diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..b099c4d --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,11 @@ +## Describe your changes + +## Relevant issues + +## Checklist before requesting a review. + +- [ ] I have ensured documentation and testing are thorough. +- [ ] I have updated the changelog. +- [ ] I have read [CONTRIBUTING.md](../CONTRIBUTING.md) +- [ ] I have made sure the CI checks run using `nix run .#ci`. +- [ ] I have followed the code standards to the best of my ability or have documented carefully where and why I haven't. diff --git a/.gitignore b/.gitignore index a2329d2..6a0bec5 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,8 @@ TAGS # Haddock files and Hoogle databases haddock hoo + +.pre-commit-config.yaml + +agora-test/goldens/agora.json +agora-test/goldens/agoraDebug.json \ No newline at end of file diff --git a/Agora audit report-v1.0.pdf b/Agora audit report-v1.0.pdf new file mode 100644 index 0000000..c98cc44 Binary files /dev/null and b/Agora audit report-v1.0.pdf differ diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a8f017..595303b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,11 +4,193 @@ This format is based on [Keep A Changelog](https://keepachangelog.com/en/1.0.0). ## Unreleased (Candidate for 1.0.0) +### Added + +- Golden tests for the script exports. + +### Modified + +- For consistency and performance, the following data types are encoded as flat +product as opposed to SoP now: + + - `GovernorDatum` + - `ProposalThresholds` + - `ProposalTimingConfig` + - `MutateGovernorDatum` + - `TreasuryWithdrawalDatum` + + Included by [#231](https://github.com/Liqwid-Labs/agora/pull/231) + +- Fix several vulnerabilities and bugs found by auditors. + + Including: + - Stake locks can be removed without retracting votes. This is a bug + introduced in the refactoring of `premoveLocks` by #209. + - Stake can retract all votes in its cooldown period. + - Inconsistent delegate authority checking may fail in some cases, where the + delegate votes with own and delegated stakes. + + Included by [#212](https://github.com/Liqwid-Labs/agora/pull/212) + +- Mitigate potential DDoS attack(voting and unlocking repeatedly) + + We fix this issue by posing cooldown time while retracting votes, encoded in + `ProposalTimingConfig`'s `minStakeVotingTime` field. Also to make sure that + stake owners can unlock their stakes in s reasonable time, we pose a maximum + time range width requirement while voting, encoded in `ProposalTimingConfig`'s `votingTimeRangeMaxWidth` field. + + Included by [#209](https://github.com/Liqwid-Labs/agora/pull/209) + +- Fix several vulnerabilities and bugs found by auditors. + + Including: + - A bug that allows multiple GATs to be minted into a single UTxO and sent + to a malicious script. + - A bug that allows delegates to create or cosign proposals with delegated + stakes. + - Potential DDoS attack: calling `UnlockStake` without any stake. + - Potential DDoS attack: calling `UnlockStake` on a `VotingReady` proposal + without actually changing the votes. + - Ignore staking credential in proposal, stake and governor. + - Improve naming and doc strings to avoid confusion. + + Included by [#208](https://github.com/Liqwid-Labs/agora/pull/208) + +- Allow delegates to vote and retract vote with their stakes along side with + stakes delegated to them in the same transaction. + + Included by [#208](https://github.com/Liqwid-Labs/agora/pull/208) + +- Fix several vulnerabilities and bugs found in both proposal and governor scripts. + + Including: + + - Governor accepts fake stake UTxO, meaning that an attacker can DoS by + creating Proposals without passing the minimum GT limit. + - The proposal policy asserts that GST moves while minting PST, effectively + allowing attackers to create fake proposals. + +- Fix an exploit that allows arbitrary amount of SSTs to be minted. The attack is + very similar to the GAT one. See also the discussion in + [#202](https://github.com/Liqwid-Labs/agora/pull/202). + + Included by [#203](https://github.com/Liqwid-Labs/agora/pull/203) + +- Fix an exploit that allows burning `m` legitimate GATs from faulty effect + validators to mint `n` (`n` < `m`) illegitimate GAT. + + Included by [#203](https://github.com/Liqwid-Labs/agora/pull/203) + +- Fix several vulnerabilities and bugs found in both staking and proposal components. + + Including: + + - Proposal thresholds should be inclusively checked. + - Attackers can fail any voted-on/locked proposal, or fast track to `Finished`, + by constructing a transaction that has a very loose valid time range. + - The stake validator can be fooled by stakes that doesn't belong to itself, and + consequently allows attack to down vote without voting. + - Improve doc string of `authorityTokensValidIn` to avoid confusion. + - Rename proposal redeemer `Unlock` to `UnlockStake` to avoid confusion. + + Included by [#200](https://github.com/Liqwid-Labs/agora/pull/200) + +- Fix a bug where `lockedBy` and `delegatedTo` fields of stake datums aren't checked + during the creation of stakes. + + Included by [#199](https://github.com/Liqwid-Labs/agora/pull/199) + +- Fix several vulnerabilities and bugs found in staking components. + + Including: + + - Stake state token can be taken away + - Privilege escalation: Acting on behalf of delegatee role + Unlocking delegated stakes + - Delegatee can steal delegated inputs + - Stake policy doesn't allow destroying multiple stakes + + Included by [#195](https://github.com/Liqwid-Labs/agora/pull/195) + +- Place a lock the stake while cosigning a proposal. + + NOTE: This changes how cosigning works. In particular, the stake has to be + spent instead of just presented in the reference inputs. Also, adding multiple + cosignatures in one tx is no longer possible. + + Included by [#192](https://github.com/Liqwid-Labs/agora/pull/192) + +- Support voting/retracting votes with multiple stakes. + + NOTE: Due to the fact that the order of stake locks is undefined, voting to + multiple proposals in a single tx is disallowed. + + Included by [#186](https://github.com/Liqwid-Labs/agora/pull/186) + +- Fix a bug that allows an attacker to send two or more GATs to an effect in the winning effect group. + + Fixed by [#181](https://github.com/Liqwid-Labs/agora/pull/181) + +- Workaround `currentProposalTime` always returns `PNothing`, due to the fact + that upper bound of `txInfoValidRange` is never closed. + + Fixed by [#177](https://github.com/Liqwid-Labs/agora/pull/177) + +- Fixed governor validator always fail because of the 0 ADA entry in + `txInfoF.mint`. (#174) + + Fixed by [#175](https://github.com/Liqwid-Labs/agora/pull/175) + +- Standalone stake redeemers. This allows injecting custom validation logic to +the stake validator easily. The behaviour of the default stake validator remains + unchanged. + + Included by [#172](https://github.com/Liqwid-Labs/agora/pull/172) + +- Witness stakes with reference input. Stake redeemer `WitnessStake` is removed. + + Included by [#168](https://github.com/Liqwid-Labs/agora/pull/168) + +- `tracing` flag in `ScriptParams` of `agora-scripts` to enable/disable tracing in exported scripts. + + NOTE: This changes the representation of `ScriptParams`. In order to preserve old behavior, the flag + must be set to `True`. + + Included by [#167](https://github.com/Liqwid-Labs/agora/pull/167). + +- `effects` of `Proposaldatum` is now required to be sorted in ascending order. The uniqueness of result tags is also guaranteed. + + `ProposalVotes` should be sorted the same way as a result. + +- AuthCheck script is used for tagging GAT TokenName instead of effect script + it is deployed at. + + Included by [#161](https://github.com/Liqwid-Labs/agora/pull/161). + +- Use `Credential` instead of `PubKeyHash` + + Included by [#158](https://github.com/Liqwid-Labs/agora/pull/158). + + NOTE: This changes the representation of the following types: + + - `PStakeDatum` + - `PStakeRedeemer` + - `PProposalDatum` + - `PProposalRedeemer` + +- Use plutus v2 types. + + Included by [#156](https://github.com/Liqwid-Labs/agora/pull/156). + +- Expected input datum value is pinned instead of out ref for governor mutation + effect. + + Included by [#238](https://github.com/Liqwid-Labs/agora/pull/238). + ## 0.2.0 -- 2022-08-13 ### Added -- Script exporting with `plutarch-script-export` +- Script exporting with `plutarch-script-export`. ### Modified @@ -28,7 +210,7 @@ This format is based on [Keep A Changelog](https://keepachangelog.com/en/1.0.0). Included by [#146](https://github.com/Liqwid-Labs/agora/pull/146). -- Draft phase and cosigning for Proposals. +- Draft phase and cosigning for Proposals. Included by [#136](https://github.com/Liqwid-Labs/agora/pull/136). @@ -36,7 +218,7 @@ This format is based on [Keep A Changelog](https://keepachangelog.com/en/1.0.0). Included by [#134](https://github.com/Liqwid-Labs/agora/pull/134). -- Fixed bug that made it impossible to create proposals. Added new stake locking mechanism for creating proposals. +- Fixed bug that made it impossible to create proposals. Added new stake locking mechanism for creating proposals. Included by [#142](https://github.com/Liqwid-Labs/agora/pull/142). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 21d35f8..52067ce 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,6 +11,7 @@ Please follow the [Git policy](https://liqwid.notion.site/Git-Policy-9a7979b2fd5 This document will make reference to the _Agora core team_. These are the people who work on Agora professionally and will be responsible for maintaining the project in its open source life. They include: - [Emily Martins](https://github.com/emiflake) +- [Connor Fang](https://github.com/chfanghr) - [Jack Hodgkinson](https://github.com/jhodgdev) ## Issues @@ -33,7 +34,7 @@ If you wish to work to resolve the issue, the Agora team would invite you to sub Only those within the core Agora team may contribute work to the project directly. If you wish to work on the project, you must [fork](https://docs.github.com/en/get-started/quickstart/fork-a-repo) the repository and submit your changes to your fork. Instructions for getting started with the project may be found in the [README](./README.md). Once the work on your fork is completed, you may submit a PR [here](https://github.com/Liqwid-Labs/agora/pulls). -Before submitting a PR, please write an issue pertaining to the problem that your PR would solve e.g. a bug in the codebase or a missing feature. Read this document's section on _Issues_ and pay particular heed to the paragraph asking contributors to _look for pre-existing issues_. The prior experiences of existing contributors could save you a significant amount of time and effort. It is possible that a number of issues could be solved by your PR. Please reference any issues that would be ameliorated by your PR - including your own issue, if you have written one - clearly. Please label your PR using GitHub's tagging feature. Please state plainly: +If your PR fixes an issue that isn't a very obvious bug, or has not previously been discussed, please write an issue pertaining to the problem that your PR would solve. Read this document's section on _Issues_ and pay particular heed to the paragraph asking contributors to _look for pre-existing issues_. The prior experiences of existing contributors could save you a significant amount of time and effort. It is possible that a number of issues could be solved by your PR. Please reference any issues that would be ameliorated by your PR - including your own issue, if you have written one - clearly. Please label your PR using GitHub's tagging feature. Please state plainly: - What your PR achieves. - How your PR works. @@ -46,23 +47,17 @@ Contributors should expect that if their work is insufficiently documented (eith Agora utilises [Plutarch](https://github.com/plutonomicon/plutarch) and your work must be written with Plutarch, when appropriate. Plutarch can prove _complicated_ but the documentation is extensive. We would encourage you to dive deeply into the documentation, whilst stating that Plutarch's [Tricks.md](https://github.com/Plutonomicon/plutarch/blob/master/docs/Tricks.md) could prove particularly helpful. -### Stylistic guidelines - -All work must comply with the [MLabs style guide](https://github.com/mlabs-haskell/styleguide/). - ### Continuous integration -For your PR to be merged it must pass three automated checks: +For your PR to be merged it must pass the CI checks. -1. A [`fourmolu`](https://github.com/fourmolu/fourmolu) formatting check. -2. A [`hlint`](https://github.com/ndmitchell/hlint) linting check. -3. A Cabal build check. +These can be run locally by running `nix run .#ci`. If you are making a PR through a fork of the repository, they might not be run in CI. When this is the case, please ensure the CI checks run fine locally before you request a review. -Our custom `fourmolu` rules may be found in the [base of the repository](./fourmolu.yaml). You can ensure that your work will pass CI by: +## Standards -1. Running `make format` from the included `Makefile`. -2. Running `make lint` from the included `Makefile` and applying any recommendations. -3. Ensuring that `cabal build` terminates successfully on your machine in the provided Nix environment. +Agora follows strict standards to increase consistency, to minimize +the impact of legacy, to properly use automated tools, and more. The standards document +can be found [here](https://liqwid.notion.site/Coding-Standards-cd3c430e6e444fa292ecc3c57b7d95eb). ## Documentation diff --git a/Makefile b/Makefile index bab143b..a622b2d 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # This really ought to be `/usr/bin/env bash`, but nix flakes don't like that. SHELL := /bin/sh -.PHONY: hoogle format haddock usage tag format_nix format_haskell format_check \ +.PHONY: hoogle format haddock usage tag format_nix format_haskell format_check \ lint refactor ps_bridge bench bench_check scripts test build ci SOURCE_FILES := $(shell git ls-tree -r HEAD --full-tree --name-only) @@ -98,4 +98,6 @@ test: requires_nix_shell build: requires_nix_shell cabal build -j$(THREADS) -ci: format_check lint build bench_check test haddock +ci: + @ [[ "$$(uname -sm)" == "Linux x86_64" ]] || (echo "NOTE: CI only builds on Linux x86_64. Your system is $$(uname -sm), continuing...") + nix build .#checks.$(shell nix eval -f '' system).required diff --git a/README.md b/README.md index 6a24af8..9892c62 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Agora is a set of Plutus scripts that compose together to form a governance syst Goals: -- Agora aims to reduce duplication in Liqwid and LiqwidX and to serve as a one-size-fits-all governance library for projects on the Cardano blockchain. +- Agora aims to reduce duplication in Liqwid and XplorerDAO and to serve as a one-size-fits-all governance library for projects on the Cardano blockchain. - Agora aims to be modular and flexible for specific needs but presents an opinionated architecture. Non-goals: @@ -34,9 +34,7 @@ cabal run agora-scripts -- --enable-cors-middleware ## Documentation -Documentation for Agora is hosted on Notion. You can find the specs [here](https://liqwid.notion.site/e85c09d2c9a542b19aac8dd3d6caa98b?v=d863219cd6a14082a661c4959cabd6e7). - -Haddock is deployed on GitHub Pages [here](https://liqwid-labs.github.io/agora/). +Documentation for Agora is hosted on Notion. You can find the specs [here](https://liqwid.notion.site/Agora-Specs-Overview-fd7df78313cf4dc0b1522cb9260b77d1). ### Using Agora for your protocol @@ -64,11 +62,12 @@ Please read [CONTRIBUTING.md](./CONTRIBUTING.md). Additionally, please follow th ### v2 -- [ ] Rewards distribution -- [ ] Escrow staking pool solution +- [ ] Flexible scripts using TxT pattern integrated with governance +- [ ] Different voting mechanisms ### Available support channels info You can find help, more information and ongoing discusion about the project here: - The [Agora & Liqwid Libs Discord](https://discord.gg/yGkjxrYueB) - Most Agora discussion happens here. +- Specs, issues, and project-management-related information is tracked on [Notion](https://www.notion.so/liqwid) diff --git a/agora-bench/Bench.hs b/agora-bench/Bench.hs index d8cdafb..99e7f8a 100644 --- a/agora-bench/Bench.hs +++ b/agora-bench/Bench.hs @@ -2,18 +2,16 @@ module Bench (Benchmark (..), benchmarkScript, specificationTreeToBenchmarks) where -import Codec.Serialise (serialise) -import Data.ByteString.Lazy qualified as LBS import Data.ByteString.Short qualified as SBS import Data.Csv (DefaultOrdered, ToNamedRecord, header, headerOrder, namedRecord, toNamedRecord, (.=)) import Data.List (intercalate) import Data.Text (Text, pack) import Plutarch.Evaluate (evalScript) -import PlutusLedgerApi.V1 ( +import Plutarch.Script (Script, serialiseScript) +import PlutusLedgerApi.V2 ( ExBudget (ExBudget), ExCPU (..), ExMemory (..), - Script, ) import Prettyprinter (Pretty (pretty), indent, vsep) import Test.Specification ( @@ -66,7 +64,7 @@ benchmarkScript name script = Benchmark (pack name) cpu mem size where (_res, ExBudget cpu mem, _traces) = evalScript script - size = SBS.length . SBS.toShort . LBS.toStrict . serialise $ script + size = SBS.length . serialiseScript $ script specificationTreeToBenchmarks :: SpecificationTree -> [Benchmark] specificationTreeToBenchmarks = go [] diff --git a/agora-bench/Main.hs b/agora-bench/Main.hs index 9f665be..c0f88c4 100644 --- a/agora-bench/Main.hs +++ b/agora-bench/Main.hs @@ -4,7 +4,7 @@ import Bench (specificationTreeToBenchmarks) import Data.Csv (EncodeOptions (encUseCrLf), defaultEncodeOptions, encodeDefaultOrderedByNameWith) import Data.Text.Lazy.Encoding (decodeUtf8) import Data.Text.Lazy.IO as I (putStr, writeFile) -import Options (Options (..), parseOptions) +import Options (Options (output), parseOptions) import Prettyprinter (defaultLayoutOptions, layoutPretty, pretty) import Prettyprinter.Render.Text (renderLazy) import Spec.AuthorityToken qualified as AuthorityToken @@ -16,7 +16,6 @@ import Spec.Stake qualified as Stake import Spec.Treasury qualified as Treasury import System.IO (hIsTerminalDevice, stdout) import Test.Specification (group) -import Prelude -------------------------------------------------------------------------------- diff --git a/agora-purescript-bridge/AgoraTypes.hs b/agora-purescript-bridge/AgoraTypes.hs index 21a41d9..a32f088 100644 --- a/agora-purescript-bridge/AgoraTypes.hs +++ b/agora-purescript-bridge/AgoraTypes.hs @@ -11,13 +11,11 @@ import Language.PureScript.Bridge ( -------------------------------------------------------------------------------- -import Agora.AuthorityToken qualified as AuthorityToken import Agora.Effect.GovernorMutation qualified as GovernorMutation import Agora.Effect.TreasuryWithdrawal qualified as TreasuryWithdrawalEffect import Agora.Governor qualified as Governor import Agora.Proposal qualified as Proposal import Agora.Stake qualified as Stake -import Agora.Treasury qualified as Treasury -------------------------------------------------------------------------------- @@ -39,10 +37,6 @@ agoraTypes = mkSumType (Proxy @Stake.ProposalLock) , mkSumType (Proxy @Stake.StakeRedeemer) , mkSumType (Proxy @Stake.StakeDatum) - , -- Treasury - mkSumType (Proxy @Treasury.TreasuryRedeemer) - , -- AuthorityToken - mkSumType (Proxy @AuthorityToken.AuthorityToken) , -- Effects mkSumType (Proxy @TreasuryWithdrawalEffect.TreasuryWithdrawalDatum) , mkSumType (Proxy @GovernorMutation.MutateGovernorDatum) diff --git a/agora-scripts/Main.hs b/agora-scripts/Main.hs index 64ee8c3..ea44b79 100644 --- a/agora-scripts/Main.hs +++ b/agora-scripts/Main.hs @@ -8,157 +8,43 @@ -} module Main (main) where +import Agora.Bootstrap (alwaysSucceedsPolicyRoledScript) import Agora.Bootstrap qualified as Bootstrap -import Agora.Governor (Governor (..)) -import Agora.SafeMoney (GTTag) -import Agora.Scripts qualified as Scripts -import Agora.Utils (CompiledMintingPolicy (..), CompiledValidator (..)) +import Agora.Linker (linker) import Data.Aeson qualified as Aeson import Data.Default (def) -import Data.Function ((&)) -import Data.Tagged (Tagged) -import Data.Text (Text) -import Development.GitRev (gitBranch, gitHash) -import GHC.Generics qualified as GHC -import Plutarch (Config (..), TracingMode (DoTracing)) -import PlutusLedgerApi.V1 ( - MintingPolicy (getMintingPolicy), - TxOutRef, - Validator (getValidator), +import Plutarch (Config (Config), TracingMode (DoTracing, NoTracing)) +import Ply (TypedScriptEnvelope) +import ScriptExport.Export (exportMain) +import ScriptExport.Types ( + Builders, + insertBuilder, + insertScriptExportWithLinker, + insertStaticBuilder, ) -import PlutusLedgerApi.V1.Value (AssetClass) -import ScriptExport.API (runServer) -import ScriptExport.Options (parseOptions) -import ScriptExport.ScriptInfo (ScriptInfo (..), mkPolicyInfo, mkScriptInfo, mkValidatorInfo) -import ScriptExport.Types (Builders, insertBuilder) main :: IO () -main = - parseOptions >>= runServer revision builders - where - -- This encodes the git revision of the server. It's useful for the caller - -- to be able to ensure they are compatible with it. - revision :: Text - revision = $(gitBranch) <> "@" <> $(gitHash) +main = exportMain builders -{- | Builders for Agora scripts. +rawScripts :: Config -> [TypedScriptEnvelope] +rawScripts conf = + either (error . show) id $ Bootstrap.agoraScripts' conf - @since 0.2.0 --} builders :: Builders builders = - def - -- Agora scripts - & insertBuilder "governorPolicy" ((.governorPolicyInfo) . agoraScripts) - & insertBuilder "governorValidator" ((.governorValidatorInfo) . agoraScripts) - & insertBuilder "stakePolicy" ((.stakePolicyInfo) . agoraScripts) - & insertBuilder "stakeValidator" ((.stakeValidatorInfo) . agoraScripts) - & insertBuilder "proposalPolicy" ((.proposalPolicyInfo) . agoraScripts) - & insertBuilder "proposalValidator" ((.proposalValidatorInfo) . agoraScripts) - & insertBuilder "treasuryValidator" ((.treasuryValidatorInfo) . agoraScripts) - & insertBuilder "authorityTokenPolicy" ((.authorityTokenPolicyInfo) . agoraScripts) - -- Trivial scripts. These are useful for testing, but they likely aren't useful - -- to you if you are actually interested in deploying to mainnet. - & insertBuilder - "alwaysSucceedsPolicy" - (\() -> mkPolicyInfo $ plam $ \_ _ -> popaque (pconstant ())) - & insertBuilder - "alwaysSucceedsValidator" - (\() -> mkValidatorInfo $ plam $ \_ _ _ -> popaque (pconstant ())) - & insertBuilder - "neverSucceedsPolicy" - (\() -> mkPolicyInfo $ plam $ \_ _ -> perror) - & insertBuilder - "neverSucceedsValidator" - (\() -> mkValidatorInfo $ plam $ \_ _ _ -> perror) - -{- | Create scripts from params. - - @since 0.2.0 --} -agoraScripts :: ScriptParams -> AgoraScripts -agoraScripts params = - AgoraScripts - { governorPolicyInfo = mkPolicyInfo' scripts.compiledGovernorPolicy - , governorValidatorInfo = mkValidatorInfo' scripts.compiledGovernorValidator - , stakePolicyInfo = mkPolicyInfo' scripts.compiledStakePolicy - , stakeValidatorInfo = mkValidatorInfo' scripts.compiledStakeValidator - , proposalPolicyInfo = mkPolicyInfo' scripts.compiledProposalPolicy - , proposalValidatorInfo = mkValidatorInfo' scripts.compiledProposalValidator - , treasuryValidatorInfo = mkValidatorInfo' scripts.compiledTreasuryValidator - , authorityTokenPolicyInfo = mkPolicyInfo' scripts.compiledAuthorityTokenPolicy - } - where - governor = - Agora.Governor.Governor - params.governorInitialSpend - params.gtClassRef - params.maximumCosigners - - scripts = Bootstrap.agoraScripts plutarchConfig governor - -{- | Params required for creating script export. - - @since 0.2.0 --} -data ScriptParams where - ScriptParams :: - { governorInitialSpend :: TxOutRef - , gtClassRef :: Tagged GTTag AssetClass - , maximumCosigners :: Integer - } -> - ScriptParams - deriving anyclass (Aeson.ToJSON, Aeson.FromJSON) - deriving stock (Show, Eq, GHC.Generic, Ord) - -{- | Scripts that get exported. - - @since 0.2.0 --} -data AgoraScripts = AgoraScripts - { governorPolicyInfo :: ScriptInfo - , governorValidatorInfo :: ScriptInfo - , stakePolicyInfo :: ScriptInfo - , stakeValidatorInfo :: ScriptInfo - , proposalPolicyInfo :: ScriptInfo - , proposalValidatorInfo :: ScriptInfo - , treasuryValidatorInfo :: ScriptInfo - , authorityTokenPolicyInfo :: ScriptInfo - } - deriving anyclass - ( -- | @since 0.2.0 - Aeson.ToJSON - , -- | @since 0.2.0 - Aeson.FromJSON - ) - deriving stock - ( -- | @since 0.2.0 - Show - , -- | @since 0.2.0 - Eq - , -- | @since 0.2.0 - GHC.Generic - ) - -{- | Default plutarch configuration for compiling scripts. - - TODO: we should have an option to control this. - - @since 0.2.0 --} -plutarchConfig :: Config -plutarchConfig = Config {tracingMode = DoTracing} - -{- | Turn a precompiled minting policy to a 'ScriptInfo'. - - @since 0.2.0 --} -mkPolicyInfo' :: forall redeemer. CompiledMintingPolicy redeemer -> ScriptInfo -mkPolicyInfo' = mkScriptInfo . getMintingPolicy . getCompiledMintingPolicy - -{- | Turn a precompiled validator to a 'ScriptInfo'. - - @since 0.2.0 --} -mkValidatorInfo' :: forall redeemer datum. CompiledValidator datum redeemer -> ScriptInfo -mkValidatorInfo' = mkScriptInfo . getValidator . getCompiledValidator + mconcat + [ insertStaticBuilder "raw" (rawScripts (Config NoTracing)) + , insertStaticBuilder "rawDebug" (rawScripts (Config DoTracing)) + , insertScriptExportWithLinker "agora" (Bootstrap.agoraScripts def) linker + , insertScriptExportWithLinker + "agoraDebug" + ( Bootstrap.agoraScripts + (Config DoTracing) + ) + linker + , -- Note: To be compatible with current off-chain setup, we are not using + -- static builder here. + insertBuilder + "alwaysSucceedsPolicy" + (const @_ @Aeson.Value alwaysSucceedsPolicyRoledScript) + ] diff --git a/agora-scripts/sampleGov.json b/agora-scripts/sampleGov.json new file mode 100644 index 0000000..b50df56 --- /dev/null +++ b/agora-scripts/sampleGov.json @@ -0,0 +1,15 @@ +{ + "gstOutRef": { + "txOutRefId": "f28cd7145c24e66fd5bcd2796837aeb19a48a2656e7833c88c62a2d0450bd00d", + "txOutRefIdx": 1 + }, + "gtClassRef": { + "name": { + "unTokenName": "3334363333353331" + }, + "symbol": { + "unCurrencySymbol": "da8c30857834c6ae7203935b89278c532b3995245295456f993e1d24" + } + }, + "maximumCosigners": 20 +} diff --git a/agora-specs/Property/Generator.hs b/agora-specs/Property/Generator.hs index a1a26fc..885706b 100644 --- a/agora-specs/Property/Generator.hs +++ b/agora-specs/Property/Generator.hs @@ -32,22 +32,22 @@ import Plutarch.Context ( output, withValue, ) -import PlutusLedgerApi.V1 ( - Address (Address), - Credential (..), - PubKeyHash (PubKeyHash), - TxId (..), - TxOutRef (..), - ValidatorHash (ValidatorHash), - Value, - toBuiltin, - ) import PlutusLedgerApi.V1.Value ( AssetClass (AssetClass), assetClassValue, currencySymbol, tokenName, ) +import PlutusLedgerApi.V2 ( + Address (Address), + Credential (..), + PubKeyHash (PubKeyHash), + ScriptHash (ScriptHash), + TxId (..), + TxOutRef (..), + Value, + toBuiltin, + ) import Test.QuickCheck ( Arbitrary (arbitrary), Gen, @@ -76,7 +76,7 @@ genUserCredential = PubKeyCredential . PubKeyHash . toBuiltin <$> genHashByteStr -- | Random script credential. genScriptCredential :: Gen Credential -genScriptCredential = ScriptCredential . ValidatorHash . toBuiltin <$> genHashByteString +genScriptCredential = ScriptCredential . ScriptHash . toBuiltin <$> genHashByteString -- | Random credential: combination of user and script credential generators. genCredential :: Gen Credential diff --git a/agora-specs/Property/Governor.hs b/agora-specs/Property/Governor.hs index 1da91d8..9f47861 100644 --- a/agora-specs/Property/Governor.hs +++ b/agora-specs/Property/Governor.hs @@ -1,3 +1,7 @@ +{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} + +{-# HLINT ignore "Redundant bracket" #-} + {- | Module : Property.Governor Maintainer : seungheon.ooh@gmail.com @@ -7,216 +11,299 @@ Property model and tests for 'Governor' related functions -} module Property.Governor (props) where -import Agora.Governor (Governor (gstOutRef), GovernorDatum (..), pisGovernorDatumValid) +import Agora.Governor ( + GovernorDatum ( + GovernorDatum, + createProposalTimeRangeMaxWidth, + maximumCreatedProposalsPerStake, + nextProposalId, + proposalThresholds, + proposalTimings + ), + PGovernorDatum, + pisGovernorDatumValid, + ) import Agora.Governor.Scripts (governorPolicy) import Agora.Proposal ( ProposalId (ProposalId), - ProposalThresholds (ProposalThresholds), + ProposalThresholds ( + ProposalThresholds + ), ) import Agora.Proposal.Time ( MaxTimeRangeWidth (MaxTimeRangeWidth), ProposalTimingConfig (ProposalTimingConfig), ) -import Data.Default.Class (Default (def)) -import Data.Tagged (Tagged (Tagged), untag) -import Data.Universe (Finite (..), Universe (..)) -import Plutarch.Api.V1 (PScriptContext) +import Data.Default (def) +import Data.Tagged (Tagged (Tagged)) +import Data.Universe (Universe) +import Data.Universe.Class (Finite) +import Generics.SOP.NP (NP (Nil, (:*))) +import Optics (view) +import Plutarch.Api.V2 (PScriptContext) import Plutarch.Builtin (pforgetData) import Plutarch.Context ( MintingBuilder, - buildMintingUnsafe, + buildMinting', input, mint, output, script, withDatum, withMinting, - withOutRef, + withRef, withValue, ) -import PlutusLedgerApi.V1 ( - ScriptContext (scriptContextTxInfo), - TxInInfo (txInInfoOutRef), - TxInfo (txInfoInputs, txInfoMint, txInfoOutputs), - TxOut (txOutValue), +import Plutarch.Evaluate (evalTerm) +import Plutarch.Extra.AssetClass (assetClassValue) +import Plutarch.Extra.Compile (mustCompile) +import Plutarch.Script (Script) +import Plutarch.Test.QuickCheck ( + Equality (OnPEq), + Partiality (ByComplete), + TestableTerm (TestableTerm), + haskEquiv, + pconstantT, + shouldCrash, + shouldRun, ) -import PlutusLedgerApi.V1.Value (assetClassValue) +import PlutusLedgerApi.V2 (ScriptContext) import Property.Generator (genInput, genOutput) import Sample.Shared ( - govAssetClass, - govSymbol, - govValidatorHash, + deterministicTracingConfig, governor, + governorAssetClass, + governorScriptHash, + governorSymbol, gstUTXORef, ) -import Test.Tasty (TestTree) -import Test.Tasty.Plutarch.Property (classifiedPropertyNative) -import Test.Tasty.QuickCheck ( +import Test.QuickCheck ( + Arbitrary (arbitrary), Gen, Property, + arbitraryBoundedEnum, + checkCoverage, choose, chooseInteger, + cover, + forAll, listOf1, - testProperty, ) +import Test.Tasty (TestTree, adjustOption, testGroup) +import Test.Tasty.QuickCheck (QuickCheckTests, testProperty) data GovernorDatumCases = ExecuteLE0 | CreateLE0 + | ToVotingLE0 | VoteLE0 + | CosignLE0 | Correct - deriving stock (Eq, Show) + deriving stock (Eq, Show, Enum, Bounded) + deriving anyclass (Universe, Finite) -instance Universe GovernorDatumCases where - universe = - [ ExecuteLE0 - , CreateLE0 - , VoteLE0 - , Correct - ] +instance Arbitrary GovernorDatumCases where + arbitrary = arbitraryBoundedEnum -instance Finite GovernorDatumCases where - universeF = universe - cardinality = Tagged 6 - -{- | Property that checks `governorDatumValid`. - `governorDatumValid` determines if given governor datum is valid or not. This property - ensures `governorDatumValid` is checking the datum correctly and ruling out improper datum. +{- | Property that checks `pisGovernorDatumValid` behaves as intended by + comparing it to a simple haskell implementation. -} governorDatumValidProperty :: Property governorDatumValidProperty = - classifiedPropertyNative gen (const []) expected classifier pisGovernorDatumValid + haskEquiv @('OnPEq) @('ByComplete) + isValidModelImpl + (TestableTerm pisGovernorDatumValid) + (genDatum :* Nil) where - classifier :: GovernorDatum -> GovernorDatumCases - classifier (proposalThresholds -> ProposalThresholds e c v) - | e < 0 = ExecuteLE0 - | c < 0 = CreateLE0 - | v < 0 = VoteLE0 - | otherwise = Correct - - expected :: GovernorDatum -> Maybe Bool - expected c = Just $ classifier c == Correct - - gen :: GovernorDatumCases -> Gen GovernorDatum - gen c = do - thres <- genProposalThresholds c - - let timing = ProposalTimingConfig 0 0 0 0 - return $ GovernorDatum thres (ProposalId 0) timing (MaxTimeRangeWidth 1) 3 + genDatum :: Gen (TestableTerm PGovernorDatum) + genDatum = pconstantT <$> (arbitrary >>= genDatumForCase) where - taggedInteger p = Tagged <$> chooseInteger p - genProposalThresholds :: GovernorDatumCases -> Gen ProposalThresholds - genProposalThresholds c = do - let validGT = taggedInteger (0, 1000000000) - execute <- validGT - create <- validGT - vote <- validGT - le0 <- taggedInteger (-1000, -1) + genDatumForCase :: GovernorDatumCases -> Gen GovernorDatum + genDatumForCase c = do + thres <- genProposalThresholds c - case c of - ExecuteLE0 -> - -- execute < 0 - return $ ProposalThresholds le0 create vote - CreateLE0 -> - -- c < 0 - return $ ProposalThresholds execute le0 vote - VoteLE0 -> - -- vote < 0 - return $ ProposalThresholds execute create le0 - Correct -> do - -- c <= vote < execute - nv <- taggedInteger (0, untag execute - 1) - nc <- taggedInteger (0, untag nv) - return $ ProposalThresholds execute nc nv + let timing = ProposalTimingConfig 0 0 0 0 0 0 + pure $ + GovernorDatum thres (ProposalId 0) timing (MaxTimeRangeWidth 1) 3 + where + taggedInteger p = Tagged <$> chooseInteger p + genProposalThresholds :: GovernorDatumCases -> Gen ProposalThresholds + genProposalThresholds c = do + let validGT = taggedInteger (0, 1000000000) + execute <- validGT + create <- validGT + toVoting <- validGT + vote <- validGT + cosign <- validGT + le0 <- taggedInteger (-1000, -1) + + case c of + ExecuteLE0 -> + -- execute < 0 + return $ ProposalThresholds le0 create toVoting vote cosign + CreateLE0 -> + -- c < 0 + return $ ProposalThresholds execute le0 toVoting vote cosign + ToVotingLE0 -> + return $ ProposalThresholds execute create le0 vote cosign + VoteLE0 -> + -- vote < 0 + return $ ProposalThresholds execute create toVoting le0 cosign + CosignLE0 -> + return $ ProposalThresholds execute create toVoting vote le0 + Correct -> + return $ ProposalThresholds execute create toVoting vote cosign + + -- \| This is a model Haskell implementation of `pisGovernorDatumValid`. + isValidModelImpl :: GovernorDatum -> Bool + isValidModelImpl = correctCase . classifier + where + correctCase = \case + Correct -> True + _ -> False + + classifier :: GovernorDatum -> GovernorDatumCases + classifier + ( view #proposalThresholds -> + ProposalThresholds + execute + create + toVoting + vote + cosign + ) + | execute < 0 = ExecuteLE0 + | create < 0 = CreateLE0 + | toVoting < 0 = ToVotingLE0 + | vote < 0 = VoteLE0 + | cosign < 0 = CosignLE0 + | otherwise = Correct + +-------------------------------------------------------------------------------- data GovernorPolicyCases = ReferenceUTXONotSpent | IncorrectAmountOfTokenMinted | GovernorOutputNotFound - | GovernorPolicyCorrect deriving stock (Eq, Show) -instance Universe GovernorPolicyCases where - universe = - [ ReferenceUTXONotSpent - , IncorrectAmountOfTokenMinted - , GovernorOutputNotFound - , GovernorPolicyCorrect - ] +governorMintingPolicyTests :: [TestTree] +governorMintingPolicyTests = + [ mkGovMintingCasePropertyTest + "Reference input spend test" + ReferenceUTXONotSpent + "Spent" + "Not spent" + , mkGovMintingCasePropertyTest + "Amount of token minted test" + IncorrectAmountOfTokenMinted + "Correct" + "Incorrect" + , mkGovMintingCasePropertyTest + "Governor output presense" + GovernorOutputNotFound + "Present" + "Absent" + ] -instance Finite GovernorPolicyCases where - universeF = universe - cardinality = Tagged 4 +{- | Creates a property by compiling governorPolicy script with given arguments + and checking if it runs as expected by a test. +-} +governorPolicyValid :: ScriptContext -> Bool -> Property +governorPolicyValid ctx shouldSucceed = + let mp = mkPolicyScript ctx in if shouldSucceed then shouldRun mp else shouldCrash mp -governorMintingProperty :: Property -governorMintingProperty = - classifiedPropertyNative gen (const []) expected classifier actual +{-# INLINEABLE mkPolicyScript #-} +mkPolicyScript :: ScriptContext -> Script +mkPolicyScript ctx = mustCompile (go # pconstant ctx) where - {- Note: - I don't think it's easily possible to randomize orefs. We can't really pass pass `Governor` type to `actual` function. - -} - gst = assetClassValue govAssetClass 1 - mintAmount x = mint . mconcat $ replicate x gst - outputToGov = - output $ - mconcat - [ script govValidatorHash - , withValue gst - , withDatum govDatum - ] - referencedInput = input $ withOutRef gstUTXORef + go :: forall (s :: S). Term s (PScriptContext :--> POpaque) + go = loudEval $ + plam $ \sc -> + governorPolicy + # pdata (pconstant (view #gstOutRef governor)) + # pforgetData (pconstantData ()) + # sc - govDatum :: GovernorDatum - govDatum = - GovernorDatum - { proposalThresholds = def - , nextProposalId = ProposalId 0 - , proposalTimings = def - , createProposalTimeRangeMaxWidth = def - , maximumProposalsPerStake = 3 - } - - gen :: GovernorPolicyCases -> Gen ScriptContext +-- | Prepares a minting policy test for given policy error case. +mkGovMintingCasePropertyTest :: + String -> + GovernorPolicyCases -> + String -> + String -> + TestTree +mkGovMintingCasePropertyTest name case' positiveCaseName negativeCaseName = + testProperty name $ + forAll (gen case') $ + \(ctx, valid) -> + checkCoverage $ + cover 48 valid positiveCaseName $ + cover 48 (not valid) negativeCaseName $ + governorPolicyValid ctx valid + where + gen :: GovernorPolicyCases -> Gen (ScriptContext, Bool) gen c = do inputs <- fmap mconcat . listOf1 $ genInput @MintingBuilder outputs <- fmap mconcat . listOf1 $ genOutput @MintingBuilder toks <- choose (2, 100) + valid <- arbitrary let comp = - case c of - ReferenceUTXONotSpent -> outputToGov <> mintAmount 1 - IncorrectAmountOfTokenMinted -> referencedInput <> outputToGov <> mintAmount toks - GovernorOutputNotFound -> referencedInput <> mintAmount 1 - GovernorPolicyCorrect -> referencedInput <> outputToGov <> mintAmount 1 + if valid + then referencedInput <> outputToGov <> mintAmount 1 + else case c of + ReferenceUTXONotSpent -> outputToGov <> mintAmount 1 + IncorrectAmountOfTokenMinted -> + referencedInput + <> outputToGov + <> mintAmount toks + GovernorOutputNotFound -> referencedInput <> mintAmount 1 - return . buildMintingUnsafe $ inputs <> outputs <> comp <> withMinting govSymbol - - expected :: ScriptContext -> Maybe () - expected sc = - case classifier sc of - GovernorPolicyCorrect -> Just () - _ -> Nothing - - opaqueToUnit :: Term s (POpaque :--> PUnit) - opaqueToUnit = plam $ \_ -> pconstant () - - actual :: Term s (PScriptContext :--> PUnit) - actual = plam $ \sc -> opaqueToUnit #$ governorPolicy governor.gstOutRef # pforgetData (pconstantData ()) # sc - - classifier :: ScriptContext -> GovernorPolicyCases - classifier sc - | minted /= gst = IncorrectAmountOfTokenMinted - | refInputNotExists = ReferenceUTXONotSpent - | govOutputNotExists = GovernorOutputNotFound - | otherwise = GovernorPolicyCorrect + let ctx = + buildMinting' $ + inputs + <> outputs + <> comp + <> withMinting + governorSymbol + pure (ctx, valid) where - txinfo = scriptContextTxInfo sc - minted = txInfoMint txinfo - refInputNotExists = gstUTXORef `notElem` (txInInfoOutRef <$> txInfoInputs txinfo) - govOutputNotExists = gst `notElem` (txOutValue <$> txInfoOutputs txinfo) + govDatum :: GovernorDatum + govDatum = + GovernorDatum + { proposalThresholds = def + , nextProposalId = ProposalId 0 + , proposalTimings = def + , createProposalTimeRangeMaxWidth = def + , maximumCreatedProposalsPerStake = 3 + } + + gst = assetClassValue governorAssetClass 1 + mintAmount x = mint . mconcat $ replicate x gst + referencedInput = input $ withRef gstUTXORef + outputToGov = + output $ + mconcat + [ script governorScriptHash + , withValue gst + , withDatum govDatum + ] props :: [TestTree] props = - [ testProperty "governorDatumValid" governorDatumValidProperty - , testProperty "governorPolicy" governorMintingProperty + [ adjustOption go . testProperty "governorDatumValid" $ governorDatumValidProperty + , testGroup "governorPolicy" governorMintingPolicyTests ] + where + go :: QuickCheckTests -> QuickCheckTests + go = max 20_000 + +loudEval :: + forall (p :: S -> Type). + ClosedTerm p -> + ClosedTerm p +loudEval x = + case evalTerm deterministicTracingConfig x of + Right (Right t, _, _) -> t + Right (Left err, _, trace) -> error $ show err <> show trace + Left err -> error $ show err diff --git a/agora-specs/Property/Utils.hs b/agora-specs/Property/Utils.hs new file mode 100644 index 0000000..3919607 --- /dev/null +++ b/agora-specs/Property/Utils.hs @@ -0,0 +1,37 @@ +module Property.Utils (props) where + +import Agora.Utils (phashDatum) +import Generics.SOP (NP (Nil, (:*))) +import Plutarch.Api.V2 (datumHash) +import Plutarch.Test.QuickCheck ( + Equality (OnPEq), + Partiality (ByComplete), + TestableTerm (TestableTerm), + arbitraryPLift, + haskEquiv, + ) +import Plutarch.Test.QuickCheck.Instances () +import Test.Tasty (TestTree, adjustOption) +import Test.Tasty.QuickCheck ( + Property, + QuickCheckTests, + resize, + testProperty, + ) + +propHashDatumCorrect :: Property +propHashDatumCorrect = + haskEquiv + @'OnPEq + @'ByComplete + datumHash + (TestableTerm phashDatum) + (resize 5 arbitraryPLift :* Nil) + +props :: [TestTree] +props = + [ adjustOption go $ testProperty "Correct 'phashDatum'" propHashDatumCorrect + ] + where + go :: QuickCheckTests -> QuickCheckTests + go = max 20_000 diff --git a/agora-specs/Sample/AuthorityToken/UnauthorizedMintingExploit.hs b/agora-specs/Sample/AuthorityToken/UnauthorizedMintingExploit.hs new file mode 100644 index 0000000..d0e614f --- /dev/null +++ b/agora-specs/Sample/AuthorityToken/UnauthorizedMintingExploit.hs @@ -0,0 +1,66 @@ +module Sample.AuthorityToken.UnauthorizedMintingExploit ( + Parameters (..), + exploit, + mkTestCase, +) where + +import Control.Exception (assert) +import Plutarch.Context (input, mint, normalizeValue, output, script, withValue) +import Plutarch.Extra.ScriptContext (scriptHashToTokenName) +import PlutusLedgerApi.V1.Value qualified as Value +import Sample.Shared (authorityTokenPolicy, authorityTokenSymbol, minAda) +import Test.Specification (SpecificationTree, testPolicy) +import Test.Util (CombinableBuilder, mkMinting, validatorHashes) + +data Parameters = Parameters + { burntGAT :: Int + , mintedGAT :: Int + } + +exploit :: + forall b. + CombinableBuilder b => + Parameters -> + b +exploit (Parameters burntGAT mintedGAT) = + assert (burntGAT > mintedGAT && mintedGAT > 0) $ + effectInputBuilder <> maliciousGATOutputBuilder + where + (effectScriptHashes, rest) = splitAt burntGAT validatorHashes + maliciousScripts = take mintedGAT rest + + gatValue hash = + Value.singleton + authorityTokenSymbol + (scriptHashToTokenName hash) + + mkGATUTxO hash = + mconcat + [ script hash + , withValue $ normalizeValue $ minAda <> gatValue hash 1 + ] + + effectInputBuilder = + foldMap + ( \effectHash -> + mconcat + [ mint $ gatValue effectHash $ negate 1 + , input $ mkGATUTxO effectHash + ] + ) + effectScriptHashes + + maliciousGATOutputBuilder = + foldMap + ( \scriptHash -> + mconcat + [ mint $ gatValue scriptHash 1 + , output $ mkGATUTxO scriptHash + ] + ) + maliciousScripts + +mkTestCase :: String -> Parameters -> SpecificationTree +mkTestCase name ps = + testPolicy False name authorityTokenPolicy () $ + mkMinting exploit ps authorityTokenSymbol diff --git a/agora-specs/Sample/Effect/GovernorMutation.hs b/agora-specs/Sample/Effect/GovernorMutation.hs index 75a7a56..8557c23 100644 --- a/agora-specs/Sample/Effect/GovernorMutation.hs +++ b/agora-specs/Sample/Effect/GovernorMutation.hs @@ -2,7 +2,7 @@ module Sample.Effect.GovernorMutation ( mkEffectTxInfo, effectValidator, effectValidatorAddress, - effectValidatorHash, + effectScriptHash, atAssetClass, govRef, effectRef, @@ -13,74 +13,83 @@ module Sample.Effect.GovernorMutation ( import Agora.Effect.GovernorMutation ( MutateGovernorDatum (..), - mutateGovernorValidator, ) -import Agora.Governor (GovernorDatum (..)) +import Agora.Governor (GovernorDatum (..), GovernorRedeemer (MutateGovernor)) import Agora.Proposal (ProposalId (..), ProposalThresholds (..)) -import Agora.Utils (validatorHashToTokenName) +import Agora.SafeMoney (AuthorityTokenTag) import Data.Default.Class (Default (def)) +import Data.Map ((!)) import Data.Tagged (Tagged (..)) -import Plutarch.Api.V1 (mkValidator, validatorHash) -import PlutusLedgerApi.V1 ( +import Plutarch.Api.V2 (scriptHash) +import Plutarch.Extra.AssetClass (AssetClass (AssetClass), assetClassValue) +import Plutarch.Extra.ScriptContext (scriptHashToTokenName) +import Plutarch.Script (Script) +import PlutusLedgerApi.V1 qualified as Interval (always) +import PlutusLedgerApi.V1.Address (scriptHashAddress) +import PlutusLedgerApi.V1.Value qualified as Value ( + singleton, + ) +import PlutusLedgerApi.V2 ( Address, Datum (..), + OutputDatum (OutputDatumHash), + ScriptHash, + ScriptPurpose (Spending), ToData (..), TxInInfo (..), TxInfo (..), TxOut (..), TxOutRef (TxOutRef), - Validator, - ValidatorHash (..), - ) -import PlutusLedgerApi.V1 qualified as Interval (always) -import PlutusLedgerApi.V1.Address (scriptHashAddress) -import PlutusLedgerApi.V1.Value (AssetClass, assetClass) -import PlutusLedgerApi.V1.Value qualified as Value ( - assetClassValue, - singleton, ) +import PlutusTx.AssocMap qualified as AssocMap import Sample.Shared ( agoraScripts, authorityTokenSymbol, - deterministicTracingConfing, - govAssetClass, - govValidatorAddress, + governorAssetClass, + governorValidatorAddress, minAda, + mkRedeemer, signer, ) import Test.Util (datumPair, toDatumHash) -- | The effect validator instance. -effectValidator :: Validator -effectValidator = mkValidator deterministicTracingConfing $ mutateGovernorValidator agoraScripts +effectValidator :: Script +effectValidator = agoraScripts ! "agora:mutateGovernorValidator" -- | The hash of the validator instance. -effectValidatorHash :: ValidatorHash -effectValidatorHash = validatorHash effectValidator +effectScriptHash :: ScriptHash +effectScriptHash = scriptHash effectValidator -- | The address of the validator. effectValidatorAddress :: Address -effectValidatorAddress = scriptHashAddress effectValidatorHash +effectValidatorAddress = scriptHashAddress effectScriptHash -- | The assetclass of the authority token. -atAssetClass :: AssetClass -atAssetClass = assetClass authorityTokenSymbol tokenName +atAssetClass :: Tagged AuthorityTokenTag AssetClass +atAssetClass = Tagged $ AssetClass authorityTokenSymbol tokenName where - tokenName = validatorHashToTokenName effectValidatorHash + tokenName = scriptHashToTokenName effectScriptHash -- | The mock reference of the governor state UTXO. govRef :: TxOutRef -govRef = TxOutRef "1475e1ee22330dfc55430980e5a6b100ec9d9249bb4b462256a79559" 1 +govRef = + TxOutRef + "d63fe09e6ac6e55dea82291149085d0a9b901df65087b83965188ee92fb25aef" + 1 -- | The mock reference of the effect UTXO. effectRef :: TxOutRef -effectRef = TxOutRef "a302d327d8e5553d50b9d017475369753f723d7e999ac1b68da8ad52" 1 +effectRef = + TxOutRef + "3ca6864670aae61a9f3e63064284cec00bd983d77cf4e1ab1e26bef34cafb0a9" + 1 -- | The input effect datum in 'mkEffectTransaction'. -mkEffectDatum :: GovernorDatum -> MutateGovernorDatum -mkEffectDatum newGovDatum = +mkEffectDatum :: GovernorDatum -> GovernorDatum -> MutateGovernorDatum +mkEffectDatum oldGovDatum newGovDatum = MutateGovernorDatum - { governorRef = govRef + { oldDatum = oldGovDatum , newDatum = newGovDatum } @@ -90,11 +99,11 @@ mkEffectDatum newGovDatum = -} mkEffectTxInfo :: GovernorDatum -> TxInfo mkEffectTxInfo newGovDatum = - let gst = Value.assetClassValue govAssetClass 1 - at = Value.assetClassValue atAssetClass 1 + let gst = assetClassValue governorAssetClass 1 + at = assetClassValue atAssetClass 1 -- One authority token is burnt in the process. - burnt = Value.assetClassValue atAssetClass (-1) + burnt = assetClassValue atAssetClass (-1) -- @@ -105,23 +114,24 @@ mkEffectTxInfo newGovDatum = , nextProposalId = ProposalId 0 , proposalTimings = def , createProposalTimeRangeMaxWidth = def - , maximumProposalsPerStake = 3 + , maximumCreatedProposalsPerStake = 3 } governorInputDatum :: Datum governorInputDatum = Datum $ toBuiltinData governorInputDatum' governorInput :: TxOut governorInput = TxOut - { txOutAddress = govValidatorAddress + { txOutAddress = governorValidatorAddress , txOutValue = gst - , txOutDatumHash = Just $ toDatumHash governorInputDatum + , txOutDatum = OutputDatumHash $ toDatumHash governorInputDatum + , txOutReferenceScript = Nothing } -- -- The effect should update 'nextProposalId' effectInputDatum' :: MutateGovernorDatum - effectInputDatum' = mkEffectDatum newGovDatum + effectInputDatum' = mkEffectDatum governorInputDatum' newGovDatum effectInputDatum :: Datum effectInputDatum = Datum $ toBuiltinData effectInputDatum' effectInput :: TxOut @@ -129,7 +139,8 @@ mkEffectTxInfo newGovDatum = TxOut { txOutAddress = effectValidatorAddress , txOutValue = at -- The effect carry an authotity token. - , txOutDatumHash = Just $ toDatumHash effectInputDatum + , txOutDatum = OutputDatumHash $ toDatumHash effectInputDatum + , txOutReferenceScript = Nothing } -- @@ -141,23 +152,30 @@ mkEffectTxInfo newGovDatum = governorOutput :: TxOut governorOutput = TxOut - { txOutAddress = govValidatorAddress + { txOutAddress = governorValidatorAddress , txOutValue = mconcat [gst, minAda] - , txOutDatumHash = Just $ toDatumHash governorOutputDatum + , txOutDatum = OutputDatumHash $ toDatumHash governorOutputDatum + , txOutReferenceScript = Nothing } in TxInfo { txInfoInputs = [ TxInInfo effectRef effectInput , TxInInfo govRef governorInput ] + , txInfoReferenceInputs = [] , txInfoOutputs = [governorOutput] , txInfoFee = Value.singleton "" "" 2 , txInfoMint = burnt , txInfoDCert = [] - , txInfoWdrl = [] + , txInfoWdrl = AssocMap.empty , txInfoValidRange = Interval.always , txInfoSignatories = [signer] - , txInfoData = datumPair <$> [governorInputDatum, governorOutputDatum, effectInputDatum] + , txInfoData = AssocMap.fromList $ datumPair <$> [governorInputDatum, governorOutputDatum, effectInputDatum] + , txInfoRedeemers = + AssocMap.fromList + [ (Spending effectRef, mkRedeemer ()) + , (Spending govRef, mkRedeemer MutateGovernor) + ] , txInfoId = "74c75505691e7baa981fa80e50b9b7e88dbe1eda67d4f062d89d203b" } @@ -168,7 +186,7 @@ validNewGovernorDatum = , nextProposalId = ProposalId 42 , proposalTimings = def , createProposalTimeRangeMaxWidth = def - , maximumProposalsPerStake = 3 + , maximumCreatedProposalsPerStake = 3 } invalidNewGovernorDatum :: GovernorDatum @@ -176,10 +194,10 @@ invalidNewGovernorDatum = GovernorDatum { proposalThresholds = def - { vote = Tagged (-1) + { toVoting = Tagged (-1) } , nextProposalId = ProposalId 42 , proposalTimings = def , createProposalTimeRangeMaxWidth = def - , maximumProposalsPerStake = 3 + , maximumCreatedProposalsPerStake = 3 } diff --git a/agora-specs/Sample/Effect/TreasuryWithdrawal.hs b/agora-specs/Sample/Effect/TreasuryWithdrawal.hs index 3070e79..a534e73 100644 --- a/agora-specs/Sample/Effect/TreasuryWithdrawal.hs +++ b/agora-specs/Sample/Effect/TreasuryWithdrawal.hs @@ -6,170 +6,209 @@ Description: Sample based testing for Treasury Withdrawal Effect This module provides samples for Treasury Withdrawal Effect tests. -} module Sample.Effect.TreasuryWithdrawal ( - inputTreasury, - inputUser, - inputGAT, - inputCollateral, - outputTreasury, - outputUser, - buildReceiversOutputFromDatum, - currSymbol, - users, - treasuries, - buildScriptContext, + runEffect, + Parameters (..), + Validity (..), + totallyValidParameters, + mkTestTree, ) where import Agora.Effect.TreasuryWithdrawal ( - TreasuryWithdrawalDatum (TreasuryWithdrawalDatum), - treasuryWithdrawalValidator, + TreasuryWithdrawalDatum (..), ) -import Data.Default (def) -import Plutarch.Api.V1 (mkValidator, validatorHash) -import PlutusLedgerApi.V1 ( - Address (Address), +import Control.Composition ((.*)) +import Data.Foldable (Foldable (fold)) +import Data.List (singleton) +import Data.Map ((!)) +import Data.Map.Ordered (OMap) +import Data.Map.Ordered qualified as Map +import Data.Semigroup (mtimesDefault) +import Plutarch.Api.V2 (scriptHash) +import Plutarch.Context (credential, input, mint, output, script, withInlineDatum, withRef, withRefTxId, withValue) +import Plutarch.Script (Script) +import PlutusLedgerApi.V1.Value qualified as Value (scale, singleton) +import PlutusLedgerApi.V2 ( Credential (..), - CurrencySymbol, - DatumHash (DatumHash), - PubKeyHash, - ScriptContext (..), - ScriptPurpose (Spending), - TokenName (TokenName), - TxInInfo (TxInInfo), - TxInfo ( - TxInfo, - txInfoDCert, - txInfoData, - txInfoFee, - txInfoId, - txInfoInputs, - txInfoMint, - txInfoOutputs, - txInfoSignatories, - txInfoValidRange, - txInfoWdrl - ), - TxOut (..), + TxId, TxOutRef (TxOutRef), - Validator, - ValidatorHash (ValidatorHash), Value, ) -import PlutusLedgerApi.V1.Interval qualified as Interval (always) -import PlutusLedgerApi.V1.Value qualified as Value (singleton) -import Test.Util (scriptCredentials, userCredentials) +import PlutusLedgerApi.V3 (ScriptHash) +import Sample.Shared (agoraScripts, authorityTokenPolicy, authorityTokenSymbol, minAda, signer, signer2, trScriptHash, trValidator) +import Test.Specification (SpecificationTree, group, testPolicy, testValidator) +import Test.Util (CombinableBuilder, mkMinting, mkSpending, subtractValue, validatorHashes) --- | A sample Currency Symbol. -currSymbol :: CurrencySymbol -currSymbol = "9c04a69c7133e26061fe5a15adaf4f79cd51e47ef22a2e3c91a36f04" +data Parameters = Parameters + { shouldDeliver :: + OMap Credential Value + , treasuryInputCount :: Integer + , badReceivedValue :: Bool + , badReceivers :: Bool + , badReceiverOrder :: Bool + , badTreasuryPaybackValue :: Bool + } --- | A sample 'PubKeyHash'. -signer :: PubKeyHash -signer = "8a30896c4fd5e79843e4ca1bd2cdbaa36f8c0bc3be7401214142019c" +data Validity = Validity + { forGATPolicy :: Bool + , forEffectValidator :: Bool + , forTreasury :: Bool + } --- | List of users who the effect will pay to. -users :: [Credential] -users = userCredentials +effectValidator :: Script +effectValidator = agoraScripts ! "agora:treasuryWithdrawalValidator" --- | List of users who the effect will pay to. -treasuries :: [Credential] -treasuries = scriptCredentials +effectHash :: ScriptHash +effectHash = scriptHash effectValidator -inputGAT :: TxInInfo -inputGAT = - TxInInfo - (TxOutRef "0b2086cbf8b6900f8cb65e012de4516cb66b5cb08a9aaba12a8b88be" 1) - TxOut - { txOutAddress = Address (ScriptCredential $ validatorHash validator) Nothing - , txOutValue = Value.singleton currSymbol validatorHashTN 1 -- Stake ST - , txOutDatumHash = Just (DatumHash "") - } - --- | Create an input given the index of the treasury and the 'Value' at this input. -inputTreasury :: Int -> Value -> TxInInfo -inputTreasury indx val = - TxInInfo - (TxOutRef "" 1) - TxOut - { txOutAddress = Address (treasuries !! indx) Nothing - , txOutValue = val - , txOutDatumHash = Just (DatumHash "") - } - --- | Create a input given the index of the user and the 'Value' at this input. -inputUser :: Int -> Value -> TxInInfo -inputUser indx val = - TxInInfo - (TxOutRef "" 1) - TxOut - { txOutAddress = Address (users !! indx) Nothing - , txOutValue = val - , txOutDatumHash = Just (DatumHash "") - } - --- | Create a input representing the collateral given by a user. -inputCollateral :: Int -> TxInInfo -inputCollateral indx = - TxInInfo -- Initiator - (TxOutRef "" 1) - TxOut - { txOutAddress = Address (users !! indx) Nothing - , txOutValue = Value.singleton "" "" 2000000 - , txOutDatumHash = Just (DatumHash "") - } - --- | Create an output at the nth treasury with the given 'Value'. -outputTreasury :: Int -> Value -> TxOut -outputTreasury indx val = - TxOut - { txOutAddress = Address (treasuries !! indx) Nothing - , txOutValue = val - , txOutDatumHash = Nothing +mkEffectDatum :: Parameters -> TreasuryWithdrawalDatum +mkEffectDatum ps = + TreasuryWithdrawalDatum + { receivers = Map.assocs ps.shouldDeliver + , treasuries = [ScriptCredential trScriptHash] } --- | Create an output at the nth user with the given 'Value'. -outputUser :: Int -> Value -> TxOut -outputUser indx val = - TxOut - { txOutAddress = Address (users !! indx) Nothing - , txOutValue = val - , txOutDatumHash = Nothing +effectRef :: TxOutRef +effectRef = TxOutRef "0b2086cbf8b6900f8cb65e012de4516cb66b5cb08a9aaba12a8b88be" 0 + +treasuryTxId :: TxId +treasuryTxId = "0ca36f3a357bc69579ab2531aecd1e7d3714d993c7820f40b864be15" + +mkEffectInputBuilder :: forall b. CombinableBuilder b => Parameters -> b +mkEffectInputBuilder ps = + let mkGATValue = Value.singleton authorityTokenSymbol "" + in mconcat + [ mint $ mkGATValue (-1) + , input $ + mconcat + [ script effectHash + , withRef effectRef + , withInlineDatum $ mkEffectDatum ps + , withValue $ mkGATValue 1 + ] + ] + +mkTreasuryInputBuilder :: + forall b. + CombinableBuilder b => + Parameters -> + b +mkTreasuryInputBuilder ps = + mtimesDefault ps.treasuryInputCount $ + input $ + mconcat + [ script trScriptHash + , withRefTxId treasuryTxId + , withInlineDatum () + , withValue $ fold ps.shouldDeliver + ] + +mkTreasuryPaybackOutputBuilder :: + forall b. + CombinableBuilder b => + Parameters -> + b +mkTreasuryPaybackOutputBuilder ps = + let sentAmount = fold ps.shouldDeliver + inputAmount = + flip Value.scale sentAmount $ + if ps.badTreasuryPaybackValue + then 1 + else ps.treasuryInputCount + paybackValue = inputAmount `subtractValue` sentAmount + in output $ + mconcat + [ script trScriptHash + , withValue paybackValue + , withInlineDatum () + ] + +mkReceiverOutputBuilder :: + forall b. + CombinableBuilder b => + Parameters -> + b +mkReceiverOutputBuilder ps = + let mkOutputValue = + (minAda <>) + . if ps.badReceivedValue + then const $ Value.singleton "" "bruh" 1 + else id + mkFinalOutputs = + mconcat + . (if ps.badReceiverOrder then reverse else id) + . (if ps.badReceivers then drop 1 else id) + mkOutput :: _ -> _ -> b + mkOutput cred value = + output $ + mconcat + [ credential cred + , withValue $ mkOutputValue value + , withInlineDatum () + ] + rawOutputs = + foldMap (uncurry $ singleton .* mkOutput) $ + Map.assocs ps.shouldDeliver + in mkFinalOutputs rawOutputs + +runEffect :: forall b. CombinableBuilder b => Parameters -> b +runEffect ps = + foldMap + ($ ps) + [ mkEffectInputBuilder + , mkTreasuryInputBuilder + , mkReceiverOutputBuilder + , mkTreasuryPaybackOutputBuilder + ] + +totallyValidParameters :: Parameters +totallyValidParameters = + Parameters + { shouldDeliver = + Map.fromList + [ (PubKeyCredential signer, Value.singleton "" "" 42_000_000) + , (PubKeyCredential signer2, Value.singleton "" "" 42_000_000) + , (ScriptCredential (head validatorHashes), Value.singleton "" "" 42_000_000) + ] + , treasuryInputCount = 2 + , badReceivedValue = False + , badReceivers = False + , badReceiverOrder = False + , badTreasuryPaybackValue = False } --- | Create a list of the outputs that are required as encoded in 'TreasuryWithdrawalDatum'. -buildReceiversOutputFromDatum :: TreasuryWithdrawalDatum -> [TxOut] -buildReceiversOutputFromDatum (TreasuryWithdrawalDatum xs _) = f <$> xs +mkTestTree :: + String -> + Parameters -> + Validity -> + SpecificationTree +mkTestTree name ps val = + group name [effect, treasury, authority] where - f x = - TxOut - { txOutAddress = Address (fst x) Nothing - , txOutValue = snd x - , txOutDatumHash = Nothing - } + spend = mkSpending runEffect ps + mint = mkMinting runEffect ps --- | Effect validator instance. -validator :: Validator -validator = mkValidator def $ treasuryWithdrawalValidator currSymbol + effect = + testValidator + val.forEffectValidator + "effect" + effectValidator + (mkEffectDatum ps) + () + (spend effectRef) --- | 'TokenName' that represents the hash of the 'Agora.Stake.Stake' validator. -validatorHashTN :: TokenName -validatorHashTN = let ValidatorHash vh = validatorHash validator in TokenName vh + treasury = + testValidator + val.forTreasury + "treasury" + trValidator + () + () + (spend $ TxOutRef treasuryTxId 1) -buildScriptContext :: [TxInInfo] -> [TxOut] -> ScriptContext -buildScriptContext inputs outputs = - ScriptContext - { scriptContextTxInfo = - TxInfo - { txInfoInputs = inputs - , txInfoOutputs = outputs - , txInfoFee = Value.singleton "" "" 2 - , txInfoMint = Value.singleton currSymbol validatorHashTN (-1) - , txInfoDCert = [] - , txInfoWdrl = [] - , txInfoValidRange = Interval.always - , txInfoSignatories = [signer] - , txInfoData = [] - , txInfoId = "0b2086cbf8b6900f8cb65e012de4516cb66b5cb08a9aaba12a8b88be" - } - , scriptContextPurpose = - Spending (TxOutRef "0b2086cbf8b6900f8cb65e012de4516cb66b5cb08a9aaba12a8b88be" 1) - } + authority = + testPolicy + val.forGATPolicy + "authority" + authorityTokenPolicy + () + (mint authorityTokenSymbol) diff --git a/agora-specs/Sample/Governor/Initialize.hs b/agora-specs/Sample/Governor/Initialize.hs index 167cb5a..6c6b692 100644 --- a/agora-specs/Sample/Governor/Initialize.hs +++ b/agora-specs/Sample/Governor/Initialize.hs @@ -21,18 +21,18 @@ module Sample.Governor.Initialize ( 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 Agora.Scripts ( - AgoraScripts (compiledGovernorPolicy), - governorSTAssetClass, - governorSTSymbol, - governorValidatorHash, - ) import Data.Default (Default (..)) +import Data.Map (Map, (!)) +import Data.Text (Text) +import Optics (view) +import Plutarch (Script) +import Plutarch.Api.V2 (scriptHash) import Plutarch.Context ( input, mint, @@ -42,20 +42,23 @@ import Plutarch.Context ( signedWith, txId, withDatum, - withOutRef, + withRef, withValue, ) -import PlutusLedgerApi.V1 ( - CurrencySymbol, - TxOutRef (TxOutRef), - ValidatorHash, - ) import PlutusLedgerApi.V1.Value (AssetClass (..)) import PlutusLedgerApi.V1.Value qualified as Value +import PlutusLedgerApi.V2 ( + CurrencySymbol (CurrencySymbol), + ScriptHash, + TxOutRef (TxOutRef), + getScriptHash, + ) import Sample.Shared ( + deterministicTracingConfig, minAda, ) import Sample.Shared qualified as Shared +import ScriptExport.ScriptInfo (runLinker) import Test.Specification (SpecificationTree, testPolicy) import Test.Util (CombinableBuilder, mkMinting, pubKeyHashes, sortValue) @@ -65,19 +68,19 @@ data Parameters = Parameters -- ^ Whether the 'GovernorDatum.proposalThresholds' field of the output -- governor datum is valid or not. , datumMaxTimeRangeWidthValid :: Bool - -- ^ Whether the 'GovernorDatum.maximumProposalsPerStake'field of the + -- ^ Whether the 'GovernorDatum.maximumCreatedProposalsPerStake'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. + -- ^ 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. } -------------------------------------------------------------------------------- @@ -89,17 +92,17 @@ validGovernorOutputDatum = , nextProposalId = ProposalId 0 , proposalTimings = def , createProposalTimeRangeMaxWidth = def - , maximumProposalsPerStake = 3 + , maximumCreatedProposalsPerStake = 3 } invalidProposalThresholds :: ProposalThresholds -invalidProposalThresholds = ProposalThresholds (-1) (-1) (-1) +invalidProposalThresholds = ProposalThresholds (-1) (-1) (-1) (-1) (-1) invalidMaxTimeRangeWidth :: MaxTimeRangeWidth invalidMaxTimeRangeWidth = MaxTimeRangeWidth 0 invalidProposalTimings :: ProposalTimingConfig -invalidProposalTimings = ProposalTimingConfig (-1) (-1) (-1) (-1) +invalidProposalTimings = ProposalTimingConfig (-1) (-1) (-1) (-1) (-1) (-1) witnessRef :: TxOutRef witnessRef = TxOutRef "b0353c22b0bd6c5296a8eef160ba25d90b5dc82a9bb8bdaa6823ffc19515d6ad" 0 @@ -110,17 +113,31 @@ governor = { gstOutRef = witnessRef } -scripts :: AgoraScripts -scripts = agoraScripts Shared.deterministicTracingConfing governor +scripts :: Map Text Script +scripts = + either + (error . show) + (fmap (view #script) . view #scripts) + ( runLinker + linker + (agoraScripts deterministicTracingConfig) + governor + ) -govAssetClass :: AssetClass -govAssetClass = governorSTAssetClass scripts +govPolicy :: Script +govPolicy = scripts ! "agora:governorPolicy" -govValidatorHash :: ValidatorHash -govValidatorHash = governorValidatorHash scripts +govValidator :: Script +govValidator = scripts ! "agora:governorValidator" govSymbol :: CurrencySymbol -govSymbol = governorSTSymbol scripts +govSymbol = CurrencySymbol . getScriptHash $ scriptHash govPolicy + +govAssetClass :: AssetClass +govAssetClass = AssetClass (govSymbol, "") + +govScriptHash :: ScriptHash +govScriptHash = scriptHash govValidator -------------------------------------------------------------------------------- @@ -175,7 +192,7 @@ mintGST ps = builder mconcat [ pubKey witnessPubKey , withValue witnessValue - , withOutRef witnessRef + , withRef witnessRef ] , output $ mconcat @@ -194,7 +211,7 @@ mintGST ps = builder else mempty in output $ mconcat - [ script govValidatorHash + [ script govScriptHash , withValue governorValue , datum ] @@ -274,6 +291,6 @@ mkTestCase name ps valid = testPolicy valid name - scripts.compiledGovernorPolicy + govPolicy () (mkMinting mintGST ps govSymbol) diff --git a/agora-specs/Sample/Governor/Mutate.hs b/agora-specs/Sample/Governor/Mutate.hs index df8a70c..e387e28 100644 --- a/agora-specs/Sample/Governor/Mutate.hs +++ b/agora-specs/Sample/Governor/Mutate.hs @@ -16,13 +16,13 @@ module Sample.Governor.Mutate ( invalidBundles, ) where -import Agora.Effect.NoOp (noOpValidator) import Agora.Governor (GovernorDatum (..), GovernorRedeemer (MutateGovernor)) import Agora.Proposal (ProposalId (ProposalId), ProposalThresholds (..)) -import Agora.Scripts (AgoraScripts (..)) -import Agora.Utils (validatorHashToTokenName) import Data.Default (def) -import Plutarch.Api.V1 (PValidator, mkValidator, validatorHash) +import Data.Map ((!)) +import Data.Text qualified as T +import Plutarch (Script) +import Plutarch.Api.V2 (PMintingPolicy, scriptHash) import Plutarch.Context ( input, mint, @@ -30,26 +30,34 @@ import Plutarch.Context ( pubKey, script, withDatum, - withOutRef, + withRef, withValue, ) -import PlutusLedgerApi.V1 ( +import Plutarch.Extra.AssetClass (assetClassValue) +import Plutarch.Extra.ScriptContext (scriptHashToTokenName) +import PlutusLedgerApi.V1.Value qualified as Value +import PlutusLedgerApi.V2 ( Data, + ScriptHash, TxOutRef (TxOutRef), - ValidatorHash, Value, toData, ) -import PlutusLedgerApi.V1.Value qualified as Value import Sample.Shared ( agoraScripts, authorityTokenSymbol, - govAssetClass, - govValidatorHash, + governorAssetClass, + governorScriptHash, + governorValidator, minAda, ) import Test.Specification (SpecificationTree, testValidator) -import Test.Util (CombinableBuilder, mkSpending, pubKeyHashes, sortValue, validatorHashes) +import Test.Util ( + CombinableBuilder, + mkSpending, + pubKeyHashes, + sortValue, + ) -------------------------------------------------------------------------------- @@ -96,7 +104,7 @@ governorInputDatum = , nextProposalId = ProposalId 0 , proposalTimings = def , createProposalTimeRangeMaxWidth = def - , maximumProposalsPerStake = 3 + , maximumCreatedProposalsPerStake = 3 } mkGovernorOutputDatum :: @@ -106,14 +114,16 @@ mkGovernorOutputDatum DatumValid = Just $ toData $ governorInputDatum - { maximumProposalsPerStake = 4 + { maximumCreatedProposalsPerStake = 4 } mkGovernorOutputDatum ValueInvalid = let invalidProposalThresholds = ProposalThresholds { execute = -1 , create = -1 + , toVoting = -1 , vote = -1 + , cosign = -1 } in Just $ toData $ @@ -135,22 +145,22 @@ governorRedeemer = MutateGovernor mkGovernorBuilder :: forall b. CombinableBuilder b => GovernorParameters -> b mkGovernorBuilder ps = - let gst = Value.assetClassValue govAssetClass 1 + let gst = assetClassValue governorAssetClass 1 value = sortValue $ gst <> minAda gstOutput = if ps.stealGST then pubKey $ head pubKeyHashes - else script govValidatorHash + else script governorScriptHash withGSTDatum = maybe mempty withDatum $ mkGovernorOutputDatum ps.governorOutputDatumValidity in mconcat [ input $ mconcat - [ script govValidatorHash + [ script governorScriptHash , withDatum governorInputDatum , withValue value - , withOutRef governorRef + , withRef governorRef ] , output $ mconcat @@ -162,21 +172,28 @@ mkGovernorBuilder ps = -------------------------------------------------------------------------------- -mockEffectValidator :: ClosedTerm PValidator -mockEffectValidator = noOpValidator authorityTokenSymbol +mockEffectValidator :: Script +mockEffectValidator = agoraScripts ! "agora:noOpValidator" -mockEffectValidatorHash :: ValidatorHash -mockEffectValidatorHash = validatorHash $ mkValidator def mockEffectValidator +mockEffectScriptHash :: ScriptHash +mockEffectScriptHash = scriptHash mockEffectValidator + +mockAuthScript :: ClosedTerm PMintingPolicy +mockAuthScript = plam $ \_ _ -> popaque $ pcon PUnit + +mockAuthScriptHash :: ScriptHash +mockAuthScriptHash = + scriptHash . either (error . T.unpack) id $ compile def mockAuthScript mkGATValue :: GATValidity -> Integer -> Value mkGATValue NoGAT _ = mempty mkGATValue v q = - let gatOwner = case v of - GATValid -> mockEffectValidatorHash - WrongTag -> head validatorHashes + let authScript = case v of + GATValid -> mockAuthScriptHash + WrongTag -> "" in Value.singleton authorityTokenSymbol - (validatorHashToTokenName gatOwner) + (scriptHashToTokenName authScript) q mkMockEffectBuilder :: forall b. CombinableBuilder b => MockEffectParameters -> b @@ -192,12 +209,12 @@ mkMockEffectBuilder ps = [ mint burnt , input $ mconcat - [ script mockEffectValidatorHash + [ script mockEffectScriptHash , withValue inputValue ] , output $ mconcat - [ script mockEffectValidatorHash + [ script mockEffectScriptHash , withValue outputValue ] ] @@ -219,7 +236,7 @@ mkTestCase name pb (Validity forGov) = testValidator forGov name - agoraScripts.compiledGovernorValidator + governorValidator governorInputDatum governorRedeemer (mkSpending mutate pb governorRef) diff --git a/agora-specs/Sample/Proposal/Advance.hs b/agora-specs/Sample/Proposal/Advance.hs index 6e7a3f1..999964d 100644 --- a/agora-specs/Sample/Proposal/Advance.hs +++ b/agora-specs/Sample/Proposal/Advance.hs @@ -24,26 +24,31 @@ module Sample.Proposal.Advance ( mkValidToNextStateBundle, mkValidToNextStateBundles, mkValidToFailedStateBundles, + mkValidToFinishedInlineGATDatumBundles, mkInsufficientVotesBundle, mkAmbiguousWinnerBundle, mkFromFinishedBundles, mkInsufficientCosignsBundle, mkToNextStateTooLateBundles, - mkInvalidOutputStakeBundles, mkMintGATsForWrongEffectsBundle, mkNoGATMintedBundle, mkGATsWithWrongDatumBundle, mkMintGATsWithoutTagBundle, mkBadGovernorOutputDatumBundle, + mkUnexpectedOutputStakeBundles, + mkFastforwardToFinishBundles, + mkBadGovernorRedeemerBundle, ) where import Agora.Governor ( Governor (..), GovernorDatum (..), - GovernorRedeemer (MintGATs), + GovernorRedeemer (CreateProposal, MintGATs), ) import Agora.Proposal ( ProposalDatum (..), + ProposalEffectGroup, + ProposalEffectMetadata (ProposalEffectMetadata), ProposalId (ProposalId), ProposalRedeemer (AdvanceProposal), ProposalStatus (..), @@ -61,57 +66,63 @@ import Agora.Proposal.Time ( votingTime ), ) -import Agora.Scripts (AgoraScripts (..)) +import Agora.SafeMoney (AuthorityTokenTag, GTTag) import Agora.Stake ( StakeDatum (..), - StakeRedeemer (WitnessStake), ) -import Agora.Utils (validatorHashToTokenName) +import Control.Applicative (liftA2) import Control.Monad.State (execState, modify, when) import Data.Default (def) -import Data.List (sort) -import Data.Maybe (catMaybes, fromJust) -import Data.Tagged (Tagged (..), untag) +import Data.List (singleton, sort) +import Data.Map.Strict qualified as StrictMap +import Data.Maybe (fromJust) +import Data.Tagged (Tagged (Tagged), untag) import Plutarch.Context ( input, mint, output, + referenceInput, script, signedWith, timeRange, withDatum, - withOutRef, + withInlineDatum, + withRedeemer, + withRef, withValue, ) +import Plutarch.Extra.AssetClass (AssetClass (AssetClass), assetClassValue) +import Plutarch.Extra.ScriptContext (scriptHashToTokenName) import Plutarch.Lift (PLifted, PUnsafeLiftDecl) -import PlutusLedgerApi.V1 ( +import PlutusLedgerApi.V2 ( + Credential (PubKeyCredential), DatumHash, POSIXTime, POSIXTimeRange, PubKeyHash, + ScriptHash, TxOutRef (TxOutRef), - ValidatorHash, ) -import PlutusLedgerApi.V1.Value (AssetClass (..)) -import PlutusLedgerApi.V1.Value qualified as Value -import PlutusTx.AssocMap qualified as AssocMap +import PlutusTx qualified import Sample.Proposal.Shared ( governorTxRef, proposalTxRef, stakeTxRef, ) import Sample.Shared ( - agoraScripts, + authorityTokenPolicy, authorityTokenSymbol, - govAssetClass, - govValidatorHash, governor, + governorAssetClass, + governorScriptHash, + governorValidator, minAda, - proposalPolicySymbol, - proposalValidatorHash, + proposalAssetClass, + proposalScriptHash, + proposalValidator, signer, stakeAssetClass, - stakeValidatorHash, + stakeScriptHash, ) import Test.Specification ( SpecificationTree, @@ -127,9 +138,9 @@ import Test.Util ( mkMinting, mkSpending, pubKeyHashes, + scriptHashes, sortValue, toDatum, - updateMap, validatorHashes, ) @@ -144,7 +155,7 @@ data ParameterBundle = ParameterBundle , governorParameters :: Maybe GovernorParameters -- ^ Parameters related to GST moving. If set to 'Nothing', the GST won't -- be moved, thus the governor validator won't be run in 'mkTestTree'. - , authorityTokenParameters :: Maybe AuthorityTokenParameters + , authorityTokenParameters :: [AuthorityTokenParameters] -- ^ Parameters related to GAT minting. If set to 'Nothing', no GAT will -- be minted, thus the GAT minting policy won't be run in 'mkTestTree'. , transactionTimeRange :: POSIXTimeRange @@ -157,9 +168,18 @@ data ParameterBundle = ParameterBundle } -- | Everything about the generated governor stuff. -newtype GovernorParameters = GovernorParameters +data GovernorParameters = forall + (redeemer :: Type) + (predeemer :: PType). + ( PUnsafeLiftDecl predeemer + , PLifted predeemer ~ redeemer + , PIsData predeemer + , PlutusTx.ToData redeemer + ) => + GovernorParameters { invalidGovernorOutputDatum :: Bool -- ^ The output governor datum will be changed. + , governorRedeemer :: redeemer } -- | Everything about the generated authority token stuff. @@ -171,13 +191,17 @@ data AuthorityTokenParameters = forall , PIsData pdatum ) => AuthorityTokenParameters - { mintGATsFor :: [ValidatorHash] + { mintGATsFor :: ScriptHash -- ^ GATs will be minted and sent to the given group of effects. , carryDatum :: Maybe datum -- ^ The datum that GAT UTxOs will be carrying. + , carryAuthScript :: Maybe ScriptHash + -- ^ The authentication script that GAT UTxOs link to through their token name. , invalidTokenName :: Bool -- ^ If set to true, GATs won't be tagged by their corresponding effect -- hashes. + , shouldInlineDatum :: Bool + -- ^ If set to true, the effect datum will be inlined. } -- | Represent the winning effect group(s). @@ -193,7 +217,7 @@ data ProposalParameters = ProposalParameters -- ^ What status is the proposal advancing from , toStatus :: ProposalStatus -- ^ What status is the proposal advancing to - , effectList :: [AssocMap.Map ValidatorHash DatumHash] + , effectList :: [ProposalEffectGroup] -- ^ The effect groups of the proposal. A neutral effect group is not -- required here. , winnerAndVotes :: Maybe (Winner, Integer) @@ -208,9 +232,8 @@ data ProposalParameters = ProposalParameters -- | Everything about the generated stake stuff. data StakeParameters = StakeParameters { numStake :: NumStake - , perStakeGTs :: Integer + , perStakeGTs :: Tagged GTTag Integer , transactionSignedByOwners :: Bool - , invalidStakeOutputDatum :: Bool } -- | Represent the number of stakes or the number of the cosigners. @@ -219,7 +242,7 @@ type NumStake = Int -- | Represent an index. type Index = Int -{- | The validity of the generated transacrion for variuos componets. +{- | The validity of the generated transaction for variuos componets. 'True' means valid, 'False' means invalid. -} data Validity = Validity @@ -234,8 +257,8 @@ data Validity = Validity -- * Proposal -- | Mock cosigners. -mkCosigners :: NumStake -> [PubKeyHash] -mkCosigners = sort . flip take pubKeyHashes +mkCosigners :: NumStake -> [Credential] +mkCosigners = sort . fmap PubKeyCredential . flip take pubKeyHashes -- | Allocate the result tag for the effect at the given index. outcomeIdxToResultTag :: Index -> ResultTag @@ -244,20 +267,20 @@ outcomeIdxToResultTag = ResultTag . fromIntegral -- | Add a neutral effect group and allocate result tags for the effect groups. mkEffects :: ProposalParameters -> - AssocMap.Map ResultTag (AssocMap.Map ValidatorHash DatumHash) + StrictMap.Map ResultTag ProposalEffectGroup mkEffects ps = let resultTags = map ResultTag [0 ..] - neutralEffect = AssocMap.empty + neutralEffect = StrictMap.empty finalEffects = ps.effectList <> [neutralEffect] - in AssocMap.fromList $ zip resultTags finalEffects + in StrictMap.fromList $ zip resultTags finalEffects -- | Set the votes of the winning group(s). setWinner :: (Winner, Integer) -> ProposalVotes -> ProposalVotes setWinner (All, votes) (ProposalVotes m) = - ProposalVotes $ AssocMap.mapMaybe (const $ Just votes) m + ProposalVotes $ StrictMap.mapMaybe (const $ Just votes) m setWinner (EffectAt winnerIdx, votes) (ProposalVotes m) = let winnerResultTag = outcomeIdxToResultTag winnerIdx - in ProposalVotes $ updateMap (const $ Just votes) winnerResultTag m + in ProposalVotes $ StrictMap.adjust (const votes) winnerResultTag m -- | Mock votes for the proposal, given the parameters. mkVotes :: @@ -270,7 +293,7 @@ mkVotes ps = -- | The starting time of every generated proposal. proposalStartingTime :: POSIXTime -proposalStartingTime = 0 +proposalStartingTime = 100 -- | Create the input proposal datum given the parameters. mkProposalInputDatum :: ProposalParameters -> ProposalDatum @@ -311,19 +334,19 @@ proposalRef = TxOutRef proposalTxRef 1 -} mkProposalBuilder :: forall b. CombinableBuilder b => ProposalParameters -> b mkProposalBuilder ps = - let pst = Value.singleton proposalPolicySymbol "" 1 + let pst = assetClassValue proposalAssetClass 1 value = sortValue $ minAda <> pst in mconcat [ input $ mconcat - [ script proposalValidatorHash - , withOutRef proposalRef + [ script proposalScriptHash + , withRef proposalRef , withDatum (mkProposalInputDatum ps) , withValue value ] , output $ mconcat - [ script proposalValidatorHash + [ script proposalScriptHash , withDatum (mkProposalOutputDatum ps) , withValue value ] @@ -340,7 +363,7 @@ proposalRedeemer = AdvanceProposal -- * Stake -- Mock owners of the stakes. -mkStakeOwners :: NumStake -> [PubKeyHash] +mkStakeOwners :: NumStake -> [Credential] mkStakeOwners = mkCosigners -- | Create the input stake datums given the parameters. @@ -348,32 +371,14 @@ mkStakeInputDatums :: StakeParameters -> [StakeDatum] mkStakeInputDatums ps = let template = StakeDatum - { stakedAmount = Tagged ps.perStakeGTs - , owner = "" + { stakedAmount = ps.perStakeGTs + , owner = PubKeyCredential "" , delegatedTo = Nothing , lockedBy = [] } in (\owner -> template {owner = owner}) <$> mkStakeOwners ps.numStake --- | Create the output stake datums given the parameters. -mkStakeOutputDatums :: StakeParameters -> [StakeDatum] -mkStakeOutputDatums ps = - let inputDatums = mkStakeInputDatums ps - outputStakedAmount = - Tagged $ - if ps.invalidStakeOutputDatum - then ps.perStakeGTs * 10 - else ps.perStakeGTs - modify inp = inp {stakedAmount = outputStakedAmount} - in modify <$> inputDatums - -{- | Get the input stake datum given the index. The range of the index is - @[0, 'StakeParameters.numStake - 1']@ --} -getStakeInputDatumAt :: StakeParameters -> Index -> StakeDatum -getStakeInputDatumAt ps = (!!) (mkStakeInputDatums ps) - -- | Create the reference to a particular stake UTXO. mkStakeRef :: Index -> TxOutRef mkStakeRef = TxOutRef stakeTxRef . (+ 3) . fromIntegral @@ -386,43 +391,30 @@ mkStakeBuilder ps = let perStakeValue = sortValue $ minAda - <> Value.assetClassValue stakeAssetClass 1 - <> Value.assetClassValue - (untag governor.gtClassRef) + <> assetClassValue stakeAssetClass 1 + <> assetClassValue + governor.gtClassRef ps.perStakeGTs - perStake idx i o = + perStake idx i = let withSig = - if ps.transactionSignedByOwners - then signedWith i.owner - else mempty + case (i.owner, ps.transactionSignedByOwners) of + (PubKeyCredential owner, True) -> signedWith owner + _ -> mempty in mconcat [ withSig - , input $ + , referenceInput $ mconcat - [ script stakeValidatorHash - , withOutRef (mkStakeRef idx) + [ script stakeScriptHash + , withRef (mkStakeRef idx) , withValue perStakeValue - , withDatum i - ] - , output $ - mconcat - [ script stakeValidatorHash - , withValue perStakeValue - , withDatum o + , withInlineDatum i ] ] in mconcat $ - zipWith3 + zipWith perStake [0 :: Index ..] (mkStakeInputDatums ps) - (mkStakeOutputDatums ps) - -{- | The proposal redeemer used to spend the stake UTXO, which is always - 'WitnessStake' in this case. --} -stakeRedeemer :: StakeRedeemer -stakeRedeemer = WitnessStake -------------------------------------------------------------------------------- @@ -436,14 +428,14 @@ governorInputDatum = , nextProposalId = ProposalId 42 , proposalTimings = def , createProposalTimeRangeMaxWidth = def - , maximumProposalsPerStake = 3 + , maximumCreatedProposalsPerStake = 3 } -- | Create the output governor datum given the parameters. mkGovernorOutputDatum :: GovernorParameters -> GovernorDatum mkGovernorOutputDatum ps = if ps.invalidGovernorOutputDatum - then governorInputDatum {maximumProposalsPerStake = 15} + then governorInputDatum {maximumCreatedProposalsPerStake = 15} else governorInputDatum -- | Reference to the governor UTXO. @@ -454,32 +446,27 @@ governorRef = TxOutRef governorTxRef 2 governor validator. -} mkGovernorBuilder :: forall b. CombinableBuilder b => GovernorParameters -> b -mkGovernorBuilder ps = - let gst = Value.assetClassValue govAssetClass 1 +mkGovernorBuilder ps@(GovernorParameters _ redeemer) = + let gst = assetClassValue governorAssetClass 1 value = sortValue $ gst <> minAda in mconcat [ input $ mconcat - [ script govValidatorHash + [ script governorScriptHash , withValue value - , withOutRef governorRef + , withRef governorRef , withDatum governorInputDatum + , withRedeemer redeemer ] , output $ mconcat - [ script govValidatorHash + [ script governorScriptHash , withValue value - , withOutRef governorRef + , withRef governorRef , withDatum (mkGovernorOutputDatum ps) ] ] -{- | The proposal redeemer used to spend the governor UTXO, which is always - 'MintGATs' in this case. --} -governorRedeemer :: GovernorRedeemer -governorRedeemer = MintGATs - -------------------------------------------------------------------------------- -- * Authority Token @@ -492,27 +479,26 @@ mkAuthorityTokenBuilder :: CombinableBuilder b => AuthorityTokenParameters -> b -mkAuthorityTokenBuilder (AuthorityTokenParameters es mdt invalidTokenName) = - foldMap perEffect es - where - perEffect :: ValidatorHash -> b - perEffect vh = - let tn = - if invalidTokenName - then "" - else validatorHashToTokenName vh - ac = AssetClass (authorityTokenSymbol, tn) - minted = Value.assetClassValue ac 1 - value = sortValue $ minAda <> minted - in mconcat - [ mint minted - , output $ - mconcat - [ script vh - , maybe mempty withDatum mdt - , withValue value - ] - ] +mkAuthorityTokenBuilder ps@AuthorityTokenParameters {carryDatum, shouldInlineDatum} = + let tn = + case (ps.invalidTokenName, ps.carryAuthScript) of + (True, Just _) -> "deadbeef" + (True, Nothing) -> "deadbeef" + (False, Just as) -> scriptHashToTokenName as + (False, Nothing) -> "" + ac = Tagged @AuthorityTokenTag $ AssetClass authorityTokenSymbol tn + minted = assetClassValue ac 1 + value = sortValue $ minAda <> minted + withDatum' = if shouldInlineDatum then withInlineDatum else withDatum + in mconcat + [ mint minted + , output $ + mconcat + [ script ps.mintGATsFor + , maybe mempty withDatum' carryDatum + , withValue value + ] + ] -- | The redeemer used while running the authority token policy. authorityTokenRedeemer :: () @@ -532,7 +518,7 @@ advance pb = [ mkProposalBuilder pb.proposalParameters , mkStakeBuilder pb.stakeParameters , mkBuilderMaybe mkGovernorBuilder pb.governorParameters - , mkBuilderMaybe mkAuthorityTokenBuilder pb.authorityTokenParameters + , foldMap mkAuthorityTokenBuilder pb.authorityTokenParameters , timeRange pb.transactionTimeRange , maybe mempty signedWith pb.extraSignature ] @@ -548,52 +534,48 @@ mkTestTree :: Validity -> SpecificationTree mkTestTree name pb val = - group name $ catMaybes [proposal, stake, governor, authority] + group name $ mconcat [proposal, governor, authority] where spend = mkSpending advance pb - mint = mkMinting advance pb proposal = let proposalInputDatum = mkProposalInputDatum pb.proposalParameters - in Just $ + in singleton $ testValidator val.forProposalValidator "proposal" - agoraScripts.compiledProposalValidator + proposalValidator proposalInputDatum proposalRedeemer (spend proposalRef) - stake = - let idx = 0 - in Just $ - testValidator - val.forStakeValidator - "stake" - agoraScripts.compiledStakeValidator - (getStakeInputDatumAt pb.stakeParameters idx) - stakeRedeemer - ( spend (mkStakeRef idx) - ) - governor = - testValidator - (fromJust val.forGovernorValidator) - "governor" - agoraScripts.compiledGovernorValidator - governorInputDatum - governorRedeemer - (spend governorRef) - <$ pb.governorParameters + maybe + [] + ( singleton + . ( \(GovernorParameters _ governorRedeemer) -> + testValidator + (fromJust val.forGovernorValidator) + "governor" + governorValidator + governorInputDatum + governorRedeemer + (spend governorRef) + ) + ) + (pb.governorParameters) - authority = - testPolicy - (fromJust val.forAuthorityTokenPolicy) - "authority" - agoraScripts.compiledAuthorityTokenPolicy - authorityTokenRedeemer - (mint authorityTokenSymbol) - <$ (pb.authorityTokenParameters) + authority = case pb.authorityTokenParameters of + [] -> [] + _ -> + singleton + ( testPolicy + (fromJust val.forAuthorityTokenPolicy) + "authority" + authorityTokenPolicy + authorityTokenRedeemer + (mkMinting advance pb authorityTokenSymbol) + ) {- | Create a test tree that runs a bunch of parameter bundles. These bundles should have the same validity. @@ -651,7 +633,8 @@ mkInTimeTimeRange advanceFrom = + (def :: ProposalTimingConfig).draftTime + (def :: ProposalTimingConfig).votingTime + (def :: ProposalTimingConfig).lockingTime - + (def :: ProposalTimingConfig).executingTime - 1 + + (def :: ProposalTimingConfig).executingTime + - 1 ) Finished -> error "Cannot advance 'Finished' proposal" @@ -667,7 +650,8 @@ mkTooLateTimeRange advanceFrom = (proposalStartingTime + (def :: ProposalTimingConfig).draftTime + 1) ( proposalStartingTime + (def :: ProposalTimingConfig).draftTime - + (def :: ProposalTimingConfig).votingTime - 1 + + (def :: ProposalTimingConfig).votingTime + - 1 ) -- [S + D + V + L + 1, S + D + V + L + E -1] VotingReady -> @@ -713,10 +697,12 @@ getNextState = \case Finished -> error "Cannot advance 'Finished' proposal" -- | Calculate the number of GTs per stake in order to exceed the minimum limit. -compPerStakeGTsForDraft :: NumStake -> Integer +compPerStakeGTsForDraft :: NumStake -> Tagged GTTag Integer compPerStakeGTsForDraft nCosigners = - untag (def :: ProposalThresholds).vote - `div` fromIntegral nCosigners + 1 + Tagged $ + untag (def :: ProposalThresholds).toVoting + `div` fromIntegral nCosigners + + 1 dummyDatum :: () dummyDatum = () @@ -725,29 +711,41 @@ dummyDatumHash :: DatumHash dummyDatumHash = datumHash $ toDatum dummyDatum -- | Create given number of effect groups. Each group will have 3 effects. -mkMockEffects :: Int -> [AssocMap.Map ValidatorHash DatumHash] -mkMockEffects = - flip - take - ( AssocMap.fromList - . flip zip (repeat dummyDatumHash) - <$> groupsOfN 3 validatorHashes - ) +mkMockEffects :: Bool -> Int -> [ProposalEffectGroup] +mkMockEffects useAuthScript n = effects + where + effectsPerGroup = 3 -numberOfVotesThatExceedsTheMinimumRequirement :: Integer -numberOfVotesThatExceedsTheMinimumRequirement = - untag (def @ProposalThresholds).execute + 1 + mkAuthScripts True = Just <$> scriptHashes + mkAuthScripts False = repeat Nothing + authScripts = mkAuthScripts useAuthScript + + datums = repeat dummyDatumHash + + effectMetadata = zipWith ProposalEffectMetadata datums authScripts + effectScripts = validatorHashes + + effects = + take n $ + StrictMap.fromList + <$> groupsOfN + effectsPerGroup + (zip effectScripts effectMetadata) + +numberOfVotesThatJustMeetsTheMinimumRequirement :: Integer +numberOfVotesThatJustMeetsTheMinimumRequirement = + untag (def @ProposalThresholds).execute mkWinnerVotes :: Index -> (Winner, Integer) mkWinnerVotes idx = ( EffectAt idx - , numberOfVotesThatExceedsTheMinimumRequirement + , numberOfVotesThatJustMeetsTheMinimumRequirement ) ambiguousWinnerVotes :: (Winner, Integer) ambiguousWinnerVotes = ( All - , numberOfVotesThatExceedsTheMinimumRequirement + , numberOfVotesThatJustMeetsTheMinimumRequirement ) -------------------------------------------------------------------------------- @@ -767,16 +765,18 @@ defaultWinnerIdx = 0 mkValidToNextStateBundle :: -- | Number of cosigners. Word -> - -- | Number of effects + -- | Number of effects. Word -> + -- | Toggle the referenc script in GAT UTXO. + Bool -> -- | The initial proposal state, should not be 'Finished'. ProposalStatus -> ParameterBundle -mkValidToNextStateBundle _ _ Finished = +mkValidToNextStateBundle _ _ _ Finished = error "Cannot advance from Finished" -mkValidToNextStateBundle nCosigners nEffects from = +mkValidToNextStateBundle nCosigners nEffects authScript from = let next = getNextState from - effects = mkMockEffects $ fromIntegral nEffects + effects = mkMockEffects authScript $ fromIntegral nEffects winner = defaultWinnerIdx template = @@ -792,15 +792,14 @@ mkValidToNextStateBundle nCosigners nEffects from = } , stakeParameters = StakeParameters - { numStake = 1 + { numStake = 0 , perStakeGTs = compPerStakeGTsForDraft $ fromIntegral nCosigners , transactionSignedByOwners = False - , invalidStakeOutputDatum = False } , governorParameters = Nothing - , authorityTokenParameters = Nothing + , authorityTokenParameters = [] , transactionTimeRange = mkInTimeTimeRange from , extraSignature = Just signer } @@ -830,18 +829,26 @@ mkValidToNextStateBundle nCosigners nEffects from = when (from == Locked) $ modify $ \b -> let aut = - AuthorityTokenParameters - { mintGATsFor = AssocMap.keys $ effects !! winner - , carryDatum = Just dummyDatum - , invalidTokenName = False - } + StrictMap.elems $ + StrictMap.mapWithKey + ( \vh (ProposalEffectMetadata _ authScript) -> + AuthorityTokenParameters + { mintGATsFor = vh + , carryDatum = Just dummyDatum + , carryAuthScript = authScript + , invalidTokenName = False + , shouldInlineDatum = False + } + ) + (effects !! winner) gov = GovernorParameters { invalidGovernorOutputDatum = False + , governorRedeemer = MintGATs } in b { governorParameters = Just gov - , authorityTokenParameters = Just aut + , authorityTokenParameters = aut } in execState modifyTemplate template @@ -852,11 +859,34 @@ mkValidToNextStateBundles :: Word -> [ParameterBundle] mkValidToNextStateBundles nCosigners nEffects = - mkValidToNextStateBundle nCosigners nEffects - <$> [ Draft - , VotingReady - , Locked - ] + liftA2 + (mkValidToNextStateBundle nCosigners nEffects) + [True, False] + [Draft, VotingReady, Locked] + +mkValidToFinishedInlineGATDatumBundles :: + Word -> + Word -> + [ParameterBundle] +mkValidToFinishedInlineGATDatumBundles nCosigners nEffects = + let templates = + liftA2 + (mkValidToNextStateBundle nCosigners nEffects) + [True, False] + [Locked] + + modifyTemplate template = + template + { authorityTokenParameters = + modifyAuthorityParameters + <$> template.authorityTokenParameters + } + + modifyAuthorityParameters params = + params + { shouldInlineDatum = True + } + in modifyTemplate <$> templates mkValidToFailedStateBundles :: -- | Number of cosigners @@ -865,15 +895,14 @@ mkValidToFailedStateBundles :: Word -> [ParameterBundle] mkValidToFailedStateBundles nCosigners nEffects = - mkBundle - <$> [ Draft - , VotingReady - , Locked - ] + liftA2 + mkBundle + [True, False] + [Draft, VotingReady, Locked] where - mkBundle from = + mkBundle authScript from = let next = Finished - effects = mkMockEffects $ fromIntegral nEffects + effects = mkMockEffects authScript $ fromIntegral nEffects in ParameterBundle { proposalParameters = ProposalParameters @@ -886,15 +915,14 @@ mkValidToFailedStateBundles nCosigners nEffects = } , stakeParameters = StakeParameters - { numStake = 1 + { numStake = 0 , perStakeGTs = compPerStakeGTsForDraft $ fromIntegral nCosigners , transactionSignedByOwners = False - , invalidStakeOutputDatum = False } , governorParameters = Nothing - , authorityTokenParameters = Nothing + , authorityTokenParameters = [] , transactionTimeRange = mkTooLateTimeRange from , extraSignature = Just signer } @@ -908,14 +936,13 @@ mkFromFinishedBundles :: Word -> [ParameterBundle] mkFromFinishedBundles nCosigners nEffects = - mkBundle - <$> [ Draft - , VotingReady - , Locked - ] + liftA2 + mkBundle + [True, False] + [Draft, VotingReady, Locked] where - mkBundle from = - let template = mkValidToNextStateBundle nCosigners nEffects from + mkBundle authScript from = + let template = mkValidToNextStateBundle nCosigners nEffects authScript from in template { proposalParameters = template.proposalParameters @@ -926,28 +953,30 @@ mkFromFinishedBundles nCosigners nEffects = mkToNextStateTooLateBundles :: Word -> Word -> [ParameterBundle] mkToNextStateTooLateBundles nCosigners nEffects = - mkBundle - <$> [ Draft - , VotingReady - , Locked - ] + liftA2 + mkBundle + [True, False] + [Draft, VotingReady, Locked] where - mkBundle from = - let template = mkValidToNextStateBundle nCosigners nEffects from + mkBundle authScript from = + let template = mkValidToNextStateBundle nCosigners nEffects authScript from in template { transactionTimeRange = mkTooLateTimeRange from } -mkInvalidOutputStakeBundles :: Word -> Word -> [ParameterBundle] -mkInvalidOutputStakeBundles nCosigners nEffects = - mkBundle <$> [Draft, VotingReady, Locked] +mkUnexpectedOutputStakeBundles :: Word -> Word -> [ParameterBundle] +mkUnexpectedOutputStakeBundles nCosigners nEffects = + liftA2 + mkBundle + [True, False] + [VotingReady, Locked] where - mkBundle from = - let template = mkValidToNextStateBundle nCosigners nEffects from + mkBundle authScript from = + let template = mkValidToNextStateBundle nCosigners nEffects authScript from in template { stakeParameters = template.stakeParameters - { invalidStakeOutputDatum = True + { numStake = 1 } } @@ -963,9 +992,11 @@ mkInsufficientCosignsBundle nCosigners nEffects = } where insuffcientPerStakeGTs = - untag (def :: ProposalThresholds).vote - `div` fromIntegral nCosigners - 1 - template = mkValidToNextStateBundle nCosigners nEffects Draft + Tagged $ + untag (def :: ProposalThresholds).toVoting + `div` fromIntegral nCosigners + - 1 + template = mkValidToNextStateBundle nCosigners nEffects False Draft -- * From VotingReady @@ -986,7 +1017,7 @@ mkInsufficientVotesBundle :: Word -> ParameterBundle mkInsufficientVotesBundle nCosigners nEffects = - mkValidToNextStateBundle nCosigners nEffects VotingReady + mkValidToNextStateBundle nCosigners nEffects False VotingReady `setWinnerAndVotes` Nothing mkAmbiguousWinnerBundle :: @@ -994,14 +1025,14 @@ mkAmbiguousWinnerBundle :: Word -> ParameterBundle mkAmbiguousWinnerBundle nCosigners nEffects = - mkValidToNextStateBundle nCosigners nEffects VotingReady + mkValidToNextStateBundle nCosigners nEffects False VotingReady `setWinnerAndVotes` Just ambiguousWinnerVotes -- * From Locked mkValidFromLockedBundle :: Word -> Word -> ParameterBundle mkValidFromLockedBundle nCosigners nEffects = - mkValidToNextStateBundle nCosigners nEffects Locked + mkValidToNextStateBundle nCosigners nEffects False Locked mkMintGATsForWrongEffectsBundle :: Word -> @@ -1010,17 +1041,11 @@ mkMintGATsForWrongEffectsBundle :: mkMintGATsForWrongEffectsBundle nCosigners nEffects = template { authorityTokenParameters = - ( \aut -> - aut - { mintGATsFor = - [ validatorHashes !! 1 - , validatorHashes !! 3 - , validatorHashes !! 5 - , validatorHashes !! 7 - ] - } - ) - <$> template.authorityTokenParameters + take 4 $ + zipWith + (\a i -> a {mintGATsFor = validatorHashes !! i}) + template.authorityTokenParameters + [1, 3 ..] } where template = mkValidFromLockedBundle nCosigners nEffects @@ -1031,7 +1056,7 @@ mkNoGATMintedBundle :: ParameterBundle mkNoGATMintedBundle nCosigners nEffects = template - { authorityTokenParameters = Nothing + { authorityTokenParameters = [] } where template = mkValidFromLockedBundle nCosigners nEffects @@ -1059,16 +1084,20 @@ mkGATsWithWrongDatumBundle :: ParameterBundle mkGATsWithWrongDatumBundle nCosigners nEffects = template - { authorityTokenParameters = Just newAut + { authorityTokenParameters = newAut } where template = mkValidFromLockedBundle nCosigners nEffects - aut = fromJust template.authorityTokenParameters newAut = - AuthorityTokenParameters - aut.mintGATsFor - (Just (1 :: Integer)) - False + ( \aut -> + AuthorityTokenParameters + aut.mintGATsFor + (Just (1 :: Integer)) + aut.carryAuthScript + False + False + ) + <$> template.authorityTokenParameters mkBadGovernorOutputDatumBundle :: Word -> @@ -1080,4 +1109,47 @@ mkBadGovernorOutputDatumBundle nCosigners nEffects = } where template = mkValidFromLockedBundle nCosigners nEffects - gov = GovernorParameters True + gov = GovernorParameters True MintGATs + +mkBadGovernorRedeemerBundle :: + Word -> + Word -> + ParameterBundle +mkBadGovernorRedeemerBundle nCosigners nEffects = + template + { governorParameters = Just gov + } + where + template = mkValidFromLockedBundle nCosigners nEffects + gov = GovernorParameters False CreateProposal + +mkFastforwardToFinishBundles :: + Word -> + Word -> + [ParameterBundle] +mkFastforwardToFinishBundles nCosigners nEffects = updateTemplate <$> templates + where + templates = mkValidToFailedStateBundles nCosigners nEffects + mkMaliciousTimRange = + let lb = proposalStartingTime - 1 + dub = + 1 + + proposalStartingTime + + (def :: ProposalTimingConfig).draftTime + vub = + dub + + (def :: ProposalTimingConfig).votingTime + + (def :: ProposalTimingConfig).lockingTime + lub = + vub + + (def :: ProposalTimingConfig).executingTime + go Draft = (lb, dub) + go VotingReady = (lb, vub) + go Locked = (lb, lub) + go Finished = error "cannot advance from Finished" + in uncurry closedBoundedInterval . go + updateTemplate template = + template + { transactionTimeRange = + mkMaliciousTimRange template.proposalParameters.fromStatus + } diff --git a/agora-specs/Sample/Proposal/Cosign.hs b/agora-specs/Sample/Proposal/Cosign.hs index 09f0b67..f4ef7b0 100644 --- a/agora-specs/Sample/Proposal/Cosign.hs +++ b/agora-specs/Sample/Proposal/Cosign.hs @@ -6,12 +6,22 @@ Description: Generate sample data for testing the functionalities of cosigning p Sample and utilities for testing the functionalities of cosigning proposals. -} module Sample.Proposal.Cosign ( - Parameters (..), - validCosignNParameters, - duplicateCosignersParameters, - statusNotDraftCosignNParameters, - invalidStakeOutputParameters, + StakedAmount (..), + StakeOwner (..), + StakeParameters (..), + SignedBy (..), + TransactionParameters (..), + ProposalParameters (..), + ParameterBundle (..), + Validity (..), + cosign, mkTestTree, + totallyValid, + insufficientStakedAmount, + duplicateCosigners, + locksNotUpdated, + cosignersNotUpdated, + cosignAfterDraft, ) where import Agora.Governor (Governor (..)) @@ -20,6 +30,7 @@ import Agora.Proposal ( ProposalId (ProposalId), ProposalRedeemer (Cosign), ProposalStatus (..), + ProposalThresholds (..), ResultTag (ResultTag), emptyVotesFor, ) @@ -28,194 +39,272 @@ import Agora.Proposal.Time ( ProposalTimingConfig (draftTime), ) import Agora.SafeMoney (GTTag) -import Agora.Scripts (AgoraScripts (..)) import Agora.Stake ( - StakeDatum (StakeDatum, owner), - StakeRedeemer (WitnessStake), - stakedAmount, + ProposalAction (Cosigned, Created), + ProposalLock (ProposalLock), + StakeDatum (..), + StakeRedeemer (PermitVote), ) import Data.Coerce (coerce) import Data.Default (def) import Data.List (sort) -import Data.Tagged (Tagged, untag) +import Data.Map.Strict qualified as StrictMap +import Data.Tagged (Tagged) import Plutarch.Context ( input, + normalizeValue, output, script, signedWith, timeRange, txId, withDatum, - withOutRef, - withTxId, + withInlineDatum, + withRedeemer, + withRef, withValue, ) -import PlutusLedgerApi.V1 ( - POSIXTimeRange, +import Plutarch.Extra.AssetClass (assetClassValue) +import PlutusLedgerApi.V2 ( + Credential (PubKeyCredential), + POSIXTime (POSIXTime), PubKeyHash, - TxOutRef (..), - Value, + TxOutRef (TxOutRef), ) -import PlutusLedgerApi.V1.Value qualified as Value -import PlutusTx.AssocMap qualified as AssocMap import Sample.Proposal.Shared (proposalTxRef, stakeTxRef) import Sample.Shared ( - agoraScripts, governor, minAda, - proposalPolicySymbol, - proposalValidatorHash, - signer, + proposalAssetClass, + proposalScriptHash, + proposalValidator, stakeAssetClass, - stakeValidatorHash, + stakeScriptHash, + stakeValidator, ) import Test.Specification ( SpecificationTree, group, testValidator, ) -import Test.Util (CombinableBuilder, closedBoundedInterval, mkSpending, pubKeyHashes, sortValue) +import Test.Util ( + CombinableBuilder, + closedBoundedInterval, + mkSpending, + pubKeyHashes, + ) --- | Parameters for cosigning a proposal. -data Parameters = Parameters - { newCosigners :: [PubKeyHash] - -- ^ New cosigners to be added, and the owners of the generated stakes. - , proposalStatus :: ProposalStatus - -- ^ Current state of the proposal. - , alterOutputStakes :: Bool - -- ^ Whether to generate invalid stake outputs. - -- In particular, the 'stakedAmount' of all the stake datums will be set to zero. +data StakedAmount = Sufficient | Insufficient + +data StakeOwner = Creator | Other + +data StakeParameters = StakeParameters + { gtAmount :: StakedAmount + , stakeOwner :: StakeOwner + , dontUpdateLocks :: Bool } --- | Owner of the creator stake, doesn't really matter in this case. -proposalCreator :: PubKeyHash -proposalCreator = signer +data SignedBy = Owner | Delegatee | Unknown --- | The amount of GTs every generated stake has, doesn't really matter in this case. -perStakedGTs :: Tagged GTTag Integer -perStakedGTs = 5 +newtype TransactionParameters = TransactionParameters + { signedBy :: SignedBy + } -{- | Create input proposal datum given the parameters. - In particular, 'status' is set to 'proposalStstus'. --} -mkProposalInputDatum :: Parameters -> ProposalDatum +data ProposalParameters = ProposalParameters + { proposalStatus :: ProposalStatus + , dontUpdateCosigners :: Bool + } + +-- | Parameters for cosigning a proposal. +data ParameterBundle = ParameterBundle + { stakeParameters :: StakeParameters + , proposalParameters :: ProposalParameters + , transactionParameters :: TransactionParameters + } + +data Validity = Validity + { forProposalValidator :: Bool + , forStakeValidator :: Bool + } + +-------------------------------------------------------------------------------- + +mkStakeAmount :: StakedAmount -> Tagged GTTag Integer +mkStakeAmount Sufficient = (def @ProposalThresholds).cosign +mkStakeAmount Insufficient = mkStakeAmount Sufficient - 1 + +mkStakeOwner :: StakeOwner -> PubKeyHash +mkStakeOwner Creator = creator +mkStakeOwner Other = pubKeyHashes !! 2 + +mkSigner :: StakeOwner -> SignedBy -> PubKeyHash +mkSigner so Owner = mkStakeOwner so +mkSigner _ Delegatee = delegatee +mkSigner _ Unknown = pubKeyHashes !! 4 + +creator :: PubKeyHash +creator = pubKeyHashes !! 1 + +delegatee :: PubKeyHash +delegatee = pubKeyHashes !! 3 + +-------------------------------------------------------------------------------- + +defProposalId :: ProposalId +defProposalId = ProposalId 0 + +mkProposalInputDatum :: ParameterBundle -> ProposalDatum mkProposalInputDatum ps = let effects = - AssocMap.fromList - [ (ResultTag 0, AssocMap.empty) - , (ResultTag 1, AssocMap.empty) + StrictMap.fromList + [ (ResultTag 0, StrictMap.empty) + , (ResultTag 1, StrictMap.empty) ] in ProposalDatum { proposalId = ProposalId 0 , effects = effects - , status = ps.proposalStatus - , cosigners = [proposalCreator] + , status = ps.proposalParameters.proposalStatus + , cosigners = [PubKeyCredential creator] , thresholds = def , votes = emptyVotesFor effects , timingConfig = def , startingTime = ProposalStartingTime 0 } -{- | Create the output proposal datum given the parameters. - The 'newCosigners' is added to the exisiting list of cosigners, note the said list should be sorted in - ascending order. --} -mkProposalOutputDatum :: Parameters -> ProposalDatum +mkProposalOutputDatum :: ParameterBundle -> ProposalDatum mkProposalOutputDatum ps = let inputDatum = mkProposalInputDatum ps - in inputDatum - { cosigners = sort $ inputDatum.cosigners <> ps.newCosigners + stakeOwner = + PubKeyCredential $ + mkStakeOwner ps.stakeParameters.stakeOwner + newCosigners = + if ps.proposalParameters.dontUpdateCosigners + then inputDatum.cosigners + else sort $ stakeOwner : inputDatum.cosigners + in inputDatum {cosigners = newCosigners} + +proposalRedeemer :: ProposalRedeemer +proposalRedeemer = Cosign + +proposalRef :: TxOutRef +proposalRef = TxOutRef proposalTxRef 1 + +-------------------------------------------------------------------------------- + +mkStakeInputDatum :: ParameterBundle -> StakeDatum +mkStakeInputDatum ps = + let sps = ps.stakeParameters + amount = mkStakeAmount sps.gtAmount + owner = mkStakeOwner sps.stakeOwner + locks = case sps.stakeOwner of + Creator -> [ProposalLock defProposalId Created] + _ -> [] + in StakeDatum + { stakedAmount = amount + , owner = PubKeyCredential owner + , delegatedTo = Just $ PubKeyCredential delegatee + , lockedBy = locks } --- | Create all the input stakes given the parameters. -mkStakeInputDatums :: Parameters -> [StakeDatum] -mkStakeInputDatums = fmap (\pk -> StakeDatum perStakedGTs pk Nothing []) . newCosigners +mkStakeOuputDatum :: ParameterBundle -> StakeDatum +mkStakeOuputDatum ps = + let sps = ps.stakeParameters + inpDatum = mkStakeInputDatum ps + locks = + if sps.dontUpdateLocks + then inpDatum.lockedBy + else ProposalLock defProposalId Cosigned : inpDatum.lockedBy + in inpDatum {lockedBy = locks} + +stakeRedeemer :: StakeRedeemer +stakeRedeemer = PermitVote + +stakeRef :: TxOutRef +stakeRef = TxOutRef stakeTxRef 0 + +-------------------------------------------------------------------------------- -- | Create a 'TxInfo' that tries to cosign a proposal with new cosigners. -cosign :: forall b. CombinableBuilder b => Parameters -> b +cosign :: forall b. CombinableBuilder b => ParameterBundle -> b cosign ps = builder where - pst = Value.singleton proposalPolicySymbol "" 1 - sst = Value.assetClassValue stakeAssetClass 1 + pst = assetClassValue proposalAssetClass 1 + sst = assetClassValue stakeAssetClass 1 - --- + ---------------------------------------------------------------------------- - stakeInputDatums :: [StakeDatum] - stakeInputDatums = mkStakeInputDatums ps + stakeInputDatum = mkStakeInputDatum ps + stakeOutputDatum = mkStakeOuputDatum ps - stakeValue :: Value stakeValue = - sortValue $ + normalizeValue $ minAda - <> Value.assetClassValue - (untag governor.gtClassRef) - (untag perStakedGTs) + <> assetClassValue + governor.gtClassRef + (mkStakeAmount ps.stakeParameters.gtAmount) <> sst stakeBuilder = - foldMap - ( \(stakeDatum, refIdx) -> - let stakeOutputDatum = - if ps.alterOutputStakes - then stakeDatum {stakedAmount = 0} - else stakeDatum - in mconcat - [ input $ - mconcat - [ script stakeValidatorHash - , withValue stakeValue - , withDatum stakeDatum - , withTxId stakeTxRef - , withOutRef (mkStakeRef refIdx) - ] - , output $ - mconcat - [ script stakeValidatorHash - , withValue stakeValue - , withDatum stakeOutputDatum - ] - , signedWith stakeDatum.owner - ] - ) - $ zip - stakeInputDatums - [0 ..] + mconcat + [ input $ + mconcat + [ script stakeScriptHash + , withValue stakeValue + , withInlineDatum stakeInputDatum + , withRef stakeRef + , withRedeemer stakeRedeemer + ] + , output $ + mconcat + [ script stakeScriptHash + , withValue stakeValue + , withInlineDatum stakeOutputDatum + ] + ] - --- + ---------------------------------------------------------------------------- - proposalInputDatum :: ProposalDatum proposalInputDatum = mkProposalInputDatum ps - - proposalOutputDatum :: ProposalDatum proposalOutputDatum = mkProposalOutputDatum ps + proposalValue = + normalizeValue $ + pst <> minAda + proposalBuilder = mconcat [ input $ mconcat - [ script proposalValidatorHash - , withValue pst + [ script proposalScriptHash + , withValue proposalValue , withDatum proposalInputDatum - , withTxId proposalTxRef - , withOutRef proposalRef + , withRef proposalRef + , withRedeemer proposalRedeemer ] , output $ mconcat - [ script proposalValidatorHash - , withValue (sortValue (pst <> minAda)) + [ script proposalScriptHash + , withValue proposalValue , withDatum proposalOutputDatum ] ] - validTimeRange :: POSIXTimeRange + ---------------------------------------------------------------------------- + validTimeRange = closedBoundedInterval (coerce proposalInputDatum.startingTime + 1) ( coerce proposalInputDatum.startingTime - + proposalInputDatum.timingConfig.draftTime - 1 + + proposalInputDatum.timingConfig.draftTime + - 1 ) - --- + sig = + mkSigner + ps.stakeParameters.stakeOwner + ps.transactionParameters.signedBy + + ---------------------------------------------------------------------------- builder = mconcat @@ -223,117 +312,107 @@ cosign ps = builder , timeRange validTimeRange , proposalBuilder , stakeBuilder + , signedWith sig ] --- | Reference index of the proposal UTXO. -proposalRefIdx :: Integer -proposalRefIdx = 1 +-------------------------------------------------------------------------------- --- | Spend the proposal ST. -proposalRef :: TxOutRef -proposalRef = TxOutRef proposalTxRef proposalRefIdx - --- | Consume the given stake. -mkStakeRef :: Int -> TxOutRef -mkStakeRef idx = - TxOutRef - stakeTxRef - $ proposalRefIdx + 1 + fromIntegral idx - --- | Create a proposal redeemer which cosigns with the new cosginers. -mkProposalRedeemer :: Parameters -> ProposalRedeemer -mkProposalRedeemer (sort . newCosigners -> cs) = Cosign cs - --- | Stake redeemer for cosuming all the stakes generated in the module. -stakeRedeemer :: StakeRedeemer -stakeRedeemer = WitnessStake - ---- - --- | Create a valid parameters that cosign the proposal with a given number of cosigners. -validCosignNParameters :: Int -> Parameters -validCosignNParameters n - | n > 0 = - Parameters - { newCosigners = take n pubKeyHashes - , proposalStatus = Draft - , alterOutputStakes = False - } - | otherwise = error "Number of cosigners should be positive" - ---- - -{- | Parameters that make 'cosign' yield duplicate cosigners. - Invalid for the ptoposal validator, perfectly valid for stake validator. --} -duplicateCosignersParameters :: Parameters -duplicateCosignersParameters = - Parameters - { newCosigners = [proposalCreator] - , proposalStatus = Draft - , alterOutputStakes = False - } - ---- - -{- | Generate a list of parameters that sets proposal status to something other than 'Draft'. - Invalid for the ptoposal validator, perfectly valid for stake validator. --} -statusNotDraftCosignNParameters :: Int -> [Parameters] -statusNotDraftCosignNParameters n = - map - ( \st -> - Parameters - { newCosigners = take n pubKeyHashes - , proposalStatus = st - , alterOutputStakes = False - } - ) - [VotingReady, Locked, Finished] - ---- - -{- | Parameters thet change the output stake datums. - Invalid for both proposal validator and stake validator. --} -invalidStakeOutputParameters :: Parameters -invalidStakeOutputParameters = - (validCosignNParameters 2) - { alterOutputStakes = True - } - ---- - --- | Create a test tree given the parameters. Both the proposal validator and stake validator will be run. mkTestTree :: - -- | The name of the test group. String -> - Parameters -> - -- | Are the parameters valid for the proposal validator? - Bool -> + ParameterBundle -> + Validity -> SpecificationTree -mkTestTree name ps isValid = group name [proposal, stake] +mkTestTree name ps val = + group name [proposal, stake] where spend = mkSpending cosign ps proposal = - let proposalInputDatum = mkProposalInputDatum ps - in testValidator - isValid - "proposal" - agoraScripts.compiledProposalValidator - proposalInputDatum - (mkProposalRedeemer ps) - (spend proposalRef) + testValidator + val.forProposalValidator + "proposal" + proposalValidator + (mkProposalInputDatum ps) + proposalRedeemer + (spend proposalRef) stake = - let idx = 0 - stakeInputDatum = mkStakeInputDatums ps !! idx - isValid = not ps.alterOutputStakes - in testValidator - isValid - "stake" - agoraScripts.compiledStakeValidator - stakeInputDatum - stakeRedeemer - (spend $ mkStakeRef idx) + testValidator + val.forStakeValidator + "stake" + stakeValidator + (mkStakeInputDatum ps) + stakeRedeemer + (spend stakeRef) + +-------------------------------------------------------------------------------- + +totallyValid :: ParameterBundle +totallyValid = + ParameterBundle + { stakeParameters = + StakeParameters + { gtAmount = Sufficient + , stakeOwner = Other + , dontUpdateLocks = False + } + , proposalParameters = + ProposalParameters + { proposalStatus = Draft + , dontUpdateCosigners = False + } + , transactionParameters = + TransactionParameters + { signedBy = + Owner + } + } + +insufficientStakedAmount :: ParameterBundle +insufficientStakedAmount = + totallyValid + { stakeParameters = + totallyValid.stakeParameters + { gtAmount = Insufficient + } + } + +locksNotUpdated :: ParameterBundle +locksNotUpdated = + totallyValid + { stakeParameters = + totallyValid.stakeParameters + { dontUpdateLocks = True + } + } + +duplicateCosigners :: ParameterBundle +duplicateCosigners = + totallyValid + { stakeParameters = + totallyValid.stakeParameters + { stakeOwner = Creator + } + } + +cosignersNotUpdated :: ParameterBundle +cosignersNotUpdated = + totallyValid + { proposalParameters = + totallyValid.proposalParameters + { dontUpdateCosigners = True + } + } + +cosignAfterDraft :: [ParameterBundle] +cosignAfterDraft = + map + ( \s -> + totallyValid + { proposalParameters = + totallyValid.proposalParameters + { proposalStatus = s + } + } + ) + [VotingReady, Locked, Finished] diff --git a/agora-specs/Sample/Proposal/Create.hs b/agora-specs/Sample/Proposal/Create.hs index af356fb..82943b2 100644 --- a/agora-specs/Sample/Proposal/Create.hs +++ b/agora-specs/Sample/Proposal/Create.hs @@ -17,70 +17,99 @@ module Sample.Proposal.Create ( timeRangeNotTightParameters, timeRangeNotClosedParameters, invalidProposalStatusParameters, + fakeSSTParameters, + wrongGovernorRedeemer, + wrongGovernorRedeemer1, ) where import Agora.Governor ( Governor (..), GovernorDatum (..), - GovernorRedeemer (CreateProposal), + GovernorRedeemer ( + CreateProposal, + MintGATs, + MutateGovernor + ), ) import Agora.Proposal ( ProposalDatum (..), + ProposalEffectGroup, ProposalId (ProposalId), ProposalStatus (..), ResultTag (ResultTag), emptyVotesFor, ) -import Agora.Proposal.Time (MaxTimeRangeWidth (MaxTimeRangeWidth), ProposalStartingTime (..)) -import Agora.Scripts (AgoraScripts (..)) +import Agora.Proposal.Time ( + MaxTimeRangeWidth ( + MaxTimeRangeWidth + ), + ProposalStartingTime (..), + ) +import Agora.SafeMoney (GTTag) import Agora.Stake ( - ProposalLock (..), + ProposalAction (Created, Voted), + ProposalLock (ProposalLock), StakeDatum (..), StakeRedeemer (PermitVote), ) import Data.Coerce (coerce) import Data.Default (Default (def)) -import Data.Tagged (Tagged, untag) +import Data.Map.Strict qualified as StrictMap +import Data.Tagged (Tagged) import Plutarch.Context ( input, mint, + normalizeValue, output, script, signedWith, timeRange, txId, withDatum, - withOutRef, + withRedeemer, + withRef, withValue, ) -import PlutusLedgerApi.V1 ( - DatumHash, +import Plutarch.Extra.AssetClass (assetClassValue) +import Plutarch.Extra.ScriptContext (scriptHashToTokenName) +import PlutusLedgerApi.V1.Value qualified as Value +import PlutusLedgerApi.V2 ( + Credential (PubKeyCredential), POSIXTime (POSIXTime), POSIXTimeRange, - PubKeyHash, + Redeemer (Redeemer), + ToData (toBuiltinData), TxOutRef (TxOutRef), - ValidatorHash, always, ) -import PlutusLedgerApi.V1.Value qualified as Value -import PlutusTx.AssocMap qualified as AssocMap import Sample.Proposal.Shared (stakeTxRef) import Sample.Shared ( - agoraScripts, - govAssetClass, - govValidatorHash, governor, + governorAssetClass, + governorScriptHash, + governorValidator, minAda, + proposalAssetClass, + proposalPolicy, proposalPolicySymbol, + proposalScriptHash, proposalStartingTimeFromTimeRange, - proposalValidatorHash, signer, signer2, stakeAssetClass, - stakeValidatorHash, + stakeScriptHash, + stakeSymbol, + stakeValidator, ) import Test.Specification (SpecificationTree, group, testPolicy, testValidator) -import Test.Util (CombinableBuilder, closedBoundedInterval, mkMinting, mkSpending, sortValue) +import Test.Util ( + CombinableBuilder, + closedBoundedInterval, + mkMinting, + mkSpending, + sortValue, + validatorHashes, + ) -- | Parameters for creating a proposal. data Parameters = Parameters @@ -100,11 +129,15 @@ data Parameters = Parameters -- ^ Is 'TxInfo.validTimeRange' closed? , proposalStatus :: ProposalStatus -- ^ The status of the newly created proposal. + , fakeSST :: Bool + -- ^ Whether to use SST that doesn't belong to the stake validator. + , governorRedeemer :: Redeemer + -- ^ The redeemer used to spend the governor. } -------------------------------------------------------------------------------- --- | See 'GovernorDatum.maximumProposalsPerStake'. +-- | See 'GovernorDatum.maximumCreatedProposalsPerStake'. maxProposalPerStake :: Integer maxProposalPerStake = 3 @@ -113,29 +146,30 @@ thisProposalId :: ProposalId thisProposalId = ProposalId 25 -- | The arbitrary staked amount. Doesn;t really matter in this case. -stakedGTs :: Tagged _ Integer +stakedGTs :: Tagged GTTag Integer stakedGTs = 5 -- | The owner of the stake. -stakeOwner :: PubKeyHash -stakeOwner = signer +stakeOwner :: Credential +stakeOwner = PubKeyCredential signer {- | The invalid stake owner. If the 'alterOutputStakeOwner' is set to true, the output stake owner will be set to this. -} -alteredStakeOwner :: PubKeyHash -alteredStakeOwner = signer2 +alteredStakeOwner :: Credential +alteredStakeOwner = PubKeyCredential signer2 -- | Locks the stake that the input stake already has. defLocks :: [ProposalLock] -defLocks = [Created (ProposalId 0)] +defLocks = [ProposalLock (ProposalId 0) Created] -- | The effect of the newly created proposal. -defEffects :: AssocMap.Map ResultTag (AssocMap.Map ValidatorHash DatumHash) +defEffects :: StrictMap.Map ResultTag ProposalEffectGroup defEffects = - AssocMap.fromList - [ (ResultTag 0, AssocMap.empty) - , (ResultTag 1, AssocMap.empty) + StrictMap.fromList + [ (ResultTag 0, StrictMap.empty) + , (ResultTag 1, StrictMap.empty) + , (ResultTag 3, StrictMap.empty) ] -------------------------------------------------------------------------------- @@ -148,7 +182,7 @@ governorInputDatum = , nextProposalId = thisProposalId , proposalTimings = def , createProposalTimeRangeMaxWidth = def - , maximumProposalsPerStake = maxProposalPerStake + , maximumCreatedProposalsPerStake = maxProposalPerStake } -- | Create governor output datum given the parameters. @@ -163,7 +197,7 @@ mkGovernorOutputDatum ps = , nextProposalId = nextPid , proposalTimings = def , createProposalTimeRangeMaxWidth = def - , maximumProposalsPerStake = maxProposalPerStake + , maximumCreatedProposalsPerStake = maxProposalPerStake } -------------------------------------------------------------------------------- @@ -174,7 +208,7 @@ mkStakeInputDatum ps = let locks = if ps.createdMoreThanMaximumProposals then - Created . ProposalId + flip ProposalLock Created . ProposalId <$> take (fromInteger maxProposalPerStake) [1 ..] @@ -193,10 +227,10 @@ mkStakeOutputDatum ps = newLocks = if ps.invalidNewLocks then - [ Voted thisProposalId (ResultTag 0) - , Voted thisProposalId (ResultTag 1) + [ ProposalLock thisProposalId $ Voted (ResultTag 0) 100 + , ProposalLock thisProposalId $ Voted (ResultTag 1) 100 ] - else [Created thisProposalId] + else [ProposalLock thisProposalId Created] locks = newLocks <> inputDatum.lockedBy newOwner = mkOwner ps in inputDatum @@ -211,16 +245,18 @@ mkStakeOutputDatum ps = -} mkProposalOutputDatum :: Parameters -> ProposalDatum mkProposalOutputDatum ps = - ProposalDatum - { proposalId = thisProposalId - , effects = defEffects - , status = ps.proposalStatus - , cosigners = [mkOwner ps] - , thresholds = def - , votes = emptyVotesFor defEffects - , timingConfig = def - , startingTime = mkProposalStartingTime ps - } + let effects = defEffects + votes = emptyVotesFor defEffects + in ProposalDatum + { proposalId = thisProposalId + , effects = effects + , status = ps.proposalStatus + , cosigners = [mkOwner ps] + , thresholds = def + , votes = votes + , timingConfig = def + , startingTime = mkProposalStartingTime ps + } -------------------------------------------------------------------------------- @@ -243,7 +279,7 @@ mkProposalStartingTime ps = else ProposalStartingTime 0 -- | Who should be the 'owner' of the output stake. -mkOwner :: Parameters -> PubKeyHash +mkOwner :: Parameters -> Credential mkOwner ps = if ps.alterOutputStakeOwner then alteredStakeOwner @@ -265,26 +301,51 @@ governorRef = TxOutRef "0b2086cbf8b6900f8cb65e012de4516cb66b5cb08a9aaba12a8b88be createProposal :: forall b. CombinableBuilder b => Parameters -> b createProposal ps = builder where - pst = Value.singleton proposalPolicySymbol "" 1 - sst = Value.assetClassValue stakeAssetClass 1 - gst = Value.assetClassValue govAssetClass 1 + pst = assetClassValue proposalAssetClass 1 + sst = assetClassValue stakeAssetClass 1 + gst = assetClassValue governorAssetClass 1 + + --- + + attacker = head validatorHashes + + fakeStakeBuilder = + if ps.fakeSST + then + mconcat + [ input @b $ + mconcat + [ script attacker + , withValue $ + Value.singleton + stakeSymbol + (scriptHashToTokenName attacker) + 1 + , withDatum $ + (mkStakeInputDatum ps) + { stakedAmount = 10000000000 + } + ] + ] + else mempty --- governorValue = sortValue $ gst <> minAda stakeValue = sortValue $ - sortValue $ - sst - <> Value.assetClassValue (untag governor.gtClassRef) (untag stakedGTs) - <> minAda + sst + <> assetClassValue governor.gtClassRef stakedGTs + <> minAda proposalValue = sortValue $ pst <> minAda --- withSig = if ps.stakeOwnerSignsTheTransaction - then signedWith stakeOwner + then case stakeOwner of + PubKeyCredential sig -> signedWith sig + _ -> mempty else mempty --- @@ -295,43 +356,68 @@ createProposal ps = builder , --- withSig , --- - mint pst + mint $ + normalizeValue + pst , --- timeRange $ mkTimeRange ps , input $ mconcat - [ script govValidatorHash + [ script governorScriptHash , withValue governorValue , withDatum governorInputDatum - , withOutRef governorRef + , withRedeemer ps.governorRedeemer + , withRef governorRef ] , output $ mconcat - [ script govValidatorHash + [ script governorScriptHash , withValue governorValue , withDatum (mkGovernorOutputDatum ps) ] , --- - input $ - mconcat - [ script stakeValidatorHash - , withValue stakeValue - , withDatum (mkStakeInputDatum ps) - , withOutRef stakeRef - ] - , output $ - mconcat - [ script stakeValidatorHash - , withValue stakeValue - , withDatum (mkStakeOutputDatum ps) - ] + if ps.fakeSST + then + mconcat + [ input @b $ + mconcat + [ script attacker + , withValue $ + Value.singleton + stakeSymbol + (scriptHashToTokenName attacker) + 1 + , withDatum $ + (mkStakeInputDatum ps) + { stakedAmount = 10000000000 + } + ] + ] + else + mconcat + [ input $ + mconcat + [ script stakeScriptHash + , withValue stakeValue + , withDatum (mkStakeInputDatum ps) + , withRef stakeRef + ] + , output $ + mconcat + [ script stakeScriptHash + , withValue stakeValue + , withDatum (mkStakeOutputDatum ps) + ] + ] , --- output $ mconcat - [ script proposalValidatorHash + [ script proposalScriptHash , withValue proposalValue , withDatum (mkProposalOutputDatum ps) ] + , --- + fakeStakeBuilder ] -------------------------------------------------------------------------------- @@ -340,10 +426,6 @@ createProposal ps = builder stakeRedeemer :: StakeRedeemer stakeRedeemer = PermitVote --- | Spend the governor with the 'CreateProposal' redeemer. -governorRedeemer :: GovernorRedeemer -governorRedeemer = CreateProposal - -- | Mint the PST with an arbitrary redeemer. Doesn't really matter. proposalPolicyRedeemer :: () proposalPolicyRedeemer = () @@ -361,6 +443,8 @@ totallyValidParameters = , timeRangeTightEnough = True , timeRangeClosed = True , proposalStatus = Draft + , fakeSST = False + , governorRedeemer = Redeemer $ toBuiltinData CreateProposal } invalidOutputGovernorDatumParameters :: Parameters @@ -413,6 +497,24 @@ invalidProposalStatusParameters = ) [VotingReady, Locked, Finished] +fakeSSTParameters :: Parameters +fakeSSTParameters = + totallyValidParameters + { fakeSST = True + } + +wrongGovernorRedeemer :: Parameters +wrongGovernorRedeemer = + totallyValidParameters + { governorRedeemer = Redeemer $ toBuiltinData MintGATs + } + +wrongGovernorRedeemer1 :: Parameters +wrongGovernorRedeemer1 = + totallyValidParameters + { governorRedeemer = Redeemer $ toBuiltinData MutateGovernor + } + -------------------------------------------------------------------------------- {- | Create a test tree that runs the proposal minting policy, the governor @@ -435,7 +537,7 @@ mkTestTree testPolicy validForProposalPolicy "proposal" - agoraScripts.compiledProposalPolicy + proposalPolicy proposalPolicyRedeemer (mint proposalPolicySymbol) @@ -443,16 +545,16 @@ mkTestTree testValidator validForGovernorValidator "governor" - agoraScripts.compiledGovernorValidator + governorValidator governorInputDatum - governorRedeemer + ps.governorRedeemer (spend governorRef) stakeTest = testValidator validForStakeValidator "stake" - agoraScripts.compiledStakeValidator + stakeValidator (mkStakeInputDatum ps) stakeRedeemer (spend stakeRef) diff --git a/agora-specs/Sample/Proposal/PrivilegeEscalate.hs b/agora-specs/Sample/Proposal/PrivilegeEscalate.hs new file mode 100644 index 0000000..53b4e27 --- /dev/null +++ b/agora-specs/Sample/Proposal/PrivilegeEscalate.hs @@ -0,0 +1,254 @@ +module Sample.Proposal.PrivilegeEscalate ( + Operation (..), + privilegeEscalate, + Validity (..), + mkTestTree, +) where + +import Agora.Proposal ( + ProposalDatum (..), + ProposalId (ProposalId), + ProposalRedeemer (UnlockStake, Vote), + ProposalStatus (VotingReady), + ProposalVotes (ProposalVotes), + ResultTag (ResultTag), + emptyVotesFor, + ) +import Agora.Proposal.Time ( + ProposalStartingTime (ProposalStartingTime), + ProposalTimingConfig (draftTime, votingTime), + ) +import Agora.SafeMoney (GTTag) +import Agora.Stake ( + ProposalAction ( + Voted + ), + ProposalLock (ProposalLock), + StakeDatum (..), + StakeRedeemer (PermitVote, RetractVotes), + ) +import Data.Default (Default (def)) +import Data.Map.Strict qualified as StrictMap +import Data.Tagged (Tagged, untag) +import Plutarch.Context ( + input, + normalizeValue, + output, + script, + signedWith, + timeRange, + withDatum, + withRedeemer, + withRef, + withValue, + ) +import Plutarch.Extra.AssetClass (assetClassValue) +import PlutusLedgerApi.V1 (Credential (PubKeyCredential)) +import PlutusLedgerApi.V2 (PubKeyHash, TxOutRef (TxOutRef)) +import Sample.Proposal.Shared (proposalTxRef, stakeTxRef) +import Sample.Shared ( + minAda, + proposalAssetClass, + proposalScriptHash, + proposalValidator, + stakeAssetClass, + stakeScriptHash, + stakeValidator, + ) +import Test.Specification (SpecificationTree, group, testValidator) +import Test.Util (CombinableBuilder, closedBoundedInterval, mkSpending, pubKeyHashes) + +data Operation = Voting | RetractingVotes + +data Validity = Validity + { forStakeValidator :: Bool + , forProposalValidator :: Bool + } + +wrap :: forall x y. Operation -> (x -> x -> y) -> x -> x -> y +wrap Voting = id +wrap RetractingVotes = flip + +defStakeAmount :: Tagged GTTag Integer +defStakeAmount = 100000 + +defResultTag :: ResultTag +defResultTag = ResultTag 0 + +defProposalId :: ProposalId +defProposalId = ProposalId 0 + +mkProposalInputOutputDatum :: Operation -> (ProposalDatum, ProposalDatum) +mkProposalInputOutputDatum op = + let effects = StrictMap.singleton defResultTag StrictMap.empty + + proposal = + ProposalDatum + { proposalId = defProposalId + , effects = effects + , status = VotingReady + , cosigners = [] -- doesn't matter + , thresholds = def + , votes = emptyVotesFor effects + , timingConfig = def + , startingTime = ProposalStartingTime 0 + } + + proposalWithVotes = + proposal + { votes = + ProposalVotes $ + StrictMap.singleton defResultTag (untag defStakeAmount) + } + in wrap op (,) proposal proposalWithVotes + +mkProposalRedeemer :: Operation -> ProposalRedeemer +mkProposalRedeemer op = wrap op const (Vote defResultTag) UnlockStake + +proposalRef :: TxOutRef +proposalRef = TxOutRef proposalTxRef 1 + +attacker :: PubKeyHash +attacker = head pubKeyHashes + +mkStakeInputOutputDatums :: Operation -> ([StakeDatum], [StakeDatum]) +mkStakeInputOutputDatums op = + let delegatee = pubKeyHashes !! 1 + + firstStake = + StakeDatum + { stakedAmount = defStakeAmount + , owner = PubKeyCredential attacker + , delegatedTo = Just $ PubKeyCredential delegatee + , lockedBy = [] + } + + otherStakes = + (\pkh -> firstStake {owner = PubKeyCredential pkh}) + <$> drop 2 pubKeyHashes + + allStakes = take 10 $ firstStake : otherStakes + + createdAt = (def :: ProposalTimingConfig).votingTime - 1 + + stakeWithLock = + ( \stake -> + stake + { lockedBy = + [ ProposalLock defProposalId $ + Voted + defResultTag + createdAt + ] + } + ) + <$> allStakes + in wrap op (,) allStakes stakeWithLock + +mkStakeRedeemer :: Operation -> StakeRedeemer +mkStakeRedeemer op = wrap op const PermitVote RetractVotes + +mkStakeRef :: Integer -> TxOutRef +mkStakeRef o = TxOutRef stakeTxRef $ 1 + o + +privilegeEscalate :: forall b. CombinableBuilder b => Operation -> b +privilegeEscalate op = + let sst = assetClassValue stakeAssetClass 1 + + stakeValue = normalizeValue $ minAda <> sst + + (stakeInputDatums, stakeOutputDatums) = mkStakeInputOutputDatums op + + stakeBuilder = + mconcat $ + zipWith3 + ( \index stakeInput stakeOutput -> + mconcat @b + [ input $ + mconcat + [ script stakeScriptHash + , withDatum stakeInput + , withValue stakeValue + , withRef $ mkStakeRef index + , withRedeemer $ mkStakeRedeemer op + ] + , output $ + mconcat + [ script stakeScriptHash + , withDatum stakeOutput + , withValue stakeValue + ] + ] + ) + [1 ..] + stakeInputDatums + stakeOutputDatums + + --- + + pst = assetClassValue proposalAssetClass 1 + + proposalValue = normalizeValue $ minAda <> pst + + (proposalInput, proposalOutput) = mkProposalInputOutputDatum op + + proposalBuilder = + mconcat @b + [ input $ + mconcat + [ script proposalScriptHash + , withDatum proposalInput + , withRedeemer $ mkProposalRedeemer op + , withValue proposalValue + , withRef proposalRef + ] + , output $ + mconcat + [ script proposalScriptHash + , withDatum proposalOutput + , withValue proposalValue + ] + ] + + --- + + validTimeRange = + closedBoundedInterval + ((def :: ProposalTimingConfig).draftTime + 1) + ((def :: ProposalTimingConfig).votingTime - 1) + + miscBuilder = + mconcat @b + [ signedWith attacker + , timeRange validTimeRange + ] + in mconcat + [ miscBuilder + , stakeBuilder + , proposalBuilder + ] + +mkTestTree :: String -> Operation -> Validity -> SpecificationTree +mkTestTree name op val = group name [proposal, stake] + where + spend = mkSpending privilegeEscalate op + + proposal = + testValidator + val.forProposalValidator + "proposal" + proposalValidator + (fst $ mkProposalInputOutputDatum op) + (mkProposalRedeemer op) + (spend proposalRef) + + stakeInputdDatum = head $ fst $ mkStakeInputOutputDatums op + + stake = + testValidator + val.forStakeValidator + "stake" + stakeValidator + stakeInputdDatum + (mkStakeRedeemer op) + (spend $ mkStakeRef 1) diff --git a/agora-specs/Sample/Proposal/Shared.hs b/agora-specs/Sample/Proposal/Shared.hs index c73f1c9..8677718 100644 --- a/agora-specs/Sample/Proposal/Shared.hs +++ b/agora-specs/Sample/Proposal/Shared.hs @@ -7,7 +7,7 @@ Shared constants for proposal samples. -} module Sample.Proposal.Shared (proposalTxRef, stakeTxRef, governorTxRef) where -import PlutusLedgerApi.V1 (TxId) +import PlutusLedgerApi.V2 (TxId) -- | 'TxId' of all the proposal inputs in the samples. proposalTxRef :: TxId diff --git a/agora-specs/Sample/Proposal/Unlock.hs b/agora-specs/Sample/Proposal/Unlock.hs new file mode 100644 index 0000000..a9305fd --- /dev/null +++ b/agora-specs/Sample/Proposal/Unlock.hs @@ -0,0 +1,612 @@ +{- | +Module : Sample.Proposal.UnlockStake +Maintainer : connor@mlabs.city +Description: Generate sample data for testing the functionalities of unlocking stake and retracting votes + +Sample and utilities for testing the functionalities of unlocking stake and retracting votes +-} +module Sample.Proposal.Unlock ( + ParameterBundle (..), + StakeRole (..), + TimeRange (..), + SignedBy (..), + TransactionParameters (..), + ProposalParameters (..), + SSTOwner (..), + StakeParameters (..), + Validity (..), + unlock, + mkTestTree, + mkValidVoterRetractVotes, + mkValidDelegateeRetractVotes, + mkValidVoterCreatorRetractVotes, + mkValidCreatorRemoveLock, + mkValidVoterRemoveLockAfterVoting, + mkRetractVotesWhileNotVoting, + mkUnockIrrelevantStakes, + mkRemoveCreatorLockBeforeFinished, + mkCreatorRetractVotes, + mkChangeOutputStakeValue, + mkUseFakeStakes, + mkDisrespectCooldown, +) where + +-------------------------------------------------------------------------------- + +import Agora.Governor (Governor (..)) +import Agora.Proposal ( + ProposalDatum (..), + ProposalEffectGroup, + ProposalId (..), + ProposalRedeemer (UnlockStake), + ProposalStatus (..), + ProposalVotes (..), + ResultTag (..), + ) +import Agora.Proposal.Time ( + ProposalStartingTime (ProposalStartingTime), + ProposalTimingConfig (..), + ) +import Agora.SafeMoney (GTTag) +import Agora.Stake ( + ProposalAction (Created, Voted), + ProposalLock (..), + StakeDatum (..), + StakeRedeemer (RetractVotes), + ) +import Data.Coerce (coerce) +import Data.Default.Class (Default (def)) +import Data.Map.Strict qualified as StrictMap +import Data.Tagged (Tagged, untag) +import Plutarch.Context ( + input, + normalizeValue, + output, + script, + signedWith, + timeRange, + txId, + withDatum, + withRedeemer, + withRef, + withValue, + ) +import Plutarch.Extra.AssetClass (assetClassValue) +import Plutarch.Extra.ScriptContext (scriptHashToTokenName) +import PlutusLedgerApi.V1.Value qualified as Value +import PlutusLedgerApi.V2 ( + Credential (PubKeyCredential), + POSIXTime, + PubKeyHash, + TxOutRef (..), + ) +import Sample.Proposal.Shared (stakeTxRef) +import Sample.Shared ( + governor, + minAda, + proposalAssetClass, + proposalScriptHash, + proposalValidator, + stakeScriptHash, + stakeSymbol, + stakeValidator, + ) +import Test.Specification (SpecificationTree, group, testValidator) +import Test.Util (CombinableBuilder, closedBoundedInterval, mkSpending, pubKeyHashes) + +-------------------------------------------------------------------------------- + +votesTemplate :: ProposalVotes +votesTemplate = + ProposalVotes $ + StrictMap.fromList + [ (ResultTag 0, 0) + , (ResultTag 1, 0) + ] + +-- | Create empty effects for every result tag given the votes. +emptyEffectFor :: + ProposalVotes -> + StrictMap.Map ResultTag ProposalEffectGroup +emptyEffectFor (ProposalVotes vs) = + StrictMap.fromList $ + map (,StrictMap.empty) (StrictMap.keys vs) + +-- | The default vote option that will be used by functions in this module. +defVoteFor :: ResultTag +defVoteFor = ResultTag 0 + +-- | The default number of GTs the stake will have. +defStakedGTs :: Tagged GTTag Integer +defStakedGTs = 100000 + +alteredStakedGTs :: Tagged GTTag Integer +alteredStakedGTs = 100 + +-- | Default owner of the stakes. +defOwner :: PubKeyHash +defOwner = pubKeyHashes !! 1 + +defDelegatee :: PubKeyHash +defDelegatee = pubKeyHashes !! 2 + +defUnknown :: PubKeyHash +defUnknown = pubKeyHashes !! 3 + +defProposalId :: ProposalId +defProposalId = ProposalId 0 + +defStartingTime :: ProposalStartingTime +defStartingTime = ProposalStartingTime 0 + +-------------------------------------------------------------------------------- + +data ParameterBundle = ParameterBundle + { proposalParameters :: ProposalParameters + , stakeParameters :: StakeParameters + , transactionParameters :: TransactionParameters + } + +data SignedBy = Owner | Delegatee | Unknown + +data TimeRange = WhileVoting {offset :: POSIXTime} | AfterVoting + +data TransactionParameters = TransactionParameters + { signedBy :: SignedBy + , timeRange :: TimeRange + } + +data ProposalParameters = ProposalParameters + { proposalStatus :: ProposalStatus + , retractVotes :: Bool + } + +-- | How a stake has been used on a particular proposal. +data StakeRole + = -- | The stake was spent to vote for a paraticular option. + Voter + | -- | The stake was used to create the proposal. + Creator + | -- | The stake was used to both create and vote for the proposal. + Both + | -- | The stake has nothing to do with the proposal. + Irrelevant + deriving stock (Bounded, Enum, Show) + +data SSTOwner + = StakeValidator + | Attacker + +data StakeParameters = StakeParameters + { numStakes :: Integer + , stakeRole :: StakeRole + , removeVoterLock :: Bool + , removeCreatorLock :: Bool + , alterOutputValue :: Bool + , sstOwner :: SSTOwner + , votingLockCreatedAt :: POSIXTime + } + +data Validity = Validity + { forProposalValidator :: Bool + , forStakeValidator :: Bool + } + +-------------------------------------------------------------------------------- + +mkStakeRef :: Integer -> TxOutRef +mkStakeRef = TxOutRef stakeTxRef + +stakeRedeemer :: StakeRedeemer +stakeRedeemer = RetractVotes + +mkStakeInputDatum :: StakeParameters -> StakeDatum +mkStakeInputDatum ps = + StakeDatum + { stakedAmount = defStakedGTs + , owner = PubKeyCredential defOwner + , delegatedTo = Just $ PubKeyCredential defDelegatee + , lockedBy = stakeLocks + } + where + stakeLocks = mkStakeLocks' ps.stakeRole + + mkStakeLocks' Voter = + [ ProposalLock defProposalId $ + Voted defVoteFor ps.votingLockCreatedAt + ] + mkStakeLocks' Creator = [ProposalLock defProposalId Created] + mkStakeLocks' Both = mkStakeLocks' Voter <> mkStakeLocks' Creator + mkStakeLocks' Irrelevant = + let ProposalId pid = defProposalId + ResultTag vid = defVoteFor + in [ ProposalLock (ProposalId $ pid + 1) $ + Voted + (ResultTag $ vid + 1) + ps.votingLockCreatedAt + , ProposalLock (ProposalId $ pid + 1) Created + ] + +-------------------------------------------------------------------------------- + +proposalRef :: TxOutRef +proposalRef = TxOutRef stakeTxRef 0 + +proposalRedeemer :: ProposalRedeemer +proposalRedeemer = UnlockStake + +mkProposalInputDatum :: + StakeParameters -> + ProposalParameters -> + ProposalDatum +mkProposalInputDatum sps pps = + ProposalDatum + { proposalId = defProposalId + , effects = emptyEffectFor votesTemplate + , status = pps.proposalStatus + , cosigners = [PubKeyCredential $ head pubKeyHashes] + , thresholds = def + , votes = updatVotes votesTemplate + , timingConfig = def + , startingTime = defStartingTime + } + where + updatVotes (ProposalVotes vt) = + ProposalVotes $ + StrictMap.adjust + (+ sps.numStakes * untag defStakedGTs) + defVoteFor + vt + +-------------------------------------------------------------------------------- + +unlock :: forall b. CombinableBuilder b => ParameterBundle -> b +unlock ps = builder + where + pst = assetClassValue proposalAssetClass 1 + + proposalInputDatum = + mkProposalInputDatum + ps.stakeParameters + ps.proposalParameters + + proposalOutputDatum = + if ps.proposalParameters.retractVotes + then proposalInputDatum {votes = votesTemplate} + else proposalInputDatum + + proposalValue = normalizeValue $ pst <> minAda + + proposalBuilder :: b + proposalBuilder = + mconcat + [ input $ + mconcat + [ script proposalScriptHash + , withValue proposalValue + , withDatum proposalInputDatum + , withRef proposalRef + , withRedeemer proposalRedeemer + ] + , output $ + mconcat + [ script proposalScriptHash + , withValue proposalValue + , withDatum proposalOutputDatum + ] + ] + + --- + + sstName = case ps.stakeParameters.sstOwner of + StakeValidator -> scriptHashToTokenName stakeScriptHash + _ -> "" + + sst = Value.singleton stakeSymbol sstName 1 + + stakeInputDatum = mkStakeInputDatum ps.stakeParameters + + -- TODO respect timing + removeLocks v c = + filter $ \(ProposalLock pid action) -> + pid == defProposalId + && not + ( case action of + Voted _ _ -> v + _ -> c + ) + + stakeOutputDatum = + stakeInputDatum + { lockedBy = + removeLocks + ps.stakeParameters.removeVoterLock + ps.stakeParameters.removeCreatorLock + stakeInputDatum.lockedBy + } + + mkStakeValue gt = + normalizeValue $ + mconcat + [ minAda + , sst + , assetClassValue + governor.gtClassRef + gt + ] + + stakeInputValue = mkStakeValue defStakedGTs + + stakeOutputValue = + mkStakeValue $ + if ps.stakeParameters.alterOutputValue + then alteredStakedGTs + else defStakedGTs + + stakeBuilder :: b + stakeBuilder = + foldMap + ( \i -> + mconcat + [ input $ + mconcat + [ script stakeScriptHash + , withValue stakeInputValue + , withDatum stakeInputDatum + , withRef $ mkStakeRef i + ] + , output $ + mconcat + [ script stakeScriptHash + , withValue stakeOutputValue + , withDatum stakeOutputDatum + ] + ] + ) + [1 .. ps.stakeParameters.numStakes] + + --- + + ProposalStartingTime s = defStartingTime + + time = case ps.transactionParameters.timeRange of + WhileVoting offset -> + let lb = + ps.stakeParameters.votingLockCreatedAt + + offset + ub = + s + + (def :: ProposalTimingConfig).draftTime + + (def :: ProposalTimingConfig).votingTime + in closedBoundedInterval (lb + 1) (ub - 1) + AfterVoting -> + let lb = + s + + (def :: ProposalTimingConfig).draftTime + + (def :: ProposalTimingConfig).votingTime + ub = lb + (def :: ProposalTimingConfig).lockingTime + in closedBoundedInterval (lb + 1) (ub - 1) + + sig = case ps.transactionParameters.signedBy of + Unknown -> defUnknown + Owner -> defOwner + Delegatee -> defDelegatee + + --- + + builder = + mconcat + [ txId "388bc0b897b3dadcd479da4c88291de4113a50b72ddbed001faf7fc03f11bc52" + , proposalBuilder + , stakeBuilder + , signedWith sig + , timeRange time + ] + +-------------------------------------------------------------------------------- + +{- | Create a test tree that runs both the stake validator and the proposal + validator. +-} +mkTestTree :: String -> ParameterBundle -> Validity -> SpecificationTree +mkTestTree name ps val = group name [stake, proposal] + where + spend = mkSpending unlock ps + + stake = + testValidator + val.forStakeValidator + "stake" + stakeValidator + (mkStakeInputDatum ps.stakeParameters) + stakeRedeemer + (spend $ mkStakeRef 1) + + proposal = + testValidator + val.forProposalValidator + "proposal" + proposalValidator + (mkProposalInputDatum ps.stakeParameters ps.proposalParameters) + proposalRedeemer + (spend proposalRef) + +-------------------------------------------------------------------------------- + +mkValidVoterRetractVotes :: Integer -> ParameterBundle +mkValidVoterRetractVotes i = + ParameterBundle + { proposalParameters = + ProposalParameters + { proposalStatus = VotingReady + , retractVotes = True + } + , stakeParameters = + StakeParameters + { numStakes = i + , stakeRole = Voter + , removeVoterLock = True + , removeCreatorLock = False + , alterOutputValue = False + , sstOwner = StakeValidator + , votingLockCreatedAt = + coerce defStartingTime + + (def :: ProposalTimingConfig).draftTime + + 1 + } + , transactionParameters = + TransactionParameters + { signedBy = Owner + , timeRange = + WhileVoting + { offset = + coerce + (def :: ProposalTimingConfig).minStakeVotingTime + + 5 + } + } + } + +mkValidDelegateeRetractVotes :: Integer -> ParameterBundle +mkValidDelegateeRetractVotes i = + let template = mkValidVoterRetractVotes i + in template + { transactionParameters = + template.transactionParameters + { signedBy = Delegatee + } + } + +mkValidVoterCreatorRetractVotes :: Integer -> ParameterBundle +mkValidVoterCreatorRetractVotes i = + let template = mkValidVoterRetractVotes i + in template + { stakeParameters = + template.stakeParameters + { stakeRole = Both + } + } + +mkValidCreatorRemoveLock :: Integer -> ParameterBundle +mkValidCreatorRemoveLock i = + let template = mkValidVoterRetractVotes i + in template + { proposalParameters = + template.proposalParameters + { proposalStatus = Finished + , retractVotes = False + } + , stakeParameters = + template.stakeParameters + { stakeRole = Creator + , removeCreatorLock = True + } + , transactionParameters = + template.transactionParameters + { timeRange = AfterVoting + } + } + +mkValidVoterRemoveLockAfterVoting :: Integer -> ParameterBundle +mkValidVoterRemoveLockAfterVoting i = + let template = mkValidVoterRetractVotes i + in template + { proposalParameters = + template.proposalParameters + { proposalStatus = Finished + , retractVotes = False + } + , transactionParameters = + template.transactionParameters + { timeRange = AfterVoting + } + } + +mkRetractVotesWhileNotVoting :: Integer -> [ParameterBundle] +mkRetractVotesWhileNotVoting i = + let template = mkValidVoterRetractVotes i + in map + ( \s -> + template + { proposalParameters = + template.proposalParameters + { proposalStatus = s + } + } + ) + [Draft, Locked, Finished] + +mkUnockIrrelevantStakes :: Integer -> ParameterBundle +mkUnockIrrelevantStakes i = + let template = mkValidVoterRetractVotes i + in template + { stakeParameters = + template.stakeParameters + { stakeRole = Irrelevant + , removeCreatorLock = True + } + } + +mkRemoveCreatorLockBeforeFinished :: Integer -> [ParameterBundle] +mkRemoveCreatorLockBeforeFinished i = + let template = mkValidCreatorRemoveLock i + in map + ( \s -> + template + { proposalParameters = + template.proposalParameters + { proposalStatus = s + } + } + ) + [Draft, VotingReady, Locked] + +mkCreatorRetractVotes :: Integer -> ParameterBundle +mkCreatorRetractVotes i = + let template = mkValidVoterRetractVotes i + in template + { proposalParameters = + template.proposalParameters + { proposalStatus = VotingReady + } + , stakeParameters = + template.stakeParameters + { stakeRole = Creator + } + } + +mkChangeOutputStakeValue :: Integer -> ParameterBundle +mkChangeOutputStakeValue i = + let template = mkValidVoterRetractVotes i + in template + { stakeParameters = + template.stakeParameters + { alterOutputValue = True + } + } + +mkUseFakeStakes :: Integer -> ParameterBundle +mkUseFakeStakes i = + let template = mkValidVoterCreatorRetractVotes i + in template + { stakeParameters = + template.stakeParameters + { sstOwner = Attacker + } + } + +mkDisrespectCooldown :: Integer -> ParameterBundle +mkDisrespectCooldown i = + let template = mkValidVoterCreatorRetractVotes i + in template + { transactionParameters = + template.transactionParameters + { timeRange = + WhileVoting + { offset = + coerce + (def :: ProposalTimingConfig).minStakeVotingTime + - 5 + } + } + } diff --git a/agora-specs/Sample/Proposal/UnlockStake.hs b/agora-specs/Sample/Proposal/UnlockStake.hs deleted file mode 100644 index 5e72125..0000000 --- a/agora-specs/Sample/Proposal/UnlockStake.hs +++ /dev/null @@ -1,550 +0,0 @@ -{- | -Module : Sample.Proposal.UnlockStake -Maintainer : connor@mlabs.city -Description: Generate sample data for testing the functionalities of unlocking stake and retracting votes - -Sample and utilities for testing the functionalities of unlocking stake and retracting votes --} -module Sample.Proposal.UnlockStake ( - StakeRole (..), - Parameters (..), - unlockStake, - mkTestTree, - mkVoterRetractVotesWhileVotingParameters, - mkVoterCreatorRetractVotesWhileVotingParameters, - mkCreatorRemoveCreatorLocksWhenFinishedParameters, - mkVoterCreatorRemoveAllLocksWhenFinishedParameters, - mkVoterUnlockStakeAfterVotingParameters, - mkVoterCreatorRemoveVoteLocksWhenLockedParameters, - mkRetractVotesWhileNotVoting, - mkUnockIrrelevantStakeParameters, - mkRemoveCreatorLockBeforeFinishedParameters, - mkRetractVotesWithCreatorStakeParamaters, - mkAlterStakeParameters, -) where - --------------------------------------------------------------------------------- - -import Agora.Governor (Governor (..)) -import Agora.Proposal ( - ProposalDatum (..), - ProposalId (..), - ProposalRedeemer (Unlock), - ProposalStatus (..), - ProposalVotes (..), - ResultTag (..), - ) -import Agora.Proposal.Time (ProposalStartingTime (ProposalStartingTime)) -import Agora.Scripts (AgoraScripts (..)) -import Agora.Stake (ProposalLock (..), StakeDatum (..), StakeRedeemer (RetractVotes)) -import Data.Default.Class (Default (def)) -import Data.Tagged (Tagged (..), untag) -import Plutarch.Context ( - input, - output, - script, - signedWith, - txId, - withDatum, - withOutRef, - withValue, - ) -import PlutusLedgerApi.V1 ( - DatumHash, - PubKeyHash, - TxOutRef (..), - ValidatorHash, - ) -import PlutusLedgerApi.V1.Value qualified as Value -import PlutusTx.AssocMap qualified as AssocMap -import Sample.Proposal.Shared (stakeTxRef) -import Sample.Shared ( - agoraScripts, - governor, - minAda, - proposalPolicySymbol, - proposalValidatorHash, - signer, - stakeAssetClass, - stakeValidatorHash, - ) -import Test.Specification (SpecificationTree, group, testValidator) -import Test.Util (CombinableBuilder, mkSpending, sortValue, updateMap) - --------------------------------------------------------------------------------- - --- | The template "shape" that votes of proposals generated by 'mkProposalDatumPair' have. -votesTemplate :: ProposalVotes -votesTemplate = - ProposalVotes $ - AssocMap.fromList - [ (ResultTag 0, 0) - , (ResultTag 1, 0) - ] - --- | Create empty effects for every result tag given the votes. -emptyEffectFor :: - ProposalVotes -> - AssocMap.Map ResultTag (AssocMap.Map ValidatorHash DatumHash) -emptyEffectFor (ProposalVotes vs) = - AssocMap.fromList $ - map (,AssocMap.empty) (AssocMap.keys vs) - --- | The default vote option that will be used by functions in this module. -defVoteFor :: ResultTag -defVoteFor = ResultTag 0 - --- | The default number of GTs the stake will have. -defStakedGTs :: Tagged _ Integer -defStakedGTs = 100000 - -{- | If 'Parameters.alterOutputStake' is set to true, the - 'StakeDatum.stakedAmount' will be set to this. --} -alteredStakedGTs :: Tagged _ Integer -alteredStakedGTs = 100 - --- | Default owner of the stakes. -defOwner :: PubKeyHash -defOwner = signer - --- | How a stake has been used on a particular proposal. -data StakeRole - = -- | The stake was spent to vote for a paraticular option. - Voter - | -- | The stake was used to create the proposal. - Creator - | -- | The stake was used to both create and vote for the proposal. - Both - | -- | The stake has nothing to do with the proposal. - Irrelevant - deriving stock (Bounded, Enum, Show) - --- | Parameters for creating a 'TxOut' that unlocks a stake. -data Parameters = Parameters - { proposalCount :: Integer - -- ^ The number of proposals in the 'TxOut'. - , stakeRole :: StakeRole - -- ^ The role of the stake we're unlocking. - , retractVotes :: Bool - -- ^ Whether to retract votes or not. - , removeVoterLock :: Bool - -- ^ Remove the voter locks from the input stake. - , removeCreatorLock :: Bool - -- ^ Remove the creator locks from the input stake. - , proposalStatus :: ProposalStatus - -- ^ The state of all the proposals. - , alterOutputStake :: Bool - } - --- | Iterate over the proposal id of every proposal, given the number of proposals. -forEachProposalId :: Parameters -> (ProposalId -> a) -> [a] -forEachProposalId ps = forEachProposalId' ps.proposalCount - where - forEachProposalId' :: Integer -> (ProposalId -> a) -> [a] - forEachProposalId' 0 _ = error "zero proposal" - forEachProposalId' n f = f . ProposalId <$> [0 .. n - 1] - --- | Create locks for the input stake given the parameters. -mkInputStakeLocks :: Parameters -> [ProposalLock] -mkInputStakeLocks ps = mconcat $ forEachProposalId ps $ mkStakeLocksFor ps.stakeRole - where - mkStakeLocksFor :: StakeRole -> ProposalId -> [ProposalLock] - mkStakeLocksFor sr pid = - let voted = [Voted pid defVoteFor] - created = [Created pid] - in case sr of - Voter -> voted - Creator -> created - Both -> voted <> created - _ -> [] - --- | Create locks for the output stake by removing locks from the input locks. -mkOutputStakeLocks :: Parameters -> [ProposalLock] -mkOutputStakeLocks ps = - filter - ( \lock -> not $ case lock of - Voted _ _ -> ps.removeVoterLock - Created _ -> ps.removeCreatorLock - ) - inputLocks - where - inputLocks = mkInputStakeLocks ps - --- | Create the stake input datum given the parameters. -mkStakeInputDatum :: Parameters -> StakeDatum -mkStakeInputDatum ps = - StakeDatum - { stakedAmount = defStakedGTs - , owner = defOwner - , delegatedTo = Nothing - , lockedBy = mkInputStakeLocks ps - } - --- | Create stake output datum given the parameters. -mkStakeOutputDatum :: Parameters -> StakeDatum -mkStakeOutputDatum ps = - let template = mkStakeInputDatum ps - stakedAmount' = - if ps.alterOutputStake - then alteredStakedGTs - else defStakedGTs - in template - { stakedAmount = stakedAmount' - , lockedBy = mkOutputStakeLocks ps - } - --- | Generate some input proposals and their corresponding output proposals. -mkProposals :: Parameters -> [(ProposalDatum, ProposalDatum)] -mkProposals ps = forEachProposalId ps $ mkProposalDatumPair ps - --- | Create the input proposal datum. -mkProposalInputDatum :: Parameters -> ProposalId -> ProposalDatum -mkProposalInputDatum p pid = fst $ mkProposalDatumPair p pid - --- | Create a input proposal and its corresponding output proposal. -mkProposalDatumPair :: - Parameters -> - ProposalId -> - (ProposalDatum, ProposalDatum) -mkProposalDatumPair params pid = - let inputVotes = mkInputVotes params.stakeRole $ untag defStakedGTs - - input = - ProposalDatum - { proposalId = pid - , effects = emptyEffectFor votesTemplate - , status = params.proposalStatus - , cosigners = [defOwner] - , thresholds = def - , votes = inputVotes - , timingConfig = def - , startingTime = ProposalStartingTime 0 - } - - output = - if params.retractVotes - then input {votes = votesTemplate} - else input - in (input, output) - where - -- Assemble the votes of the input proposal based on 'votesTemplate'. - mkInputVotes :: - StakeRole -> - -- The staked amount/votes. - Integer -> - ProposalVotes - mkInputVotes Creator _ = - ProposalVotes $ - updateMap (Just . const 1000) defVoteFor $ - getProposalVotes votesTemplate - mkInputVotes Irrelevant _ = votesTemplate - mkInputVotes _ vc = - ProposalVotes $ - updateMap (Just . const vc) defVoteFor $ - getProposalVotes votesTemplate - --- | Create a 'TxInfo' that tries to unlock a stake. -unlockStake :: forall b. CombinableBuilder b => Parameters -> b -unlockStake ps = - let pst = Value.singleton proposalPolicySymbol "" 1 - sst = Value.assetClassValue stakeAssetClass 1 - - pIODatums = mkProposals ps - - proposals = - foldMap - ( \((i, o), idx) -> - mconcat - [ input $ - mconcat - [ script proposalValidatorHash - , withValue pst - , withDatum i - , withOutRef (mkProposalRef idx) - ] - , output $ - mconcat - [ script proposalValidatorHash - , withValue (sortValue $ pst <> minAda) - , withDatum o - ] - ] - ) - (zip pIODatums [0 ..]) - - stakeValue = - sortValue $ - mconcat - [ Value.assetClassValue - (untag governor.gtClassRef) - (untag defStakedGTs) - , sst - , minAda - ] - - sInDatum = mkStakeInputDatum ps - sOutDatum = mkStakeOutputDatum ps - - stakes = - mconcat - [ input $ - mconcat - [ script stakeValidatorHash - , withValue stakeValue - , withDatum sInDatum - , withOutRef stakeRef - ] - , output $ - mconcat - [ script stakeValidatorHash - , withValue stakeValue - , withDatum sOutDatum - ] - ] - - builder = - mconcat - [ txId "388bc0b897b3dadcd479da4c88291de4113a50b72ddbed001faf7fc03f11bc52" - , proposals - , stakes - , signedWith defOwner - ] - in builder - --- | Reference to the stake UTXO. -stakeRef :: TxOutRef -stakeRef = TxOutRef stakeTxRef 1 - --- | Generate the reference to a proposal UTXOs, given the index of the proposal. -mkProposalRef :: Int -> TxOutRef -mkProposalRef offset = TxOutRef stakeTxRef $ 2 + fromIntegral offset - --- | Proposal redeemer used by 'mkTestTree', in this case it's always 'Unlock'. -proposalRedeemer :: ProposalRedeemer -proposalRedeemer = Unlock - --- | Stake redeemer used by 'mkTestTree', in this case it's always 'RetractVotes'. -stakeRedeemer :: StakeRedeemer -stakeRedeemer = RetractVotes - --------------------------------------------------------------------------------- - -{- | Legal parameters that retract votes while the proposals is in 'VotingReady' - state, and also remove voter locks from the stake, which is - used to vote on the proposals. --} -mkVoterRetractVotesWhileVotingParameters :: Integer -> Parameters -mkVoterRetractVotesWhileVotingParameters nProposals = - Parameters - { proposalCount = nProposals - , stakeRole = Voter - , retractVotes = True - , removeVoterLock = True - , removeCreatorLock = False - , proposalStatus = VotingReady - , alterOutputStake = False - } - -{- | Legal parameters that retract votes while the proposals is in 'VotingReady' - state, and also remove voter locks from the stake, which is - used to both create and vote on the proposals. --} -mkVoterCreatorRetractVotesWhileVotingParameters :: Integer -> Parameters -mkVoterCreatorRetractVotesWhileVotingParameters nProposals = - Parameters - { proposalCount = nProposals - , stakeRole = Both - , retractVotes = True - , removeVoterLock = True - , removeCreatorLock = False - , proposalStatus = VotingReady - , alterOutputStake = False - } - -{- | Legal parameters that remove creator locks from the stake while the - proposals is in 'Finished' state. The stake was only used for creating - the proposals. --} -mkCreatorRemoveCreatorLocksWhenFinishedParameters :: Integer -> Parameters -mkCreatorRemoveCreatorLocksWhenFinishedParameters nProposals = - Parameters - { proposalCount = nProposals - , stakeRole = Creator - , retractVotes = False - , removeVoterLock = False - , removeCreatorLock = True - , proposalStatus = Finished - , alterOutputStake = False - } - -{- | Legal parameters that remove voter and creator locks from the stake while - the proposals is in 'Finished' state. The stake was used for creating - and voting on the proposals. --} -mkVoterCreatorRemoveAllLocksWhenFinishedParameters :: Integer -> Parameters -mkVoterCreatorRemoveAllLocksWhenFinishedParameters nProposals = - Parameters - { proposalCount = nProposals - , stakeRole = Both - , retractVotes = False - , removeVoterLock = True - , removeCreatorLock = True - , proposalStatus = Finished - , alterOutputStake = False - } - -{- Legal parameters that remove voter locks from the stake after the voting - phrase. The stake was used only for voting on the proposals. --} -mkVoterUnlockStakeAfterVotingParameters :: Integer -> [Parameters] -mkVoterUnlockStakeAfterVotingParameters nProposals = - map - ( \st -> - Parameters - { proposalCount = nProposals - , stakeRole = Voter - , retractVotes = False - , removeVoterLock = True - , removeCreatorLock = False - , proposalStatus = st - , alterOutputStake = False - } - ) - [Locked, Finished] - -{- Legal parameters that remove voter locks whenproposals are in phrase. - The stake was used for crating and voting on the proposals. --} -mkVoterCreatorRemoveVoteLocksWhenLockedParameters :: Integer -> Parameters -mkVoterCreatorRemoveVoteLocksWhenLockedParameters nProposals = - Parameters - { proposalCount = nProposals - , stakeRole = Both - , retractVotes = False - , removeVoterLock = True - , removeCreatorLock = False - , proposalStatus = Locked - , alterOutputStake = False - } - -{- | Illegal parameters that retract votes when the proposals are not in voting - phrase. --} -mkRetractVotesWhileNotVoting :: Integer -> [Parameters] -mkRetractVotesWhileNotVoting nProposals = do - role <- enumFrom Voter - status <- [Draft, Locked, Finished] - - pure $ - Parameters - { proposalCount = nProposals - , stakeRole = role - , retractVotes = True - , removeVoterLock = True - , removeCreatorLock = False - , proposalStatus = status - , alterOutputStake = False - } - -{- | Illegal parameter that try to unlock a stake that has nothing to do with - the proposals. --} -mkUnockIrrelevantStakeParameters :: Integer -> [Parameters] -mkUnockIrrelevantStakeParameters nProposals = do - status <- [Draft, VotingReady, Locked, Finished] - retractVotes <- [True, False] - - pure $ - Parameters - { proposalCount = nProposals - , stakeRole = Irrelevant - , retractVotes = retractVotes - , removeVoterLock = True - , removeCreatorLock = True - , proposalStatus = status - , alterOutputStake = False - } - -{- | Illegal parameters that remove the creator locks before the proposals are - 'Finished'. --} -mkRemoveCreatorLockBeforeFinishedParameters :: Integer -> [Parameters] -mkRemoveCreatorLockBeforeFinishedParameters nProposals = do - status <- [Draft, VotingReady, Locked] - - pure $ - Parameters - { proposalCount = nProposals - , stakeRole = Creator - , retractVotes = False - , removeVoterLock = False - , removeCreatorLock = True - , proposalStatus = status - , alterOutputStake = False - } - -{- | Illegal parameters that try to retract votes with a stake that was only used - for creating the proposals. --} -mkRetractVotesWithCreatorStakeParamaters :: Integer -> Parameters -mkRetractVotesWithCreatorStakeParamaters nProposals = - Parameters - { proposalCount = nProposals - , stakeRole = Creator - , retractVotes = True - , removeVoterLock = True - , removeCreatorLock = True - , proposalStatus = VotingReady - , alterOutputStake = False - } - -{- | Illegal parameters that try to change the 'StakeDatum.stakedAmount' field of - the output stake datum. --} -mkAlterStakeParameters :: Integer -> [Parameters] -mkAlterStakeParameters nProposals = do - role <- enumFrom Voter - status <- [Draft, Locked, Finished] - - pure $ - Parameters - { proposalCount = nProposals - , stakeRole = role - , retractVotes = True - , removeVoterLock = True - , removeCreatorLock = False - , proposalStatus = status - , alterOutputStake = True - } - --------------------------------------------------------------------------------- - -{- | Create a test tree that runs both the stake validator and the proposal - validator. --} -mkTestTree :: String -> Parameters -> Bool -> SpecificationTree -mkTestTree name ps isValid = group name [stake, proposal] - where - spend = mkSpending unlockStake ps - - stake = - testValidator - (not ps.alterOutputStake) - "stake" - agoraScripts.compiledStakeValidator - (mkStakeInputDatum ps) - stakeRedeemer - (spend stakeRef) - - proposal = - let idx = 0 - pid = ProposalId $ fromIntegral idx - ref = mkProposalRef idx - in testValidator - isValid - "proposal" - agoraScripts.compiledProposalValidator - (mkProposalInputDatum ps pid) - proposalRedeemer - (spend ref) diff --git a/agora-specs/Sample/Proposal/Vote.hs b/agora-specs/Sample/Proposal/Vote.hs index 937a152..e02cd6b 100644 --- a/agora-specs/Sample/Proposal/Vote.hs +++ b/agora-specs/Sample/Proposal/Vote.hs @@ -2,13 +2,32 @@ Module : Sample.Proposal.Vote Maintainer : connor@mlabs.city Description: Generate sample data for testing the functionalities of voting on proposals. - Sample and utilities for testing the functionalities of voting on proposals. -} module Sample.Proposal.Vote ( - validVoteParameters, + ParameterBundle (..), + VoteParameters (..), + StakeParameters (..), + StakeInputParameters (..), + StakeOutputParameters (..), + NumProposals (..), + ProposalParameters (..), + TransactionParameters (..), + Validity (..), + vote, mkTestTree, - validVoteAsDelegateParameters, + mkValidOwnerVoteBundle, + mkValidDelegateeVoteBundle, + delegateeVoteWithOwnAndDelegatedStakeBundle, + transparentAssets, + transactionNotAuthorized, + voteForNonexistentOutcome, + noProposal, + moreThanOneProposals, + invalidLocks, + destroyStakes, + insufficientAmount, + insufficientAmount1, ) where import Agora.Governor (Governor (..)) @@ -17,6 +36,7 @@ import Agora.Proposal ( ProposalId (ProposalId), ProposalRedeemer (Vote), ProposalStatus (VotingReady), + ProposalThresholds (vote), ProposalVotes (ProposalVotes), ResultTag (ResultTag), ) @@ -24,269 +44,550 @@ import Agora.Proposal.Time ( ProposalStartingTime (ProposalStartingTime), ProposalTimingConfig (draftTime, votingTime), ) -import Agora.Scripts (AgoraScripts (..)) +import Agora.SafeMoney (GTTag) import Agora.Stake ( - ProposalLock (..), + ProposalAction (Voted), + ProposalLock (ProposalLock), StakeDatum (..), - StakeRedeemer (PermitVote), + StakeRedeemer (Destroy, PermitVote), ) import Data.Default (Default (def)) -import Data.Tagged (Tagged (Tagged), untag) +import Data.Map.Strict qualified as StrictMap +import Data.Maybe (catMaybes) +import Data.Tagged (Tagged, untag) import Plutarch.Context ( input, + mint, + normalizeValue, output, script, signedWith, timeRange, - txId, - withDatum, - withOutRef, + withInlineDatum, + withRedeemer, + withRef, withValue, ) -import PlutusLedgerApi.V1 ( - PubKeyHash, - TxOutRef (TxOutRef), - ) -import PlutusLedgerApi.V1.Value qualified as Value -import PlutusTx.AssocMap qualified as AssocMap -import Sample.Proposal.Shared (proposalTxRef, stakeTxRef) +import Plutarch.Extra.AssetClass (adaClass, assetClassValue) +import PlutusLedgerApi.V2 (Credential (PubKeyCredential), Interval, POSIXTime, PubKeyHash) +import PlutusLedgerApi.V2.Contexts (TxOutRef (TxOutRef)) +import Sample.Proposal.Shared (proposalTxRef) import Sample.Shared ( - agoraScripts, governor, minAda, - proposalPolicySymbol, - proposalValidatorHash, - signer, + proposalAssetClass, + proposalScriptHash, + proposalValidator, stakeAssetClass, - stakeValidatorHash, + stakeScriptHash, + stakeValidator, ) -import Test.Specification ( - SpecificationTree, - group, - testValidator, - validatorSucceedsWith, +import Test.Specification (SpecificationTree, group, testValidator) +import Test.Util ( + CombinableBuilder, + closedBoundedInterval, + mkSpending, + pubKeyHashes, ) -import Test.Util (CombinableBuilder, closedBoundedInterval, mkSpending, pubKeyHashes, sortValue, updateMap) --- | Reference to the proposal UTXO. -proposalRef :: TxOutRef -proposalRef = TxOutRef proposalTxRef 0 - --- | Reference to the stake UTXO. -stakeRef :: TxOutRef -stakeRef = TxOutRef stakeTxRef 1 - --- | Parameters for creating a voting transaction. -data Parameters = Parameters - { voteFor :: ResultTag - -- ^ The outcome the transaction is voting for. - , voteCount :: Integer - -- ^ The count of votes. - , voteAsDelegate :: Bool - -- ^ Delegate the stake and use it to vote. +data ParameterBundle = ParamerterBundle + { voteParameters :: VoteParameters + , stakeParameters :: StakeParameters + , proposalParameters :: ProposalParameters + , transactionParameters :: TransactionParameters } --- | The public key hash of the stake owner. -stakeOwner :: PubKeyHash -stakeOwner = signer +newtype VoteParameters = VoteParameters {voteFor :: ResultTag} --- | The votes of the input proposals. -initialVotes :: AssocMap.Map ResultTag Integer +data StakeParameters = StakeParameters + { numStakes :: Integer + , mixInDelegateeAsOwner :: Bool + , stakeInputParameters :: StakeInputParameters + , stakeOutputParameters :: StakeOutputParameters + } + +newtype StakeInputParameters = StakeInputParameters + { perStakeGTs :: Tagged GTTag Integer + } + +data StakeOutputParameters = StakeOutputParameters + { burnStakes :: Bool + , dontAddNewLock :: Bool + , changeGTAmount :: Bool + , changeAdaAmount :: Bool + } + +data NumProposals = NoProposal | OneProposal | MoreThanOneProposals + +data ProposalParameters = ProposalParameters + { wrongAddedVotes :: Bool + , numProposals :: NumProposals + } + +data SignedBy = Owner | Delegatee | Unknown + +newtype TransactionParameters = TransactionParameters + { signedBy :: SignedBy + } + +data Validity = Validity + { forProposalValidator :: Bool + , forStakeValidator :: Bool + } + +-------------------------------------------------------------------------------- + +stakeOwner :: PubKeyHash +stakeOwner = head pubKeyHashes + +delegatee :: PubKeyHash +delegatee = pubKeyHashes !! 1 + +unknownSig :: PubKeyHash +unknownSig = pubKeyHashes !! 2 + +validTimeRangeLowerBound :: POSIXTime +validTimeRangeLowerBound = + 0 + + (def :: ProposalTimingConfig).draftTime + + 1 + +validTimeRangeUpperBound :: POSIXTime +validTimeRangeUpperBound = + validTimeRangeLowerBound + + (def :: ProposalTimingConfig).votingTime + - 2 + +validTimeRange :: Interval POSIXTime +validTimeRange = + closedBoundedInterval + validTimeRangeLowerBound + validTimeRangeUpperBound + +-------------------------------------------------------------------------------- + +initialVotes :: StrictMap.Map ResultTag Integer initialVotes = - AssocMap.fromList - [ (ResultTag 0, 42) - , (ResultTag 1, 4242) + StrictMap.fromList + [ (ResultTag 0, 114) + , (ResultTag 1, 514) ] --- | The input proposal datum. proposalInputDatum :: ProposalDatum proposalInputDatum = ProposalDatum - { proposalId = ProposalId 42 + { proposalId = ProposalId 22 , effects = - AssocMap.fromList - [ (ResultTag 0, AssocMap.empty) - , (ResultTag 1, AssocMap.empty) + StrictMap.fromList + [ (ResultTag 0, StrictMap.empty) + , (ResultTag 1, StrictMap.empty) ] , status = VotingReady - , cosigners = [stakeOwner] + , cosigners = [PubKeyCredential stakeOwner] , thresholds = def , votes = ProposalVotes initialVotes , timingConfig = def , startingTime = ProposalStartingTime 0 } --- | The locks of the input stake. -existingLocks :: [ProposalLock] -existingLocks = - [ Voted (ProposalId 0) (ResultTag 0) - , Voted (ProposalId 1) (ResultTag 2) - ] +mkProposalRedeemer :: VoteParameters -> ProposalRedeemer +mkProposalRedeemer v = Vote v.voteFor -delegate :: PubKeyHash -delegate = head pubKeyHashes +mkProposalRef :: Integer -> TxOutRef +mkProposalRef = TxOutRef proposalTxRef -{- | Set the 'StakeDatum.stakedAmount' according to the number of votes being - casted. --} -mkStakeInputDatum :: Parameters -> StakeDatum +numProposals :: NumProposals -> Integer +numProposals NoProposal = 0 +numProposals OneProposal = 1 +numProposals MoreThanOneProposals = 2 + +-------------------------------------------------------------------------------- + +mkStakeRedeemer :: StakeOutputParameters -> StakeRedeemer +mkStakeRedeemer params = + if params.burnStakes + then Destroy + else PermitVote + +mkStakeInputDatum :: StakeInputParameters -> StakeDatum mkStakeInputDatum params = StakeDatum - { stakedAmount = Tagged params.voteCount - , owner = stakeOwner - , delegatedTo = - if params.voteAsDelegate - then Just delegate - else Nothing - , lockedBy = existingLocks + { stakedAmount = params.perStakeGTs + , owner = PubKeyCredential stakeOwner + , delegatedTo = Just (PubKeyCredential delegatee) + , lockedBy = + [ ProposalLock (ProposalId 0) $ Voted (ResultTag 0) 100 + , ProposalLock (ProposalId 1) $ Voted (ResultTag 2) 200 + ] } --- | Create the proposal redeemer. In this case @'Vote' _@ will always be used. -mkProposalRedeemer :: Parameters -> ProposalRedeemer -mkProposalRedeemer = Vote . voteFor +mkStakeRef :: Integer -> Integer -> TxOutRef +mkStakeRef o i = TxOutRef proposalTxRef $ o + i --- | Place new proposal locks on the stake. -mkNewLock :: Parameters -> ProposalLock -mkNewLock = Voted proposalInputDatum.proposalId . voteFor +-------------------------------------------------------------------------------- -{- | The stake redeemer that is used in 'mkTestTree'. In this case it'll always be - 'PermitVote'. --} -stakeRedeemer :: StakeRedeemer -stakeRedeemer = PermitVote - --- | Create a valid transaction that votes on a propsal, given the parameters. -vote :: forall b. CombinableBuilder b => Parameters -> b +vote :: forall b. CombinableBuilder b => ParameterBundle -> b vote params = - let pst = Value.singleton proposalPolicySymbol "" 1 - sst = Value.assetClassValue stakeAssetClass 1 + let pst = assetClassValue proposalAssetClass 1 + sst = assetClassValue stakeAssetClass 1 --- - stakeInputDatum = mkStakeInputDatum params + stakeInputDatum = + mkStakeInputDatum + params.stakeParameters.stakeInputParameters - --- + stakeInputValue = + normalizeValue $ + sst + <> assetClassValue + governor.gtClassRef + params.stakeParameters.stakeInputParameters.perStakeGTs + <> minAda - updatedVotes :: AssocMap.Map ResultTag Integer - updatedVotes = updateMap (Just . (+ params.voteCount)) params.voteFor initialVotes + newLock = + ProposalLock + proposalInputDatum.proposalId + $ Voted + params.voteParameters.voteFor + validTimeRangeUpperBound - --- + updatedLocks = + if params.stakeParameters.stakeOutputParameters.dontAddNewLock + then stakeInputDatum.lockedBy + else newLock : stakeInputDatum.lockedBy + + stakeOutputDatum = stakeInputDatum {lockedBy = updatedLocks} + + stakeOutputValue = + let changeAmount cond = if cond then (* 100) else id + gtAmount = + changeAmount + params.stakeParameters.stakeOutputParameters.changeGTAmount + params.stakeParameters.stakeInputParameters.perStakeGTs + adaAmount = + changeAmount + params.stakeParameters.stakeOutputParameters.changeAdaAmount + 10_000_000 + in normalizeValue $ + sst + <> assetClassValue + governor.gtClassRef + gtAmount + <> minAda + <> assetClassValue adaClass adaAmount + + stakeRedeemer = + mkStakeRedeemer params.stakeParameters.stakeOutputParameters + + mixOwner i datum = + if params.stakeParameters.mixInDelegateeAsOwner + && i == 2 + then + datum + { owner = PubKeyCredential delegatee + , delegatedTo = Nothing + } + else datum + + stakeBuilder :: b + stakeBuilder = + foldMap + ( \i -> + mconcat + [ input $ + mconcat + [ script stakeScriptHash + , withValue stakeInputValue + , withInlineDatum $ mixOwner i stakeInputDatum + , withRedeemer stakeRedeemer + , withRef $ mkStakeRef numProposals' i + ] + , if params.stakeParameters.stakeOutputParameters.burnStakes + then mint $ assetClassValue stakeAssetClass (-1) + else + output $ + mconcat + [ script stakeScriptHash + , withValue stakeOutputValue + , withInlineDatum $ mixOwner i stakeOutputDatum + ] + ] + ) + [1 .. params.stakeParameters.numStakes] + + -------------------------------------------------------------------------- + + numProposals' = numProposals params.proposalParameters.numProposals + + updatedVotes = + StrictMap.adjust + ( ( if params.proposalParameters.wrongAddedVotes + then (* 10) + else id + ) + . ( + + untag params.stakeParameters.stakeInputParameters.perStakeGTs + * params.stakeParameters.numStakes + ) + ) + params.voteParameters.voteFor + initialVotes - proposalOutputDatum :: ProposalDatum proposalOutputDatum = proposalInputDatum { votes = ProposalVotes updatedVotes } - --- + proposalRedeemer = mkProposalRedeemer params.voteParameters - -- Off-chain code should do exactly like this: prepend new lock toStatus the list. - updatedLocks :: [ProposalLock] - updatedLocks = mkNewLock params : existingLocks - - --- - - stakeOutputDatum :: StakeDatum - stakeOutputDatum = - stakeInputDatum - { lockedBy = updatedLocks - } - - --- - - validTimeRange = - closedBoundedInterval - ((def :: ProposalTimingConfig).draftTime + 1) - ((def :: ProposalTimingConfig).votingTime - 1) - - --- - - stakeValue = - sortValue $ - sst - <> Value.assetClassValue (untag governor.gtClassRef) params.voteCount + proposalValue = + normalizeValue $ + pst <> minAda - signer = - if params.voteAsDelegate - then delegate - else stakeOwner + proposalBuidler :: b + proposalBuidler = + foldMap + ( \i -> + mconcat + [ input $ + mconcat + [ script proposalScriptHash + , withValue proposalValue + , withRedeemer proposalRedeemer + , withInlineDatum proposalInputDatum + , withRef $ mkProposalRef i + ] + , output $ + mconcat + [ script proposalScriptHash + , withValue proposalValue + , withInlineDatum proposalOutputDatum + ] + ] + ) + [1 .. numProposals'] + -------------------------------------------------------------------------- + + sig = case params.transactionParameters.signedBy of + Owner -> stakeOwner + Delegatee -> delegatee + Unknown -> unknownSig + + -------------------------------------------------------------------------- + + miscBuilder :: b + miscBuilder = + mconcat + [ signedWith sig + , timeRange validTimeRange + ] + + -------------------------------------------------------------------------- + + builder :: b builder = mconcat - [ txId "827598fb2d69a896bbd9e645bb14c307df907f422b39eecbe4d6329bc30b428c" - , signedWith signer - , timeRange validTimeRange - , input $ - mconcat - [ script proposalValidatorHash - , withValue pst - , withDatum proposalInputDatum - , withOutRef proposalRef - ] - , input $ - mconcat - [ script stakeValidatorHash - , withValue stakeValue - , withDatum stakeInputDatum - , withOutRef stakeRef - ] - , output $ - mconcat - [ script proposalValidatorHash - , withValue pst - , withDatum proposalOutputDatum - ] - , output $ - mconcat - [ script stakeValidatorHash - , withValue stakeValue - , withDatum stakeOutputDatum - ] + [ stakeBuilder + , proposalBuidler + , miscBuilder ] in builder ---- +-------------------------------------------------------------------------------- --- | Valida parameters that vote on the proposal. -validVoteParameters :: Parameters -validVoteParameters = - Parameters - { voteFor = ResultTag 0 - , voteCount = 27 - , voteAsDelegate = False - } - -validVoteAsDelegateParameters :: Parameters -validVoteAsDelegateParameters = - validVoteParameters - { voteAsDelegate = True - } - ---- - -{- | Create a test tree that runs the stake validator and proposal validator to - test the voting functionalities. --} -mkTestTree :: String -> Parameters -> Bool -> SpecificationTree -mkTestTree name ps isValid = group name [proposal, stake] +mkTestTree :: String -> ParameterBundle -> Validity -> SpecificationTree +mkTestTree name ps val = group name $ catMaybes [proposal, stake] where spend = mkSpending vote ps + numProposals' = numProposals ps.proposalParameters.numProposals + proposal = - testValidator - isValid - "proposal" - agoraScripts.compiledProposalValidator - proposalInputDatum - (mkProposalRedeemer ps) - (spend proposalRef) + case ps.proposalParameters.numProposals of + NoProposal -> Nothing + _ -> + Just $ + testValidator + val.forProposalValidator + "proposal" + proposalValidator + proposalInputDatum + (mkProposalRedeemer ps.voteParameters) + (spend $ mkProposalRef 1) stake = - let stakeInputDatum = mkStakeInputDatum ps - in validatorSucceedsWith - "stake" - agoraScripts.compiledStakeValidator - stakeInputDatum - stakeRedeemer - (spend stakeRef) + case ps.stakeParameters.numStakes of + 0 -> error "At least one stake" + _ -> + let stakeRef = mkStakeRef numProposals' 1 + in Just $ + testValidator + val.forStakeValidator + "stake" + stakeValidator + (mkStakeInputDatum ps.stakeParameters.stakeInputParameters) + (mkStakeRedeemer ps.stakeParameters.stakeOutputParameters) + (spend stakeRef) + +-------------------------------------------------------------------------------- + +-- TODO(Connor) Use optics + +mkValidOwnerVoteBundle :: Integer -> ParameterBundle +mkValidOwnerVoteBundle stakes = + ParamerterBundle + { voteParameters = + VoteParameters + { voteFor = ResultTag 0 + } + , stakeParameters = + StakeParameters + { numStakes = stakes + , mixInDelegateeAsOwner = False + , stakeInputParameters = + StakeInputParameters + { perStakeGTs = (def :: ProposalThresholds).vote + } + , stakeOutputParameters = + StakeOutputParameters + { burnStakes = False + , dontAddNewLock = False + , changeGTAmount = False + , changeAdaAmount = False + } + } + , proposalParameters = + ProposalParameters + { wrongAddedVotes = False + , numProposals = OneProposal + } + , transactionParameters = + TransactionParameters + { signedBy = Owner + } + } + +mkValidDelegateeVoteBundle :: Integer -> ParameterBundle +mkValidDelegateeVoteBundle stakes = + let template = mkValidOwnerVoteBundle stakes + in template + { transactionParameters = + template.transactionParameters + { signedBy = Delegatee + } + } + +delegateeVoteWithOwnAndDelegatedStakeBundle :: ParameterBundle +delegateeVoteWithOwnAndDelegatedStakeBundle = + let template = mkValidDelegateeVoteBundle 5 + in template + { stakeParameters = + template.stakeParameters + { mixInDelegateeAsOwner = True + } + } + +ownerVoteWithSignleStake :: ParameterBundle +ownerVoteWithSignleStake = mkValidOwnerVoteBundle 1 + +transparentAssets :: ParameterBundle +transparentAssets = + ownerVoteWithSignleStake + { stakeParameters = + ownerVoteWithSignleStake.stakeParameters + { stakeOutputParameters = + ownerVoteWithSignleStake.stakeParameters.stakeOutputParameters + { changeAdaAmount = True + } + } + } + +transactionNotAuthorized :: ParameterBundle +transactionNotAuthorized = + ownerVoteWithSignleStake + { transactionParameters = + ownerVoteWithSignleStake.transactionParameters + { signedBy = Unknown + } + } + +voteForNonexistentOutcome :: ParameterBundle +voteForNonexistentOutcome = + ownerVoteWithSignleStake + { voteParameters = + ownerVoteWithSignleStake.voteParameters + { voteFor = ResultTag 1919810 + } + } + +noProposal :: ParameterBundle +noProposal = + ownerVoteWithSignleStake + { proposalParameters = + ownerVoteWithSignleStake.proposalParameters + { numProposals = NoProposal + } + } + +moreThanOneProposals :: ParameterBundle +moreThanOneProposals = + ownerVoteWithSignleStake + { proposalParameters = + ownerVoteWithSignleStake.proposalParameters + { numProposals = MoreThanOneProposals + } + } + +ownerVoteWithMultipleStakes :: ParameterBundle +ownerVoteWithMultipleStakes = mkValidOwnerVoteBundle 5 + +invalidLocks :: ParameterBundle +invalidLocks = + ownerVoteWithMultipleStakes + { stakeParameters = + ownerVoteWithMultipleStakes.stakeParameters + { stakeOutputParameters = + ownerVoteWithMultipleStakes.stakeParameters.stakeOutputParameters + { dontAddNewLock = True + } + } + } + +destroyStakes :: ParameterBundle +destroyStakes = + ownerVoteWithMultipleStakes + { stakeParameters = + ownerVoteWithMultipleStakes.stakeParameters + { stakeOutputParameters = + ownerVoteWithMultipleStakes.stakeParameters.stakeOutputParameters + { burnStakes = True + } + } + } + +insufficientAmount :: ParameterBundle +insufficientAmount = + ownerVoteWithSignleStake + { stakeParameters = + ownerVoteWithSignleStake.stakeParameters + { stakeInputParameters = + ownerVoteWithSignleStake.stakeParameters.stakeInputParameters + { perStakeGTs = 1 + } + } + } + +insufficientAmount1 :: ParameterBundle +insufficientAmount1 = + ownerVoteWithMultipleStakes + { stakeParameters = + ownerVoteWithMultipleStakes.stakeParameters + { stakeInputParameters = + ownerVoteWithMultipleStakes.stakeParameters.stakeInputParameters + { perStakeGTs = 1 + } + } + } diff --git a/agora-specs/Sample/Shared.hs b/agora-specs/Sample/Shared.hs index 01039db..128a963 100644 --- a/agora-specs/Sample/Shared.hs +++ b/agora-specs/Sample/Shared.hs @@ -12,8 +12,8 @@ module Sample.Shared ( signer, signer2, minAda, - deterministicTracingConfing, - mkEffect, + deterministicTracingConfig, + mkRedeemer, -- * Agora Scripts agoraScripts, @@ -22,27 +22,33 @@ module Sample.Shared ( -- ** Stake stakeAssetClass, - stakeValidatorHash, + stakePolicy, + stakeValidator, + stakeScriptHash, stakeAddress, stakeSymbol, -- ** Governor governor, - govPolicy, - govValidator, - govSymbol, - govAssetClass, - govValidatorAddress, - govValidatorHash, + governorPolicy, + governorValidator, + governorSymbol, + governorAssetClass, + governorValidatorAddress, + governorScriptHash, gstUTXORef, -- ** Proposal + proposalPolicy, proposalPolicySymbol, - proposalValidatorHash, + proposalValidator, + proposalScriptHash, proposalValidatorAddress, proposalStartingTimeFromTimeRange, + proposalAssetClass, -- ** Authority + authorityTokenPolicy, authorityTokenSymbol, -- ** Treasury @@ -51,65 +57,67 @@ module Sample.Shared ( gatCs, mockTrEffect, mockTrEffectHash, + trValidator, + trScriptHash, trCredential, wrongEffHash, ) where import Agora.Bootstrap qualified as Bootstrap -import Agora.Effect.NoOp (noOpValidator) import Agora.Governor (Governor (Governor)) +import Agora.Linker (linker) import Agora.Proposal (ProposalThresholds (..)) import Agora.Proposal.Time ( MaxTimeRangeWidth (..), ProposalStartingTime (ProposalStartingTime), ProposalTimingConfig (..), ) -import Agora.Scripts qualified as Scripts -import Agora.Treasury (treasuryValidator) -import Agora.Utils ( - CompiledEffect (CompiledEffect), - CompiledMintingPolicy (getCompiledMintingPolicy), - CompiledValidator (getCompiledValidator), - validatorHashToTokenName, - ) +import Agora.SafeMoney (GovernorSTTag, ProposalSTTag, StakeSTTag) import Data.Default.Class (Default (..)) +import Data.Map (Map, (!)) import Data.Tagged (Tagged (..)) -import Plutarch (Config (..), TracingMode (DetTracing)) -import Plutarch.Api.V1 ( - PValidator, - mintingPolicySymbol, - mkValidator, - validatorHash, +import Data.Text (Text) +import Optics (view) +import Plutarch (Config (..), Script, TracingMode (DetTracing)) +import Plutarch.Api.V2 (scriptHash) +import Plutarch.Extra.AssetClass (AssetClass (AssetClass)) +import Plutarch.Extra.ScriptContext (scriptHashToTokenName) +import PlutusLedgerApi.V1.Address (scriptHashAddress) +import PlutusLedgerApi.V1.Value (TokenName, Value) +import PlutusLedgerApi.V1.Value qualified as Value ( + singleton, ) -import PlutusLedgerApi.V1 ( +import PlutusLedgerApi.V2 ( Address (Address), Credential (ScriptCredential), - CurrencySymbol, + CurrencySymbol (CurrencySymbol), Extended (..), Interval (..), LowerBound (..), - MintingPolicy (..), + OutputDatum (NoOutputDatum), POSIXTimeRange, PubKeyHash, + Redeemer (..), + ScriptHash (getScriptHash), + ToData (toBuiltinData), + TxOut ( + TxOut, + txOutAddress, + txOutDatum, + txOutReferenceScript, + txOutValue + ), TxOutRef (TxOutRef), UpperBound (..), - Value, - ) -import PlutusLedgerApi.V1.Address (scriptHashAddress) -import PlutusLedgerApi.V1.Contexts (TxOut (..)) -import PlutusLedgerApi.V1.Scripts (Validator, ValidatorHash (..)) -import PlutusLedgerApi.V1.Value (AssetClass, TokenName) -import PlutusLedgerApi.V1.Value qualified as Value ( - assetClass, - singleton, ) import PlutusTx qualified +import ScriptExport.ScriptInfo (runLinker) -- Plutarch compiler configauration. -- TODO: add the ability to change this value. Maybe wrap everything in a -- Reader monad? -deterministicTracingConfing :: Config -deterministicTracingConfing = Config DetTracing +deterministicTracingConfig :: Config +deterministicTracingConfig = Config DetTracing governor :: Governor governor = Governor oref gt mc @@ -117,49 +125,69 @@ governor = Governor oref gt mc oref = gstUTXORef gt = Tagged $ - Value.assetClass + AssetClass "da8c30857834c6ae7203935b89278c532b3995245295456f993e1d24" "LQ" mc = 20 -agoraScripts :: Scripts.AgoraScripts -agoraScripts = Bootstrap.agoraScripts deterministicTracingConfing governor +agoraScripts :: Map Text Script +agoraScripts = + either + (error . show) + (fmap (view #script) . view #scripts) + ( runLinker + linker + (Bootstrap.agoraScripts deterministicTracingConfig) + governor + ) + +stakePolicy :: Script +stakePolicy = agoraScripts ! "agora:stakePolicy" stakeSymbol :: CurrencySymbol -stakeSymbol = Scripts.stakeSTSymbol agoraScripts +stakeSymbol = CurrencySymbol . getScriptHash $ scriptHash stakePolicy -stakeAssetClass :: AssetClass -stakeAssetClass = Scripts.stakeSTAssetClass agoraScripts +stakeAssetClass :: Tagged StakeSTTag AssetClass +stakeAssetClass = Tagged $ AssetClass stakeSymbol (scriptHashToTokenName stakeScriptHash) -stakeValidatorHash :: ValidatorHash -stakeValidatorHash = Scripts.stakeValidatorHash agoraScripts +stakeValidator :: Script +stakeValidator = agoraScripts ! "agora:stakeValidator" + +stakeScriptHash :: ScriptHash +stakeScriptHash = scriptHash stakeValidator stakeAddress :: Address -stakeAddress = Address (ScriptCredential stakeValidatorHash) Nothing +stakeAddress = Address (ScriptCredential stakeScriptHash) Nothing gstUTXORef :: TxOutRef gstUTXORef = TxOutRef "f28cd7145c24e66fd5bcd2796837aeb19a48a2656e7833c88c62a2d0450bd00d" 0 -govPolicy :: MintingPolicy -govPolicy = getCompiledMintingPolicy $ agoraScripts.compiledGovernorPolicy +governorPolicy :: Script +governorPolicy = agoraScripts ! "agora:governorPolicy" -govValidator :: Validator -govValidator = getCompiledValidator $ agoraScripts.compiledGovernorValidator +governorValidator :: Script +governorValidator = agoraScripts ! "agora:governorValidator" -govSymbol :: CurrencySymbol -govSymbol = mintingPolicySymbol govPolicy +governorSymbol :: CurrencySymbol +governorSymbol = CurrencySymbol . getScriptHash $ scriptHash governorPolicy -govAssetClass :: AssetClass -govAssetClass = Scripts.governorSTAssetClass agoraScripts +governorAssetClass :: Tagged GovernorSTTag AssetClass +governorAssetClass = Tagged $ AssetClass governorSymbol "" -govValidatorHash :: ValidatorHash -govValidatorHash = Scripts.governorValidatorHash agoraScripts +governorScriptHash :: ScriptHash +governorScriptHash = scriptHash governorValidator -govValidatorAddress :: Address -govValidatorAddress = scriptHashAddress govValidatorHash +governorValidatorAddress :: Address +governorValidatorAddress = scriptHashAddress governorScriptHash + +proposalPolicy :: Script +proposalPolicy = agoraScripts ! "agora:proposalPolicy" proposalPolicySymbol :: CurrencySymbol -proposalPolicySymbol = Scripts.proposalSTSymbol agoraScripts +proposalPolicySymbol = CurrencySymbol . getScriptHash $ scriptHash proposalPolicy + +proposalAssetClass :: Tagged ProposalSTTag AssetClass +proposalAssetClass = Tagged $ AssetClass proposalPolicySymbol "" -- | A sample 'PubKeyHash'. signer :: PubKeyHash @@ -169,11 +197,14 @@ signer = "8a30896c4fd5e79843e4ca1bd2cdbaa36f8c0bc3be7401214142019c" signer2 :: PubKeyHash signer2 = "8a30896c4fd5e79843e4ca1bd2cdbaa36f8c0bc3be74012141420192" -proposalValidatorHash :: ValidatorHash -proposalValidatorHash = Scripts.proposalValidatoHash agoraScripts +proposalValidator :: Script +proposalValidator = agoraScripts ! "agora:proposalValidator" + +proposalScriptHash :: ScriptHash +proposalScriptHash = scriptHash proposalValidator proposalValidatorAddress :: Address -proposalValidatorAddress = scriptHashAddress proposalValidatorHash +proposalValidatorAddress = scriptHashAddress proposalScriptHash {- | Default value of 'Agora.Proposal.ProposalThresholds'. For testing purpose only. @@ -183,11 +214,16 @@ instance Default ProposalThresholds where ProposalThresholds { execute = Tagged 1000 , create = Tagged 1 + , toVoting = Tagged 100 , vote = Tagged 100 + , cosign = Tagged 100 } +authorityTokenPolicy :: Script +authorityTokenPolicy = agoraScripts ! "agora:authorityTokenPolicy" + authorityTokenSymbol :: CurrencySymbol -authorityTokenSymbol = Scripts.authorityTokenSymbol agoraScripts +authorityTokenSymbol = CurrencySymbol . getScriptHash $ scriptHash authorityTokenPolicy {- | Default value of 'Agora.Governor.GovernorDatum.proposalTimings'. For testing purpose only. @@ -199,6 +235,8 @@ instance Default ProposalTimingConfig where , votingTime = 1000 , lockingTime = 2000 , executingTime = 3000 + , minStakeVotingTime = 100 + , votingTimeRangeMaxWidth = 1000000 } {- | Default value of 'Agora.Governor.GovernorDatum.createProposalTimeRangeMaxWidth'. @@ -216,8 +254,8 @@ proposalStartingTimeFromTimeRange ProposalStartingTime $ (l + u) `div` 2 proposalStartingTimeFromTimeRange _ = error "Given time range should be finite and closed" -mkEffect :: (PlutusTx.ToData datum) => ClosedTerm PValidator -> CompiledEffect datum -mkEffect v = CompiledEffect $ mkValidator deterministicTracingConfing v +mkRedeemer :: forall redeemer. PlutusTx.ToData redeemer => redeemer -> Redeemer +mkRedeemer = Redeemer . toBuiltinData ------------------------------------------------------------------ @@ -226,41 +264,43 @@ treasuryOut = TxOut { txOutAddress = Address trCredential Nothing , txOutValue = minAda - , txOutDatumHash = Nothing + , txOutDatum = NoOutputDatum + , txOutReferenceScript = Nothing } {- | Arbitrary 'CurrencySymbol', representing the 'CurrencySymbol' of a valid governance authority token (GAT). -} gatCs :: CurrencySymbol -gatCs = "73475cb40a568e8da8a045ced110137e159f890ac4da883b6b17dc651b3a8049" +gatCs = authorityTokenSymbol -trValidator :: Validator -trValidator = mkValidator def (treasuryValidator gatCs) +trValidator :: Script +trValidator = agoraScripts ! "agora:treasuryValidator" + +trScriptHash :: ScriptHash +trScriptHash = scriptHash trValidator -- | `ScriptCredential` used for the dummy treasury validator. trCredential :: Credential -trCredential = ScriptCredential $ validatorHash trValidator +trCredential = ScriptCredential trScriptHash -- | `TokenName` for GAT generated from address of `mockTrEffect`. gatTn :: TokenName -gatTn = validatorHashToTokenName $ validatorHash mockTrEffect +gatTn = scriptHashToTokenName $ scriptHash mockTrEffect -- | Mock treasury effect script, used for testing. -mockTrEffect :: Validator -mockTrEffect = mkValidator def $ noOpValidator gatCs +mockTrEffect :: Script +mockTrEffect = agoraScripts ! "agora:noOpValidator" -- | Mock treasury effect validator hash -mockTrEffectHash :: ValidatorHash -mockTrEffectHash = validatorHash mockTrEffect +mockTrEffectHash :: ScriptHash +mockTrEffectHash = scriptHash mockTrEffect {- | A SHA-256 hash which (in all certainty) should not match the hash of the dummy effect script. -} -wrongEffHash :: ValidatorHash -wrongEffHash = - ValidatorHash - "a21bc4a1d95600f9fa0a00b97ed0fa49a152a72de76253cb706f90b4b40f837b" +wrongEffHash :: ScriptHash +wrongEffHash = "a21bc4a1d95600f9fa0a00b97ed0fa49a152a72de76253cb706f90b4b40f837b" ------------------------------------------------------------------ diff --git a/agora-specs/Sample/Stake.hs b/agora-specs/Sample/Stake.hs index 1d0f2c1..3a377ac 100644 --- a/agora-specs/Sample/Stake.hs +++ b/agora-specs/Sample/Stake.hs @@ -11,9 +11,6 @@ module Sample.Stake ( signer, -- * Script contexts - stakeCreation, - stakeCreationWrongDatum, - stakeCreationUnsigned, stakeDepositWithdraw, DepositWithdrawExample (..), ) where @@ -23,91 +20,35 @@ import Agora.SafeMoney (GTTag) import Agora.Stake ( StakeDatum (StakeDatum, stakedAmount), ) -import Data.Tagged (Tagged, untag) +import Data.Tagged (Tagged) import Plutarch.Context ( - MintingBuilder, SpendingBuilder, - buildMintingUnsafe, - buildSpendingUnsafe, + buildSpending', input, - mint, output, script, signedWith, txId, withDatum, - withMinting, - withOutRef, + withRef, withSpendingOutRef, withValue, ) -import PlutusLedgerApi.V1 ( - Datum (Datum), - ScriptContext (..), - ScriptPurpose (Minting), - ToData (toBuiltinData), - TxInfo (txInfoData, txInfoSignatories), - ) +import Plutarch.Extra.AssetClass (assetClassValue) import PlutusLedgerApi.V1.Contexts (TxOutRef (..)) -import PlutusLedgerApi.V1.Value qualified as Value ( - assetClassValue, - singleton, +import PlutusLedgerApi.V2 ( + Credential (PubKeyCredential), + ScriptContext (..), ) import Sample.Shared ( governor, signer, stakeAssetClass, + stakeScriptHash, stakeSymbol, - stakeValidatorHash, ) import Test.Util (sortValue) --- | This script context should be a valid transaction. -stakeCreation :: ScriptContext -stakeCreation = - let st = Value.assetClassValue stakeAssetClass 1 -- Stake ST - datum :: StakeDatum - datum = StakeDatum 424242424242 signer Nothing [] - - builder :: MintingBuilder - builder = - mconcat - [ txId "0b2086cbf8b6900f8cb65e012de4516cb66b5cb08a9aaba12a8b88be" - , signedWith signer - , mint st - , output $ - mconcat - [ script stakeValidatorHash - , withValue (st <> Value.singleton "da8c30857834c6ae7203935b89278c532b3995245295456f993e1d24" "LQ" 424242424242) - , withDatum datum - ] - , withMinting stakeSymbol - ] - in buildMintingUnsafe builder - --- | This ScriptContext should fail because the datum has too much GT. -stakeCreationWrongDatum :: ScriptContext -stakeCreationWrongDatum = - let datum :: Datum - datum = Datum (toBuiltinData $ StakeDatum 4242424242424242 signer Nothing []) -- Too much GT - in ScriptContext - { scriptContextTxInfo = stakeCreation.scriptContextTxInfo {txInfoData = [("", datum)]} - , scriptContextPurpose = Minting stakeSymbol - } - --- | This ScriptContext should fail because the datum has too much GT. -stakeCreationUnsigned :: ScriptContext -stakeCreationUnsigned = - ScriptContext - { scriptContextTxInfo = - stakeCreation.scriptContextTxInfo - { txInfoSignatories = [] - } - , scriptContextPurpose = Minting stakeSymbol - } - --------------------------------------------------------------------------------- - -- | Config for creating a ScriptContext that deposits or withdraws. data DepositWithdrawExample = DepositWithdrawExample { startAmount :: Tagged GTTag Integer @@ -119,9 +60,9 @@ data DepositWithdrawExample = DepositWithdrawExample -- | Create a ScriptContext that deposits or withdraws, given the config for it. stakeDepositWithdraw :: DepositWithdrawExample -> ScriptContext stakeDepositWithdraw config = - let st = Value.assetClassValue stakeAssetClass 1 -- Stake ST + let st = assetClassValue stakeAssetClass 1 -- Stake ST stakeBefore :: StakeDatum - stakeBefore = StakeDatum config.startAmount signer Nothing [] + stakeBefore = StakeDatum config.startAmount (PubKeyCredential signer) Nothing [] stakeAfter :: StakeDatum stakeAfter = stakeBefore {stakedAmount = stakeBefore.stakedAmount + config.delta} @@ -134,28 +75,27 @@ stakeDepositWithdraw config = mconcat [ txId "0b2086cbf8b6900f8cb65e012de4516cb66b5cb08a9aaba12a8b88be" , signedWith signer - , mint st , input $ mconcat - [ script stakeValidatorHash + [ script stakeScriptHash , withValue ( sortValue $ st - <> Value.assetClassValue (untag governor.gtClassRef) (untag stakeBefore.stakedAmount) + <> assetClassValue governor.gtClassRef stakeBefore.stakedAmount ) - , withDatum stakeAfter - , withOutRef stakeRef + , withDatum stakeBefore + , withRef stakeRef ] , output $ mconcat - [ script stakeValidatorHash + [ script stakeScriptHash , withValue ( sortValue $ st - <> Value.assetClassValue (untag governor.gtClassRef) (untag stakeAfter.stakedAmount) + <> assetClassValue governor.gtClassRef stakeAfter.stakedAmount ) , withDatum stakeAfter ] , withSpendingOutRef stakeRef ] - in buildSpendingUnsafe builder + in buildSpending' builder diff --git a/agora-specs/Sample/Stake/Create.hs b/agora-specs/Sample/Stake/Create.hs new file mode 100644 index 0000000..808ebba --- /dev/null +++ b/agora-specs/Sample/Stake/Create.hs @@ -0,0 +1,260 @@ +{-# LANGUAGE ExistentialQuantification #-} + +module Sample.Stake.Create ( + StakeDatumWrapper (..), + Parameters (..), + create, + mkTestCase, + ownerIsPubKeyTotallyValid, + ownerIsScriptTotallyValid, + createMoreThanOneStake, + spendStake, + unexpectedStakedAmount, + noStakeDatum, + malformedStakeDatum, + notAuthorizedByOwner, + setDelegatee, + alreadyHasLocks, +) where + +import Agora.Governor (Governor (gtClassRef)) +import Agora.Proposal (ProposalId (ProposalId)) +import Agora.SafeMoney (GTTag) +import Agora.Stake (ProposalAction (Created), ProposalLock (ProposalLock), StakeDatum (..)) +import Data.Semigroup (stimesMonoid) +import Data.Tagged (Tagged) +import Plutarch.Context ( + input, + mint, + normalizeValue, + output, + pubKey, + script, + signedWith, + withDatum, + withValue, + ) +import Plutarch.Extra.AssetClass (assetClassValue) +import Plutarch.Extra.ScriptContext (scriptHashToTokenName) +import Plutarch.Lift (PUnsafeLiftDecl (PLifted)) +import PlutusLedgerApi.V1.Value qualified as Value +import PlutusLedgerApi.V2 ( + Credential ( + PubKeyCredential, + ScriptCredential + ), + ) +import Sample.Shared ( + governor, + signer, + signer2, + stakePolicy, + stakeScriptHash, + stakeSymbol, + ) +import Test.Specification (SpecificationTree, testPolicy) +import Test.Util (CombinableBuilder, mkMinting, validatorHashes) + +data StakeDatumWrapper + = forall (b :: Type) (p :: S -> Type). + (PUnsafeLiftDecl p, PLifted p ~ b, PIsData p) => + StakeDatumWrapper b + +data Parameters = Parameters + { numSSTMinted :: Integer + , invalidSSTName :: Bool + , stakeAtInput :: Bool + , numGTsInValue :: Tagged GTTag Integer + , stakeDatum :: Maybe StakeDatumWrapper + , authorizedBy :: Maybe Credential + } + +create :: forall b. CombinableBuilder b => Parameters -> b +create ps@Parameters {stakeDatum} = + let perStakeGTs = + assetClassValue + governor.gtClassRef + ps.numGTsInValue + + gtValue = + stimesMonoid ps.numSSTMinted perStakeGTs + + gtInputBuilder = + mconcat + [ input $ + mconcat + [ pubKey signer + , withValue $ normalizeValue gtValue + ] + ] + + --- + + sstName = + if ps.invalidSSTName + then "114514" + else scriptHashToTokenName stakeScriptHash + + sst = Value.singleton stakeSymbol sstName 1 + + withStakeDatum = + maybe + mempty + (\(StakeDatumWrapper stakeDatum) -> withDatum stakeDatum) + stakeDatum + + stakeBuilder = + mconcat + [ script stakeScriptHash + , withValue $ normalizeValue $ sst <> perStakeGTs + , withStakeDatum + ] + + stakeInputBuilder = + if ps.stakeAtInput + then input stakeBuilder + else mempty + + stakeOutputBuilder = + stimesMonoid ps.numSSTMinted $ + output stakeBuilder + + --- + + withAuthorization = + maybe + mempty + ( \case + PubKeyCredential pkh -> signedWith pkh + ScriptCredential val -> input $ script val + ) + ps.authorizedBy + + --- + + mintSSTs = mint $ stimesMonoid ps.numSSTMinted sst + in mconcat + [ gtInputBuilder + , stakeInputBuilder + , stakeOutputBuilder + , withAuthorization + , mintSSTs + ] + +mkTestCase :: String -> Parameters -> Bool -> SpecificationTree +mkTestCase name ps val = stake + where + mint = mkMinting create ps + + stake = + testPolicy + val + name + stakePolicy + () + (mint stakeSymbol) + +mkTotallyValid :: Integer -> Credential -> Parameters +mkTotallyValid gts owner = + Parameters + { numSSTMinted = 1 + , invalidSSTName = False + , numGTsInValue = fromInteger gts + , stakeAtInput = False + , stakeDatum = + Just $ + StakeDatumWrapper $ + StakeDatum + { stakedAmount = fromInteger gts + , owner = owner + , delegatedTo = Nothing + , lockedBy = [] + } + , authorizedBy = Just owner + } + +ownerIsPubKeyTotallyValid :: Parameters +ownerIsPubKeyTotallyValid = mkTotallyValid 114514 (PubKeyCredential signer) + +ownerIsScriptTotallyValid :: Parameters +ownerIsScriptTotallyValid = + mkTotallyValid + 114514 + ( ScriptCredential $ + head validatorHashes + ) + +createMoreThanOneStake :: Parameters +createMoreThanOneStake = + ownerIsPubKeyTotallyValid + { numSSTMinted = 5 + } + +spendStake :: Parameters +spendStake = + ownerIsPubKeyTotallyValid + { stakeAtInput = True + } + +unexpectedStakedAmount :: Parameters +unexpectedStakedAmount = + ownerIsPubKeyTotallyValid + { numGTsInValue = 114514 + , stakeDatum = + Just $ + StakeDatumWrapper $ + StakeDatum + { stakedAmount = 1919810 + , owner = PubKeyCredential signer + , delegatedTo = Nothing + , lockedBy = [] + } + } + +noStakeDatum :: Parameters +noStakeDatum = + ownerIsPubKeyTotallyValid + { stakeDatum = Nothing + } + +malformedStakeDatum :: Parameters +malformedStakeDatum = + ownerIsPubKeyTotallyValid + { stakeDatum = Just $ StakeDatumWrapper (1 :: Integer) + } + +notAuthorizedByOwner :: Parameters +notAuthorizedByOwner = + ownerIsPubKeyTotallyValid + { authorizedBy = Nothing + } + +setDelegatee :: Parameters +setDelegatee = + ownerIsPubKeyTotallyValid + { numGTsInValue = 114514 + , stakeDatum = + Just $ + StakeDatumWrapper $ + StakeDatum + { stakedAmount = 114514 + , owner = PubKeyCredential signer + , delegatedTo = Just $ PubKeyCredential signer2 + , lockedBy = [] + } + } + +alreadyHasLocks :: Parameters +alreadyHasLocks = + ownerIsPubKeyTotallyValid + { numGTsInValue = 114514 + , stakeDatum = + Just $ + StakeDatumWrapper $ + StakeDatum + { stakedAmount = 114514 + , owner = PubKeyCredential signer + , delegatedTo = Nothing + , lockedBy = [ProposalLock (ProposalId 0) Created] + } + } diff --git a/agora-specs/Sample/Stake/Destroy.hs b/agora-specs/Sample/Stake/Destroy.hs new file mode 100644 index 0000000..b820961 --- /dev/null +++ b/agora-specs/Sample/Stake/Destroy.hs @@ -0,0 +1,298 @@ +module Sample.Stake.Destroy ( + ParameterBundle (..), + StakeInputParameters (..), + StakeBurningParameters (..), + LeftOverStakeMode (..), + AuthorizedBy (..), + Validity (..), + destroy, + mkTestTree, + mkTotallyValid, + oneStake, + multipleStakes, + stealSST, + stealSST1, + stealSST3, + lockedStakes, + authorizedByDelegatee, + notAuthorized, +) where + +import Agora.Proposal (ProposalId (..)) +import Agora.Stake ( + ProposalAction (Created), + ProposalLock (ProposalLock), + StakeDatum (..), + StakeRedeemer (Destroy), + ) +import Control.Exception (assert) +import Data.Maybe (catMaybes, fromJust) +import Data.Semigroup (stimesMonoid) +import Plutarch.Context ( + input, + mint, + normalizeValue, + output, + pubKey, + script, + signedWith, + withDatum, + withRedeemer, + withRef, + withValue, + ) +import Plutarch.Extra.AssetClass (assetClassValue) +import PlutusLedgerApi.V1 ( + Credential (PubKeyCredential), + TxOutRef (TxOutRef), + ) +import PlutusLedgerApi.V2 (PubKeyHash) +import Sample.Proposal.Shared (stakeTxRef) +import Sample.Shared ( + minAda, + signer2, + stakeAssetClass, + stakePolicy, + stakeScriptHash, + stakeSymbol, + stakeValidator, + ) +import Test.Specification ( + SpecificationTree, + group, + testPolicy, + testValidator, + ) +import Test.Util (CombinableBuilder, mkMinting, mkSpending, pubKeyHashes) + +data ParameterBundle = ParameterBundle + { stakeInputParameters :: StakeInputParameters + , stakeBurningParameters :: StakeBurningParameters + , authorizedBy :: AuthorizedBy + } + +data StakeInputParameters = StakeInputParameters + { numInputs :: Int + , notUnlocked :: Bool + } + +data StakeBurningParameters = StakeBurningParameters + { numBurnt :: Int + , leftOverStakeMode :: Maybe LeftOverStakeMode + } + +data LeftOverStakeMode = OutputAsIs | CollectSSTInOneUTxO + +data AuthorizedBy = Owner | Delegatee | NotAuthorized + +data Validity = Validity + { forStakePolicy :: Maybe Bool + , forStakeValidator :: Bool + } + +-------------------------------------------------------------------------------- + +owner :: PubKeyHash +owner = pubKeyHashes !! 2 + +delegatee :: PubKeyHash +delegatee = pubKeyHashes !! 3 + +-------------------------------------------------------------------------------- + +mkStakeInputDatum :: StakeInputParameters -> StakeDatum +mkStakeInputDatum ps = + StakeDatum + { stakedAmount = 114514 + , owner = PubKeyCredential owner + , delegatedTo = Just $ PubKeyCredential delegatee + , lockedBy = [ProposalLock (ProposalId 0) Created | ps.notUnlocked] + } + +mkStakeRef :: Int -> TxOutRef +mkStakeRef = TxOutRef stakeTxRef . fromIntegral + +stakeRedeemer :: StakeRedeemer +stakeRedeemer = Destroy + +-------------------------------------------------------------------------------- + +destroy :: forall b. CombinableBuilder b => ParameterBundle -> b +destroy ps = + let stakeInputDatum = mkStakeInputDatum ps.stakeInputParameters + + sst = assetClassValue stakeAssetClass 1 + + stakeUTxOTemplate = + mconcat + [ script stakeScriptHash + , withDatum stakeInputDatum + , withValue $ normalizeValue $ sst <> minAda + ] + + stakeInputBuilder = + foldMap + ( \i -> + input $ + mconcat + [ stakeUTxOTemplate + , withRef $ mkStakeRef i + , withRedeemer stakeRedeemer + ] + ) + [1 .. ps.stakeInputParameters.numInputs] + + withSSTsBurnt = + mint $ + normalizeValue $ + assetClassValue stakeAssetClass $ + negate $ + fromIntegral ps.stakeBurningParameters.numBurnt + + --- + + leftOverStakes = + ps.stakeInputParameters.numInputs + - ps.stakeBurningParameters.numBurnt + + stealSSTs = + case fromJust ps.stakeBurningParameters.leftOverStakeMode of + OutputAsIs -> + foldMap output $ + replicate + leftOverStakes + stakeUTxOTemplate + CollectSSTInOneUTxO -> + output $ + mconcat + [ pubKey signer2 + , withValue $ stimesMonoid leftOverStakes sst + ] + + stakeOutputBuilder = + assert (leftOverStakes >= 0) $ + mconcat + [ withSSTsBurnt + , if leftOverStakes > 0 + then stealSSTs + else mempty + ] + + --- + + sigBuilder = case ps.authorizedBy of + Owner -> signedWith owner + Delegatee -> signedWith delegatee + NotAuthorized -> mempty + in mconcat + [ stakeInputBuilder + , stakeOutputBuilder + , sigBuilder + ] + +-------------------------------------------------------------------------------- + +mkTestTree :: + String -> + ParameterBundle -> + Validity -> + SpecificationTree +mkTestTree name pb val = group name $ catMaybes [validator, policy] + where + spend = mkSpending destroy pb + mint = mkMinting destroy pb + validator = + Just $ + testValidator + val.forStakeValidator + "stake validator" + stakeValidator + (mkStakeInputDatum pb.stakeInputParameters) + stakeRedeemer + (spend $ mkStakeRef 1) + + policy = case pb.stakeBurningParameters.numBurnt of + 0 -> Nothing + _ -> + Just $ + testPolicy + (fromJust val.forStakePolicy) + "stake policy" + stakePolicy + () + (mint stakeSymbol) + +-------------------------------------------------------------------------------- + +mkTotallyValid :: Int -> ParameterBundle +mkTotallyValid numStakes = + ParameterBundle + { stakeInputParameters = + StakeInputParameters + { numInputs = numStakes + , notUnlocked = False + } + , stakeBurningParameters = + StakeBurningParameters + { numBurnt = numStakes + , leftOverStakeMode = Nothing + } + , authorizedBy = Owner + } + +oneStake :: ParameterBundle +oneStake = mkTotallyValid 1 + +multipleStakes :: ParameterBundle +multipleStakes = mkTotallyValid 10 + +stealSST :: ParameterBundle +stealSST = + multipleStakes + { stakeBurningParameters = + StakeBurningParameters + { numBurnt = 1 + , leftOverStakeMode = Just CollectSSTInOneUTxO + } + } + +stealSST1 :: ParameterBundle +stealSST1 = + multipleStakes + { stakeBurningParameters = + StakeBurningParameters + { numBurnt = 0 + , leftOverStakeMode = Just CollectSSTInOneUTxO + } + } + +stealSST3 :: ParameterBundle +stealSST3 = + multipleStakes + { stakeBurningParameters = + StakeBurningParameters + { numBurnt = 1 + , leftOverStakeMode = Just OutputAsIs + } + } + +lockedStakes :: ParameterBundle +lockedStakes = + multipleStakes + { stakeInputParameters = + multipleStakes.stakeInputParameters + { notUnlocked = True + } + } + +authorizedByDelegatee :: ParameterBundle +authorizedByDelegatee = + multipleStakes + { authorizedBy = Delegatee + } + +notAuthorized :: ParameterBundle +notAuthorized = + multipleStakes + { authorizedBy = NotAuthorized + } diff --git a/agora-specs/Sample/Stake/SetDelegate.hs b/agora-specs/Sample/Stake/SetDelegate.hs index 9f9f25e..efc7833 100644 --- a/agora-specs/Sample/Stake/SetDelegate.hs +++ b/agora-specs/Sample/Stake/SetDelegate.hs @@ -20,39 +20,38 @@ module Sample.Stake.SetDelegate ( ) where import Agora.Governor (Governor (gtClassRef)) -import Agora.Scripts (AgoraScripts (..)) import Agora.Stake ( StakeDatum (..), StakeRedeemer (ClearDelegate, DelegateTo), ) -import Data.Tagged (untag) import Plutarch.Context ( SpendingBuilder, - buildSpendingUnsafe, + buildSpending', input, output, script, signedWith, txId, withDatum, - withOutRef, + withRef, withSpendingOutRef, withValue, ) -import PlutusLedgerApi.V1 ( +import Plutarch.Extra.AssetClass (assetClassValue) +import PlutusLedgerApi.V2 ( + Credential (PubKeyCredential), PubKeyHash, ScriptContext, TxOutRef (TxOutRef), ) -import PlutusLedgerApi.V1.Value qualified as Value import Sample.Shared ( - agoraScripts, governor, minAda, signer, signer2, stakeAssetClass, - stakeValidatorHash, + stakeScriptHash, + stakeValidator, ) import Test.Specification (SpecificationTree, testValidator) import Test.Util (pubKeyHashes, sortValue) @@ -73,7 +72,7 @@ data Parameters = Parameters -- | Select the correct stake redeemer based on the existence of the new delegate. mkStakeRedeemer :: Parameters -> StakeRedeemer -mkStakeRedeemer (newDelegate -> d) = maybe ClearDelegate DelegateTo d +mkStakeRedeemer params = maybe ClearDelegate (DelegateTo . PubKeyCredential) params.newDelegate -- | The owner of the input stake. stakeOwner :: PubKeyHash @@ -84,14 +83,14 @@ mkStakeInputDatum :: Parameters -> StakeDatum mkStakeInputDatum ps = StakeDatum { stakedAmount = 5 - , owner = stakeOwner - , delegatedTo = ps.existingDelegate + , owner = PubKeyCredential stakeOwner + , delegatedTo = PubKeyCredential <$> ps.existingDelegate , lockedBy = [] } -- | Generate a 'ScriptContext' that tries to change the delegate of a stake. setDelegate :: Parameters -> ScriptContext -setDelegate ps = buildSpendingUnsafe builder +setDelegate ps = buildSpending' builder where stakeRef :: TxOutRef stakeRef = TxOutRef "0ffef57e30cc604342c738e31e0451593837b313e7bfb94b0922b142782f98e6" 1 @@ -105,22 +104,24 @@ setDelegate ps = buildSpendingUnsafe builder else stakeInput.stakedAmount in stakeInput { stakedAmount = stakedAmount - , delegatedTo = ps.newDelegate + , delegatedTo = PubKeyCredential <$> ps.newDelegate } signer = if ps.signedByOwner - then stakeInput.owner + then case stakeInput.owner of + PubKeyCredential c -> c + _ -> signer2 else signer2 - st = Value.assetClassValue stakeAssetClass 1 -- Stake ST + st = assetClassValue stakeAssetClass 1 -- Stake ST stakeValue = sortValue $ mconcat [ st - , Value.assetClassValue - (untag governor.gtClassRef) - (untag stakeInput.stakedAmount) + , assetClassValue + governor.gtClassRef + stakeInput.stakedAmount , minAda ] @@ -131,14 +132,14 @@ setDelegate ps = buildSpendingUnsafe builder , signedWith signer , input $ mconcat - [ script stakeValidatorHash + [ script stakeScriptHash , withValue stakeValue , withDatum stakeInput - , withOutRef stakeRef + , withRef stakeRef ] , output $ mconcat - [ script stakeValidatorHash + [ script stakeScriptHash , withValue stakeValue , withDatum stakeOutput ] @@ -155,7 +156,7 @@ mkTestCase name ps valid = testValidator valid name - agoraScripts.compiledStakeValidator + stakeValidator (mkStakeInputDatum ps) (mkStakeRedeemer ps) (setDelegate ps) diff --git a/agora-specs/Sample/Stake/UnauthorizedMintingExploit.hs b/agora-specs/Sample/Stake/UnauthorizedMintingExploit.hs new file mode 100644 index 0000000..9460015 --- /dev/null +++ b/agora-specs/Sample/Stake/UnauthorizedMintingExploit.hs @@ -0,0 +1,74 @@ +module Sample.Stake.UnauthorizedMintingExploit ( + Parameters (..), + exploit, + mkTestCase, +) where + +import Plutarch.Context ( + input, + mint, + normalizeValue, + output, + script, + withValue, + ) +import Plutarch.Extra.AssetClass (assetClassValue) +import Plutarch.Extra.ScriptContext (scriptHashToTokenName) +import PlutusLedgerApi.V1.Value qualified as Value +import Sample.Shared ( + minAda, + stakeAssetClass, + stakePolicy, + stakeScriptHash, + stakeSymbol, + ) +import Test.Specification (SpecificationTree, testPolicy) +import Test.Util ( + CombinableBuilder, + mkMinting, + validatorHashes, + ) + +newtype Parameters = Parameters + { inputSST :: Int + } + +exploit :: + forall b. + CombinableBuilder b => + Parameters -> + b +exploit (Parameters inputSST) = + mconcat + [ input $ + mconcat + [ script attacker + , withValue $ + normalizeValue $ + minAda <> fakeSSTValue inputSST + ] + , mint $ fakeSSTValue $ negate inputSST + , mint sst + , output $ + mconcat + [ script stakeScriptHash + , withValue $ + normalizeValue $ + minAda <> sst + ] + ] + where + attacker = head validatorHashes + + fakeSSTValue = + Value.singleton + stakeSymbol + (scriptHashToTokenName attacker) + . fromIntegral + + sst = assetClassValue stakeAssetClass 1 + +mkTestCase :: String -> Parameters -> SpecificationTree +mkTestCase name ps = + testPolicy False name stakePolicy () $ + mkMinting exploit ps stakeSymbol diff --git a/agora-specs/Sample/Treasury.hs b/agora-specs/Sample/Treasury.hs index f314509..1ac076d 100644 --- a/agora-specs/Sample/Treasury.hs +++ b/agora-specs/Sample/Treasury.hs @@ -18,8 +18,8 @@ module Sample.Treasury ( ) where import Plutarch.Context ( - MintingBuilder, - buildMintingUnsafe, + SpendingBuilder, + buildSpending', credential, input, mint, @@ -27,23 +27,24 @@ import Plutarch.Context ( script, signedWith, txId, - withMinting, - withTxId, + withRefTxId, + withSpendingOutRefId, withValue, ) -import PlutusLedgerApi.V1 ( - Credential (PubKeyCredential), - PubKeyHash (PubKeyHash), - ) import PlutusLedgerApi.V1.Address (Address (..)) -import PlutusLedgerApi.V1.Contexts ( +import PlutusLedgerApi.V1.Value qualified as Value (singleton) +import PlutusLedgerApi.V2 ( + Credential (PubKeyCredential), + OutputDatum (NoOutputDatum), + PubKeyHash (PubKeyHash), + ScriptHash (ScriptHash), + ) +import PlutusLedgerApi.V2.Contexts ( ScriptContext (..), TxInInfo (..), TxOut (..), TxOutRef (..), ) -import PlutusLedgerApi.V1.Scripts (ValidatorHash (ValidatorHash)) -import PlutusLedgerApi.V1.Value qualified as Value (singleton) import Sample.Shared ( gatCs, gatTn, @@ -54,13 +55,13 @@ import Sample.Shared ( wrongEffHash, ) -baseCtxBuilder :: MintingBuilder +baseCtxBuilder :: SpendingBuilder baseCtxBuilder = let treasury = mconcat [ credential trCredential , withValue minAda - , withTxId "73475cb40a568e8da8a045ced110137e159f890ac4da883b6b17dc651b3a8049" + , withRefTxId "73475cb40a568e8da8a045ced110137e159f890ac4da883b6b17dc651b3a8049" ] in mconcat [ txId "73475cb40a568e8da8a045ced110137e159f890ac4da883b6b17dc651b3a8049" @@ -68,7 +69,7 @@ baseCtxBuilder = , mint (Value.singleton gatCs gatTn (-1)) , input treasury , output treasury - , withMinting gatCs + , withSpendingOutRefId "73475cb40a568e8da8a045ced110137e159f890ac4da883b6b17dc651b3a8049" ] {- | A `ScriptContext` that should be compatible with treasury @@ -76,7 +77,7 @@ baseCtxBuilder = -} validCtx :: ScriptContext validCtx = - let builder :: MintingBuilder + let builder :: SpendingBuilder builder = mconcat [ baseCtxBuilder @@ -84,10 +85,10 @@ validCtx = mconcat [ script mockTrEffectHash , withValue (Value.singleton gatCs gatTn 1 <> minAda) - , withTxId "52b67b60260da3937510ad545c7f46f8d9915bd27e1082e76947fb309f913bd3" + , withRefTxId "52b67b60260da3937510ad545c7f46f8d9915bd27e1082e76947fb309f913bd3" ] ] - in buildMintingUnsafe builder + in buildSpending' builder treasuryRef :: TxOutRef treasuryRef = @@ -100,7 +101,7 @@ treasuryRef = -} walletIn :: TxInInfo walletIn = - let (ValidatorHash addressBs) = mockTrEffectHash + let (ScriptHash addressBs) = mockTrEffectHash in TxInInfo { txInInfoOutRef = TxOutRef @@ -108,7 +109,8 @@ walletIn = 0 , txInInfoResolved = TxOut - { txOutDatumHash = Nothing + { txOutDatum = NoOutputDatum + , txOutReferenceScript = Nothing , txOutValue = Value.singleton gatCs gatTn 1 , txOutAddress = Address @@ -119,7 +121,7 @@ walletIn = trCtxGATNameNotAddress :: ScriptContext trCtxGATNameNotAddress = - let builder :: MintingBuilder + let builder :: SpendingBuilder builder = mconcat [ baseCtxBuilder @@ -127,7 +129,7 @@ trCtxGATNameNotAddress = mconcat [ script wrongEffHash , withValue (Value.singleton gatCs gatTn 1 <> minAda) - , withTxId "52b67b60260da3937510ad545c7f46f8d9915bd27e1082e76947fb309f913bd3" + , withRefTxId "52b67b60260da3937510ad545c7f46f8d9915bd27e1082e76947fb309f913bd3" ] ] - in buildMintingUnsafe builder + in buildSpending' builder diff --git a/agora-specs/Spec/AuthorityToken.hs b/agora-specs/Spec/AuthorityToken.hs index 909cbce..2da7fea 100644 --- a/agora-specs/Spec/AuthorityToken.hs +++ b/agora-specs/Spec/AuthorityToken.hs @@ -10,18 +10,18 @@ Tests for Authority token functions module Spec.AuthorityToken (specs) where import Agora.AuthorityToken (singleAuthorityTokenBurned) -import Plutarch (ClosedTerm, POpaque, perror, popaque) +import Data.Tagged (Tagged (Tagged)) import Plutarch.Extra.Compile (mustCompile) +import Plutarch.Script (Script) import Plutarch.Unsafe (punsafeCoerce) import PlutusLedgerApi.V1 ( Address (Address), Credential (PubKeyCredential, ScriptCredential), CurrencySymbol, - Script, + ScriptHash (ScriptHash), TxInInfo (TxInInfo), TxOut (TxOut), TxOutRef (TxOutRef), - ValidatorHash (ValidatorHash), Value, ) import PlutusLedgerApi.V1.Value qualified as Value ( @@ -29,21 +29,13 @@ import PlutusLedgerApi.V1.Value qualified as Value ( singleton, ) import PlutusTx.AssocMap qualified as AssocMap (empty) +import Sample.AuthorityToken.UnauthorizedMintingExploit qualified as UnauthorizedMintingExploit import Test.Specification ( SpecificationTree, group, scriptFails, scriptSucceeds, ) -import Prelude ( - Maybe (Nothing), - PBool, - Semigroup ((<>)), - fmap, - pconstant, - pif, - ($), - ) currencySymbol :: CurrencySymbol currencySymbol = "deadbeef" @@ -54,7 +46,7 @@ mkInputs = fmap (TxInInfo (TxOutRef "" 0)) singleAuthorityTokenBurnedTest :: Value -> [TxOut] -> Script singleAuthorityTokenBurnedTest mint outs = let actual :: ClosedTerm PBool - actual = singleAuthorityTokenBurned (pconstant currencySymbol) (punsafeCoerce $ pconstant $ mkInputs outs) (pconstant mint) + actual = singleAuthorityTokenBurned (pconstant $ Tagged currencySymbol) (punsafeCoerce $ pconstant $ mkInputs outs) (pconstant mint) s :: ClosedTerm POpaque s = pif @@ -76,7 +68,7 @@ specs = <> Value.singleton "aa" "USDC" 100_000 ) [ TxOut - (Address (ScriptCredential (ValidatorHash "deadbeef")) Nothing) + (Address (ScriptCredential (ScriptHash "deadbeef")) Nothing) (Value.singleton currencySymbol "deadbeef" 1) Nothing ] @@ -92,7 +84,7 @@ specs = (Value.singleton "aaabcc" "hello-token" 1) Nothing , TxOut - (Address (ScriptCredential (ValidatorHash "deadbeef")) Nothing) + (Address (ScriptCredential (ScriptHash "deadbeef")) Nothing) (Value.singleton currencySymbol "deadbeef" 1) Nothing , TxOut @@ -101,6 +93,17 @@ specs = Nothing ] ) + , scriptSucceeds + "Correct even though scripts don't match" + ( singleAuthorityTokenBurnedTest + ( Value.singleton currencySymbol "i'm not deadbeef!" (-1) + ) + [ TxOut + (Address (ScriptCredential (ScriptHash "deadbeef")) Nothing) + (Value.singleton currencySymbol "i'm not deadbeef!" 1) + Nothing + ] + ) , scriptFails "Incorrect no burn" ( singleAuthorityTokenBurnedTest @@ -115,17 +118,6 @@ specs = ) [] ) - , scriptFails - "Incorrect script mismatch" - ( singleAuthorityTokenBurnedTest - ( Value.singleton currencySymbol "i'm not deadbeef!" (-1) - ) - [ TxOut - (Address (ScriptCredential (ValidatorHash "deadbeef")) Nothing) - (Value.singleton currencySymbol "i'm not deadbeef!" 1) - Nothing - ] - ) , scriptFails "Incorrect spent from PK" ( singleAuthorityTokenBurnedTest @@ -144,10 +136,21 @@ specs = <> Value.singleton "aa" "USDC" 100_000 ) [ TxOut - (Address (ScriptCredential (ValidatorHash "deadbeef")) Nothing) + (Address (ScriptCredential (ScriptHash "deadbeef")) Nothing) (Value.singleton currencySymbol "deadbeef" 2) Nothing ] ) ] + , group "unauthorized minting exploit" + $ map + ( UnauthorizedMintingExploit.mkTestCase "(negative test)" + . uncurry UnauthorizedMintingExploit.Parameters + ) + $ let l = [1 .. 10] + in [ (burnt, minted) + | burnt <- l + , minted <- l + , minted < burnt + ] ] diff --git a/agora-specs/Spec/Effect/GovernorMutation.hs b/agora-specs/Spec/Effect/GovernorMutation.hs index 72a17e6..32d8c20 100644 --- a/agora-specs/Spec/Effect/GovernorMutation.hs +++ b/agora-specs/Spec/Effect/GovernorMutation.hs @@ -1,20 +1,19 @@ module Spec.Effect.GovernorMutation (specs) where -import Agora.Effect.GovernorMutation (mutateGovernorValidator) import Agora.Governor (GovernorDatum (..), GovernorRedeemer (MutateGovernor)) import Agora.Proposal (ProposalId (..)) -import Agora.Scripts (AgoraScripts (..)) import Data.Default.Class (Default (def)) -import PlutusLedgerApi.V1 (ScriptContext (ScriptContext), ScriptPurpose (Spending)) +import PlutusLedgerApi.V2 (ScriptContext (ScriptContext), ScriptPurpose (Spending)) import Sample.Effect.GovernorMutation ( effectRef, + effectValidator, govRef, invalidNewGovernorDatum, mkEffectDatum, mkEffectTxInfo, validNewGovernorDatum, ) -import Sample.Shared (agoraScripts, mkEffect) +import Sample.Shared (governorValidator) import Test.Specification ( SpecificationTree, effectFailsWith, @@ -32,33 +31,42 @@ specs = "valid new governor datum" [ validatorSucceedsWith "governor validator should pass" - agoraScripts.compiledGovernorValidator + governorValidator ( GovernorDatum def - (ProposalId 0) + nextProposalId def def 3 ) MutateGovernor ( ScriptContext - (mkEffectTxInfo validNewGovernorDatum) + (mkEffectTxInfo validNewGovernorDatum') (Spending govRef) ) , effectSucceedsWith "effect validator should pass" - (mkEffect $ mutateGovernorValidator agoraScripts) - (mkEffectDatum validNewGovernorDatum) - (ScriptContext (mkEffectTxInfo validNewGovernorDatum) (Spending effectRef)) + effectValidator + ( mkEffectDatum + ( GovernorDatum + def + nextProposalId + def + def + 3 + ) + validNewGovernorDatum + ) + (ScriptContext (mkEffectTxInfo validNewGovernorDatum') (Spending effectRef)) ] , group "invalid new governor datum" [ validatorFailsWith "governor validator should fail" - agoraScripts.compiledGovernorValidator + governorValidator ( GovernorDatum def - (ProposalId 0) + nextProposalId def def 3 @@ -70,9 +78,26 @@ specs = ) , effectFailsWith "effect validator should fail" - (mkEffect $ mutateGovernorValidator agoraScripts) - (mkEffectDatum validNewGovernorDatum) + effectValidator + ( mkEffectDatum + ( GovernorDatum + def + nextProposalId + def + def + 3 + ) + validNewGovernorDatum + ) (ScriptContext (mkEffectTxInfo invalidNewGovernorDatum) (Spending effectRef)) ] ] ] + where + validNewGovernorDatum' :: GovernorDatum + validNewGovernorDatum' = validNewGovernorDatum {nextProposalId} + -- \^ The datum value pinned by the effect, disregarding the proposal ID and + -- taking this field from the governor input instead + + nextProposalId :: ProposalId + nextProposalId = ProposalId 0 diff --git a/agora-specs/Spec/Effect/TreasuryWithdrawal.hs b/agora-specs/Spec/Effect/TreasuryWithdrawal.hs index 984a49c..29ef319 100644 --- a/agora-specs/Spec/Effect/TreasuryWithdrawal.hs +++ b/agora-specs/Spec/Effect/TreasuryWithdrawal.hs @@ -7,174 +7,44 @@ This module specs the Treasury Withdrawal Effect. -} module Spec.Effect.TreasuryWithdrawal (specs) where -import Agora.Effect.TreasuryWithdrawal ( - TreasuryWithdrawalDatum (TreasuryWithdrawalDatum), - treasuryWithdrawalValidator, - ) -import PlutusLedgerApi.V1.Value qualified as Value import Sample.Effect.TreasuryWithdrawal ( - buildReceiversOutputFromDatum, - buildScriptContext, - currSymbol, - inputCollateral, - inputGAT, - inputTreasury, - inputUser, - outputTreasury, - outputUser, - treasuries, - users, + Parameters (..), + Validity (..), + mkTestTree, + totallyValidParameters, ) -import Sample.Shared (mkEffect) import Test.Specification ( SpecificationTree, - effectFailsWith, - effectSucceedsWith, - group, ) -import Test.Util (sortValue) specs :: [SpecificationTree] specs = - [ group - "effect" - [ effectSucceedsWith - "Simple" - (mkEffect $ treasuryWithdrawalValidator currSymbol) - datum1 - ( buildScriptContext - [ inputGAT - , inputCollateral 10 - , inputTreasury 1 (asset1 10) - ] - $ outputTreasury 1 (asset1 7) : - buildReceiversOutputFromDatum datum1 - ) - , effectSucceedsWith - "Simple with multiple treasuries " - (mkEffect $ treasuryWithdrawalValidator currSymbol) - datum1 - ( buildScriptContext - [ inputGAT - , inputCollateral 10 - , inputTreasury 1 (asset1 10) - , inputTreasury 2 (asset1 100) - , inputTreasury 3 (asset1 500) - ] - $ [ outputTreasury 1 (asset1 7) - , outputTreasury 2 (asset1 100) - , outputTreasury 3 (asset1 500) - ] - ++ buildReceiversOutputFromDatum datum1 - ) - , effectSucceedsWith - "Mixed Assets" - (mkEffect $ treasuryWithdrawalValidator currSymbol) - datum2 - ( buildScriptContext - [ inputGAT - , inputCollateral 10 - , inputTreasury 1 (asset1 20) - , inputTreasury 2 (asset2 20) - ] - $ [ outputTreasury 1 (asset1 13) - , outputTreasury 2 (asset2 14) - ] - ++ buildReceiversOutputFromDatum datum2 - ) - , effectFailsWith - "Pay to uknown 3rd party" - (mkEffect $ treasuryWithdrawalValidator currSymbol) - datum2 - ( buildScriptContext - [ inputGAT - , inputCollateral 10 - , inputTreasury 1 (asset1 20) - , inputTreasury 2 (asset2 20) - ] - $ [ outputUser 100 (asset1 2) - , outputTreasury 1 (asset1 11) - , outputTreasury 2 (asset2 14) - ] - ++ buildReceiversOutputFromDatum datum2 - ) - , effectFailsWith - "Missing receiver" - (mkEffect $ treasuryWithdrawalValidator currSymbol) - datum2 - ( buildScriptContext - [ inputGAT - , inputCollateral 10 - , inputTreasury 1 (asset1 20) - , inputTreasury 2 (asset2 20) - ] - $ [ outputTreasury 1 (asset1 13) - , outputTreasury 2 (asset2 14) - ] - ++ drop 1 (buildReceiversOutputFromDatum datum2) - ) - , effectFailsWith - "Unauthorized treasury" - (mkEffect $ treasuryWithdrawalValidator currSymbol) - datum3 - ( buildScriptContext - [ inputGAT - , inputCollateral 10 - , inputTreasury 999 (asset1 20) - ] - $ outputTreasury 999 (asset1 17) : - buildReceiversOutputFromDatum datum3 - ) - , effectFailsWith - "Prevent transactions besides the withdrawal" - (mkEffect $ treasuryWithdrawalValidator currSymbol) - datum3 - ( buildScriptContext - [ inputGAT - , inputTreasury 1 (asset1 20) - , inputTreasury 999 (asset1 20) - , inputUser 99 (asset2 100) - ] - $ [ outputTreasury 1 (asset1 17) - , outputUser 100 (asset2 100) - ] - ++ buildReceiversOutputFromDatum datum3 - ) - ] + [ mkTestTree + "totally valid" + totallyValidParameters + Validity + { forGATPolicy = True + , forEffectValidator = True + , forTreasury = True + } + , mkTestTree + "bad received value" + totallyValidParameters + { badReceivedValue = True + } + Validity + { forGATPolicy = True + , forEffectValidator = False + , forTreasury = True + } + , mkTestTree + "bad receiver order" + totallyValidParameters + { badReceiverOrder = True + } + Validity + { forGATPolicy = True + , forEffectValidator = False + , forTreasury = True + } ] - where - asset1 = - Value.singleton - "0d586e057e76238f8c56c0752507bfa45ae13b04f8497a311d4aaa48" - "OrangeBottle" - asset2 = - Value.singleton - "7e6aa764bceeba1f7acf47d20f1a2a85440afa2928f8ae96376f4d85" - "19721121" - datum1 = - TreasuryWithdrawalDatum - [ (head users, asset1 1) - , (users !! 1, asset1 1) - , (users !! 2, asset1 1) - ] - [ treasuries !! 1 - , treasuries !! 2 - , treasuries !! 3 - ] - datum2 = - TreasuryWithdrawalDatum - [ (head users, sortValue $ asset2 5 <> asset1 4) - , (users !! 1, sortValue $ asset2 1 <> asset1 2) - , (users !! 2, asset1 1) - ] - [ head treasuries - , treasuries !! 1 - , treasuries !! 2 - ] - datum3 = - TreasuryWithdrawalDatum - [ (head users, asset1 1) - , (users !! 1, asset1 1) - , (users !! 2, asset1 1) - ] - [treasuries !! 1] diff --git a/agora-specs/Spec/Proposal.hs b/agora-specs/Spec/Proposal.hs index b49dd60..d48b162 100644 --- a/agora-specs/Spec/Proposal.hs +++ b/agora-specs/Spec/Proposal.hs @@ -10,8 +10,10 @@ module Spec.Proposal (specs) where import Sample.Proposal.Advance qualified as Advance import Sample.Proposal.Cosign qualified as Cosign import Sample.Proposal.Create qualified as Create -import Sample.Proposal.UnlockStake qualified as UnlockStake +import Sample.Proposal.PrivilegeEscalate qualified as PrivilegeEscalate +import Sample.Proposal.Unlock qualified as Unlock import Sample.Proposal.Vote qualified as Vote + import Test.Specification ( SpecificationTree, group, @@ -52,8 +54,8 @@ specs = "invalid stake locks" Create.addInvalidLocksParameters True - False True + False , Create.mkTestTree "has reached maximum proposals limit" Create.exceedMaximumProposalsParameters @@ -83,59 +85,127 @@ specs = True ) Create.invalidProposalStatusParameters + , Create.mkTestTree + "fake SST" + Create.fakeSSTParameters + True + False + False + , Create.mkTestTree + "wrong governor redeemer" + Create.wrongGovernorRedeemer + False + False + True + , Create.mkTestTree + "wrong governor redeemer" + Create.wrongGovernorRedeemer1 + False + False + True ] ] , group "validator" [ group "cosignature" - $ let cosignerCases = [1, 5, 10] - - mkLegalGroup nCosigners = - Cosign.mkTestTree - (unwords ["with", show nCosigners, "cosigners"]) - (Cosign.validCosignNParameters nCosigners) - True - legalGroup = - group "legal" $ - map mkLegalGroup cosignerCases - - mkIllegalStatusNotDraftGroup nCosigners = - group (unwords ["with", show nCosigners, "cosigners"]) $ - map - ( \ps -> - Cosign.mkTestTree - ("status: " <> show ps.proposalStatus) - ps - False - ) - (Cosign.statusNotDraftCosignNParameters nCosigners) - illegalStatusNotDraftGroup = - group "proposal status not Draft" $ - map mkIllegalStatusNotDraftGroup cosignerCases - - illegalGroup = - group - "illegal" - [ Cosign.mkTestTree - "duplicate cosigners" - Cosign.duplicateCosignersParameters - False - , Cosign.mkTestTree - "altered output stake" - Cosign.invalidStakeOutputParameters - False - , illegalStatusNotDraftGroup - ] - in [legalGroup, illegalGroup] + [ Cosign.mkTestTree + "legal" + Cosign.totallyValid + (Cosign.Validity True True) + , group + "illegal" + [ Cosign.mkTestTree + "insufficient staked amount" + Cosign.insufficientStakedAmount + (Cosign.Validity False True) + , Cosign.mkTestTree + "proposal locks not updated" + Cosign.locksNotUpdated + (Cosign.Validity True False) + , Cosign.mkTestTree + "duplicate cosigners" + Cosign.duplicateCosigners + (Cosign.Validity False True) + , Cosign.mkTestTree + "cosigners not updated" + Cosign.cosignersNotUpdated + (Cosign.Validity False True) + , group "cosign after draft" $ + map + ( \b -> + Cosign.mkTestTree + "(negative test)" + b + (Cosign.Validity False True) + ) + Cosign.cosignAfterDraft + ] + ] , group "voting" [ group "legal" - [ Vote.mkTestTree "ordinary" Vote.validVoteParameters True - , Vote.mkTestTree "delegate" Vote.validVoteAsDelegateParameters True + [ group "different number of stakes" $ + map + ( \s -> + group + (unwords [show s, "stakes"]) + [ Vote.mkTestTree + "by owner" + (Vote.mkValidOwnerVoteBundle s) + (Vote.Validity True True) + , Vote.mkTestTree + "by delegatee" + (Vote.mkValidDelegateeVoteBundle s) + (Vote.Validity True True) + ] + ) + [1, 3, 5, 7, 9] + , Vote.mkTestTree + "transparent non-GT tokens" + Vote.transparentAssets + (Vote.Validity True True) + , Vote.mkTestTree + "Delegatee vote with own and delegated stakes in one tx" + Vote.delegateeVoteWithOwnAndDelegatedStakeBundle + (Vote.Validity True True) + ] + , group + "illegal" + [ Vote.mkTestTree + "vote for nonexistent outcome" + Vote.voteForNonexistentOutcome + (Vote.Validity False True) + , Vote.mkTestTree + "unauthorized tx" + Vote.transactionNotAuthorized + (Vote.Validity True False) + , Vote.mkTestTree + "no proposal" + Vote.noProposal + (Vote.Validity False False) + , Vote.mkTestTree + "more than one proposals" + Vote.voteForNonexistentOutcome + (Vote.Validity False True) + , Vote.mkTestTree + "locks not added" + Vote.invalidLocks + (Vote.Validity True False) + , Vote.mkTestTree + "attempt to burn stakes" + Vote.destroyStakes + (Vote.Validity True False) + , Vote.mkTestTree + "insufficient staked amount" + Vote.insufficientAmount + (Vote.Validity False True) + , Vote.mkTestTree + "insufficient staked amount" + Vote.insufficientAmount1 + (Vote.Validity False True) ] - -- TODO: add negative test cases ] , group "advancing" @@ -184,6 +254,11 @@ specs = mkName (Advance.mkValidToFailedStateBundles cs es) allValid + , Advance.mkTestTree' + "to finished state with inline datum" + mkName + (Advance.mkValidToFinishedInlineGATDatumBundles cs es) + allValid ] , group "illegal" @@ -234,16 +309,6 @@ specs = , forGovernorValidator = Just True , forAuthorityTokenPolicy = Just True } - , Advance.mkTestTree' - "altered output stake datum" - (\b -> unwords ["from", show b.proposalParameters.fromStatus]) - (Advance.mkInvalidOutputStakeBundles cs es) - Advance.Validity - { forProposalValidator = False - , forStakeValidator = False - , forGovernorValidator = Just True - , forAuthorityTokenPolicy = Just True - } , Advance.mkTestTree "forget to mint GATs" (Advance.mkNoGATMintedBundle cs es) @@ -269,7 +334,7 @@ specs = { forProposalValidator = True , forStakeValidator = True , forGovernorValidator = Just False - , forAuthorityTokenPolicy = Just False + , forAuthorityTokenPolicy = Just True } , Advance.mkTestTree "wrong GAT datum" @@ -289,106 +354,113 @@ specs = , forGovernorValidator = Just False , forAuthorityTokenPolicy = Just True } + , Advance.mkTestTree' + "fastforward to finished" + (\b -> unwords ["from", show b.proposalParameters.fromStatus]) + (Advance.mkFastforwardToFinishBundles cs es) + Advance.Validity + { forProposalValidator = False + , forStakeValidator = True + , forGovernorValidator = Just False + , forAuthorityTokenPolicy = Just True + } + , Advance.mkTestTree + "wrong governor redeemer" + (Advance.mkBadGovernorRedeemerBundle cs es) + Advance.Validity + { forProposalValidator = True + , forStakeValidator = True + , forGovernorValidator = Just False + , forAuthorityTokenPolicy = Just False + } ] ] , group "unlocking" $ - let proposalCountCases = [1, 5, 10, 42] + let stakeCountCases = [1, 3, 5, 7, 9, 11] - mkSubgroupName nProposals = unwords ["with", show nProposals, "proposals"] + mkSubgroupName nStakes = unwords ["with", show nStakes, "stakes"] - mkLegalGroup nProposals = + mkLegalGroup nStakes = group - (mkSubgroupName nProposals) - [ UnlockStake.mkTestTree + (mkSubgroupName nStakes) + [ Unlock.mkTestTree "voter: retract votes while voting" - (UnlockStake.mkVoterRetractVotesWhileVotingParameters nProposals) - True - , UnlockStake.mkTestTree + (Unlock.mkValidVoterRetractVotes nStakes) + (Unlock.Validity True True) + , Unlock.mkTestTree + "voter: retract votes while voting by delegatee" + (Unlock.mkValidDelegateeRetractVotes nStakes) + (Unlock.Validity True True) + , Unlock.mkTestTree "voter/creator: retract votes while voting" - (UnlockStake.mkVoterCreatorRetractVotesWhileVotingParameters nProposals) - True - , UnlockStake.mkTestTree - "creator: remove creator locks when finished" - (UnlockStake.mkCreatorRemoveCreatorLocksWhenFinishedParameters nProposals) - True - , UnlockStake.mkTestTree - "voter/creator: remove all locks when finished" - (UnlockStake.mkVoterCreatorRemoveAllLocksWhenFinishedParameters nProposals) - True - , group "voter: unlock after voting" $ - map - ( \ps -> - let name = show ps.proposalStatus - in UnlockStake.mkTestTree name ps True - ) - (UnlockStake.mkVoterUnlockStakeAfterVotingParameters nProposals) - , UnlockStake.mkTestTree - "voter/creator: remove vote locks when locked" - (UnlockStake.mkVoterCreatorRemoveVoteLocksWhenLockedParameters nProposals) - True + (Unlock.mkValidVoterCreatorRetractVotes nStakes) + (Unlock.Validity True True) + , Unlock.mkTestTree + "creator: remove creator lock after voting" + (Unlock.mkValidCreatorRemoveLock nStakes) + (Unlock.Validity True True) + , Unlock.mkTestTree + "Voter: remove lock after voting" + (Unlock.mkValidVoterRemoveLockAfterVoting nStakes) + (Unlock.Validity True True) ] - mkIllegalGroup nProposals = + mkIllegalGroup nStakes = group - (mkSubgroupName nProposals) + (mkSubgroupName nStakes) [ group "retract votes while not voting" $ map - ( \ps -> - let name = - unwords - [ "role:" - , show ps.stakeRole - , "," - , "status:" - , show ps.proposalStatus - ] - in UnlockStake.mkTestTree name ps False + ( \c -> + Unlock.mkTestTree + "(negative test)" + c + (Unlock.Validity False True) ) - (UnlockStake.mkRetractVotesWhileNotVoting nProposals) - , group "unlock an irrelevant stake" $ - map - ( \ps -> - let name = - unwords - [ "status:" - , show ps.proposalStatus - , "retract votes:" - , show ps.retractVotes - ] - in UnlockStake.mkTestTree name ps False - ) - (UnlockStake.mkUnockIrrelevantStakeParameters nProposals) + (Unlock.mkRetractVotesWhileNotVoting nStakes) , group "remove creator too early" $ map - ( \ps -> - let name = - unwords - ["status:", show ps.proposalStatus] - in UnlockStake.mkTestTree name ps False + ( \c -> + Unlock.mkTestTree + "(negative test)" + c + (Unlock.Validity True False) ) - (UnlockStake.mkRemoveCreatorLockBeforeFinishedParameters nProposals) - , UnlockStake.mkTestTree + (Unlock.mkRemoveCreatorLockBeforeFinished nStakes) + , Unlock.mkTestTree + "unlock an irrelevant stake" + (Unlock.mkUnockIrrelevantStakes nStakes) + (Unlock.Validity False False) + , Unlock.mkTestTree "creator: retract votes" - (UnlockStake.mkRetractVotesWithCreatorStakeParamaters nProposals) - False - , group "alter output stake datum" $ - map - ( \ps -> - let name = - unwords - [ "role:" - , show ps.stakeRole - , "," - , "status:" - , show ps.proposalStatus - ] - in UnlockStake.mkTestTree name ps False - ) - (UnlockStake.mkAlterStakeParameters nProposals) + (Unlock.mkCreatorRetractVotes nStakes) + (Unlock.Validity False True) + , Unlock.mkTestTree + "change output stake value" + (Unlock.mkChangeOutputStakeValue nStakes) + (Unlock.Validity True False) + , Unlock.mkTestTree + "use fake stake" + (Unlock.mkUseFakeStakes nStakes) + (Unlock.Validity False False) + , Unlock.mkTestTree + "retract votes in cooldown" + (Unlock.mkDisrespectCooldown nStakes) + (Unlock.Validity True False) ] - legalGroup = group "legal" $ map mkLegalGroup proposalCountCases - illegalGroup = group "illegal" $ map mkIllegalGroup proposalCountCases + legalGroup = group "legal" $ map mkLegalGroup stakeCountCases + illegalGroup = group "illegal" $ map mkIllegalGroup stakeCountCases in [legalGroup, illegalGroup] ] + , group + "privilege escalate" + [ PrivilegeEscalate.mkTestTree + "vote" + PrivilegeEscalate.Voting + (PrivilegeEscalate.Validity False False) + , PrivilegeEscalate.mkTestTree + "retract votes" + PrivilegeEscalate.RetractingVotes + (PrivilegeEscalate.Validity False False) + ] ] diff --git a/agora-specs/Spec/Stake.hs b/agora-specs/Spec/Stake.hs index b9e781f..7f864b2 100644 --- a/agora-specs/Spec/Stake.hs +++ b/agora-specs/Spec/Stake.hs @@ -9,14 +9,12 @@ Tests for Stake policy and validator -} module Spec.Stake (specs) where -import Agora.Scripts (AgoraScripts (..)) import Agora.Stake ( StakeDatum (StakeDatum), StakeRedeemer (DepositWithdraw), ) -import Data.Bool (Bool (..)) -import Data.Maybe (Maybe (..)) -import Sample.Shared (agoraScripts) +import PlutusLedgerApi.V1 (Credential (PubKeyCredential)) +import Sample.Shared (stakeValidator) import Sample.Stake ( DepositWithdrawExample ( DepositWithdrawExample, @@ -26,61 +24,133 @@ import Sample.Stake ( signer, ) import Sample.Stake qualified as Stake ( - stakeCreation, - stakeCreationUnsigned, - stakeCreationWrongDatum, stakeDepositWithdraw, ) +import Sample.Stake.Create qualified as Create +import Sample.Stake.Destroy qualified as Destroy import Sample.Stake.SetDelegate qualified as SetDelegate +import Sample.Stake.UnauthorizedMintingExploit qualified as UnauthorizedMintingExploit import Test.Specification ( SpecificationTree, group, - policyFailsWith, - policySucceedsWith, validatorFailsWith, validatorSucceedsWith, ) -import Prelude (Num (negate), ($)) -- | The SpecificationTree exported by this module. specs :: [SpecificationTree] specs = [ group "policy" - [ policySucceedsWith - "stakeCreation" - agoraScripts.compiledStakePolicy - () - Stake.stakeCreation - , policyFailsWith - "stakeCreationWrongDatum" - agoraScripts.compiledStakePolicy - () - Stake.stakeCreationWrongDatum - , policyFailsWith - "stakeCreationUnsigned" - agoraScripts.compiledStakePolicy - () - Stake.stakeCreationUnsigned + [ group + "create" + [ group + "valid" + [ Create.mkTestCase + "stake owner: pub key" + Create.ownerIsPubKeyTotallyValid + True + , Create.mkTestCase + "stake owner: script" + Create.ownerIsScriptTotallyValid + True + ] + , group + "invalid" + [ Create.mkTestCase + "mint more than one sst in one tx" + Create.createMoreThanOneStake + False + , Create.mkTestCase + "spend stake while minting SST" + Create.spendStake + False + , Create.mkTestCase + "wrong staked amount" + Create.unexpectedStakedAmount + False + , Create.mkTestCase + "no stake datum" + Create.noStakeDatum + False + , Create.mkTestCase + "bad stake datum" + Create.malformedStakeDatum + False + , Create.mkTestCase + "not authorized by owner" + Create.notAuthorizedByOwner + False + , Create.mkTestCase + "delegatee not empty" + Create.setDelegatee + False + , Create.mkTestCase + "have locks" + Create.alreadyHasLocks + False + ] + ] ] , group "validator" - [ validatorSucceedsWith + [ group + "destroy" + [ group + "legal" + [ Destroy.mkTestTree + "One stake" + Destroy.oneStake + (Destroy.Validity (Just True) True) + , Destroy.mkTestTree + "Multiple stake" + Destroy.multipleStakes + (Destroy.Validity (Just True) True) + ] + , group + "illegal" + [ Destroy.mkTestTree + "Destroy only one stake to steal SST" + Destroy.stealSST + (Destroy.Validity (Just False) False) + , Destroy.mkTestTree + "Destroy nothing to steal SST" + Destroy.stealSST1 + (Destroy.Validity Nothing False) + , Destroy.mkTestTree + "Steal SST" + Destroy.stealSST3 + (Destroy.Validity (Just False) False) + , Destroy.mkTestTree + "Destroy locked stakes" + Destroy.lockedStakes + (Destroy.Validity (Just True) False) + , Destroy.mkTestTree + "not authorized by owner" + Destroy.notAuthorized + (Destroy.Validity (Just True) False) + , Destroy.mkTestTree + "not authorized by owner" + Destroy.authorizedByDelegatee + (Destroy.Validity (Just True) False) + ] + ] + , validatorSucceedsWith "stakeDepositWithdraw deposit" - agoraScripts.compiledStakeValidator - (StakeDatum 100_000 signer Nothing []) + stakeValidator + (StakeDatum 100_000 (PubKeyCredential signer) Nothing []) (DepositWithdraw 100_000) (Stake.stakeDepositWithdraw $ DepositWithdrawExample {startAmount = 100_000, delta = 100_000}) , validatorSucceedsWith "stakeDepositWithdraw withdraw" - agoraScripts.compiledStakeValidator - (StakeDatum 100_000 signer Nothing []) + stakeValidator + (StakeDatum 100_000 (PubKeyCredential signer) Nothing []) (DepositWithdraw $ negate 100_000) (Stake.stakeDepositWithdraw $ DepositWithdrawExample {startAmount = 100_000, delta = negate 100_000}) , validatorFailsWith "stakeDepositWithdraw negative GT" - agoraScripts.compiledStakeValidator - (StakeDatum 100_000 signer Nothing []) + stakeValidator + (StakeDatum 100_000 (PubKeyCredential signer) Nothing []) (DepositWithdraw 1_000_000) (Stake.stakeDepositWithdraw $ DepositWithdrawExample {startAmount = 100_000, delta = negate 1_000_000}) , group @@ -110,5 +180,13 @@ specs = SetDelegate.invalidOutputStakeDatumParameters False ] + , group + "unauthorized SST minting exploit" + $ map + ( UnauthorizedMintingExploit.mkTestCase + "(negative test)" + . UnauthorizedMintingExploit.Parameters + ) + [1 .. 20] ] ] diff --git a/agora-specs/Spec/Treasury.hs b/agora-specs/Spec/Treasury.hs index 03d60fb..d42280d 100644 --- a/agora-specs/Spec/Treasury.hs +++ b/agora-specs/Spec/Treasury.hs @@ -21,28 +21,22 @@ Tests need to fail when: -} module Spec.Treasury (specs) where -import Agora.Treasury ( - TreasuryRedeemer (SpendTreasuryGAT), - treasuryValidator, - ) -import Agora.Utils (CompiledValidator (CompiledValidator)) -import Plutarch.Api.V1 (mkValidator) -import PlutusLedgerApi.V1 (DCert (DCertDelegRegKey)) -import PlutusLedgerApi.V1.Contexts ( - ScriptContext (scriptContextPurpose, scriptContextTxInfo), - ScriptPurpose (Certifying, Rewarding, Spending), - TxInfo (txInfoInputs, txInfoMint), - ) +import Plutarch.Script (Script) import PlutusLedgerApi.V1.Credential ( StakingCredential (StakingHash), ) import PlutusLedgerApi.V1.Value qualified as Value (singleton) -import Sample.Shared (deterministicTracingConfing, trCredential) +import PlutusLedgerApi.V2 (DCert (DCertDelegRegKey)) +import PlutusLedgerApi.V2.Contexts ( + ScriptContext (scriptContextPurpose, scriptContextTxInfo), + ScriptPurpose (Certifying, Minting, Rewarding), + TxInfo (txInfoInputs, txInfoMint), + ) +import Sample.Shared (trCredential, trValidator) import Sample.Treasury ( gatCs, gatTn, trCtxGATNameNotAddress, - treasuryRef, validCtx, walletIn, ) @@ -53,11 +47,8 @@ import Test.Specification ( validatorSucceedsWith, ) -compiledTreasuryValidator :: CompiledValidator () TreasuryRedeemer -compiledTreasuryValidator = - CompiledValidator $ - mkValidator deterministicTracingConfing $ - treasuryValidator gatCs +compiledTreasuryValidator :: Script +compiledTreasuryValidator = trValidator specs :: [SpecificationTree] specs = @@ -69,26 +60,32 @@ specs = "Allows for effect changes" compiledTreasuryValidator () - SpendTreasuryGAT + () validCtx + , validatorSucceedsWith + "Fails when GAT token name is not script address" + compiledTreasuryValidator + () + () + trCtxGATNameNotAddress ] , group "Negative" [ group - "Fails with ScriptPurpose not Minting" + "Fails with ScriptPurpose not Spending" [ validatorFailsWith - "Spending" + "Minting" compiledTreasuryValidator () - SpendTreasuryGAT + () validCtx - { scriptContextPurpose = Spending treasuryRef + { scriptContextPurpose = Minting "" } , validatorFailsWith "Rewarding" compiledTreasuryValidator () - SpendTreasuryGAT + () validCtx { scriptContextPurpose = Rewarding $ @@ -98,7 +95,7 @@ specs = "Certifying" compiledTreasuryValidator () - SpendTreasuryGAT + () validCtx { scriptContextPurpose = Certifying $ @@ -110,7 +107,7 @@ specs = "Fails when multiple GATs burned" compiledTreasuryValidator () - SpendTreasuryGAT + () validCtx { scriptContextTxInfo = validCtx.scriptContextTxInfo @@ -121,17 +118,11 @@ specs = (-2) } } - , validatorFailsWith - "Fails when GAT token name is not script address" - compiledTreasuryValidator - () - SpendTreasuryGAT - trCtxGATNameNotAddress , validatorFailsWith "Fails with wallet as input" compiledTreasuryValidator () - SpendTreasuryGAT + () ( let txInfo = validCtx.scriptContextTxInfo inputs = txInfo.txInfoInputs newInputs = diff --git a/agora-specs/Spec/Utils.hs b/agora-specs/Spec/Utils.hs index 16e62d9..cb68b2b 100644 --- a/agora-specs/Spec/Utils.hs +++ b/agora-specs/Spec/Utils.hs @@ -7,7 +7,8 @@ Tests for utility functions in 'Agora.Utils'. -} module Spec.Utils (tests) where -import Test.Tasty (TestTree) +import Property.Utils qualified as Props +import Test.Tasty (TestTree, testGroup) tests :: [TestTree] -tests = [] +tests = [testGroup "properties" Props.props] diff --git a/agora-test/Golden.hs b/agora-test/Golden.hs new file mode 100644 index 0000000..64c2763 --- /dev/null +++ b/agora-test/Golden.hs @@ -0,0 +1,52 @@ +module Golden (testGolden) where + +import Agora.Bootstrap qualified as Bootstrap +import Agora.Linker (linker) +import Data.Text qualified as Text +import Plutarch (Config (Config), TracingMode (DoTracing, NoTracing)) +import ScriptExport.File qualified as ScriptExport +import ScriptExport.Options qualified as ScriptExport +import ScriptExport.Types qualified as ScriptExport +import System.Directory (createDirectoryIfMissing) +import Test.Tasty (TestTree, testGroup) +import Test.Tasty.Golden (goldenVsFile) +import Test.Tasty.Providers (TestName) + +builders :: ScriptExport.Builders +builders = + mconcat + [ ScriptExport.insertScriptExportWithLinker "agora" (Bootstrap.agoraScripts (Config NoTracing)) linker + , ScriptExport.insertScriptExportWithLinker "agoraDebug" (Bootstrap.agoraScripts (Config DoTracing)) linker + ] + +testGolden :: TestTree +testGolden = + testGroup + "Golden tests for script export" + [ goldenTest "agora" "./agora-test/goldens/" + , goldenTest "agoraDebug" "./agora-test/goldens/" + ] + +goldenTest :: TestName -> FilePath -> TestTree +goldenTest builder outputPath = + let mkFilename suffix = outputPath <> builder <> suffix <> ".json" + goldenFilename = mkFilename "-golden" + sampleFilename = mkFilename "" + in goldenVsFile + builder + goldenFilename + sampleFilename + $ callExportScript builder outputPath + +-- Call the script server and generate an unapplied script set. +callExportScript :: String -> FilePath -> IO () +callExportScript builder outputPath = do + _ <- createDirectoryIfMissing False outputPath + ScriptExport.runFile + builders + ( ScriptExport.FileOptions + { out = outputPath + , param = "" + , builder = Text.pack builder + } + ) diff --git a/agora-test/Spec.hs b/agora-test/Spec.hs index ed7b983..6cfda9d 100644 --- a/agora-test/Spec.hs +++ b/agora-test/Spec.hs @@ -1,8 +1,5 @@ -import Prelude - --------------------------------------------------------------------------------- - import GHC.IO.Encoding (setLocaleEncoding, utf8) +import Golden qualified import Test.Tasty (defaultMain, testGroup) -------------------------------------------------------------------------------- @@ -26,7 +23,8 @@ main = do defaultMain $ testGroup "test suite" - [ testGroup + [ Golden.testGolden + , testGroup "Effects" [ toTestTree $ group "Treasury Withdrawal Effect" TreasuryWithdrawal.specs , toTestTree $ group "Governor Mutation Effect" GovernorMutation.specs diff --git a/agora-test/goldens/agora-golden.json b/agora-test/goldens/agora-golden.json new file mode 100644 index 0000000..bdde1fb --- /dev/null +++ b/agora-test/goldens/agora-golden.json @@ -0,0 +1,125 @@ +{ + "rawScripts": { + "agora:authorityTokenPolicy": { + "cborHex": "5903c35903c001000032323232323232323232322223232323232323253330103370e900000109991980090008b199119806919991180991299980b0008801899802180d0009801180c80091180091299980b99b8848000dd6980e00209911980080100199b80002375a603800826446600200800466e00004dd6980e00219191198008018012400090000009998071191118010019bab301800137520040026eb8c04c004dd5980980211299980919b884800000854ccc048cdc3a40000022a6660246644a66602866e1c0092000153330143370e00290000a51153330143370e00290010a50153330143370e00290020a5014a02a66602866e1c0092002153330143370e00290000a50153330143370e00290010a51153330143370e00290020a5014a02a66602866e1c0092004153330143370e00290000a50153330143370e00290010a50153330143370e00290020a5114a22a66602866e1c005200014a02a66602866e1c005200214a02a66602866e1c005200414a22945200233223300120011649010f4753542073686f756c64206d6f7665003332223301075a6666020466e95200233574000297ae03301223253330173370e64600c446603044a66603600229000099299980e99baf301e001005132533301d001161533301e3574660400022a66603c66ebcc07cc0840040144dd6981198108008b0b1bab302200113003301f002301f001003323756603660346038002603460320029001099111801001980d0008912800980d00080111999111980180080111198099190011bad001333014232223002003301e001002001002001122500132323223300100300230173016002301600137580186eb0c054020dd5980a99180a980a980a980a800980a0030a999809199180891299980a0008a5115332233301700200114a06006603000226004602e0024664464666644666602a4a66603266ebc00cc068004488c00800c48940040048c888c00800cc0780044894004dd48019bab301930180012323232533301a3370e90000010a5014a2603c00460320026ea8c068c06cc068008528980c8009bae30160040013758602a00e2930b0b0b0a99980919b874800000852616163014002300f00137546020601e008601c601c002601a601a002601c601a002601a00244660024644460040066006002244a0024446600a44a666010002244a0022a66601266ebcc028c0300040104c014c0300044c008c02c0040048c008894ccc01400448940044ccc00cc024004888c00800c4c008c0200048c8c0088cc0080080048c0088cc00800800555cfab9a5573aae895d0918011baa0015573d", + "description": "agora:authorityTokenPolicy", + "params": [ + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"GovernorSTTag\"#Plutarch.Extra.AssetClass:AssetClass" + ], + "rawHex": "5903c001000032323232323232323232322223232323232323253330103370e900000109991980090008b199119806919991180991299980b0008801899802180d0009801180c80091180091299980b99b8848000dd6980e00209911980080100199b80002375a603800826446600200800466e00004dd6980e00219191198008018012400090000009998071191118010019bab301800137520040026eb8c04c004dd5980980211299980919b884800000854ccc048cdc3a40000022a6660246644a66602866e1c0092000153330143370e00290000a51153330143370e00290010a50153330143370e00290020a5014a02a66602866e1c0092002153330143370e00290000a50153330143370e00290010a51153330143370e00290020a5014a02a66602866e1c0092004153330143370e00290000a50153330143370e00290010a50153330143370e00290020a5114a22a66602866e1c005200014a02a66602866e1c005200214a02a66602866e1c005200414a22945200233223300120011649010f4753542073686f756c64206d6f7665003332223301075a6666020466e95200233574000297ae03301223253330173370e64600c446603044a66603600229000099299980e99baf301e001005132533301d001161533301e3574660400022a66603c66ebcc07cc0840040144dd6981198108008b0b1bab302200113003301f002301f001003323756603660346038002603460320029001099111801001980d0008912800980d00080111999111980180080111198099190011bad001333014232223002003301e001002001002001122500132323223300100300230173016002301600137580186eb0c054020dd5980a99180a980a980a980a800980a0030a999809199180891299980a0008a5115332233301700200114a06006603000226004602e0024664464666644666602a4a66603266ebc00cc068004488c00800c48940040048c888c00800cc0780044894004dd48019bab301930180012323232533301a3370e90000010a5014a2603c00460320026ea8c068c06cc068008528980c8009bae30160040013758602a00e2930b0b0b0a99980919b874800000852616163014002300f00137546020601e008601c601c002601a601a002601c601a002601a00244660024644460040066006002244a0024446600a44a666010002244a0022a66601266ebcc028c0300040104c014c0300044c008c02c0040048c008894ccc01400448940044ccc00cc024004888c00800c4c008c0200048c8c0088cc0080080048c0088cc00800800555cfab9a5573aae895d0918011baa0015573d", + "role": "MintingPolicyRole", + "version": "ScriptV2" + }, + "agora:governorPolicy": { + "cborHex": "5904a65904a301000032323232323232323232323232323232222323232533300f3370e90000010991919192999809991919800925114a06601e4a66602a66ebc030c064c06c004488c00800c4894004004dd6180b8020a999809999119baf374c0046e98004cc035241104753542073796d626f6c20656e7472790033233011232223002003375660380026ea4004dd7180b8029bab30170023322332233574066ec00080052f5bded8c06ea4008dd4000a45004800854ccc04cc8c94cc034c8c8c8c94cc044cdc4a40006eb4c07401054cc044cdc4a40006eb4c07400c54cc044cdc4a40006eb4c07400854cc044cdc4a40006eb4c0740044cdc4a40006eb4c074c078004c074004c070004c06c004dd6180c8010a99806991919191929980919b8948000dd6980f0028a9980919b8948000dd6980f0020a9980919b8948000dd6980f0018a9980919b8948000dd6980f0010a9980919b8948000dd6980f0008a9980919b8948000dd6980f180f8008a51301e001301d001301c001301b0013758603200226466e212000001375a60326034002603260320026601a9211e476f7665726e6f72206f75747075742073686f756c642070726573656e74003300e23253330153370e664466664466660284a66603466ebc00cc074004488c00800c48940040048c888c00800cc0840044894004dd4801000919991180c11299980d80088018998021810000980118108009119b80375a604200400290001bab001148000dd7180c8039bab3019001480084c044dd61991191980090008b199119800919111801001980180089128009191919191919191919191919191919191919191919191919191919299981999b89480000044c8c8c94ccc0d8cdc4a40000022646464a66607266e2520000011323232533303c3371290000008991919299981f99b89480000044c8c8c94ccc108cdc4a400000226464646464a66608e66e25200000113232323232035533304a001149858c13c00cdd6800982600098260018b1bad001304900130490165333042001149858c11c00c58dd6800982200098220018b1bad0013041001304100316375a002607c002607c0062c6eb4004c0ec004c0ec00c58dd6800981c000981c0018b1bad00130350013758002606600260660066eb4004c0c0004c0c004d4ccc0a400452616302e003375a002605600260560066eb4004c0a0004c0a000cdd6800981280098128019bad00130220013022003375a002603e0026eb0004c074004dd6000991919299980d19b8748000008406c54ccc068cdc3a40080042602c603c00226646603046444600400660460026ea4004dd7180f0008021810001180d8009baa0023019301a00137566032602e6034006202c603260340026eb0c05c00c5261616163014301700130163016001301530150013015301330150041630150023010001375460206022602400244666014004002006294088cc0048004588c010894ccc01c00448940044ccc00cc030004888c00800c4c008c034004888c00800c888cc010894ccc01c004489400454ccc020cdd798059806000802098029806000898011806800800919180111980100100091801119801001000aab9f573444a002460086008002aae755d0aba2230023754002aae781", + "description": "agora:governorPolicy", + "params": [ + "Ply.Core.Types:AsData#PlutusLedgerApi.V1.Tx:TxOutRef" + ], + "rawHex": "5904a301000032323232323232323232323232323232222323232533300f3370e90000010991919192999809991919800925114a06601e4a66602a66ebc030c064c06c004488c00800c4894004004dd6180b8020a999809999119baf374c0046e98004cc035241104753542073796d626f6c20656e7472790033233011232223002003375660380026ea4004dd7180b8029bab30170023322332233574066ec00080052f5bded8c06ea4008dd4000a45004800854ccc04cc8c94cc034c8c8c8c94cc044cdc4a40006eb4c07401054cc044cdc4a40006eb4c07400c54cc044cdc4a40006eb4c07400854cc044cdc4a40006eb4c0740044cdc4a40006eb4c074c078004c074004c070004c06c004dd6180c8010a99806991919191929980919b8948000dd6980f0028a9980919b8948000dd6980f0020a9980919b8948000dd6980f0018a9980919b8948000dd6980f0010a9980919b8948000dd6980f0008a9980919b8948000dd6980f180f8008a51301e001301d001301c001301b0013758603200226466e212000001375a60326034002603260320026601a9211e476f7665726e6f72206f75747075742073686f756c642070726573656e74003300e23253330153370e664466664466660284a66603466ebc00cc074004488c00800c48940040048c888c00800cc0840044894004dd4801000919991180c11299980d80088018998021810000980118108009119b80375a604200400290001bab001148000dd7180c8039bab3019001480084c044dd61991191980090008b199119800919111801001980180089128009191919191919191919191919191919191919191919191919191919299981999b89480000044c8c8c94ccc0d8cdc4a40000022646464a66607266e2520000011323232533303c3371290000008991919299981f99b89480000044c8c8c94ccc108cdc4a400000226464646464a66608e66e25200000113232323232035533304a001149858c13c00cdd6800982600098260018b1bad001304900130490165333042001149858c11c00c58dd6800982200098220018b1bad0013041001304100316375a002607c002607c0062c6eb4004c0ec004c0ec00c58dd6800981c000981c0018b1bad00130350013758002606600260660066eb4004c0c0004c0c004d4ccc0a400452616302e003375a002605600260560066eb4004c0a0004c0a000cdd6800981280098128019bad00130220013022003375a002603e0026eb0004c074004dd6000991919299980d19b8748000008406c54ccc068cdc3a40080042602c603c00226646603046444600400660460026ea4004dd7180f0008021810001180d8009baa0023019301a00137566032602e6034006202c603260340026eb0c05c00c5261616163014301700130163016001301530150013015301330150041630150023010001375460206022602400244666014004002006294088cc0048004588c010894ccc01c00448940044ccc00cc030004888c00800c4c008c034004888c00800c888cc010894ccc01c004489400454ccc020cdd798059806000802098029806000898011806800800919180111980100100091801119801001000aab9f573444a002460086008002aae755d0aba2230023754002aae781", + "role": "MintingPolicyRole", + "version": "ScriptV2" + }, + "agora:governorValidator": { + "cborHex": "591b61591b5e01000032323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323222222222323232323232323232323232323232323232323232323232323232323232323232323232533305f3371290000008991919299983119b89480000044c8c8c94ccc194cdc4a40000022646464a6660d066e2520000011323232533306b3371290000008991919299983719b89480000044c8c8c8c8c94ccc1cccdc4a40000022646464646464646464646464a6660fe66e1d200200213232323232325333085013370e00290000a999842809982980299837984480806998379ba8323370000290011bad30890100c3306f30890100b3306f30890100a3306f30890130880100a06b15333085013370e660d00086eacc22404111200213232325333088013371064660ca4646464a66611a0266e1d200000214800852000309201002308c010013754611c02611a026eb0004004dd61846009845808009bad308c01308b0100d1533308801337126eb4c8c23404c23004dd60009846008081bad308c01003132323232323232533308f0153307c53307c53307c53307c53307c53307c53307c323323090012253330950100114a02a66466128020022944c00cc25c040044c008c258040048c1d4dd5984b808008009bab3093010061332233309001222330022233003225333098013375e00800426600e00600229405280998009125014a260c600460c60026eacc24c04018dd5984980801099199119918490091299984b808008a5115330820130033099010011300230980100123003375a613202002002466e1c00520000013756612602004266ebcc24c0401cc24c040584cdd7984980802a601010000133308e01222533309401002153330940100114a2294054ccc250040045280a9998490099baf30960100230960100113300330950100230950100114a06eb0c24c04010c8cc1e80041d8c24c040244ccc888ccc888cc0048c00c004400d2812998400099b89300122337020020040082600244a661040266e240080104cdc480200099199911198011198011191118010019980280100089128008998009112800891280091299984a8099b8800200112330010030021632533309401323370e612c026ea8005200230980130970100113232325333097013370e900100109847809bad309b01001109301309c010023096010013754613002002212002613002612e0200264646464a66612e0266e1d20020021308f01375a613602002212602613802004612c020026ea8c26004004c26004c25c04c25804004c25c04008dd698498080a1849808269bad309301309201001153307c3375e61260200661260202e266ebcc24c04004c24c0405452616309101001309001001308f01001308e01001308d01001308c01001330850149011e50726f706f73616c206f75747075742073686f756c642070726573656e7400330860100637586118020902c2c611402002611202002661040292011a5374616b6520696e7075742073686f756c642070726573656e74003308301332223232533308a013370e660da00a6eacc23804005200213082013758664461020266104024646464646464646464646464646464646464646402aa666144020022930b1851008019984180919191919191919191919190062999855808008a4c2c61560200ca66614e0266e1d20000021324994ccc2a40400452616153330a7013370e90010010991919191929998560099b89480000044c8c92653330af01001149858c2bc0400c58dd68009857008009856008019bad00130ab01001153330a7013370e900200109924ca666152020022930b0b1856008011853008009baa00130a70100130a501003375a0026148020026eb0004dd6000985080800984f80803299984d8099b87480000084c8c8c8c8c8c8c92653330a301001149858c28c040194ccc27c04cdc3a400000426464a6661420266e1cdc6800a407026464932999852008008a4c2c6148020062c6eb8004c28c0400454ccc27c04cdc3a400400426464a6661420266e1cdc6800a407026464932999852008008a4c2c6148020062c6eb8004c28c0400458c29004008c27804004dd5000984f808008a99984d8099b87480080084c926533309d0100114985858c28004008c26804004dd5000984d80800984c80803299984a8099b87480000084c8c94ccc25c04cdc39b8d001480e04c8c926533309a01001149858c2680400c58dd7000984c808008a99984a8099b87480080084c8c94ccc25c04cdc39b8d001480e04c8c926533309a01001149858c2680400c58dd7000984c808008b184d00801184a008009baa001309501001309301003375a0026124020026eb0004cc20c04008004c23804c23404004010421804c23004004c23404c23004c22c04c23404004c8c8c88cc00400c008c22c04c22804008c22804004dd60289bab308901308801308801042375861120208c2c2c2a66610a0266e1c0052002153330850133053005375809a2a66610a0266e1ccc1d4124c8ccc1e888cc88ccc8c16888dd3198019bab0023756002446660b6446ea0cdc01bad002375a002004002004002646eacc23404c23004004c23404c8c23404c23004004c234040080041bc004dd6184480823240042646464a6661100266ebcc23004009300101020013253330890133323089012223300222330032253307e3300700300113300800400214a0266002449405289119b8f375c00400260b6002646644646611802446600244660cc0046008002244a00266118024466002446600244600c66124024466002446600244660dc660084466661340244446600244a666142026660ea02e00a0042660ec00a66600c0040020082660ec00466600c00a0080022660e80060040040020082004600c0022006244a00200a2004244a0020026661160244466002446600244660024466002446464446600400800666018016004a66612e026660d60140100082a66612e026660d601400c0042666660d401401000c0080042666660d401401000400800c2a66612e026660d601400c0042666660d401400800c0100042666660d401400800401000c26464446600400800644a002a66612a026660d201000c0042a66612a026660d201000c0082a66612a026660d2010008004264446600401200664446600400e00664446600400a00644a002264446600401200664446600400a00664446600400e00644a0022a66612a026660d201000c004264446600400e00664446600401200664446600400a00644a002264446600400e00664446600400a00664446600401200644a0022a66612a026660d20100040082a66612a026660d201000800c264446600400a00664446600400e00664446600401200644a002264446600400a00664446600401200664446600400e00644a0022a66612a026660d201000400c264446600400e00664446600400a00664446600401200644a002264446600400e00664446600401200664446600400a00644a00226464446600400800644a002a666126026660ce00c008004264446600400e00664446600400a00644a002264446600400a00664446600400e00644a00226464446600400800644a00264446600400a00644a002244a002004002466002e3dc880099918448091299984700800891280089998019848008009198310009801984800801098011847808009191929998460099b8733306223300170ee24cc1f0144dd5984800800a400490000844008a9998460099b8733306223300170ee24cc1f0144dd5984800800a4004900109919299984700a9983d998380298028a9983d99b8f375c612402002646464a6661220266e1d20020021375c612a020022a6661220266e1d200400213237286ecc004c2540400458c25804008c24004004dd5184900984880801899b873307133079053323232325333092013370e9001001083f09bae30960100130970100230910100137540026124026122020026eacc2480400d20021308601002163308a014912652656365697665722073686f756c6420626520696e20746865206566666563742067726f7570003330870123222300200337586128020026ea4004014cc2240524011f4741542072656365697665722073686f756c6420626520612073637269707400307b30900100216308e01001308f010013758611a020922930b19911984380a48127706c6f6f6b75705061727469616c3a204e6f2076616c756520666f756e6420666f72206b65792e003330840123222300200337566122020026ea0008004ccc888ccc8c8c94ccc238054cc1eccdc3999841009129998480099b87375a612c02004006266e000052002100148000019200213371200a0022446004008244a0026eb4c24c04008dd698468080099983f9129998468099b88375a6126020026eb4c24c0400840084004c23c0400c00c80044004dd59846009845808009bad32308d0137580026118020026460fc6610e024a6661140260dc6eacc240040044c888c00800cdd698458080089128008009bab308c0100337566118020062c611402611402002611202002611002661040292011850726f706f73616c20696e707574206e6f7420666f756e6400330830123004308a01308901308b01001375861120208c2c2c2a66610a0266e1c00520041533308501305c00515333085015330723370e660ea0946eacc22404110c181200213370e660c2464a66610e02660d20980022660ee0986eacc22c04c22804c2300400458c8c22c04c22804004c22c04004dd6184480823240042930b0b0a99984280982e0028a99984280a9983919b873307504a375661120208860c09001099b87330612325333087013306904c00113307704c37566116026114026118020022c646116026114020026116020026eb0c22404119200214985858dd68259bad04a232325333085015330723370e660d00086eacc22404005200213371e6466002400220e460e86112020046eb81484c1f4dd61991183e1983e91919191919191919191919191919191919191919191919191919191919191919191919191919191919191929998598099b89480000044c8c8c94ccc2d804cdc4a40000022646464a6661720266e252000001132323253330bc013371290000008991919299985f8099b89480000044c8c8c94ccc30804cdc4a400000226464646464a66618e0266e2520000011323204253330ca01001149858c3280400c58dd680098648080098638080b2999862808008a4c2c618a020062c6eb4004c31004004c3080400c58dd6800986080800985f808018b1bad00130be0100130bc0100316375a0026176020026172020062c6eb4004c2e004004c2d80400c58dd6800985a808009bac00130b30100130b10100530940137560066612802466ec0c8c2bc04008dd698570080099185a008011bad30b3010010013756002615c02002615802026a666154020022930b1855008019bad00130a90100130a701003375a002614c020026148020066eb4004c28c04004c2840400cdd6800985000800984f008019bad001309d010013758002613602002613202006660f446464646400aa6661320266e1d200000213232533309b013370e6e340052038132324994ccc2780400452616309e0100316375c002613a020022a6661320266e1d200200213232533309b013370e6e340052038132324994ccc2780400452616309e0100316375c002613a020022c613c020046130020026ea8004dd6000984c00800984b008019bad00130950100130930100530763756006660ec466ec0c8c24404008dd6984800800991919184c00802191998488091299984b00800890020991299984b0098008010b099802184c80801919b90001003375c612a026130020020024940dd5984b808019983c119bb0325333092013370e6e340052038130930100216375c612402002646464a6661280266e1cdc69bae002481004c8c8c8c8c8c8c8c8c288040314ccc2740400452616309d010065333099013370e900000109919299984d8099b87371a002901c0991924ca66613c020022930b184f008018b1bae001309d0100115333099013370e900100109924ca666136020022930b0b184f00801184c008009baa00130990100130970100316375c002612c020026eb0c25c04004004dd5984a808008009bab001309001001308e01003375a002611a020026eb0004cc1f8008004c22404c22004004dd5984480984400984400821084080984380800984400800998360228369983ea49194f776e206f75747075742073686f756c642070726573656e74003307e232323253330840153307133223300223300223371e00400229404cc0049280a513073308801003307330880100513370e660e86eb813cdd598440080124004260f86eb0cc88c1eccc1f08c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c94ccc28804cdc4a40000022646464a66614a0266e252000001132323253330a801337129000000899191929998558099b89480000044c8c8c94ccc2b804cdc4a40000022646464a6661620266e2520000011323232323253330b6013371290000008991919191901aa99985e008008a4c2c6178020066eb4004c2ec04004c2e40400c58dd6800985c00800985b0080b299985a008008a4c2c6168020062c6eb4004c2cc04004c2c40400c58dd68009858008009857008018b1bad00130ad0100130ab0100316375a0026154020026150020062c6eb4004c29c04004c2940400c58dd68009852008009bac00130a20100130a001003375a002613e02002613a02026a666136020022930b184d808019bad001309a01001309801003375a002612e02002612a020066eb4004c25004004c2480400cdd68009848808009847808019bad001308e0100137580026118020026eb0004cc1f4008004c22004004dd59844009843809843808208840009843008009842808009843008009bac308401040308401323084013083013085010013307c4912d4d616c666f726d65642073637269707420636f6e746578743a206f776e20696e707574206e6f7420666f756e640033223307f25333082013375e006610c02610e020022446004006244a0020026106020026eb0c20c0410058c21004008c1f8004dd5184000983f81f983f000983e800983e0009bac0405333079001149858c1e400cdd6800983c000983b0018b1bad001307500130730165333071001149858c1c400c58dd6800983800098370018b1bad001306d001306b00316375a00260d400260d00062c6eb4004c19c004c19400c58dd6800983200098310018b1bad0013061001375800260be00260ba0066eb4004c170004c16804d4ccc160004526163058003375a00260ae00260aa0066eb4004c150004c14800cdd6800982880098278019bad001304e001304c003375a00260960026eb0004c124004dd600618230009918231823000982280098221822000982198218009822000982100098210019bae006375c0084466ebcdd38011ba7001222333300400322002002001230303002001223232233001003002222533303700113301f003002132323253330383375e00400226604466ec0008cc024c0f8018c0f800cccc02088008014c0ec01054ccc0e0cdc81bae002375c00226604400c666601044002006607600800a26604400666660104400200c00a60760086070004606e008607200244a66606a00420022666600644002606e004606c00400246605c44a666066002244a00226600c6064606a0026004606800200244444a66606466600c00a0080062a66606466600c00a0040022a66606466600c00a006004264446600400e00664446600400c00664446600400a00664446600400800644a002264446600400e00664446600400a00664446600400c00664446600400800644a0022a66606466600c00a006002264446600400e00664446600400c00664446600400800664446600400a00644a002264446600400e00664446600400800664446600400c00664446600400a00644a0022a66606466600c00a0040022a66606466600c00a008004264446600400c00664446600400e00664446600400a00664446600400800644a002264446600400c00664446600400a00664446600400e00664446600400800644a0022a66606466600c00a008002264446600400c00664446600400e00664446600400800664446600400a00644a002264446600400c00664446600400800664446600400e00664446600400a00644a00244460064466002008006444466004008006444600644a66605e66004008006290010a999817998008020018a40002900211929980c18019bac302f002153301830043758605e0022600a6eb4c0bcc0b8004c0b4c0b40048c8c8c94cc064cdc4a40006eb4c0c001054cc064cdc4a40006eb4c0c000c54cc064cdc4a40006eb4c0c000854cc064cdc4a40006eb4c0c00044cdc4a40006eb4c0c0c0bc004c0b8004c0b4004c0b00048c8c8c8c94cc064cdc4a40006eb4c0c001454cc064cdc4a40006eb4c0c001054cc064cdc4a40006eb4c0c000c54cc064cdc4a40006eb4c0c000854cc064cdc4a40006eb4c0c000454cc064cdc4a40006eb4c0c0c0bc0045289817000981680098160009815800919b88480000048cdc0a40000024466006600e0040026044444666008002460024466601044002600a0046600c00a0022600c93129998128008912800899111801001991911980080180118138011813800938024800088c00800488c8cccccc04c08809cdd48019bab30253024001232323253330253370e90000010a5014a2605400460480026ea8c098c09cc098008528981280091180111198101129998128008a4000264a66604866ebcc0940040144c94ccc09c0045854ccc094c024c0a000454ccc094cdd79813181480080289bad302b302900116163756605400226006604e004604e002006ae8c8c06c894ccc08000440104cc020c00cc088004c008c0840052f5c0466603244a66603c002240082644a66603c60020042c2660086042006466e2000400cdd6980e981000080092502301822533301d00110041330053003301f0013002301e0014bd6f7b6302ba022323223300100300237520046ea4009221002233301500200100314a04646464a66602a66e1d2002002132223002003375c6032002244a002603400460280026ea8c058c05c00400488cccccc00c04805cdd480100091998031119b80375a603400400290001bab0011480008888cccc040cc0140100080048c888c00800cc01000448940048894ccc040cdd78011801800891180100189128009118069129998090008801899802180a0009801180980091980090008b11198009191118010019801800891280091191919299980719b8748000008402854ccc038cdc3a40080042600c602400226600e6eb8c048004010c04c008c034004dd500111118010019198010019ba90012223300822533300d00112250011533300b3375e6018601e0020082600a601e00226004601c002002464446004006601800244a002446600240022c4600444a66600e002244a002266600660120024446004006260046010002464600446600400400246004466004004002ae6955ceaab9f5744ae848c008dd5000aab9e1", + "description": "agora:governorValidator", + "params": [ + "Ply.Core.Types:AsData#PlutusLedgerApi.V1.Scripts:ScriptHash", + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"StakeSTTag\"#Plutarch.Extra.AssetClass:AssetClass", + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"GovernorSTTag\"#PlutusLedgerApi.V1.Value:CurrencySymbol", + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"ProposalSTTag\"#PlutusLedgerApi.V1.Value:CurrencySymbol", + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"AuthorityTokenTag\"#PlutusLedgerApi.V1.Value:CurrencySymbol" + ], + "rawHex": "591b5e01000032323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323222222222323232323232323232323232323232323232323232323232323232323232323232323232533305f3371290000008991919299983119b89480000044c8c8c94ccc194cdc4a40000022646464a6660d066e2520000011323232533306b3371290000008991919299983719b89480000044c8c8c8c8c94ccc1cccdc4a40000022646464646464646464646464a6660fe66e1d200200213232323232325333085013370e00290000a999842809982980299837984480806998379ba8323370000290011bad30890100c3306f30890100b3306f30890100a3306f30890130880100a06b15333085013370e660d00086eacc22404111200213232325333088013371064660ca4646464a66611a0266e1d200000214800852000309201002308c010013754611c02611a026eb0004004dd61846009845808009bad308c01308b0100d1533308801337126eb4c8c23404c23004dd60009846008081bad308c01003132323232323232533308f0153307c53307c53307c53307c53307c53307c53307c323323090012253330950100114a02a66466128020022944c00cc25c040044c008c258040048c1d4dd5984b808008009bab3093010061332233309001222330022233003225333098013375e00800426600e00600229405280998009125014a260c600460c60026eacc24c04018dd5984980801099199119918490091299984b808008a5115330820130033099010011300230980100123003375a613202002002466e1c00520000013756612602004266ebcc24c0401cc24c040584cdd7984980802a601010000133308e01222533309401002153330940100114a2294054ccc250040045280a9998490099baf30960100230960100113300330950100230950100114a06eb0c24c04010c8cc1e80041d8c24c040244ccc888ccc888cc0048c00c004400d2812998400099b89300122337020020040082600244a661040266e240080104cdc480200099199911198011198011191118010019980280100089128008998009112800891280091299984a8099b8800200112330010030021632533309401323370e612c026ea8005200230980130970100113232325333097013370e900100109847809bad309b01001109301309c010023096010013754613002002212002613002612e0200264646464a66612e0266e1d20020021308f01375a613602002212602613802004612c020026ea8c26004004c26004c25c04c25804004c25c04008dd698498080a1849808269bad309301309201001153307c3375e61260200661260202e266ebcc24c04004c24c0405452616309101001309001001308f01001308e01001308d01001308c01001330850149011e50726f706f73616c206f75747075742073686f756c642070726573656e7400330860100637586118020902c2c611402002611202002661040292011a5374616b6520696e7075742073686f756c642070726573656e74003308301332223232533308a013370e660da00a6eacc23804005200213082013758664461020266104024646464646464646464646464646464646464646402aa666144020022930b1851008019984180919191919191919191919190062999855808008a4c2c61560200ca66614e0266e1d20000021324994ccc2a40400452616153330a7013370e90010010991919191929998560099b89480000044c8c92653330af01001149858c2bc0400c58dd68009857008009856008019bad00130ab01001153330a7013370e900200109924ca666152020022930b0b1856008011853008009baa00130a70100130a501003375a0026148020026eb0004dd6000985080800984f80803299984d8099b87480000084c8c8c8c8c8c8c92653330a301001149858c28c040194ccc27c04cdc3a400000426464a6661420266e1cdc6800a407026464932999852008008a4c2c6148020062c6eb8004c28c0400454ccc27c04cdc3a400400426464a6661420266e1cdc6800a407026464932999852008008a4c2c6148020062c6eb8004c28c0400458c29004008c27804004dd5000984f808008a99984d8099b87480080084c926533309d0100114985858c28004008c26804004dd5000984d80800984c80803299984a8099b87480000084c8c94ccc25c04cdc39b8d001480e04c8c926533309a01001149858c2680400c58dd7000984c808008a99984a8099b87480080084c8c94ccc25c04cdc39b8d001480e04c8c926533309a01001149858c2680400c58dd7000984c808008b184d00801184a008009baa001309501001309301003375a0026124020026eb0004cc20c04008004c23804c23404004010421804c23004004c23404c23004c22c04c23404004c8c8c88cc00400c008c22c04c22804008c22804004dd60289bab308901308801308801042375861120208c2c2c2a66610a0266e1c0052002153330850133053005375809a2a66610a0266e1ccc1d4124c8ccc1e888cc88ccc8c16888dd3198019bab0023756002446660b6446ea0cdc01bad002375a002004002004002646eacc23404c23004004c23404c8c23404c23004004c234040080041bc004dd6184480823240042646464a6661100266ebcc23004009300101020013253330890133323089012223300222330032253307e3300700300113300800400214a0266002449405289119b8f375c00400260b6002646644646611802446600244660cc0046008002244a00266118024466002446600244600c66124024466002446600244660dc660084466661340244446600244a666142026660ea02e00a0042660ec00a66600c0040020082660ec00466600c00a0080022660e80060040040020082004600c0022006244a00200a2004244a0020026661160244466002446600244660024466002446464446600400800666018016004a66612e026660d60140100082a66612e026660d601400c0042666660d401401000c0080042666660d401401000400800c2a66612e026660d601400c0042666660d401400800c0100042666660d401400800401000c26464446600400800644a002a66612a026660d201000c0042a66612a026660d201000c0082a66612a026660d2010008004264446600401200664446600400e00664446600400a00644a002264446600401200664446600400a00664446600400e00644a0022a66612a026660d201000c004264446600400e00664446600401200664446600400a00644a002264446600400e00664446600400a00664446600401200644a0022a66612a026660d20100040082a66612a026660d201000800c264446600400a00664446600400e00664446600401200644a002264446600400a00664446600401200664446600400e00644a0022a66612a026660d201000400c264446600400e00664446600400a00664446600401200644a002264446600400e00664446600401200664446600400a00644a00226464446600400800644a002a666126026660ce00c008004264446600400e00664446600400a00644a002264446600400a00664446600400e00644a00226464446600400800644a00264446600400a00644a002244a002004002466002e3dc880099918448091299984700800891280089998019848008009198310009801984800801098011847808009191929998460099b8733306223300170ee24cc1f0144dd5984800800a400490000844008a9998460099b8733306223300170ee24cc1f0144dd5984800800a4004900109919299984700a9983d998380298028a9983d99b8f375c612402002646464a6661220266e1d20020021375c612a020022a6661220266e1d200400213237286ecc004c2540400458c25804008c24004004dd5184900984880801899b873307133079053323232325333092013370e9001001083f09bae30960100130970100230910100137540026124026122020026eacc2480400d20021308601002163308a014912652656365697665722073686f756c6420626520696e20746865206566666563742067726f7570003330870123222300200337586128020026ea4004014cc2240524011f4741542072656365697665722073686f756c6420626520612073637269707400307b30900100216308e01001308f010013758611a020922930b19911984380a48127706c6f6f6b75705061727469616c3a204e6f2076616c756520666f756e6420666f72206b65792e003330840123222300200337566122020026ea0008004ccc888ccc8c8c94ccc238054cc1eccdc3999841009129998480099b87375a612c02004006266e000052002100148000019200213371200a0022446004008244a0026eb4c24c04008dd698468080099983f9129998468099b88375a6126020026eb4c24c0400840084004c23c0400c00c80044004dd59846009845808009bad32308d0137580026118020026460fc6610e024a6661140260dc6eacc240040044c888c00800cdd698458080089128008009bab308c0100337566118020062c611402611402002611202002611002661040292011850726f706f73616c20696e707574206e6f7420666f756e6400330830123004308a01308901308b01001375861120208c2c2c2a66610a0266e1c00520041533308501305c00515333085015330723370e660ea0946eacc22404110c181200213370e660c2464a66610e02660d20980022660ee0986eacc22c04c22804c2300400458c8c22c04c22804004c22c04004dd6184480823240042930b0b0a99984280982e0028a99984280a9983919b873307504a375661120208860c09001099b87330612325333087013306904c00113307704c37566116026114026118020022c646116026114020026116020026eb0c22404119200214985858dd68259bad04a232325333085015330723370e660d00086eacc22404005200213371e6466002400220e460e86112020046eb81484c1f4dd61991183e1983e91919191919191919191919191919191919191919191919191919191919191919191919191919191919191929998598099b89480000044c8c8c94ccc2d804cdc4a40000022646464a6661720266e252000001132323253330bc013371290000008991919299985f8099b89480000044c8c8c94ccc30804cdc4a400000226464646464a66618e0266e2520000011323204253330ca01001149858c3280400c58dd680098648080098638080b2999862808008a4c2c618a020062c6eb4004c31004004c3080400c58dd6800986080800985f808018b1bad00130be0100130bc0100316375a0026176020026172020062c6eb4004c2e004004c2d80400c58dd6800985a808009bac00130b30100130b10100530940137560066612802466ec0c8c2bc04008dd698570080099185a008011bad30b3010010013756002615c02002615802026a666154020022930b1855008019bad00130a90100130a701003375a002614c020026148020066eb4004c28c04004c2840400cdd6800985000800984f008019bad001309d010013758002613602002613202006660f446464646400aa6661320266e1d200000213232533309b013370e6e340052038132324994ccc2780400452616309e0100316375c002613a020022a6661320266e1d200200213232533309b013370e6e340052038132324994ccc2780400452616309e0100316375c002613a020022c613c020046130020026ea8004dd6000984c00800984b008019bad00130950100130930100530763756006660ec466ec0c8c24404008dd6984800800991919184c00802191998488091299984b00800890020991299984b0098008010b099802184c80801919b90001003375c612a026130020020024940dd5984b808019983c119bb0325333092013370e6e340052038130930100216375c612402002646464a6661280266e1cdc69bae002481004c8c8c8c8c8c8c8c8c288040314ccc2740400452616309d010065333099013370e900000109919299984d8099b87371a002901c0991924ca66613c020022930b184f008018b1bae001309d0100115333099013370e900100109924ca666136020022930b0b184f00801184c008009baa00130990100130970100316375c002612c020026eb0c25c04004004dd5984a808008009bab001309001001308e01003375a002611a020026eb0004cc1f8008004c22404c22004004dd5984480984400984400821084080984380800984400800998360228369983ea49194f776e206f75747075742073686f756c642070726573656e74003307e232323253330840153307133223300223300223371e00400229404cc0049280a513073308801003307330880100513370e660e86eb813cdd598440080124004260f86eb0cc88c1eccc1f08c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c94ccc28804cdc4a40000022646464a66614a0266e252000001132323253330a801337129000000899191929998558099b89480000044c8c8c94ccc2b804cdc4a40000022646464a6661620266e2520000011323232323253330b6013371290000008991919191901aa99985e008008a4c2c6178020066eb4004c2ec04004c2e40400c58dd6800985c00800985b0080b299985a008008a4c2c6168020062c6eb4004c2cc04004c2c40400c58dd68009858008009857008018b1bad00130ad0100130ab0100316375a0026154020026150020062c6eb4004c29c04004c2940400c58dd68009852008009bac00130a20100130a001003375a002613e02002613a02026a666136020022930b184d808019bad001309a01001309801003375a002612e02002612a020066eb4004c25004004c2480400cdd68009848808009847808019bad001308e0100137580026118020026eb0004cc1f4008004c22004004dd59844009843809843808208840009843008009842808009843008009bac308401040308401323084013083013085010013307c4912d4d616c666f726d65642073637269707420636f6e746578743a206f776e20696e707574206e6f7420666f756e640033223307f25333082013375e006610c02610e020022446004006244a0020026106020026eb0c20c0410058c21004008c1f8004dd5184000983f81f983f000983e800983e0009bac0405333079001149858c1e400cdd6800983c000983b0018b1bad001307500130730165333071001149858c1c400c58dd6800983800098370018b1bad001306d001306b00316375a00260d400260d00062c6eb4004c19c004c19400c58dd6800983200098310018b1bad0013061001375800260be00260ba0066eb4004c170004c16804d4ccc160004526163058003375a00260ae00260aa0066eb4004c150004c14800cdd6800982880098278019bad001304e001304c003375a00260960026eb0004c124004dd600618230009918231823000982280098221822000982198218009822000982100098210019bae006375c0084466ebcdd38011ba7001222333300400322002002001230303002001223232233001003002222533303700113301f003002132323253330383375e00400226604466ec0008cc024c0f8018c0f800cccc02088008014c0ec01054ccc0e0cdc81bae002375c00226604400c666601044002006607600800a26604400666660104400200c00a60760086070004606e008607200244a66606a00420022666600644002606e004606c00400246605c44a666066002244a00226600c6064606a0026004606800200244444a66606466600c00a0080062a66606466600c00a0040022a66606466600c00a006004264446600400e00664446600400c00664446600400a00664446600400800644a002264446600400e00664446600400a00664446600400c00664446600400800644a0022a66606466600c00a006002264446600400e00664446600400c00664446600400800664446600400a00644a002264446600400e00664446600400800664446600400c00664446600400a00644a0022a66606466600c00a0040022a66606466600c00a008004264446600400c00664446600400e00664446600400a00664446600400800644a002264446600400c00664446600400a00664446600400e00664446600400800644a0022a66606466600c00a008002264446600400c00664446600400e00664446600400800664446600400a00644a002264446600400c00664446600400800664446600400e00664446600400a00644a00244460064466002008006444466004008006444600644a66605e66004008006290010a999817998008020018a40002900211929980c18019bac302f002153301830043758605e0022600a6eb4c0bcc0b8004c0b4c0b40048c8c8c94cc064cdc4a40006eb4c0c001054cc064cdc4a40006eb4c0c000c54cc064cdc4a40006eb4c0c000854cc064cdc4a40006eb4c0c00044cdc4a40006eb4c0c0c0bc004c0b8004c0b4004c0b00048c8c8c8c94cc064cdc4a40006eb4c0c001454cc064cdc4a40006eb4c0c001054cc064cdc4a40006eb4c0c000c54cc064cdc4a40006eb4c0c000854cc064cdc4a40006eb4c0c000454cc064cdc4a40006eb4c0c0c0bc0045289817000981680098160009815800919b88480000048cdc0a40000024466006600e0040026044444666008002460024466601044002600a0046600c00a0022600c93129998128008912800899111801001991911980080180118138011813800938024800088c00800488c8cccccc04c08809cdd48019bab30253024001232323253330253370e90000010a5014a2605400460480026ea8c098c09cc098008528981280091180111198101129998128008a4000264a66604866ebcc0940040144c94ccc09c0045854ccc094c024c0a000454ccc094cdd79813181480080289bad302b302900116163756605400226006604e004604e002006ae8c8c06c894ccc08000440104cc020c00cc088004c008c0840052f5c0466603244a66603c002240082644a66603c60020042c2660086042006466e2000400cdd6980e981000080092502301822533301d00110041330053003301f0013002301e0014bd6f7b6302ba022323223300100300237520046ea4009221002233301500200100314a04646464a66602a66e1d2002002132223002003375c6032002244a002603400460280026ea8c058c05c00400488cccccc00c04805cdd480100091998031119b80375a603400400290001bab0011480008888cccc040cc0140100080048c888c00800cc01000448940048894ccc040cdd78011801800891180100189128009118069129998090008801899802180a0009801180980091980090008b11198009191118010019801800891280091191919299980719b8748000008402854ccc038cdc3a40080042600c602400226600e6eb8c048004010c04c008c034004dd500111118010019198010019ba90012223300822533300d00112250011533300b3375e6018601e0020082600a601e00226004601c002002464446004006601800244a002446600240022c4600444a66600e002244a002266600660120024446004006260046010002464600446600400400246004466004004002ae6955ceaab9f5744ae848c008dd5000aab9e1", + "role": "ValidatorRole", + "version": "ScriptV2" + }, + "agora:mutateGovernorValidator": { + "cborHex": "590bd7590bd401000032323232323232323232323232323232323232323232323232323232323232323232322222223232323232323232323232323232323232323232323232323232323232323253330403371290000008991919299982199b89480000044c8c8c94ccc118cdc4a40000022646464a66609266e2520000011323232533304c3371290000008991919299982799b89480000044c8c8c8c8c94ccc150cdc4a4000002264646464646464646464646464646464646464646464646464646464646464646464a6660ec66e252000001132323253330793371290000008991919299983e19b89480000044c8c8c94ccc1fccdc4a40000022646464a6661040266e25200000113232325333085013371290000008991919191929998450099b89480000044c8c8c8c8c8c8c8c8c8c94ccc25004cdc3a400400426464a66612c02a660f866e1ccc234041d4dd5984e00984b80984d808009919b8148000005200213370e664466612a0244466a66613e02002244a002264446004006646446600200600461420200461420200246002446664e0088004c014008cc0180140044c920004988c00c0040048c94ccc26004c8cccccc248042700428404dd483c1bab309f01309e010012323232533309d013370e90000010a5014a2614802004613c020026ea8c28004c28404c28004008528984f808008998478083b9bab309e01309d01309f010011632309e01309d01001309e010013758613802002900109919191919299984d8099b873330980122253330a2010011002133003337000049001185180800a400000290020a99984d80992998410099842009bac33085013230a301309f0130a4010013230a30130a20130a4010013309001091013322330940123370e6612c02006646eacc29804c29404c29c04004c29404c29004c298040052002001375c100020046eacc28804c2840400ccc88c8c8c8cc28004c29c04014cc28004010cc28004c29c04008cc28004c29c04004cc28004c29c04c2980400427c04c29404004c29004004c28c04008dd6185100803191851809851008009bac33085013230a301309f0130a4010013230a30130a20130a4010013309001091013322330940123370e6612c02006646eacc29804c29404c29c04004c29404c29004c298040052002001375c100020046eacc28804c2840400c4cdc79843009919191929998500099b87480080084c888c00800cdd718530080089128009853808011850808009baa30a30130a4010013230a30130a40100130a20130a101001375c102026144026611e021200266446612602466e1ccc2540400cc8dd5985280985200985300800985200985180985280800a40040026eb81fc00454ccc26c04cc894ccc27404cdc3801240002a66613a0266e1c005200014a22a66613a0266e1c005200214a02a66613a0266e1c005200414a0294054ccc27404cdc3801240042a66613a0266e1c005200014a02a66613a0266e1c005200214a22a66613a0266e1c005200414a0294054ccc27404cdc3801240082a66613a0266e1c005200014a02a66613a0266e1c005200214a02a66613a0266e1c005200414a2294454ccc27404cdc3800a4000294054ccc27404cdc3800a4004294054ccc27404cdc3800a400829445289bad3308f0149124476f7665726e6f722072656465656d65722073686f756c64206265207265736f6c7665640033223308901232002375a00266611e021200200400266e9520023309a013230a20130a3010013308f01090013322330930123370e6612a02006646eacc29404c29004c29804004c29004c28c04c294040052002001375c0fe002132026eacc2840400920041533309b0133083013758661080264614402613c026146020026611e029201184e6f20676f7665726e6f72206f757470757420666f756e64003322330930123370e6612a020066eacc29004c28c04c294040052002001375c0fe6eb0c2840400cdd598508098500080119911919191984f809853008029984f808021984f809853008011984f809853008009984f8098530098528080084f009852008009851808009851008011bac30a10130a0010053230a20130a1010013758661080264614402613c02614602002646144026142026146020026611e021200266446612602466e1ccc2540400cc8dd5985280985200985300800985200985180985280800a40040026eb81fc004dd59850809850008010a4c2c2c2c2c66461300244a66614202002213602264a66613c02600800226613a020026006614602004260066146020046146020024646466613a02002941289919191929998500099b87480080085280a5130a70100230a1010013754002614402614602002646144026146020026142026140026144020026eb0c2800400cc8c27c04c27c04c27c04c26c04004c27804004c27404c27404004c27804c274041d4dd603c0b184e00984d80839984d008008b184d80801184a808009baa30970130960106f533309401001149858c250040d94ccc2480400452616309201003375a002612202002611e020062c6eb4004c23804004c230040594ccc2280400452616308a0100316375a002611202002610e020062c6eb4004c21804004c2100400c58dd68009841808009840808018b1bad001308001001307e00316375a00260fa00260f60062c6eb4004c1e8004dd6000983c000983b0019bad001307500130730135333071001149858c1c400cdd6800983800098370019bad001306d001306b003375a00260d400260d00066eb4004c19c004c19400cdd680098320009bac0013062001375800260c000260bc06ca6660b80022930b182e0019bad001305b001305900316375a00260b000260ac02ca6660a80022930b182a0018b1bad0013053001305100316375a00260a0002609c0062c6eb4004c134004c12c00c58dd6800982500098240018b1bad0013047001304500316375a00260880026eb0004c108004c10000cdd6800981f800981e809a99981d8008a4c2c60760066eb4004c0e8004c0e000cdd6800981b800981a8019bad00130340013032003375a0026062002605e0066eb4004c0b8004dd600098160009bac001302a001375800a60520046eb801088ccc07000800400c5281119baf374e0046e9c00488c00ccc0100080048cc00480045888cc00c010cc01400800488cc0048c888c00800cc00c00448940048c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c94ccc0bccdc4a40000022646464a66606466e252000001132323253330353371290000008991919299981c19b89480000044c8c8c94ccc0eccdc4a40000022646464a66607c66e2520000011323232323253330433371290000008991919191901aa9998258008a4c2c60960066eb4004c128004c12000c58dd68009823800982280b29998218008a4c2c60860062c6eb4004c108004c10000c58dd6800981f800981e8018b1bad001303c001303a00316375a0026072002606e0062c6eb4004c0d8004c0d000c58dd680098198009bac0013031001302f003375a002605c0026058026a6660540022930b18150019bad00130290013027003375a002604c00260480066eb4004c08c004c08400cdd68009810000980f0019bad001301d001375800260360026eb000488c8c8c94ccc05ccdc3a4000004200c2a66602e66e1d200400213007301d001133008375c603a002008603c00460300026ea8008894004888c00800c8cc00800cdd48009111980711299980b80089128008a99980999baf30163019001004130053019001130023018001001232223002003301600122330012001164911e476f7665726e6f72205554584f2073686f756c6420636172727920475354003007222533301100112250011533300d30023013001132223002003301300113300300230120010012233333300300d0123752004002466600e4466e00dd6980a801000a40006eac004520002222333300533006004002001232223002003300400112250012300422533300d00112250011333003300f001222300200313002300e00122253330083375e00460060022446004006244a00244600644a6660180022006266008601c0026004601a00246460044660040040024600446600400400297ae05740ae688c014c0080048c010c01000555ceaab9f5744ae848c008dd5000aab9e1", + "description": "agora:mutateGovernorValidator", + "params": [ + "Ply.Core.Types:AsData#PlutusLedgerApi.V1.Scripts:ScriptHash", + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"GovernorSTTag\"#PlutusLedgerApi.V1.Value:CurrencySymbol", + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"AuthorityTokenTag\"#PlutusLedgerApi.V1.Value:CurrencySymbol" + ], + "rawHex": "590bd401000032323232323232323232323232323232323232323232323232323232323232323232322222223232323232323232323232323232323232323232323232323232323232323253330403371290000008991919299982199b89480000044c8c8c94ccc118cdc4a40000022646464a66609266e2520000011323232533304c3371290000008991919299982799b89480000044c8c8c8c8c94ccc150cdc4a4000002264646464646464646464646464646464646464646464646464646464646464646464a6660ec66e252000001132323253330793371290000008991919299983e19b89480000044c8c8c94ccc1fccdc4a40000022646464a6661040266e25200000113232325333085013371290000008991919191929998450099b89480000044c8c8c8c8c8c8c8c8c8c94ccc25004cdc3a400400426464a66612c02a660f866e1ccc234041d4dd5984e00984b80984d808009919b8148000005200213370e664466612a0244466a66613e02002244a002264446004006646446600200600461420200461420200246002446664e0088004c014008cc0180140044c920004988c00c0040048c94ccc26004c8cccccc248042700428404dd483c1bab309f01309e010012323232533309d013370e90000010a5014a2614802004613c020026ea8c28004c28404c28004008528984f808008998478083b9bab309e01309d01309f010011632309e01309d01001309e010013758613802002900109919191919299984d8099b873330980122253330a2010011002133003337000049001185180800a400000290020a99984d80992998410099842009bac33085013230a301309f0130a4010013230a30130a20130a4010013309001091013322330940123370e6612c02006646eacc29804c29404c29c04004c29404c29004c298040052002001375c100020046eacc28804c2840400ccc88c8c8c8cc28004c29c04014cc28004010cc28004c29c04008cc28004c29c04004cc28004c29c04c2980400427c04c29404004c29004004c28c04008dd6185100803191851809851008009bac33085013230a301309f0130a4010013230a30130a20130a4010013309001091013322330940123370e6612c02006646eacc29804c29404c29c04004c29404c29004c298040052002001375c100020046eacc28804c2840400c4cdc79843009919191929998500099b87480080084c888c00800cdd718530080089128009853808011850808009baa30a30130a4010013230a30130a40100130a20130a101001375c102026144026611e021200266446612602466e1ccc2540400cc8dd5985280985200985300800985200985180985280800a40040026eb81fc00454ccc26c04cc894ccc27404cdc3801240002a66613a0266e1c005200014a22a66613a0266e1c005200214a02a66613a0266e1c005200414a0294054ccc27404cdc3801240042a66613a0266e1c005200014a02a66613a0266e1c005200214a22a66613a0266e1c005200414a0294054ccc27404cdc3801240082a66613a0266e1c005200014a02a66613a0266e1c005200214a02a66613a0266e1c005200414a2294454ccc27404cdc3800a4000294054ccc27404cdc3800a4004294054ccc27404cdc3800a400829445289bad3308f0149124476f7665726e6f722072656465656d65722073686f756c64206265207265736f6c7665640033223308901232002375a00266611e021200200400266e9520023309a013230a20130a3010013308f01090013322330930123370e6612a02006646eacc29404c29004c29804004c29004c28c04c294040052002001375c0fe002132026eacc2840400920041533309b0133083013758661080264614402613c026146020026611e029201184e6f20676f7665726e6f72206f757470757420666f756e64003322330930123370e6612a020066eacc29004c28c04c294040052002001375c0fe6eb0c2840400cdd598508098500080119911919191984f809853008029984f808021984f809853008011984f809853008009984f8098530098528080084f009852008009851808009851008011bac30a10130a0010053230a20130a1010013758661080264614402613c02614602002646144026142026146020026611e021200266446612602466e1ccc2540400cc8dd5985280985200985300800985200985180985280800a40040026eb81fc004dd59850809850008010a4c2c2c2c2c66461300244a66614202002213602264a66613c02600800226613a020026006614602004260066146020046146020024646466613a02002941289919191929998500099b87480080085280a5130a70100230a1010013754002614402614602002646144026146020026142026140026144020026eb0c2800400cc8c27c04c27c04c27c04c26c04004c27804004c27404c27404004c27804c274041d4dd603c0b184e00984d80839984d008008b184d80801184a808009baa30970130960106f533309401001149858c250040d94ccc2480400452616309201003375a002612202002611e020062c6eb4004c23804004c230040594ccc2280400452616308a0100316375a002611202002610e020062c6eb4004c21804004c2100400c58dd68009841808009840808018b1bad001308001001307e00316375a00260fa00260f60062c6eb4004c1e8004dd6000983c000983b0019bad001307500130730135333071001149858c1c400cdd6800983800098370019bad001306d001306b003375a00260d400260d00066eb4004c19c004c19400cdd680098320009bac0013062001375800260c000260bc06ca6660b80022930b182e0019bad001305b001305900316375a00260b000260ac02ca6660a80022930b182a0018b1bad0013053001305100316375a00260a0002609c0062c6eb4004c134004c12c00c58dd6800982500098240018b1bad0013047001304500316375a00260880026eb0004c108004c10000cdd6800981f800981e809a99981d8008a4c2c60760066eb4004c0e8004c0e000cdd6800981b800981a8019bad00130340013032003375a0026062002605e0066eb4004c0b8004dd600098160009bac001302a001375800a60520046eb801088ccc07000800400c5281119baf374e0046e9c00488c00ccc0100080048cc00480045888cc00c010cc01400800488cc0048c888c00800cc00c00448940048c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c94ccc0bccdc4a40000022646464a66606466e252000001132323253330353371290000008991919299981c19b89480000044c8c8c94ccc0eccdc4a40000022646464a66607c66e2520000011323232323253330433371290000008991919191901aa9998258008a4c2c60960066eb4004c128004c12000c58dd68009823800982280b29998218008a4c2c60860062c6eb4004c108004c10000c58dd6800981f800981e8018b1bad001303c001303a00316375a0026072002606e0062c6eb4004c0d8004c0d000c58dd680098198009bac0013031001302f003375a002605c0026058026a6660540022930b18150019bad00130290013027003375a002604c00260480066eb4004c08c004c08400cdd68009810000980f0019bad001301d001375800260360026eb000488c8c8c94ccc05ccdc3a4000004200c2a66602e66e1d200400213007301d001133008375c603a002008603c00460300026ea8008894004888c00800c8cc00800cdd48009111980711299980b80089128008a99980999baf30163019001004130053019001130023018001001232223002003301600122330012001164911e476f7665726e6f72205554584f2073686f756c6420636172727920475354003007222533301100112250011533300d30023013001132223002003301300113300300230120010012233333300300d0123752004002466600e4466e00dd6980a801000a40006eac004520002222333300533006004002001232223002003300400112250012300422533300d00112250011333003300f001222300200313002300e00122253330083375e00460060022446004006244a00244600644a6660180022006266008601c0026004601a00246460044660040040024600446600400400297ae05740ae688c014c0080048c010c01000555ceaab9f5744ae848c008dd5000aab9e1", + "role": "ValidatorRole", + "version": "ScriptV2" + }, + "agora:noOpValidator": { + "cborHex": "5901c85901c5010000323232323232323232323232323222223232323232533300f3370e9001001099192999808a99911998098010008a503370e6601800e6eacc058c8c060c060c060004c05c004c8cdc0a40000029001099b87332233301522233533301900112250011322230020033232233001003002301d002301b0012300122333270044002600a0046600c00a002264900024c46006002002464a666026646666660220300386ea4028dd5980c980d0009191919299980c19b87480000085280a51301f002301a00137546034603860340042944c0680044cc038024dd5980c180c980d0008b19180c180c800980c8009bac30160014800852616301730150053014001163016002301100137546022602400260240046eb801000488cccccc00c028038dd480100091998041119b80375a602200400290001bab0011480008888cccc014cc0180100080048c888c00800cc01000448940048c014894ccc02000448940044ccc00cc028004888c00800c4c008c02c0048894ccc010cdd7801180180089118010018912800ab9a22300322533300600110031330043008001300230090012323002233002002001230022330020020015573eaae755d0aba2230023754002aae79", + "description": "agora:noOpValidator", + "params": [ + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"AuthorityTokenTag\"#PlutusLedgerApi.V1.Value:CurrencySymbol" + ], + "rawHex": "5901c5010000323232323232323232323232323222223232323232533300f3370e9001001099192999808a99911998098010008a503370e6601800e6eacc058c8c060c060c060004c05c004c8cdc0a40000029001099b87332233301522233533301900112250011322230020033232233001003002301d002301b0012300122333270044002600a0046600c00a002264900024c46006002002464a666026646666660220300386ea4028dd5980c980d0009191919299980c19b87480000085280a51301f002301a00137546034603860340042944c0680044cc038024dd5980c180c980d0008b19180c180c800980c8009bac30160014800852616301730150053014001163016002301100137546022602400260240046eb801000488cccccc00c028038dd480100091998041119b80375a602200400290001bab0011480008888cccc014cc0180100080048c888c00800cc01000448940048c014894ccc02000448940044ccc00cc028004888c00800c4c008c02c0048894ccc010cdd7801180180089118010018912800ab9a22300322533300600110031330043008001300230090012323002233002002001230022330020020015573eaae755d0aba2230023754002aae79", + "role": "ValidatorRole", + "version": "ScriptV2" + }, + "agora:proposalPolicy": { + "cborHex": "59032e59032b010000323232323232323232323232222323232323232533300e3370e90000010a9998071991980090008b199119806119991180891299980a0008801899802180d0009801180c80091180091299980a99b8848000dd6980e00209911980080100199b80002375a603800826446600200800466e00004dd6980e00219191198008018012400090000009998069191118010019bab301800137520040026eb8c04c004dd5980980211299911998090010008a503370e0049001099b870014800054ccc038cc894ccc040cdc3801240002a66602066e1c005200014a22a66602066e1c005200214a02a66602066e1c005200414a0294054ccc040cdc3801240042a66602066e1c005200014a02a66602066e1c005200214a22a66602066e1c005200414a0294054ccc040cdc3801240082a66602066e1c005200014a02a66602066e1c005200214a02a66602066e1c005200414a2294454ccc040cdc3800a4000294054ccc040cdc3800a4004294054ccc040cdc3800a40082944528a400066446600240022c92010f4753542073686f756c64206d6f7665003332223300d75a666601a466e95200233574000297ae03323010225333013001122500113330033019001222300200313002301800123253330133370e64600c446602844a66602e00229000099299980c99baf301a0010051325333019001161533301a35746603c0022a66603466ebcc06cc07c0040144dd69810980f8008b0b1bab302000113003301d002301d0010033237566032603060340026030602e0029001099111801001980c0008912800980c00080111999111980180080111198081190011bad001333011232223002003301c001002001002001122500132323223300100300230153014002301400137580126eb0c04c014dd59809991809980880098090020a4c2c2c2c6028004601a0026ea8c040c03c00cc030c038004c03cc038004c03800488cc0048c888c00800cc00c0044894004888cc010894ccc01c004489400454ccc020cdd798049806800802098029806800898011806000800919180111980100100091801119801001000aab9f5734aae748c00cc0080048c008c0080055d12ba1230023754002aae781", + "description": "agora:proposalPolicy", + "params": [ + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"GovernorSTTag\"#Plutarch.Extra.AssetClass:AssetClass" + ], + "rawHex": "59032b010000323232323232323232323232222323232323232533300e3370e90000010a9998071991980090008b199119806119991180891299980a0008801899802180d0009801180c80091180091299980a99b8848000dd6980e00209911980080100199b80002375a603800826446600200800466e00004dd6980e00219191198008018012400090000009998069191118010019bab301800137520040026eb8c04c004dd5980980211299911998090010008a503370e0049001099b870014800054ccc038cc894ccc040cdc3801240002a66602066e1c005200014a22a66602066e1c005200214a02a66602066e1c005200414a0294054ccc040cdc3801240042a66602066e1c005200014a02a66602066e1c005200214a22a66602066e1c005200414a0294054ccc040cdc3801240082a66602066e1c005200014a02a66602066e1c005200214a02a66602066e1c005200414a2294454ccc040cdc3800a4000294054ccc040cdc3800a4004294054ccc040cdc3800a40082944528a400066446600240022c92010f4753542073686f756c64206d6f7665003332223300d75a666601a466e95200233574000297ae03323010225333013001122500113330033019001222300200313002301800123253330133370e64600c446602844a66602e00229000099299980c99baf301a0010051325333019001161533301a35746603c0022a66603466ebcc06cc07c0040144dd69810980f8008b0b1bab302000113003301d002301d0010033237566032603060340026030602e0029001099111801001980c0008912800980c00080111999111980180080111198081190011bad001333011232223002003301c001002001002001122500132323223300100300230153014002301400137580126eb0c04c014dd59809991809980880098090020a4c2c2c2c6028004601a0026ea8c040c03c00cc030c038004c03cc038004c03800488cc0048c888c00800cc00c0044894004888cc010894ccc01c004489400454ccc020cdd798049806800802098029806800898011806000800919180111980100100091801119801001000aab9f5734aae748c00cc0080048c008c0080055d12ba1230023754002aae781", + "role": "MintingPolicyRole", + "version": "ScriptV2" + }, + "agora:proposalValidator": { + "cborHex": "591e7c591e79010000323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323222222223232323232323232323232533304d3370e900100109919191919191919191919191919191919191919191919191919191919191919191919191919191919191919299983c99b89480000044c8c8c94ccc1f0cdc4a40000022646464a6660fe66e2520000011323232533308201337129000000899191929998428099b89480000044c8c8c94ccc22004cdc4a400000226464646464a66611a0266e252000001132323232323232323232323232323232323232323232323232323253330a8013370e90000010980491929998550099b89375a615c020220022a66615402660e202090010a9998550098391806a40042a666154026601c4664466e24c00488cdc0800801001191bad30b0013230b00130b00130b00130af010013758002615e0202c0022c264a6661560260e2660f60026eacc2bc0405c54ccc2ac04cc21004040cc29804c2bc04070cc29804c2bc0406ccc29804c2bc04068cc29804c2bc04064cc29804c2bc04060cc29804dd319991119856009129998578080088550089929998588099b870010051333006375a616e02616a0200446615a0266ec0dd40011ba8001300430b5010031300330b401002153330b1013371200a00226615802616a0200461680200426615802616a0200460066168020046eb4c2c404c2d0040040048c888c00800ccdc00008018009bab30af01017330a60130af01016330a60130af0130ae010160a10114985858dd69857008018b0b0b0b1991199854809111999800911911180100191980080180109128009180091199938022001300500233006005001132480012623003001001253330aa01308a0130743308101375a615c020366eb0c2b804c2b004c2b4040044dd69857008008b0008a9998540099b87480080084c02494ccc2a404cc1c003d20001323253330ab013371266615202444a66615a02002200426600666e00009200230b10100148000004dd68368a9998558099b89375a615e02615c020246eb4c2bc0400854ccc2ac04cc21004040cc29804c2bc04070cc29804c2bc0406ccc29804c2bc04068cc29804dd3800998530098578080c198530098578080b998530098578080b198530098578098570080b050808a4c2c2c2c6664461540244a66615a0200226615202006148022a66615c0264600a446600400c0066164020022c2a66615c0264600a44a6612c026122026600400c00626600200c006616402002266152020066615202616402002616202002266152026164020026004616202002646460024464644660020060044466008600e004600e0024466008600c004600c00246600211002114024002615c02615a020026eb0c2b804060cc29c0488cc004894ccc2b404c23804004400858580045854ccc2a004cdc3a400c004264a66615202661040201c6614802615a020346614802615a0203266148026ea0004cc29004c2b40405ccc29004c2b404058cc29004c2b404054cc29004c2b404050cc29004c2b404c2b00405027c0454ccc2a404cdc3807a400026012460024464a66615a0266e1c0052000153330ad01337126eb4c2c40405400c54ccc2b404ccc2ac04888cc008894ccc2c40400c5280a9984b8099802800985a8080189984780801185b008018984a008008011bac30b10101b153330ad013307400548008526161616153330ad013370e00290010a999856809983a002a400c2930b0a999856809983a002a400c2930b1807a40002a6661520266e1c03d200213253330aa013370e00290000a9998550099838801240082a6661540260e06644646464a66615e02a661280266e1cccc26c04894ccc2c404cdc39bad30b70100200313370000290010800a400000a9001099b8900400112230020041225001375a6168020046eb4c2b804004ccc26004894ccc2b804cdc41bad30b401001375a616802004200420026160020040046eacc2b804058dd698570080a0a4c2c2c2a6661540266e1c0052002153330aa01330710024801852616153330aa01330710024801852616300c4801054ccc2a404cdc3807a40082a66615202660e000290030a9998548099929998550099b87001480004800454ccc2a804cdc3800a400421140221140260189003199185400912999855808008a501533078300330b0010011300230af0100123370e66124026eb81b8c8dd5985780985700985800800985700985680985780800a40046eb0c2b4041945261616153330a9013370e01e90030b0b0b1bad30ac0130aa0100d13009253330a90153330a90153308e013307000f480084c1c4c0312002153308e013089013375e6e98ccc1c888c94ccc2b004c23004c2340400454ccc2b004c1d80044ccc1e8c20004004dd698580080100188018b19841009bad30af0101c3758615e02615a02615c020026eacc2b404054004c2b4040544cc20804cc29004c2b404068cc29004c2b404064cc29004c2b404060cc29004c2b40405ccc29004c2b404058cc29004dd319983911192999856009846009846808008a99985600983b000899983d1840008009bad30b0010020031003163308201375a615e020386eb0c2bc04c2b404c2b804004dd598568080a800998520098568080a198520098568098560080a04f80807099841008071bac06a149858c2b404008c29c04004dd5032a9998520099b87480000084c8c8c8c92653330a601001149858c2a40400cdd68009854008008a9998520099b87480080084c92653330a30100114985854ccc29004cdc3a4008004264932999851808008a4c2c2a6661480266e1d20060021324994ccc28c04004526161630a90100230a30100137540c24600264600244644660020080046644646614a024466002446611c020046008002244a0026614a024466002446600244600c661560244660024466002446612c02660084466661660244446600244a6661760266612c0202e00a00426613c0200a66600c00400200826613c0200466600c00a008002266138020060040040020082004600c0022006244a00200a2004244a0020026661480244466002446600244660024466002446464446600400800666018016004a66616202666118020140100082a666162026661180201400c0042666661160201401000c0080042666661160201401000400800c2a666162026661180201400c0042666661160201400800c0100042666661160201400800401000c26464446600400800644a002a66615e026661140201000c0042a66615e026661140201000c0082a66615e0266611402010008004264446600401200664446600400e00664446600400a00644a002264446600401200664446600400a00664446600400e00644a0022a66615e026661140201000c004264446600400e00664446600401200664446600400a00644a002264446600400e00664446600400a00664446600401200644a0022a66615e02666114020100040082a66615e026661140201000800c264446600400a00664446600400e00664446600401200644a002264446600400a00664446600401200664446600400e00644a0022a66615e026661140201000400c264446600400e00664446600400a00664446600401200644a002264446600400e00664446600401200664446600400a00644a00226464446600400800644a002a66615a026661100200c008004264446600400e00664446600400a00644a002264446600400a00664446600400e00644a00226464446600400800644a00264446600400a00644a002244a00200400246600210202106020026664614002444a666148020022004266006660080046152020026150020024466446600246006002200846006446464466002006004661140261560261540200800466e00008dd698550080198028009919119800801801112800a40006eb0c294041708c94ccc28404c20404c208040044c00800458cc20804008dd618520082e19911191929998518099b8732300622330a4012253330a7010011480004c94ccc2a404cdd79855008008028992999854808008b0a999855009847009856808008a9998550099baf30ab0130ae010010051375a616002615c020022c2c6eacc2bc040044c00cc2b004008c2b00400400cdd5985380800a400426126026eb0cc88c24804cc24c048c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c80554ccc2e0040045261630bb01003330ac012323232323232323232323200c53330c101001149858c310040194ccc30004cdc3a400000426493299985f808008a4c2c2a6661800266e1d20020021323232323253330c5013371290000008991924ca66618a020022930b1864008018b1bad00130c70100130c501003375a0026188020022a6661800266e1d20040021324994ccc2fc04004526161630c50100230bf010013754002618002002617c020066eb4004c2f404004dd60009bac00130ba0100130b80100653330b4013370e900000109919191919191924ca666172020022930b185e00803299985c0099b87480000084c8c94ccc2e804cdc39b8d001480e04c8c92653330ba01001149858c2f40400c58dd7000985e008008a99985c0099b87480080084c8c94ccc2e804cdc39b8d001480e04c8c92653330ba01001149858c2f40400c58dd7000985e008008b185e80801185b808009baa00130b801001153330b4013370e900100109924ca666166020022930b0b185c808011859808009baa00130b40100130b20100653330ae013370e90000010991929998580099b87371a002901c0991924ca666160020022930b1859808018b1bae00130b201001153330ae013370e90010010991929998580099b87371a002901c0991924ca666160020022930b1859808018b1bae00130b2010011630b30100230ad010013754002615c020026158020066eb4004c2ac04004dd60009984a00801000985380985300800802084b809852808009853009852809852009853008009919191198008018011852009851808011851808009bac06337566144026142026142020aa660024666444464646464600c4464646464a6661580266e1c02d2000153330ac01533091013371201a00c266e2401401052000153330ac013371000800c290010b0a9998560099b8700b4800854ccc2b0054cc24404cdc4802003099b8900500314800054ccc2b004cdc40018030a40042c2a6661580266e1c02d2004153330ac01533091013371200600c266e2401400852000153330ac013371000400c290010b0a9998560099b8700b4801854ccc2b0054cc24404cdc4801003099b8900500114800054ccc2b004cdc40008030a40042c2a66615802a661220266e240080184cdc48028008a40002a6661580266e200040185200216337000026eb4c2bc0401ccdc00009bad30ae01007337000026eb4c2b40401ccdc00049bad30ac0100a30a80100130a70100130a60100130a50100437586144020126eb4c28804c2840402400458c8c8ccc888cc0088cc0088c888c00800ccc01400800448940044cc00488940044894004894ccc28004cdc400100089198008018010b19299984f809919b8730a10137540029001185180985100800899191929998510099b87480080084c24804dd6985300800884b009853808011850808009baa30a30100110930130a30130a2010013232323253330a2013370e900100109849009bad30a60100110960130a70100230a10100137546146020026146026144026142020026144020026140020a86612e0292011d70726f706f73616c20696e7075742073686f756c642070726573656e740033098012323232533309f015330840133223300223300223371e00400229404cc0049280a5130860130a30100330860130a30105213370e6610e026eb8188dd5985180801240042611e026eb0cc88c23804cc23c048c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c94ccc33404cdc4a40000022646464a6661a00266e252000001132323253330d3013371290000008991919299986b0099b89480000044c8c8c94ccc36404cdc4a40000022646464a6661b80266e2520000011323232323253330e101337129000000899190212999870808008a4c2c61c8020062c6eb4004c38c04004c384040594ccc370040045261630df0100316375a00261bc0200261b8020062c6eb4004c36c04004c3640400c58dd6800986c00800986b008018b1bad00130d50100130d30100316375a00261a40200261a0020062c6eb4004c33c04004dd6000986680800986580802985f009bab003330bf01233760646192020046eb4c32004004c8c33804008dd69866808008009bab00130c80100130c60101353330c101001149858c3100400cdd68009861808009860808019bad00130c00100130be01003375a002617a020026176020066eb4004c2e804004c2e00400cdd6800985b808009bac00130b50100130b301003330a40123232323200553330b3013370e900000109919299985a8099b87371a002901c0991924ca66616a020022930b185c008018b1bae00130b701001153330b3013370e900100109919299985a8099b87371a002901c0991924ca66616a020022930b185c008018b1bae00130b7010011630b80100230b20100137540026eb0004c2c804004c2c00400cdd68009857808009856808029850009bab003330a101233760646156020046eb4c2a804004c8c8c8c2c804010c28c04dd59858808019985180919bb03253330ac013370e6e340052038130ad0100216375c615802002646464a66615c0266e1cdc69bae002481004c8c8c8c8c8c8c8c8c2f0040314ccc2d0040045261630b70100653330b3013370e900000109919299985a8099b87371a002901c0991924ca66616a020022930b185c008018b1bae00130b701001153330b3013370e900100109924ca666164020022930b0b185c008011859008009baa00130b30100130b10100316375c0026160020026eb0c2c404004004dd59857808008009bab00130aa0100130a801003375a002614e020026eb0004cc24004008004c28c04004dd598518098510098510082b0849809850808009850008009850808009bac309f01055375a613c020126138020026136020026134020026eb0c2680400cc26004004c25c04004c25804004c25404004c25004004c24c04004dd60282999846808008a4c2c6120020062c6eb4004c23c04004c234040594ccc2200400452616308b0100316375a0026114020026110020062c6eb4004c21c04004c2140400c58dd68009842008009841008018b1bad001308101001307f00316375a00260fc00260f80062c6eb4004c1ec004dd6000983c800983b80298351bab0033306b2337606460ea0046eb4c1d0004c8c1e8008dd6983c8008009bab00130740013072013533306d001149858c1c000cdd6800983780098368019bad001306c001306a003375a00260d200260ce0066eb4004c198004c19000cdd680098318009bac0013061001305f00333050232323232005533305f3370e900000109919299983099b87371a002901c0991924ca6660c20022930b18320018b1bae00130630011533305f3370e900100109919299983099b87371a002901c0991924ca6660c20022930b18320018b1bae0013063001163064002305e00137540026eb0004c178004c17000cdd6800982d800982c80298261bab0033304d2337606460ae0046eb4c158004c8c8c8c178010c13cdd5982e80199827919bb03253330583370e6e3400520381305900216375c60b0002646464a6660b466e1cdc69bae002481004c8c8c8c8c8c8c8c8c1a00314ccc180004526163063006533305f3370e900000109919299983099b87371a002901c0991924ca6660c20022930b18320018b1bae00130630011533305f3370e900100109924ca6660bc0022930b0b1832001182f0009baa001305f001305d00316375c00260b80026eb0c174004004dd5982d8008009bab00130560013054003375a00260a60026eb003cc148c8c148c144c14c004cc1252401184f776e20696e7075742073686f756c642070726573656e740033223304c253330503375e00660a860aa0022446004006244a00200260a20026eb0c14402458c148008c130004dd5182718268041826000982518258009825182500098248009824000982480098238009823800919800925114a044a66607666e1c00920001533303b3370e00290000a511533303b3370e00290010a501533303b3370e00290020a501533303b3370e00290030a5014a02a66607666e1c00920021533303b3370e00290000a501533303b3370e00290010a511533303b3370e00290020a501533303b3370e00290030a5014a02a66607666e1c00920041533303b3370e00290000a501533303b3370e00290010a501533303b3370e00290020a511533303b3370e00290030a5014a02a66607666e1c00920061533303b3370e00290000a501533303b3370e00290010a501533303b3370e00290020a501533303b3370e00290030a5114a22a66607666e1c005200014a02a66607666e1c005200214a02a66607666e1c005200414a02a66607666e1c005200614a2294494ccc0e4cdc3800a4000294454ccc0e4cdc3800a400429405281181b11119800911980299803002001000880118009199800925114a029408c0d088cc004894cc018c0140084c01000452811981a8008010a51222333004232533303733712900000089118010018b19b8100100300300122233330040020012333004001233300800400100313330082001003002100123302300237500024644460040066eb4c0d800488cc00c8cc0b0cdd81ba8003375000400200444466605c44a666062002246002600c05a2644a66606866e200080184cc010c0dc00c8c008cc0c0c0e401000454ccc0d0cdc3801003098009803981b80189800980399817981c001981b8019bad30333036001001200123302900233003233300101e102210220014901096e6f7420766f746572002302922330012233300500222230020031300400112250012300c232330043370e0066eb4c0c0004c8c8c94ccc0bccdc3a40000042444a0042a66605e66e1d20020021322223003004375a60660022444a0026068004605c0026ea8c0c0c0bc004dd60009129998150010980d000880f1119baf374e0046e9c004888894ccc0acccc01801401000c54ccc0acccc01801400800454ccc0acccc01801400c0084c888cc00801c00cc888cc00801800cc888cc00801400cc888cc00801000c8940044c888cc00801c00cc888cc00801400cc888cc00801800cc888cc00801000c89400454ccc0acccc01801400c0044c888cc00801c00cc888cc00801800cc888cc00801000cc888cc00801400c8940044c888cc00801c00cc888cc00801000cc888cc00801800cc888cc00801400c89400454ccc0acccc01801400800454ccc0acccc0180140100084c888cc00801800cc888cc00801c00cc888cc00801400cc888cc00801000c8940044c888cc00801800cc888cc00801400cc888cc00801c00cc888cc00801000c89400454ccc0acccc0180140100044c888cc00801800cc888cc00801c00cc888cc00801000cc888cc00801400c8940044c888cc00801800cc888cc00801000cc888cc00801c00cc888cc00801400c894004888c00c88cc00401000c00488c8c8c94ccc0a0cdc3a40040042646464a66605666e1d200000214a0266ebcdd38021ba70013030002302a00137540082646464a66605666e1d200200214a0266ebcdd38021ba70013030002302a0013754008605a004604e0026ea800800488c8c8c8c94ccc09ccdc40010008a51153330273370e0040022646466e44dd718168011bae302d001302e004302d00414a0604e004604c0046ea8008dd50011199810800a504a2466002449405289180e91299981000089128008999801981280091980280098019812801098011812000911119801002001aba32233301d00200100314a04646464a66603a66e1d2002002132223002003375c6042002244a002604400460380026ea8c078c07c00400488cccccc00c06807cdd480100091998031119b80375a604400400290001bab0011480008888cccc05ccc0140100080048c888c00800cc01000448940048894ccc060cdd780118018008911801001891280091180a11299980b8008801899802180e0009801180d80091980090008b11198009191118010019801800891280091191919299980b19b8748000008402854ccc058cdc3a40080042600c603400226600e6eb8c068004010c06c008c054004dd500111118010019198010019ba90012223300f2253330120011225001153330133375e6028602e0020082600a602e00226004602c002002464446004006602800244a0024601444a66601a0022008266012600660240026004602200297ae0233300822533300b001120041322533300e30010021613300430110032337100020066eb4c034c0400040049281199803912999805000890020991299980698008010b0998021808001919b90001003375c6018601e00200249408c018894ccc02400440104cc014c00cc038004c008c0340052f5bded8c0ae8088cc0048004588c008894ccc01400448940044ccc00cc028004888c00800c4c008c0240048c8c0088cc0080080048c0088cc00800800555cfab9a5573a460046004002ae895d0918011baa0015573d", + "description": "agora:proposalValidator", + "params": [ + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"StakeSTTag\"#Plutarch.Extra.AssetClass:AssetClass", + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"GovernorSTTag\"#PlutusLedgerApi.V1.Value:CurrencySymbol", + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"ProposalSTTag\"#PlutusLedgerApi.V1.Value:CurrencySymbol", + "Ply.Core.Types:AsData#GHC.Num.Integer:Integer" + ], + "rawHex": "591e79010000323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323222222223232323232323232323232533304d3370e900100109919191919191919191919191919191919191919191919191919191919191919191919191919191919191919299983c99b89480000044c8c8c94ccc1f0cdc4a40000022646464a6660fe66e2520000011323232533308201337129000000899191929998428099b89480000044c8c8c94ccc22004cdc4a400000226464646464a66611a0266e252000001132323232323232323232323232323232323232323232323232323253330a8013370e90000010980491929998550099b89375a615c020220022a66615402660e202090010a9998550098391806a40042a666154026601c4664466e24c00488cdc0800801001191bad30b0013230b00130b00130b00130af010013758002615e0202c0022c264a6661560260e2660f60026eacc2bc0405c54ccc2ac04cc21004040cc29804c2bc04070cc29804c2bc0406ccc29804c2bc04068cc29804c2bc04064cc29804c2bc04060cc29804dd319991119856009129998578080088550089929998588099b870010051333006375a616e02616a0200446615a0266ec0dd40011ba8001300430b5010031300330b401002153330b1013371200a00226615802616a0200461680200426615802616a0200460066168020046eb4c2c404c2d0040040048c888c00800ccdc00008018009bab30af01017330a60130af01016330a60130af0130ae010160a10114985858dd69857008018b0b0b0b1991199854809111999800911911180100191980080180109128009180091199938022001300500233006005001132480012623003001001253330aa01308a0130743308101375a615c020366eb0c2b804c2b004c2b4040044dd69857008008b0008a9998540099b87480080084c02494ccc2a404cc1c003d20001323253330ab013371266615202444a66615a02002200426600666e00009200230b10100148000004dd68368a9998558099b89375a615e02615c020246eb4c2bc0400854ccc2ac04cc21004040cc29804c2bc04070cc29804c2bc0406ccc29804c2bc04068cc29804dd3800998530098578080c198530098578080b998530098578080b198530098578098570080b050808a4c2c2c2c6664461540244a66615a0200226615202006148022a66615c0264600a446600400c0066164020022c2a66615c0264600a44a6612c026122026600400c00626600200c006616402002266152020066615202616402002616202002266152026164020026004616202002646460024464644660020060044466008600e004600e0024466008600c004600c00246600211002114024002615c02615a020026eb0c2b804060cc29c0488cc004894ccc2b404c23804004400858580045854ccc2a004cdc3a400c004264a66615202661040201c6614802615a020346614802615a0203266148026ea0004cc29004c2b40405ccc29004c2b404058cc29004c2b404054cc29004c2b404050cc29004c2b404c2b00405027c0454ccc2a404cdc3807a400026012460024464a66615a0266e1c0052000153330ad01337126eb4c2c40405400c54ccc2b404ccc2ac04888cc008894ccc2c40400c5280a9984b8099802800985a8080189984780801185b008018984a008008011bac30b10101b153330ad013307400548008526161616153330ad013370e00290010a999856809983a002a400c2930b0a999856809983a002a400c2930b1807a40002a6661520266e1c03d200213253330aa013370e00290000a9998550099838801240082a6661540260e06644646464a66615e02a661280266e1cccc26c04894ccc2c404cdc39bad30b70100200313370000290010800a400000a9001099b8900400112230020041225001375a6168020046eb4c2b804004ccc26004894ccc2b804cdc41bad30b401001375a616802004200420026160020040046eacc2b804058dd698570080a0a4c2c2c2a6661540266e1c0052002153330aa01330710024801852616153330aa01330710024801852616300c4801054ccc2a404cdc3807a40082a66615202660e000290030a9998548099929998550099b87001480004800454ccc2a804cdc3800a400421140221140260189003199185400912999855808008a501533078300330b0010011300230af0100123370e66124026eb81b8c8dd5985780985700985800800985700985680985780800a40046eb0c2b4041945261616153330a9013370e01e90030b0b0b1bad30ac0130aa0100d13009253330a90153330a90153308e013307000f480084c1c4c0312002153308e013089013375e6e98ccc1c888c94ccc2b004c23004c2340400454ccc2b004c1d80044ccc1e8c20004004dd698580080100188018b19841009bad30af0101c3758615e02615a02615c020026eacc2b404054004c2b4040544cc20804cc29004c2b404068cc29004c2b404064cc29004c2b404060cc29004c2b40405ccc29004c2b404058cc29004dd319983911192999856009846009846808008a99985600983b000899983d1840008009bad30b0010020031003163308201375a615e020386eb0c2bc04c2b404c2b804004dd598568080a800998520098568080a198520098568098560080a04f80807099841008071bac06a149858c2b404008c29c04004dd5032a9998520099b87480000084c8c8c8c92653330a601001149858c2a40400cdd68009854008008a9998520099b87480080084c92653330a30100114985854ccc29004cdc3a4008004264932999851808008a4c2c2a6661480266e1d20060021324994ccc28c04004526161630a90100230a30100137540c24600264600244644660020080046644646614a024466002446611c020046008002244a0026614a024466002446600244600c661560244660024466002446612c02660084466661660244446600244a6661760266612c0202e00a00426613c0200a66600c00400200826613c0200466600c00a008002266138020060040040020082004600c0022006244a00200a2004244a0020026661480244466002446600244660024466002446464446600400800666018016004a66616202666118020140100082a666162026661180201400c0042666661160201401000c0080042666661160201401000400800c2a666162026661180201400c0042666661160201400800c0100042666661160201400800401000c26464446600400800644a002a66615e026661140201000c0042a66615e026661140201000c0082a66615e0266611402010008004264446600401200664446600400e00664446600400a00644a002264446600401200664446600400a00664446600400e00644a0022a66615e026661140201000c004264446600400e00664446600401200664446600400a00644a002264446600400e00664446600400a00664446600401200644a0022a66615e02666114020100040082a66615e026661140201000800c264446600400a00664446600400e00664446600401200644a002264446600400a00664446600401200664446600400e00644a0022a66615e026661140201000400c264446600400e00664446600400a00664446600401200644a002264446600400e00664446600401200664446600400a00644a00226464446600400800644a002a66615a026661100200c008004264446600400e00664446600400a00644a002264446600400a00664446600400e00644a00226464446600400800644a00264446600400a00644a002244a00200400246600210202106020026664614002444a666148020022004266006660080046152020026150020024466446600246006002200846006446464466002006004661140261560261540200800466e00008dd698550080198028009919119800801801112800a40006eb0c294041708c94ccc28404c20404c208040044c00800458cc20804008dd618520082e19911191929998518099b8732300622330a4012253330a7010011480004c94ccc2a404cdd79855008008028992999854808008b0a999855009847009856808008a9998550099baf30ab0130ae010010051375a616002615c020022c2c6eacc2bc040044c00cc2b004008c2b00400400cdd5985380800a400426126026eb0cc88c24804cc24c048c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c80554ccc2e0040045261630bb01003330ac012323232323232323232323200c53330c101001149858c310040194ccc30004cdc3a400000426493299985f808008a4c2c2a6661800266e1d20020021323232323253330c5013371290000008991924ca66618a020022930b1864008018b1bad00130c70100130c501003375a0026188020022a6661800266e1d20040021324994ccc2fc04004526161630c50100230bf010013754002618002002617c020066eb4004c2f404004dd60009bac00130ba0100130b80100653330b4013370e900000109919191919191924ca666172020022930b185e00803299985c0099b87480000084c8c94ccc2e804cdc39b8d001480e04c8c92653330ba01001149858c2f40400c58dd7000985e008008a99985c0099b87480080084c8c94ccc2e804cdc39b8d001480e04c8c92653330ba01001149858c2f40400c58dd7000985e008008b185e80801185b808009baa00130b801001153330b4013370e900100109924ca666166020022930b0b185c808011859808009baa00130b40100130b20100653330ae013370e90000010991929998580099b87371a002901c0991924ca666160020022930b1859808018b1bae00130b201001153330ae013370e90010010991929998580099b87371a002901c0991924ca666160020022930b1859808018b1bae00130b2010011630b30100230ad010013754002615c020026158020066eb4004c2ac04004dd60009984a00801000985380985300800802084b809852808009853009852809852009853008009919191198008018011852009851808011851808009bac06337566144026142026142020aa660024666444464646464600c4464646464a6661580266e1c02d2000153330ac01533091013371201a00c266e2401401052000153330ac013371000800c290010b0a9998560099b8700b4800854ccc2b0054cc24404cdc4802003099b8900500314800054ccc2b004cdc40018030a40042c2a6661580266e1c02d2004153330ac01533091013371200600c266e2401400852000153330ac013371000400c290010b0a9998560099b8700b4801854ccc2b0054cc24404cdc4801003099b8900500114800054ccc2b004cdc40008030a40042c2a66615802a661220266e240080184cdc48028008a40002a6661580266e200040185200216337000026eb4c2bc0401ccdc00009bad30ae01007337000026eb4c2b40401ccdc00049bad30ac0100a30a80100130a70100130a60100130a50100437586144020126eb4c28804c2840402400458c8c8ccc888cc0088cc0088c888c00800ccc01400800448940044cc00488940044894004894ccc28004cdc400100089198008018010b19299984f809919b8730a10137540029001185180985100800899191929998510099b87480080084c24804dd6985300800884b009853808011850808009baa30a30100110930130a30130a2010013232323253330a2013370e900100109849009bad30a60100110960130a70100230a10100137546146020026146026144026142020026144020026140020a86612e0292011d70726f706f73616c20696e7075742073686f756c642070726573656e740033098012323232533309f015330840133223300223300223371e00400229404cc0049280a5130860130a30100330860130a30105213370e6610e026eb8188dd5985180801240042611e026eb0cc88c23804cc23c048c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c94ccc33404cdc4a40000022646464a6661a00266e252000001132323253330d3013371290000008991919299986b0099b89480000044c8c8c94ccc36404cdc4a40000022646464a6661b80266e2520000011323232323253330e101337129000000899190212999870808008a4c2c61c8020062c6eb4004c38c04004c384040594ccc370040045261630df0100316375a00261bc0200261b8020062c6eb4004c36c04004c3640400c58dd6800986c00800986b008018b1bad00130d50100130d30100316375a00261a40200261a0020062c6eb4004c33c04004dd6000986680800986580802985f009bab003330bf01233760646192020046eb4c32004004c8c33804008dd69866808008009bab00130c80100130c60101353330c101001149858c3100400cdd68009861808009860808019bad00130c00100130be01003375a002617a020026176020066eb4004c2e804004c2e00400cdd6800985b808009bac00130b50100130b301003330a40123232323200553330b3013370e900000109919299985a8099b87371a002901c0991924ca66616a020022930b185c008018b1bae00130b701001153330b3013370e900100109919299985a8099b87371a002901c0991924ca66616a020022930b185c008018b1bae00130b7010011630b80100230b20100137540026eb0004c2c804004c2c00400cdd68009857808009856808029850009bab003330a101233760646156020046eb4c2a804004c8c8c8c2c804010c28c04dd59858808019985180919bb03253330ac013370e6e340052038130ad0100216375c615802002646464a66615c0266e1cdc69bae002481004c8c8c8c8c8c8c8c8c2f0040314ccc2d0040045261630b70100653330b3013370e900000109919299985a8099b87371a002901c0991924ca66616a020022930b185c008018b1bae00130b701001153330b3013370e900100109924ca666164020022930b0b185c008011859008009baa00130b30100130b10100316375c0026160020026eb0c2c404004004dd59857808008009bab00130aa0100130a801003375a002614e020026eb0004cc24004008004c28c04004dd598518098510098510082b0849809850808009850008009850808009bac309f01055375a613c020126138020026136020026134020026eb0c2680400cc26004004c25c04004c25804004c25404004c25004004c24c04004dd60282999846808008a4c2c6120020062c6eb4004c23c04004c234040594ccc2200400452616308b0100316375a0026114020026110020062c6eb4004c21c04004c2140400c58dd68009842008009841008018b1bad001308101001307f00316375a00260fc00260f80062c6eb4004c1ec004dd6000983c800983b80298351bab0033306b2337606460ea0046eb4c1d0004c8c1e8008dd6983c8008009bab00130740013072013533306d001149858c1c000cdd6800983780098368019bad001306c001306a003375a00260d200260ce0066eb4004c198004c19000cdd680098318009bac0013061001305f00333050232323232005533305f3370e900000109919299983099b87371a002901c0991924ca6660c20022930b18320018b1bae00130630011533305f3370e900100109919299983099b87371a002901c0991924ca6660c20022930b18320018b1bae0013063001163064002305e00137540026eb0004c178004c17000cdd6800982d800982c80298261bab0033304d2337606460ae0046eb4c158004c8c8c8c178010c13cdd5982e80199827919bb03253330583370e6e3400520381305900216375c60b0002646464a6660b466e1cdc69bae002481004c8c8c8c8c8c8c8c8c1a00314ccc180004526163063006533305f3370e900000109919299983099b87371a002901c0991924ca6660c20022930b18320018b1bae00130630011533305f3370e900100109924ca6660bc0022930b0b1832001182f0009baa001305f001305d00316375c00260b80026eb0c174004004dd5982d8008009bab00130560013054003375a00260a60026eb003cc148c8c148c144c14c004cc1252401184f776e20696e7075742073686f756c642070726573656e740033223304c253330503375e00660a860aa0022446004006244a00200260a20026eb0c14402458c148008c130004dd5182718268041826000982518258009825182500098248009824000982480098238009823800919800925114a044a66607666e1c00920001533303b3370e00290000a511533303b3370e00290010a501533303b3370e00290020a501533303b3370e00290030a5014a02a66607666e1c00920021533303b3370e00290000a501533303b3370e00290010a511533303b3370e00290020a501533303b3370e00290030a5014a02a66607666e1c00920041533303b3370e00290000a501533303b3370e00290010a501533303b3370e00290020a511533303b3370e00290030a5014a02a66607666e1c00920061533303b3370e00290000a501533303b3370e00290010a501533303b3370e00290020a501533303b3370e00290030a5114a22a66607666e1c005200014a02a66607666e1c005200214a02a66607666e1c005200414a02a66607666e1c005200614a2294494ccc0e4cdc3800a4000294454ccc0e4cdc3800a400429405281181b11119800911980299803002001000880118009199800925114a029408c0d088cc004894cc018c0140084c01000452811981a8008010a51222333004232533303733712900000089118010018b19b8100100300300122233330040020012333004001233300800400100313330082001003002100123302300237500024644460040066eb4c0d800488cc00c8cc0b0cdd81ba8003375000400200444466605c44a666062002246002600c05a2644a66606866e200080184cc010c0dc00c8c008cc0c0c0e401000454ccc0d0cdc3801003098009803981b80189800980399817981c001981b8019bad30333036001001200123302900233003233300101e102210220014901096e6f7420766f746572002302922330012233300500222230020031300400112250012300c232330043370e0066eb4c0c0004c8c8c94ccc0bccdc3a40000042444a0042a66605e66e1d20020021322223003004375a60660022444a0026068004605c0026ea8c0c0c0bc004dd60009129998150010980d000880f1119baf374e0046e9c004888894ccc0acccc01801401000c54ccc0acccc01801400800454ccc0acccc01801400c0084c888cc00801c00cc888cc00801800cc888cc00801400cc888cc00801000c8940044c888cc00801c00cc888cc00801400cc888cc00801800cc888cc00801000c89400454ccc0acccc01801400c0044c888cc00801c00cc888cc00801800cc888cc00801000cc888cc00801400c8940044c888cc00801c00cc888cc00801000cc888cc00801800cc888cc00801400c89400454ccc0acccc01801400800454ccc0acccc0180140100084c888cc00801800cc888cc00801c00cc888cc00801400cc888cc00801000c8940044c888cc00801800cc888cc00801400cc888cc00801c00cc888cc00801000c89400454ccc0acccc0180140100044c888cc00801800cc888cc00801c00cc888cc00801000cc888cc00801400c8940044c888cc00801800cc888cc00801000cc888cc00801c00cc888cc00801400c894004888c00c88cc00401000c00488c8c8c94ccc0a0cdc3a40040042646464a66605666e1d200000214a0266ebcdd38021ba70013030002302a00137540082646464a66605666e1d200200214a0266ebcdd38021ba70013030002302a0013754008605a004604e0026ea800800488c8c8c8c94ccc09ccdc40010008a51153330273370e0040022646466e44dd718168011bae302d001302e004302d00414a0604e004604c0046ea8008dd50011199810800a504a2466002449405289180e91299981000089128008999801981280091980280098019812801098011812000911119801002001aba32233301d00200100314a04646464a66603a66e1d2002002132223002003375c6042002244a002604400460380026ea8c078c07c00400488cccccc00c06807cdd480100091998031119b80375a604400400290001bab0011480008888cccc05ccc0140100080048c888c00800cc01000448940048894ccc060cdd780118018008911801001891280091180a11299980b8008801899802180e0009801180d80091980090008b11198009191118010019801800891280091191919299980b19b8748000008402854ccc058cdc3a40080042600c603400226600e6eb8c068004010c06c008c054004dd500111118010019198010019ba90012223300f2253330120011225001153330133375e6028602e0020082600a602e00226004602c002002464446004006602800244a0024601444a66601a0022008266012600660240026004602200297ae0233300822533300b001120041322533300e30010021613300430110032337100020066eb4c034c0400040049281199803912999805000890020991299980698008010b0998021808001919b90001003375c6018601e00200249408c018894ccc02400440104cc014c00cc038004c008c0340052f5bded8c0ae8088cc0048004588c008894ccc01400448940044ccc00cc028004888c00800c4c008c0240048c8c0088cc0080080048c0088cc00800800555cfab9a5573a460046004002ae895d0918011baa0015573d", + "role": "ValidatorRole", + "version": "ScriptV2" + }, + "agora:stakePolicy": { + "cborHex": "5907be5907bb010000323232323232323232323232323232323232323232222323232323232323232533301a3370e90000010991919809191980a119980c91180091299981119b8848000dd6981480209911980080100199b80002375a605200826446600200800466e00004dd69814802191911980080180124000900000099980a9191118010019bab302500137520060026eacc08401c894ccc078cdc4240000042a66603c66e1c00d20001533301e3370e00490010a99980f1919191929980aa9980aa9980a99b8733223002223302422533302a0011480004c94ccc0a4cdd7981600080289929998160008b0a999815180f98170008a99981519baf302d302f0010051375a6062605e0022c2c6eacc0c00044c00cc0b4008c0b400400cc8c8c88cc00400c008c0a4c0a0008c0a0004dd600a1bab3027004375a604e00626644600444646464a66605266e1d20020021332302822533302e00114a02a6646605a0022944c00cc0c40044c008c0c00048cc88c8c8c94ccc0bccdc3a40040042646464a66606466e1d200000214a0266ebcdd38021ba70013038002303300137540082646464a66606466e1d200200214a0266ebcdd38021ba7001303800230330013754008606a00460600026ea8008c8c0c0c0c4004c8c0c0c0c4004c0bcc0b8c0c000401c0104c8cc0a0894ccc0b80045280a99981619baf303100100314a226004606000200c605c002605e00460540026ea800cc8c88cc00400c008dd618140081bac302700c302700213232323253330263370e90000010a5014a26058004604e0026ea8004c09c0044c05cdd618139813000981280098120009bac3322301733018232323232323232323232323232323232323232320155333037001149858c0e000ccc8c0c8894ccc0e000452f5c026606e600660760026004607400246464646464646464646464018a6660800022930b1820803299981e19b87480000084c926533303e00114985854ccc0f0cdc3a400400426464646464a66608266e252000001132324994ccc11000452616304500316375a002608800260840066eb4004c10400454ccc0f0cdc3a400800426493299981f0008a4c2c2c6084004607a0026ea8004c0f4004c0ec00cdd6800981d0009bac0013758002606e002606a00ca66606066e1d20000021323232323232324994ccc0e000452616303900653330343370e900000109919299981b19b87371a002901c0991924ca6660720022930b181d0018b1bae0013039001153330343370e900100109919299981b19b87371a002901c0991924ca6660720022930b181d0018b1bae001303900116303a00230350013754002606a0022a66606066e1d20020021324994ccc0c800452616163036002303100137540026062002605e00ca66605466e1d200000213232533302c3370e6e340052038132324994ccc0bc00452616303000316375c002605e0022a66605466e1d200200213232533302c3370e6e340052038132324994ccc0bc00452616303000316375c002605e0022c606000460560026ea8004c0ac004c0a400cdd680098140009bac00132323253330243370e900000109128008a99981219b87480100084c888c00800cc0a40044cc8cc0748c888c00800cc0b4004dd48009bae3029001004302a00230250013754004604860460026eacc090c08cc08c024c088c090cc88cc0048004592411a4f757470757420746f20736372697074206e6f7420666f756e640033301c2225333023001122500115333021300230260011322230020033026001133003002302500123232323253330233370e90000010a5013370e666444666603e00490001199981000124000eb4dd58008019bab30283027004009375c60500029001181480118120009baa323026302700130250013025001375860460142930b0b0b0a99980f19b870013370290000018a4c2c6466664466664603a44a666046002244a0022666006604c002444600400626004604a0024a66603e66ebc00cc088004488c00800c48940040048c888c00800cc0980044894004dd4801000919980c1119b80375a604c00400290001bab001148000c8ccc05c88cc88ccc8c07488dd3198019bab00237560024466603c446ea0cdc01bad002375a002004002004002646eacc090c08c004c090c8c090c08c004c0900080052f5bded8c00026eb0c080020dd7180f8008b1810001180d8009baa301c301b00632301b301b301b001301a00130193019001301830180013019001301700130170012233300f00200100314a0ae8c8cc00480045888cc0048c888c00800cc00c0044894004888cc024894ccc03c004489400454ccc034cdd798081809000802098029809000898011808800800918011ba900122223300822533300e00110051533300c3375e601e602200200c260086026602200226004602000200244600a44a6660160022006266008601c0026004601a002444666600800644004004002460046006002464600446600400400246004466004004002446464466002006004444a6660120022660100060042646464a66601466ebc0080044cc02ccdd800119804980880318088019998041100100298070020a99980519b90375c0046eb80044cc02c018cccc0208800400cc0380100144cc02c00ccccc02088004018014c038010c030008c02c010c030004894ccc01c00840044cccc00c88004c028008c0240080055cd2ba05573eaae755d12ba1230023754002aae79", + "description": "agora:stakePolicy", + "params": [ + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"GTTag\"#Plutarch.Extra.AssetClass:AssetClass" + ], + "rawHex": "5907bb010000323232323232323232323232323232323232323232222323232323232323232533301a3370e90000010991919809191980a119980c91180091299981119b8848000dd6981480209911980080100199b80002375a605200826446600200800466e00004dd69814802191911980080180124000900000099980a9191118010019bab302500137520060026eacc08401c894ccc078cdc4240000042a66603c66e1c00d20001533301e3370e00490010a99980f1919191929980aa9980aa9980a99b8733223002223302422533302a0011480004c94ccc0a4cdd7981600080289929998160008b0a999815180f98170008a99981519baf302d302f0010051375a6062605e0022c2c6eacc0c00044c00cc0b4008c0b400400cc8c8c88cc00400c008c0a4c0a0008c0a0004dd600a1bab3027004375a604e00626644600444646464a66605266e1d20020021332302822533302e00114a02a6646605a0022944c00cc0c40044c008c0c00048cc88c8c8c94ccc0bccdc3a40040042646464a66606466e1d200000214a0266ebcdd38021ba70013038002303300137540082646464a66606466e1d200200214a0266ebcdd38021ba7001303800230330013754008606a00460600026ea8008c8c0c0c0c4004c8c0c0c0c4004c0bcc0b8c0c000401c0104c8cc0a0894ccc0b80045280a99981619baf303100100314a226004606000200c605c002605e00460540026ea800cc8c88cc00400c008dd618140081bac302700c302700213232323253330263370e90000010a5014a26058004604e0026ea8004c09c0044c05cdd618139813000981280098120009bac3322301733018232323232323232323232323232323232323232320155333037001149858c0e000ccc8c0c8894ccc0e000452f5c026606e600660760026004607400246464646464646464646464018a6660800022930b1820803299981e19b87480000084c926533303e00114985854ccc0f0cdc3a400400426464646464a66608266e252000001132324994ccc11000452616304500316375a002608800260840066eb4004c10400454ccc0f0cdc3a400800426493299981f0008a4c2c2c6084004607a0026ea8004c0f4004c0ec00cdd6800981d0009bac0013758002606e002606a00ca66606066e1d20000021323232323232324994ccc0e000452616303900653330343370e900000109919299981b19b87371a002901c0991924ca6660720022930b181d0018b1bae0013039001153330343370e900100109919299981b19b87371a002901c0991924ca6660720022930b181d0018b1bae001303900116303a00230350013754002606a0022a66606066e1d20020021324994ccc0c800452616163036002303100137540026062002605e00ca66605466e1d200000213232533302c3370e6e340052038132324994ccc0bc00452616303000316375c002605e0022a66605466e1d200200213232533302c3370e6e340052038132324994ccc0bc00452616303000316375c002605e0022c606000460560026ea8004c0ac004c0a400cdd680098140009bac00132323253330243370e900000109128008a99981219b87480100084c888c00800cc0a40044cc8cc0748c888c00800cc0b4004dd48009bae3029001004302a00230250013754004604860460026eacc090c08cc08c024c088c090cc88cc0048004592411a4f757470757420746f20736372697074206e6f7420666f756e640033301c2225333023001122500115333021300230260011322230020033026001133003002302500123232323253330233370e90000010a5013370e666444666603e00490001199981000124000eb4dd58008019bab30283027004009375c60500029001181480118120009baa323026302700130250013025001375860460142930b0b0b0a99980f19b870013370290000018a4c2c6466664466664603a44a666046002244a0022666006604c002444600400626004604a0024a66603e66ebc00cc088004488c00800c48940040048c888c00800cc0980044894004dd4801000919980c1119b80375a604c00400290001bab001148000c8ccc05c88cc88ccc8c07488dd3198019bab00237560024466603c446ea0cdc01bad002375a002004002004002646eacc090c08c004c090c8c090c08c004c0900080052f5bded8c00026eb0c080020dd7180f8008b1810001180d8009baa301c301b00632301b301b301b001301a00130193019001301830180013019001301700130170012233300f00200100314a0ae8c8cc00480045888cc0048c888c00800cc00c0044894004888cc024894ccc03c004489400454ccc034cdd798081809000802098029809000898011808800800918011ba900122223300822533300e00110051533300c3375e601e602200200c260086026602200226004602000200244600a44a6660160022006266008601c0026004601a002444666600800644004004002460046006002464600446600400400246004466004004002446464466002006004444a6660120022660100060042646464a66601466ebc0080044cc02ccdd800119804980880318088019998041100100298070020a99980519b90375c0046eb80044cc02c018cccc0208800400cc0380100144cc02c00ccccc02088004018014c038010c030008c02c010c030004894ccc01c00840044cccc00c88004c028008c0240080055cd2ba05573eaae755d12ba1230023754002aae79", + "role": "MintingPolicyRole", + "version": "ScriptV2" + }, + "agora:stakeValidator": { + "cborHex": "5913c85913c501000032323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323222222232323232323232323232323253330453370e900100109919191919191919998131119180111119191919119980080200180129981d8020a9981e99baf302830590073059305800c13375e60b260b000e60b260b0018a660740082a66078004266ebcc160c15c018c09cc16002d4cc0e40104004cdd7982b002182b004982880119191911998008020018012514a2944008888c8c8c8c8c8c8c8c8c8c8c8c8c94ccc170cdc3a400000426606246002444444a6660c66607294001c4c8c8c94ccc198c0f8c0d400c4ccc01c8c94ccc1a0cdc4a40000022a6660d066088660b66ea0004cc16cc1b0010cc16cc1b000ccc16cc1b0c1ac00c168c0d80285261616337006eb4c1ac010004985858c1a0004c19c004c0c401858c024c8888c00c010dd698300008a99982e19b87480080084cc0c48c0048888894ccc18ccc0e5280038a999831981d99830911980091299827981b001098020008a50006153330633040005149858585802054ccc170cdc3a400800426605846002444444646460b06e9c004ccc00c888c8c8c8c94ccc1accdc3a40000042a6660d66608294403c4c01488c018cdd2a4004660c06ea0dd69838801998301ba800105f161533306b3370e900100109804180219ba54801017458c1c0008c1a8004dd500191982d98360021982d80082d118011982c1ba8001330583374a900002b82b8b1299983219831111980090220a50007153330643303a4a001020022c2c0102a6660b866e1d200600213302c2300122222233300222232323253330693370e900200109929998351982025100e133332222323003223230702253330730011066132533307530040011330680013003307800213003307800230780012304a325330593370e0126eb4c1dc0044c8c8c94ccc1d8cdc3a40040042a6660ec010294454ccc1d8cdc499b80375a60f460f200201600e2944584020c1ec008c1d4004dd5183b983b0009bac001323300213300114a229404cc0045280a51225001375a60dc00e646eb4c1bcc8c1bcc0f8004dd60009837181e1836800802a9998351991299983619b870024800054ccc1b0cdc3800a4000294454ccc1b0cdc3800a4004294054ccc1b0cdc3800a4008294054ccc1b0cdc3800a400c29405280a99983619b870024800854ccc1b0cdc3800a4000294054ccc1b0cdc3800a4004294454ccc1b0cdc3800a4008294054ccc1b0cdc3800a400c29405280a99983619b870024801054ccc1b0cdc3800a4000294054ccc1b0cdc3800a4004294054ccc1b0cdc3800a4008294454ccc1b0cdc3800a400c29405280a99983619b870024801854ccc1b0cdc3800a4000294054ccc1b0cdc3800a4004294054ccc1b0cdc3800a4008294054ccc1b0cdc3800a400c29445288a99983619b87001480005280a99983619b87001480085280a99983619b87001480105280a99983619b87001480185288a51375a60dc0029003091280089128010b183618360030b183700118340009baa00226160081533305c3370e90040010998181199800930180b1804991111801002183000089981811998009313099ba54800813c020c184008c16c004dd5011299982c19b87480000084c8c8c8c926533305a001149858c17400cdd6800982e0008a99982c19b87480080084c926533305700114985854ccc160cdc3a400800426493299982b8008a4c2c2a6660b066e1d20060021324994ccc15c00452616153330583370e900400109919191919191924ca6660ba0022930b1830003299982e19b87480000084c8c94ccc178cdc39b8d001480e04c8c926533305e001149858c18400c58dd700098300008a99982e19b87480080084c8c94ccc178cdc39b8d001480e04c8c926533305e001149858c18400c58dd700098300008b1830801182d8009baa001305c001153330583370e900500109924ca6660ae0022930b0b182e801182b8009baa01e300122250012233333300100d00500200600301b53330523370e66080606a6eb0078dd5982b00a240042644446004008646eb4c15c004cc1392411e50726f706f73616c206f75747075742073686f756c642070726573656e74003304f001375860ac02a266446600240022004444a002660a0446600244a6660ac6066002260980042c20926607a464660884646444466600600c00a008660a49211c53686f756c64207265736f6c76652070726f706f73616c2074696d65003232333222330022330022322230020033300500200112250011330012225001122500122533305a3371000400224660020060042c64a6660b26466e1cc16cdd5000a400460ba60b80022646464a6660b866e1d200200213052375a60c000220a260c200460b60026ea8c1740044138c174c170004c8c8c8c94ccc170cdc3a4004004260a46eb4c1800044144c184008c16c004dd5182e800982e982e182d800982e000982d00b99191919191982b01c1981c99ba548008cc134014130dd5982f00ca99982c99b87480000084c8c8c8c926533305b001149858c17800cdd6800982e8008a99982c99b87480080084c926533305800114985854ccc164cdc3a400800426493299982c0008a4c2c2a6660b266e1d20060021324994ccc1600045261616305e00230580013754660a40686606a66e95200233049001048375660b402a60b2004600660b060ae00260b00026eb0c15805c8c8c8c94ccc154cdc399821981c1bac021375660b20049001098259bac3322305133047232323232323232323232323232323232323232323232323232323232323232323232323232323232323232533308301337129000000899191929998430099b89480000044c8c8c94ccc22404cdc4a40000022646464a6661180266e2520000011323232533308f01337129000000899191929998490099b89480000044c8c8c8c8c94ccc25c04cdc4a400000226464084a66612e020022930b184d008018b1bad001309901001309701016533309201001149858c2540400c58dd6800984a008009849008018b1bad001309101001308f0100316375a002611c020026118020062c6eb4004c22c04004c2240400c58dd68009844008009843008018b1bad001308501001375800261060200261020200a60ba6eac00ccc1748cdd819183f8011bad307e00132308401002375a6106020020026eac004c1f8004c1f004d4ccc1dc00452616307a003375a00260f200260ee0066eb4004c1d8004c1d000cdd6800983980098388019bad0013070001306e003375a00260da0026eb0004c1ac004c1a400ccc1588c8c8c8c80154ccc1a4cdc3a400000426464a6660d666e1cdc6800a4070264649329998358008a4c2c60dc0062c6eb8004c1b400454ccc1a4cdc3a400400426464a6660d666e1cdc6800a4070264649329998358008a4c2c60dc0062c6eb8004c1b400458c1b8008c1a0004dd50009bac00130680013066003375a00260ca00260c600a607e6eac00ccc0fc8cdd81918308011bad3060001323232306800432333060225333063001120041322533306630010021613300430690032337200020066eb8c194c1a00040049281bab30670033304123376064a6660c466e1cdc6800a4070260c60042c6eb8c188004c8c8c94ccc190cdc39b8d375c004902009919191919191919183900629998350008a4c2c60da00ca6660d266e1d200000213232533306b3370e6e340052038132324994ccc1ac00452616306e00316375c00260da0022a6660d266e1d20020021324994ccc1a00045261616306e0023068001375400260d200260ce0062c6eb8004c198004dd618338008009bab3065001001375600260c000260bc0066eb4004c174004dd600099825801000982c8009bab30593058014104a3057001305600130570013303b233041253330523370e6eb4c158004cc100c0d4dd600e9bab305630553057002100116300a001375860a80266464644666002008006004a6660a2a6606e00a2600c60aa0102444a0062a6660a2a66072a6606e006266606c9408c01c004c154c15002054cc0dc0104c018c1540204889400848894004c150c14c01cc14c018c88c00888c8c8c94ccc148cdc3a4004004266460a244a6660a8002294054cc0f4c00cc1640044c008c1600048cc0f4c8c160c164004c8c160c164004c15cc158c16000401c0104c8cc144894ccc1500045280a99982a99baf305900100314a22600460b000200c60ac00260ae00460a20026ea800cc8c88cc00400c008dd618280089bac304f00b330022200116304c3300122002163303323002304d304c304e0013758609801a46464a66609466e1cccc0dc8cc005c3b89330380043756609c002900124000207e2a66609466e1cccc0dc8cc005c3b89330380043756609c0029001240042a66609466e3cc110c114c1380080144c100dd6199118231981e1191919191919191919191919191919191919191900aa99982f8008a4c2c60c40066609e46464646464646464646464018a6660d00022930b1835803299983399b87480000084c926533306600114985854ccc19ccdc3a400400426464646464a6660d866e252000001132324994ccc1b000452616306f00316375a00260dc00260d80066eb4004c1ac00454ccc19ccdc3a40080042649329998330008a4c2c2c60d800460cc0026ea8004c19c004c19400cdd680098320009bac001375800260c200260be00ca6660b666e1d20000021323232323232324994ccc180004526163063006533305f3370e900000109919299983099b87371a002901c0991924ca6660c20022930b18320018b1bae00130630011533305f3370e900100109919299983099b87371a002901c0991924ca6660c20022930b18320018b1bae0013063001163064002305e001375400260be0022a6660b666e1d20020021324994ccc16800452616163060002305a001375400260b600260b200ca6660aa66e1d20000021323253330573370e6e340052038132324994ccc15c00452616305a00316375c00260b20022a6660aa66e1d20020021323253330573370e6e340052038132324994ccc15c00452616305a00316375c00260b20022c60b400460a80026ea8004c154004c14c00cdd680098290009bac00133040002001304e304d0013756609c609a0122c2c6098002609a002664464644660020060046ea4008dd48011bae013001303f304032304a304b00132304a3049304b001330414901334d616c666f726d65642073637269707420636f6e746578743a2076616c69646174656420696e707574206e6f7420666f756e6400332233044253330483375e0066098609a0022446004006244a00200260920026eb0c12402858c128008c110004dd5182318228049822000982180098209821000982098208009820000981f8009820000981f000981f0009818111980091299981b180980088010b0b1180518109bac303630040012253330323300330020010011498588c02488c8c8cc040cc09cc0e0010cc09cc0e0008cc09cc0e0004cc09cdd398029bac303830370010260033036001303500223032303100123374a90001981080081011801118009111111801911299981b99806a5000a1533303733301c4a24602066044008002601600e2a66606e660204464646602e6605c607e0086605c607e0046605c601e0166605c607e607c00205a006607a00260780040142930b0b0b111800911111299981999980111125024a029444c02001c5888cccc00c00452888010a5023001222222300322200123330290014a094488c004888888c030ccc0248c02cc02400401401888c09888cc00488cc018008c010004400c8c09088cc004894ccc0a8c01400840044cc058008c0100045888cdd79ba7002374e00246600244940528a481424d616c666f726d65642073637269707420636f6e746578743a2070726f70736f616c20696e707574206e6f7420666f756e6420696e2072656465656d6572206d61700023301a01b001233301f225333022001120041322533302530010021613300430280032337100020066eb4c090c09c0040049281180f112999810800880209980a9801981300098011812800a5eb7bdb1800048c8c88cc00400c008c088c084008c084004888c8c8c94ccc084cdc3a4004004200c2600a604a002604c00460400026ea800488ccc07000800400c52811980c8008010a5122323232533301b3370e90010010991919299980f19b8748000008528099baf374e0086e9c004c08c008c074004dd50020991919299980f19b8748008008528099baf374e0086e9c004c08c008c074004dd50021810001180d0009baa0022301422533301700112250011333003301c0012330050013003301c00213002301b00122223300200400322230032253330183300200400314800854ccc060cc00401000c5200014801088c00888cc050894ccc05c0045200013253330193375e603400200a264a6660320022c2a6660346012603a0022a66603466ebcc06cc0780040144dd69810180f0008b0b1bab301f00113003301c002301c001003574644660024644460040066006002244a0024601c44a666022002200826600a6006602c0026004602a00297ae0574044646464a66602266e1d20000021006153330113370e900200109803980a8008998041bae301500100430160023010001375400444a00244460040064660040066ea4004888cc024894ccc030004489400454ccc034cdd798071808800802098029808800898011808000800919111801001980700091980090008b1191919299980499b87480080084c888c00800cdd718068008912800980700118040009baa300a300b00122330012001162300222533300500112250011333003300a00122230020031300230090012323002233002002001230022330020020015573eae6955ce918011801000aba25742460046ea800555cf01", + "description": "agora:stakeValidator", + "params": [ + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"StakeSTTag\"#PlutusLedgerApi.V1.Value:CurrencySymbol", + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"ProposalSTTag\"#Plutarch.Extra.AssetClass:AssetClass", + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"GTTag\"#Plutarch.Extra.AssetClass:AssetClass" + ], + "rawHex": "5913c501000032323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323222222232323232323232323232323253330453370e900100109919191919191919998131119180111119191919119980080200180129981d8020a9981e99baf302830590073059305800c13375e60b260b000e60b260b0018a660740082a66078004266ebcc160c15c018c09cc16002d4cc0e40104004cdd7982b002182b004982880119191911998008020018012514a2944008888c8c8c8c8c8c8c8c8c8c8c8c8c94ccc170cdc3a400000426606246002444444a6660c66607294001c4c8c8c94ccc198c0f8c0d400c4ccc01c8c94ccc1a0cdc4a40000022a6660d066088660b66ea0004cc16cc1b0010cc16cc1b000ccc16cc1b0c1ac00c168c0d80285261616337006eb4c1ac010004985858c1a0004c19c004c0c401858c024c8888c00c010dd698300008a99982e19b87480080084cc0c48c0048888894ccc18ccc0e5280038a999831981d99830911980091299827981b001098020008a50006153330633040005149858585802054ccc170cdc3a400800426605846002444444646460b06e9c004ccc00c888c8c8c8c94ccc1accdc3a40000042a6660d66608294403c4c01488c018cdd2a4004660c06ea0dd69838801998301ba800105f161533306b3370e900100109804180219ba54801017458c1c0008c1a8004dd500191982d98360021982d80082d118011982c1ba8001330583374a900002b82b8b1299983219831111980090220a50007153330643303a4a001020022c2c0102a6660b866e1d200600213302c2300122222233300222232323253330693370e900200109929998351982025100e133332222323003223230702253330730011066132533307530040011330680013003307800213003307800230780012304a325330593370e0126eb4c1dc0044c8c8c94ccc1d8cdc3a40040042a6660ec010294454ccc1d8cdc499b80375a60f460f200201600e2944584020c1ec008c1d4004dd5183b983b0009bac001323300213300114a229404cc0045280a51225001375a60dc00e646eb4c1bcc8c1bcc0f8004dd60009837181e1836800802a9998351991299983619b870024800054ccc1b0cdc3800a4000294454ccc1b0cdc3800a4004294054ccc1b0cdc3800a4008294054ccc1b0cdc3800a400c29405280a99983619b870024800854ccc1b0cdc3800a4000294054ccc1b0cdc3800a4004294454ccc1b0cdc3800a4008294054ccc1b0cdc3800a400c29405280a99983619b870024801054ccc1b0cdc3800a4000294054ccc1b0cdc3800a4004294054ccc1b0cdc3800a4008294454ccc1b0cdc3800a400c29405280a99983619b870024801854ccc1b0cdc3800a4000294054ccc1b0cdc3800a4004294054ccc1b0cdc3800a4008294054ccc1b0cdc3800a400c29445288a99983619b87001480005280a99983619b87001480085280a99983619b87001480105280a99983619b87001480185288a51375a60dc0029003091280089128010b183618360030b183700118340009baa00226160081533305c3370e90040010998181199800930180b1804991111801002183000089981811998009313099ba54800813c020c184008c16c004dd5011299982c19b87480000084c8c8c8c926533305a001149858c17400cdd6800982e0008a99982c19b87480080084c926533305700114985854ccc160cdc3a400800426493299982b8008a4c2c2a6660b066e1d20060021324994ccc15c00452616153330583370e900400109919191919191924ca6660ba0022930b1830003299982e19b87480000084c8c94ccc178cdc39b8d001480e04c8c926533305e001149858c18400c58dd700098300008a99982e19b87480080084c8c94ccc178cdc39b8d001480e04c8c926533305e001149858c18400c58dd700098300008b1830801182d8009baa001305c001153330583370e900500109924ca6660ae0022930b0b182e801182b8009baa01e300122250012233333300100d00500200600301b53330523370e66080606a6eb0078dd5982b00a240042644446004008646eb4c15c004cc1392411e50726f706f73616c206f75747075742073686f756c642070726573656e74003304f001375860ac02a266446600240022004444a002660a0446600244a6660ac6066002260980042c20926607a464660884646444466600600c00a008660a49211c53686f756c64207265736f6c76652070726f706f73616c2074696d65003232333222330022330022322230020033300500200112250011330012225001122500122533305a3371000400224660020060042c64a6660b26466e1cc16cdd5000a400460ba60b80022646464a6660b866e1d200200213052375a60c000220a260c200460b60026ea8c1740044138c174c170004c8c8c8c94ccc170cdc3a4004004260a46eb4c1800044144c184008c16c004dd5182e800982e982e182d800982e000982d00b99191919191982b01c1981c99ba548008cc134014130dd5982f00ca99982c99b87480000084c8c8c8c926533305b001149858c17800cdd6800982e8008a99982c99b87480080084c926533305800114985854ccc164cdc3a400800426493299982c0008a4c2c2a6660b266e1d20060021324994ccc1600045261616305e00230580013754660a40686606a66e95200233049001048375660b402a60b2004600660b060ae00260b00026eb0c15805c8c8c8c94ccc154cdc399821981c1bac021375660b20049001098259bac3322305133047232323232323232323232323232323232323232323232323232323232323232323232323232323232323232533308301337129000000899191929998430099b89480000044c8c8c94ccc22404cdc4a40000022646464a6661180266e2520000011323232533308f01337129000000899191929998490099b89480000044c8c8c8c8c94ccc25c04cdc4a400000226464084a66612e020022930b184d008018b1bad001309901001309701016533309201001149858c2540400c58dd6800984a008009849008018b1bad001309101001308f0100316375a002611c020026118020062c6eb4004c22c04004c2240400c58dd68009844008009843008018b1bad001308501001375800261060200261020200a60ba6eac00ccc1748cdd819183f8011bad307e00132308401002375a6106020020026eac004c1f8004c1f004d4ccc1dc00452616307a003375a00260f200260ee0066eb4004c1d8004c1d000cdd6800983980098388019bad0013070001306e003375a00260da0026eb0004c1ac004c1a400ccc1588c8c8c8c80154ccc1a4cdc3a400000426464a6660d666e1cdc6800a4070264649329998358008a4c2c60dc0062c6eb8004c1b400454ccc1a4cdc3a400400426464a6660d666e1cdc6800a4070264649329998358008a4c2c60dc0062c6eb8004c1b400458c1b8008c1a0004dd50009bac00130680013066003375a00260ca00260c600a607e6eac00ccc0fc8cdd81918308011bad3060001323232306800432333060225333063001120041322533306630010021613300430690032337200020066eb8c194c1a00040049281bab30670033304123376064a6660c466e1cdc6800a4070260c60042c6eb8c188004c8c8c94ccc190cdc39b8d375c004902009919191919191919183900629998350008a4c2c60da00ca6660d266e1d200000213232533306b3370e6e340052038132324994ccc1ac00452616306e00316375c00260da0022a6660d266e1d20020021324994ccc1a00045261616306e0023068001375400260d200260ce0062c6eb8004c198004dd618338008009bab3065001001375600260c000260bc0066eb4004c174004dd600099825801000982c8009bab30593058014104a3057001305600130570013303b233041253330523370e6eb4c158004cc100c0d4dd600e9bab305630553057002100116300a001375860a80266464644666002008006004a6660a2a6606e00a2600c60aa0102444a0062a6660a2a66072a6606e006266606c9408c01c004c154c15002054cc0dc0104c018c1540204889400848894004c150c14c01cc14c018c88c00888c8c8c94ccc148cdc3a4004004266460a244a6660a8002294054cc0f4c00cc1640044c008c1600048cc0f4c8c160c164004c8c160c164004c15cc158c16000401c0104c8cc144894ccc1500045280a99982a99baf305900100314a22600460b000200c60ac00260ae00460a20026ea800cc8c88cc00400c008dd618280089bac304f00b330022200116304c3300122002163303323002304d304c304e0013758609801a46464a66609466e1cccc0dc8cc005c3b89330380043756609c002900124000207e2a66609466e1cccc0dc8cc005c3b89330380043756609c0029001240042a66609466e3cc110c114c1380080144c100dd6199118231981e1191919191919191919191919191919191919191900aa99982f8008a4c2c60c40066609e46464646464646464646464018a6660d00022930b1835803299983399b87480000084c926533306600114985854ccc19ccdc3a400400426464646464a6660d866e252000001132324994ccc1b000452616306f00316375a00260dc00260d80066eb4004c1ac00454ccc19ccdc3a40080042649329998330008a4c2c2c60d800460cc0026ea8004c19c004c19400cdd680098320009bac001375800260c200260be00ca6660b666e1d20000021323232323232324994ccc180004526163063006533305f3370e900000109919299983099b87371a002901c0991924ca6660c20022930b18320018b1bae00130630011533305f3370e900100109919299983099b87371a002901c0991924ca6660c20022930b18320018b1bae0013063001163064002305e001375400260be0022a6660b666e1d20020021324994ccc16800452616163060002305a001375400260b600260b200ca6660aa66e1d20000021323253330573370e6e340052038132324994ccc15c00452616305a00316375c00260b20022a6660aa66e1d20020021323253330573370e6e340052038132324994ccc15c00452616305a00316375c00260b20022c60b400460a80026ea8004c154004c14c00cdd680098290009bac00133040002001304e304d0013756609c609a0122c2c6098002609a002664464644660020060046ea4008dd48011bae013001303f304032304a304b00132304a3049304b001330414901334d616c666f726d65642073637269707420636f6e746578743a2076616c69646174656420696e707574206e6f7420666f756e6400332233044253330483375e0066098609a0022446004006244a00200260920026eb0c12402858c128008c110004dd5182318228049822000982180098209821000982098208009820000981f8009820000981f000981f0009818111980091299981b180980088010b0b1180518109bac303630040012253330323300330020010011498588c02488c8c8cc040cc09cc0e0010cc09cc0e0008cc09cc0e0004cc09cdd398029bac303830370010260033036001303500223032303100123374a90001981080081011801118009111111801911299981b99806a5000a1533303733301c4a24602066044008002601600e2a66606e660204464646602e6605c607e0086605c607e0046605c601e0166605c607e607c00205a006607a00260780040142930b0b0b111800911111299981999980111125024a029444c02001c5888cccc00c00452888010a5023001222222300322200123330290014a094488c004888888c030ccc0248c02cc02400401401888c09888cc00488cc018008c010004400c8c09088cc004894ccc0a8c01400840044cc058008c0100045888cdd79ba7002374e00246600244940528a481424d616c666f726d65642073637269707420636f6e746578743a2070726f70736f616c20696e707574206e6f7420666f756e6420696e2072656465656d6572206d61700023301a01b001233301f225333022001120041322533302530010021613300430280032337100020066eb4c090c09c0040049281180f112999810800880209980a9801981300098011812800a5eb7bdb1800048c8c88cc00400c008c088c084008c084004888c8c8c94ccc084cdc3a4004004200c2600a604a002604c00460400026ea800488ccc07000800400c52811980c8008010a5122323232533301b3370e90010010991919299980f19b8748000008528099baf374e0086e9c004c08c008c074004dd50020991919299980f19b8748008008528099baf374e0086e9c004c08c008c074004dd50021810001180d0009baa0022301422533301700112250011333003301c0012330050013003301c00213002301b00122223300200400322230032253330183300200400314800854ccc060cc00401000c5200014801088c00888cc050894ccc05c0045200013253330193375e603400200a264a6660320022c2a6660346012603a0022a66603466ebcc06cc0780040144dd69810180f0008b0b1bab301f00113003301c002301c001003574644660024644460040066006002244a0024601c44a666022002200826600a6006602c0026004602a00297ae0574044646464a66602266e1d20000021006153330113370e900200109803980a8008998041bae301500100430160023010001375400444a00244460040064660040066ea4004888cc024894ccc030004489400454ccc034cdd798071808800802098029808800898011808000800919111801001980700091980090008b1191919299980499b87480080084c888c00800cdd718068008912800980700118040009baa300a300b00122330012001162300222533300500112250011333003300a00122230020031300230090012323002233002002001230022330020020015573eae6955ce918011801000aba25742460046ea800555cf01", + "role": "ValidatorRole", + "version": "ScriptV2" + }, + "agora:treasuryValidator": { + "cborHex": "5901ca5901c70100003232323232323232323232323232222232323232533300e3370e90010010992999807a99911998088010008a503370e660146eb8024dd5980a19180b180b180b000980a8009919b8148000005200213370e664466602644466a66602e002244a00226444600400664644660020060046036004603200246002446664e0088004c014008cc0180140044c920004988c00c0040048c94ccc044cc88c8cccccc044060070dd48019bab3019301a001232323253330183370e90000010a5014a2603e00460340026ea8c068c070c068008528980d0009bae00b00113300c375c0166eacc058c05cc06000458c8c058c05c004c05c004dd6180a000a40042930b180a98098020b180a80118080009baa3010301100130110010012233333300300a00e375200400246660104466e00dd69808801000a40006eac004520002222333300533006004002001232223002003300400112250012300522533300800112250011333003300a001222300200313002300b00122253330043375e00460060022446004006244a002ae6888c00c894ccc018004400c4cc010c020004c008c0240048c8c0088cc0080080048c0088cc00800800555cfaab9d5742ae888c008dd5000aab9e1", + "description": "agora:treasuryValidator", + "params": [ + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"AuthorityTokenTag\"#PlutusLedgerApi.V1.Value:CurrencySymbol" + ], + "rawHex": "5901c70100003232323232323232323232323232222232323232533300e3370e90010010992999807a99911998088010008a503370e660146eb8024dd5980a19180b180b180b000980a8009919b8148000005200213370e664466602644466a66602e002244a00226444600400664644660020060046036004603200246002446664e0088004c014008cc0180140044c920004988c00c0040048c94ccc044cc88c8cccccc044060070dd48019bab3019301a001232323253330183370e90000010a5014a2603e00460340026ea8c068c070c068008528980d0009bae00b00113300c375c0166eacc058c05cc06000458c8c058c05c004c05c004dd6180a000a40042930b180a98098020b180a80118080009baa3010301100130110010012233333300300a00e375200400246660104466e00dd69808801000a40006eac004520002222333300533006004002001232223002003300400112250012300522533300800112250011333003300a001222300200313002300b00122253330043375e00460060022446004006244a002ae6888c00c894ccc018004400c4cc010c020004c008c0240048c8c0088cc0080080048c0088cc00800800555cfaab9d5742ae888c008dd5000aab9e1", + "role": "ValidatorRole", + "version": "ScriptV2" + }, + "agora:treasuryWithdrawalValidator": { + "cborHex": "59083e59083b010000323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323222223232323232323232323232323253330403370e900100109919299982129981c99b873301400f3756608c64608a608a608a002608800260629001099b8733223330412223330210012300122333270044002600a0046600c00a002264900024c6044004002464a666088646666660320900966ea4048dd5982498238009191919299982499b87480000085280a51304e002304a00137546094609660940042944c1240044cc058044dd59824182318248008b191824182300098240009bac3046001480084c8c94ccc110cc0e0c0e48cdc3800a4000666040e04cc094cc0708c8c8c94ccc1214cc104cc88cdd79ba7304f002374e609e00260980060102646464a66609666e1d200200214a02944c140008c130004dd500088230a999824198138009bac304c304a00613756609860940042c646098609a002609600260966094609000260940026eb0c120004cc0708cc09488004004dd618240011980e119192999823a9981f19813191826182680098258011bac304b304900513303732304c304d001304b002304b3049001137566096002208a60900026094002666082444a66609000420022a6660900022c26464a6660926605244a66084a6608464646464a66609e66e1d2002002132323253330523370e90000010a5013375e6e9c010dd3800982b80118298009baa004132323253330523370e90010010a5013375e6e9c010dd3800982b80118298009baa0043054002305000137540066460a060a2002609e0082664464660846086466e2520000010013302e0020013756609e006002266076004609e609a006609a00826600a609600860960062c6094002609860960026eb0c120008dd61824182318230008a4c2c6090608e01e6eb004858c118c114034c11000458c114008c104004dd51820981f804a99981e8008a4c2c607a0066605846464646400aa66607c66e1d20000021323253330403370e6e340052038132324994ccc10800452616304200316375c00260840022a66607c66e1d20020021323253330403370e6e340052038132324994ccc10800452616304200316375c00260840022c6086004607e0026ea8004dd6000981e800981d00199814919191919002a99981d99b87480000084c8c8c8c8c8c8c8c8c8c8c8c8c9265333048001149858c120018c94ccc118cc0e88cc0f08cdc42400000200200220022c6eac010c0fcdd58019981f919bb03232533304653303f3370e0029000099b87001480e04c12400c58dc68009bae3047001323232304d00430413756609800666082466ec0c94ccc11ccdc49b8d001481004c12800858dd718248009918268011bad304c001001375660940020026eac004c114004c1080194ccc0fccdc3a400000426464a66608266e1cdc6800a4070264649329998218008a4c2c60860062c6eb8004c10c00454ccc0fccdc3a400400426464a66608266e1cdc6800a4070264649329998218008a4c2c60860062c6eb8004c10c00458c110008c100004dd5000981f8008b1820001181e0009baa001375800260740026eb0014c0e4008dd70020009119999980181901a9ba9002001233300722337006eb4c0e00080052000375600229000111119998029980300200100091911180100198020008912800918149129998178008912800899980198190009111801001898011818000911299981699baf00230030011223002003122500122302822533302e001100313300430310013002302f0012233003300800200130242223330040012300122333008220013005002330060050011300749894ccc0a000448940044c888c00800cc8c88cc00400c008c0a8008c0ac004888ccc011c00010009111998049119980600280100080100090111118010009180f9129998128008a50153330243375e605000200629444c008c09800488c8cc00cc09c004dd598139812800981380091199801980238000233008300b0100012300322374c660066eac008dd580091801111ba833003375a0046eb4004888cccc01000c880080080048c064c00800488c8c88cc00400c0088894ccc0840044cc07c00c0084c8c8c94ccc08ccdd780100089981119bb0002330093029006302900333300822002005302500415333023337206eb8008dd70008998110031999804110008019812802002899811001999980411000803002981280218128011812002181200091299980f80108008999980191000981100118100010009119980180480100091119803998020018010009111919191919bb037520046e98004c014008c014008dd598108011bae301d001223330030060020012223300433005003002001223301200200122232323232337606ea4008dd4000980280118028011bad301d002375c60320024002466e0520000012232323253330153370e90000010a51132323253330183370e90000010a50153330183370e90020010a5113371e0126eb8c070004c074008c064004dd5002180d001180b0009baa002488120923918e403bf43c34b4ef6b48eb2ee04babed17320d8d1b9ff9ad086e86f44ec002300c225333012001100413301030033015001300230130014bd701119802118019bab3015001001223300323003375a60280020024601044a66601c002294454cc010c00cc0440044c008c03c00488ccc02c00800400c5281198040008010a512333003225333009001120041322533300a300100216133004300c0032337200020066eb8c02cc0300040049281180111299980400088028998031801980580098011804800919180111980100100091801119801001000a5eb7bdb1815d02b9a5573eae8955ceaba1230023754002aae79", + "description": "agora:treasuryWithdrawalValidator", + "params": [ + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"AuthorityTokenTag\"#PlutusLedgerApi.V1.Value:CurrencySymbol" + ], + "rawHex": "59083b010000323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323222223232323232323232323232323253330403370e900100109919299982129981c99b873301400f3756608c64608a608a608a002608800260629001099b8733223330412223330210012300122333270044002600a0046600c00a002264900024c6044004002464a666088646666660320900966ea4048dd5982498238009191919299982499b87480000085280a51304e002304a00137546094609660940042944c1240044cc058044dd59824182318248008b191824182300098240009bac3046001480084c8c94ccc110cc0e0c0e48cdc3800a4000666040e04cc094cc0708c8c8c94ccc1214cc104cc88cdd79ba7304f002374e609e00260980060102646464a66609666e1d200200214a02944c140008c130004dd500088230a999824198138009bac304c304a00613756609860940042c646098609a002609600260966094609000260940026eb0c120004cc0708cc09488004004dd618240011980e119192999823a9981f19813191826182680098258011bac304b304900513303732304c304d001304b002304b3049001137566096002208a60900026094002666082444a66609000420022a6660900022c26464a6660926605244a66084a6608464646464a66609e66e1d2002002132323253330523370e90000010a5013375e6e9c010dd3800982b80118298009baa004132323253330523370e90010010a5013375e6e9c010dd3800982b80118298009baa0043054002305000137540066460a060a2002609e0082664464660846086466e2520000010013302e0020013756609e006002266076004609e609a006609a00826600a609600860960062c6094002609860960026eb0c120008dd61824182318230008a4c2c6090608e01e6eb004858c118c114034c11000458c114008c104004dd51820981f804a99981e8008a4c2c607a0066605846464646400aa66607c66e1d20000021323253330403370e6e340052038132324994ccc10800452616304200316375c00260840022a66607c66e1d20020021323253330403370e6e340052038132324994ccc10800452616304200316375c00260840022c6086004607e0026ea8004dd6000981e800981d00199814919191919002a99981d99b87480000084c8c8c8c8c8c8c8c8c8c8c8c8c9265333048001149858c120018c94ccc118cc0e88cc0f08cdc42400000200200220022c6eac010c0fcdd58019981f919bb03232533304653303f3370e0029000099b87001480e04c12400c58dc68009bae3047001323232304d00430413756609800666082466ec0c94ccc11ccdc49b8d001481004c12800858dd718248009918268011bad304c001001375660940020026eac004c114004c1080194ccc0fccdc3a400000426464a66608266e1cdc6800a4070264649329998218008a4c2c60860062c6eb8004c10c00454ccc0fccdc3a400400426464a66608266e1cdc6800a4070264649329998218008a4c2c60860062c6eb8004c10c00458c110008c100004dd5000981f8008b1820001181e0009baa001375800260740026eb0014c0e4008dd70020009119999980181901a9ba9002001233300722337006eb4c0e00080052000375600229000111119998029980300200100091911180100198020008912800918149129998178008912800899980198190009111801001898011818000911299981699baf00230030011223002003122500122302822533302e001100313300430310013002302f0012233003300800200130242223330040012300122333008220013005002330060050011300749894ccc0a000448940044c888c00800cc8c88cc00400c008c0a8008c0ac004888ccc011c00010009111998049119980600280100080100090111118010009180f9129998128008a50153330243375e605000200629444c008c09800488c8cc00cc09c004dd598139812800981380091199801980238000233008300b0100012300322374c660066eac008dd580091801111ba833003375a0046eb4004888cccc01000c880080080048c064c00800488c8c88cc00400c0088894ccc0840044cc07c00c0084c8c8c94ccc08ccdd780100089981119bb0002330093029006302900333300822002005302500415333023337206eb8008dd70008998110031999804110008019812802002899811001999980411000803002981280218128011812002181200091299980f80108008999980191000981100118100010009119980180480100091119803998020018010009111919191919bb037520046e98004c014008c014008dd598108011bae301d001223330030060020012223300433005003002001223301200200122232323232337606ea4008dd4000980280118028011bad301d002375c60320024002466e0520000012232323253330153370e90000010a51132323253330183370e90000010a50153330183370e90020010a5113371e0126eb8c070004c074008c064004dd5002180d001180b0009baa002488120923918e403bf43c34b4ef6b48eb2ee04babed17320d8d1b9ff9ad086e86f44ec002300c225333012001100413301030033015001300230130014bd701119802118019bab3015001001223300323003375a60280020024601044a66601c002294454cc010c00cc0440044c008c03c00488ccc02c00800400c5281198040008010a512333003225333009001120041322533300a300100216133004300c0032337200020066eb8c02cc0300040049281180111299980400088028998031801980580098011804800919180111980100100091801119801001000a5eb7bdb1815d02b9a5573eae8955ceaba1230023754002aae79", + "role": "ValidatorRole", + "version": "ScriptV2" + } + } +} \ No newline at end of file diff --git a/agora-test/goldens/agoraDebug-golden.json b/agora-test/goldens/agoraDebug-golden.json new file mode 100644 index 0000000..2d9bb19 --- /dev/null +++ b/agora-test/goldens/agoraDebug-golden.json @@ -0,0 +1,125 @@ +{ + "rawScripts": { + "agora:authorityTokenPolicy": { + "cborHex": "5905845905810100003232323232323232323232322223232323232323253330103370e900000109991980090008a998092481197066726f6d4a7573743a20666f756e6420504e6f7468696e67001633223300d23332230132253330160011003133004301b0013002301a0012230012253330173371090001bad301d004132233001002003337000046eb4c0740104c88cc004010008cdc00009bad301d004323223300100300248001200000133300e232223002003375660320026ea4008004dd7180a0009bab30140042253330123371090000010a99980919b874800000454ccc048cc894ccc050cdc3801240002a66602866e1c005200014a22a66602866e1c005200214a02a66602866e1c005200414a0294054ccc050cdc3801240042a66602866e1c005200014a02a66602866e1c005200214a22a66602866e1c005200414a0294054ccc050cdc3801240082a66602866e1c005200014a02a66602866e1c005200214a02a66602866e1c005200414a2294454ccc050cdc3800a4000294054ccc050cdc3800a4004294054ccc050cdc3800a40082944528a400466446600240022a6602a0042c9210f4753542073686f756c64206d6f7665003332223301075a6666020466e95200233574000297ae03301223253330173370e64600c446603044a66603600229000099299980e99baf301f001005132533301d001153301f49012670747279456c696d53696e676c653a20466f756e6420656d707479206c6973742d6c696b652e00161533301e3574660420022a66603c66ebcc080c0880040144dd6981218110008a9980fa492766696e6456616c75653a20556e65787065637465646c79206d697373696e6720726573756c742e0016153301f4912e70747279456c696d53696e676c653a20466f756e64206e6f6e2d73696e676c65746f6e206c6973742d6c696b652e0016375660460022600660400046040002006646eacc070c06cc074004c06cc0680052002132223002003301b0011225001301b0010022333222330030010022233013232002375a002666028464446004006603e002004002004002244a0026464644660020060046030602e004602e0026eb0030dd6180b0041bab3016323016301630163016001301500615333012332301122533301400114a22a664466602e0040022940c00cc0640044c008c0600048cc88c8cccc88cccc05494ccc064cdd7801980d80089118010018912800800919111801001980f80089128009ba90033756603460320024646464a66603466e1d2000002132533301b001100113301c49137617574686f72697479546f6b656e7356616c6964496e3a2047415420696e636f72726563746c79206c69766573206174205075624b6579000014a02944c07c008c068004dd5180d980e180d8010a51301a001375c602e0080026eb0c05801c5261533013490120416c6c206f757470757473206f6e6c7920656d69742076616c696420474154730016153301349118476f7665726e6f722072656465656d7220636f7272656374001615330134910c4e6f20474154206275726e740016153330123370e90000010a4c2a660269210d4e6f20474154206d696e746564001615330114914d5061747465726e206d61746368206661696c75726520696e2027646f2720626c6f636b2061742061676f72612f41676f72612f417574686f72697479546f6b656e2e68733a3136323a352d3233001630150023010001375460226020008601e601e002601c601c002601e601c002601c00244660024644460040066006002244a0024446600a44a666010002244a0022a66601266ebcc02cc0340040104c014c0340044c008c0300040048c008894ccc01400448940044ccc00cc028004888c00800c4c008c0240048c8c0088cc0080080048c0088cc00800800555cfab9a5738aae755d12ba1230023754002aae79", + "description": "agora:authorityTokenPolicy", + "params": [ + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"GovernorSTTag\"#Plutarch.Extra.AssetClass:AssetClass" + ], + "rawHex": "5905810100003232323232323232323232322223232323232323253330103370e900000109991980090008a998092481197066726f6d4a7573743a20666f756e6420504e6f7468696e67001633223300d23332230132253330160011003133004301b0013002301a0012230012253330173371090001bad301d004132233001002003337000046eb4c0740104c88cc004010008cdc00009bad301d004323223300100300248001200000133300e232223002003375660320026ea4008004dd7180a0009bab30140042253330123371090000010a99980919b874800000454ccc048cc894ccc050cdc3801240002a66602866e1c005200014a22a66602866e1c005200214a02a66602866e1c005200414a0294054ccc050cdc3801240042a66602866e1c005200014a02a66602866e1c005200214a22a66602866e1c005200414a0294054ccc050cdc3801240082a66602866e1c005200014a02a66602866e1c005200214a02a66602866e1c005200414a2294454ccc050cdc3800a4000294054ccc050cdc3800a4004294054ccc050cdc3800a40082944528a400466446600240022a6602a0042c9210f4753542073686f756c64206d6f7665003332223301075a6666020466e95200233574000297ae03301223253330173370e64600c446603044a66603600229000099299980e99baf301f001005132533301d001153301f49012670747279456c696d53696e676c653a20466f756e6420656d707479206c6973742d6c696b652e00161533301e3574660420022a66603c66ebcc080c0880040144dd6981218110008a9980fa492766696e6456616c75653a20556e65787065637465646c79206d697373696e6720726573756c742e0016153301f4912e70747279456c696d53696e676c653a20466f756e64206e6f6e2d73696e676c65746f6e206c6973742d6c696b652e0016375660460022600660400046040002006646eacc070c06cc074004c06cc0680052002132223002003301b0011225001301b0010022333222330030010022233013232002375a002666028464446004006603e002004002004002244a0026464644660020060046030602e004602e0026eb0030dd6180b0041bab3016323016301630163016001301500615333012332301122533301400114a22a664466602e0040022940c00cc0640044c008c0600048cc88c8cccc88cccc05494ccc064cdd7801980d80089118010018912800800919111801001980f80089128009ba90033756603460320024646464a66603466e1d2000002132533301b001100113301c49137617574686f72697479546f6b656e7356616c6964496e3a2047415420696e636f72726563746c79206c69766573206174205075624b6579000014a02944c07c008c068004dd5180d980e180d8010a51301a001375c602e0080026eb0c05801c5261533013490120416c6c206f757470757473206f6e6c7920656d69742076616c696420474154730016153301349118476f7665726e6f722072656465656d7220636f7272656374001615330134910c4e6f20474154206275726e740016153330123370e90000010a4c2a660269210d4e6f20474154206d696e746564001615330114914d5061747465726e206d61746368206661696c75726520696e2027646f2720626c6f636b2061742061676f72612f41676f72612f417574686f72697479546f6b656e2e68733a3136323a352d3233001630150023010001375460226020008601e601e002601c601c002601e601c002601c00244660024644460040066006002244a0024446600a44a666010002244a0022a66601266ebcc02cc0340040104c014c0340044c008c0300040048c008894ccc01400448940044ccc00cc028004888c00800c4c008c0240048c8c0088cc0080080048c0088cc00800800555cfab9a5738aae755d12ba1230023754002aae79", + "role": "MintingPolicyRole", + "version": "ScriptV2" + }, + "agora:governorPolicy": { + "cborHex": "5908335908300100003232323232323232323232323232323232323222232323253330103370e9000001099191919299980a191919800925114a06601e4a66602c66ebc030c070c078004488c00800c4894004004dd6180d0020a99980a199119baf374c0046e98004cc035241104753542073796d626f6c20656e74727900332330122322230020033756603e0026ea4004dd7180d0029bab301a0023322332233574066ec00080052f5bded8c06ea4008dd4000a45004800854ccc050c8c94cc034c94ccc05c00440044cc06d241107468726573686f6c64732076616c6964000013232323253301132533301b001100113301f4912c45786563757465207468726573686f6c64206973206c657373207468616e206f7220657175616c20746f2030000013371290001bad3020004153301132533301b001100113301f49012b437265617465207468726573686f6c64206973206c657373207468616e206f7220657175616c20746f2030000013371290001bad3020003153301132533301b001100113301f49012d746f566f74696e67207468726573686f6c64206973206c657373207468616e206f7220657175616c20746f2030000013371290001bad3020002153301132533301b001100113301f490129566f7465207468726573686f6c64206973206c657373207468616e206f7220657175616c20746f2030000013371290001bad3020001132533301b001100113301f49012b436f7369676e207468726573686f6c64206973206c657373207468616e206f7220657175616c20746f2030000013371290001bad302030210013020001301f001301e001375860380042a6601a64a66602e002200226603692010d74696d696e67732076616c696400001323232323232533301c00110011330204910467652030000015330123371290001bad302100515330123371290001bad302100415330123371290001bad302100315330123371290001bad302100215330123371290001bad302100115330123371290001bad3021302200114a260420026040002603e002603c0026eb0c0700044c94ccc05c00440044cc06d24011074696d652072616e67652076616c69640000132325333018001100113301c4910e67726561746572207468616e2030000013371090000009bad301c301d001301c301c0013300d49011e476f7665726e6f72206f75747075742073686f756c642070726573656e74003300e23253330163370e664466664466660284a66603666ebc00cc080004488c00800c48940040048c888c00800cc0900044894004dd4801000919991180c91299980e00088018998021811800980118120009119b80375a604800400290001bab001148000dd7180e0039bab301c001480084c05d4cc0692401165265736f6c766520676f7665726e6f7220646174756d00137586644646600240022a6603a921197066726f6d4a7573743a20666f756e6420504e6f7468696e67001633223300123222300200330030011225001232323232323232323232323232323232323232323232323232323253330343371290000008991919299981b99b89480000044c8c8c94ccc0e8cdc4a40000022646464a66607a66e252000001132323253330403371290000008991919299982199b89480000044c8c8c8c8c94ccc120cdc4a40000022646464646406aa6660960022930a998280240b18290019bad001304f001304f003153304c04316375a0026098002609802ca6660860022930a998240200b18250018a9982381f0b1bad00130470013047003153304403b16375a002608800260880062a660820702c6eb4004c104004c10400c54cc0f80d458dd6800981f000981f0018a9981d8190b1bad001303b001303b003153303802f16375a00260700026eb0004c0d8004c0d800cdd680098198009819809a9998150008a4c2a6605e04e2c60620066eb4004c0b8004c0b800cdd6800981580098158019bad00130280013028003375a002604a002604a0066eb4004c088004dd600098100009bac001323232533301b3370e90000010a9980fa481086e6f20646174756d00101d1533301b3370e90010010a9980fa490a646174756d206861736800133233019232223002003302600137520026eb8c0840040104d4cc07d2410c696e6c696e6520646174756d00101c30210013023002301e00137540046038603a0026eacc070c064c07400c4060c070c074004dd6180d0018a4c2a6603092011b476f7665726e6f72206f757470757420646174756d2076616c6964001615330184912245786163746c79206f6e6520746f6b656e2073686f756c64206265206d696e746564001615330184911f5265666572656e636564207574786f2073686f756c64206265207370656e7400163016301a001301930190013018301800130183016301800415330144914f5061747465726e206d61746368206661696c75726520696e2027646f2720626c6f636b2061742061676f72612f41676f72612f476f7665726e6f722f536372697074732e68733a3130383a352d3434001630180023013001375460266028602a00244666016004002006294088cc004800454cc034008588c014894ccc02000448940044ccc00cc03c004888c00800c4c008c040005241257074727946726f6d28504f53495854696d65293a206d75737420626520706f736974697665004901317074727946726f6d2850446174615265636f72645b5d293a206c697374206973206c6f6e676572207468616e207a65726f00222330042253330070011225001153330083375e601a601c0020082600a601c00226004601e002002464600446600400400246004466004004002aae7d5cd1111801001912800918029802800ab9c5573aae855d1118011baa0015573d", + "description": "agora:governorPolicy", + "params": [ + "Ply.Core.Types:AsData#PlutusLedgerApi.V1.Tx:TxOutRef" + ], + "rawHex": "5908300100003232323232323232323232323232323232323222232323253330103370e9000001099191919299980a191919800925114a06601e4a66602c66ebc030c070c078004488c00800c4894004004dd6180d0020a99980a199119baf374c0046e98004cc035241104753542073796d626f6c20656e74727900332330122322230020033756603e0026ea4004dd7180d0029bab301a0023322332233574066ec00080052f5bded8c06ea4008dd4000a45004800854ccc050c8c94cc034c94ccc05c00440044cc06d241107468726573686f6c64732076616c6964000013232323253301132533301b001100113301f4912c45786563757465207468726573686f6c64206973206c657373207468616e206f7220657175616c20746f2030000013371290001bad3020004153301132533301b001100113301f49012b437265617465207468726573686f6c64206973206c657373207468616e206f7220657175616c20746f2030000013371290001bad3020003153301132533301b001100113301f49012d746f566f74696e67207468726573686f6c64206973206c657373207468616e206f7220657175616c20746f2030000013371290001bad3020002153301132533301b001100113301f490129566f7465207468726573686f6c64206973206c657373207468616e206f7220657175616c20746f2030000013371290001bad3020001132533301b001100113301f49012b436f7369676e207468726573686f6c64206973206c657373207468616e206f7220657175616c20746f2030000013371290001bad302030210013020001301f001301e001375860380042a6601a64a66602e002200226603692010d74696d696e67732076616c696400001323232323232533301c00110011330204910467652030000015330123371290001bad302100515330123371290001bad302100415330123371290001bad302100315330123371290001bad302100215330123371290001bad302100115330123371290001bad3021302200114a260420026040002603e002603c0026eb0c0700044c94ccc05c00440044cc06d24011074696d652072616e67652076616c69640000132325333018001100113301c4910e67726561746572207468616e2030000013371090000009bad301c301d001301c301c0013300d49011e476f7665726e6f72206f75747075742073686f756c642070726573656e74003300e23253330163370e664466664466660284a66603666ebc00cc080004488c00800c48940040048c888c00800cc0900044894004dd4801000919991180c91299980e00088018998021811800980118120009119b80375a604800400290001bab001148000dd7180e0039bab301c001480084c05d4cc0692401165265736f6c766520676f7665726e6f7220646174756d00137586644646600240022a6603a921197066726f6d4a7573743a20666f756e6420504e6f7468696e67001633223300123222300200330030011225001232323232323232323232323232323232323232323232323232323253330343371290000008991919299981b99b89480000044c8c8c94ccc0e8cdc4a40000022646464a66607a66e252000001132323253330403371290000008991919299982199b89480000044c8c8c8c8c94ccc120cdc4a40000022646464646406aa6660960022930a998280240b18290019bad001304f001304f003153304c04316375a0026098002609802ca6660860022930a998240200b18250018a9982381f0b1bad00130470013047003153304403b16375a002608800260880062a660820702c6eb4004c104004c10400c54cc0f80d458dd6800981f000981f0018a9981d8190b1bad001303b001303b003153303802f16375a00260700026eb0004c0d8004c0d800cdd680098198009819809a9998150008a4c2a6605e04e2c60620066eb4004c0b8004c0b800cdd6800981580098158019bad00130280013028003375a002604a002604a0066eb4004c088004dd600098100009bac001323232533301b3370e90000010a9980fa481086e6f20646174756d00101d1533301b3370e90010010a9980fa490a646174756d206861736800133233019232223002003302600137520026eb8c0840040104d4cc07d2410c696e6c696e6520646174756d00101c30210013023002301e00137540046038603a0026eacc070c064c07400c4060c070c074004dd6180d0018a4c2a6603092011b476f7665726e6f72206f757470757420646174756d2076616c6964001615330184912245786163746c79206f6e6520746f6b656e2073686f756c64206265206d696e746564001615330184911f5265666572656e636564207574786f2073686f756c64206265207370656e7400163016301a001301930190013018301800130183016301800415330144914f5061747465726e206d61746368206661696c75726520696e2027646f2720626c6f636b2061742061676f72612f41676f72612f476f7665726e6f722f536372697074732e68733a3130383a352d3434001630180023013001375460266028602a00244666016004002006294088cc004800454cc034008588c014894ccc02000448940044ccc00cc03c004888c00800c4c008c040005241257074727946726f6d28504f53495854696d65293a206d75737420626520706f736974697665004901317074727946726f6d2850446174615265636f72645b5d293a206c697374206973206c6f6e676572207468616e207a65726f00222330042253330070011225001153330083375e601a601c0020082600a601c00226004601e002002464600446600400400246004466004004002aae7d5cd1111801001912800918029802800ab9c5573aae855d1118011baa0015573d", + "role": "MintingPolicyRole", + "version": "ScriptV2" + }, + "agora:governorValidator": { + "cborHex": "5929bc5929b90100003232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323222222222323232323232323232323232323232323232323232323232323232323232323232323232533307b3371290000008991919299983f19b89480000044c8c8c94ccc20404cdc4a40000022646464a6661080266e2520000011323232533308701337129000000899191929998450099b89480000044c8c8c8c8c94ccc23c04cdc4a40000022646464646464646464646464a6661360266e1d2002002132323232323253330a1013370e00290000a999850809982a002998428098540080699842809ba8323370000290011bad30a80100c330850130a80100b330850130a80100a330850130a80130a70100a07f153330a1013370e660f20086eacc2a0041112002132323253330a4013371064660e44646464a6661520266e1d20000021480085200030b10100230a8010013754615a026158026eb0004004dd61855809855008009bad30ab0130aa0100d153330a401337126eb4c8c2b004c2ac04dd60009855808081bad30ab0100313232323232323253330ab01533094015330940153309401533094015330940153309401533094013253330ac0100110011330b00149112686173206e65757472616c20656666656374000013233230ac012253330b20100114a02a66466160020022944c00cc2d8040044c008c2d4040048c21c04dd5985b008008009bab30b20100613253330ac0100110011330b001490116766f74657320686176652076616c69642073686170650000133223330ac012223300222330032253330b4013375e00800426600e00600229405280998009125014a260c800460c80026eacc2c804018dd5985900801099299985600800880089985800a4810f766f7465732061726520656d7074790000132332233230ae012253330b40100114a22a6613402600661700200226004616e02002460066eb4c2e0040040048cdc3800a40000026eacc2c8040084c94ccc2b00400440044cc2c0052410a696420636f7272656374000013375e61640200e61640202c264a666158020022002266160029210f737461747573206973204472616674000013375e61640200a98101000013253330ac0100110011330b00149111636f7369676e65727320636f7272656374000013330aa0122253330b101002153330b10100114a2294054ccc2c4040045280a9998570099baf30b50100230b50100113300330b40100230b40100114a06eb0c2c804010c8cc2400400422804c2c8040244c94ccc2b00400440044cc2c0052401137374617274696e672074696d652076616c696400001333222333222330012300300110034a04a661300264a6661600200220022661680292014363726561746550726f706f73616c5374617274696e6754696d653a20676976656e2074696d652072616e67652073686f756c6420626520746967687420656e6f756768000013371260024466e040040080104c94ccc2c00400440044cc2d0052414963726561746550726f706f73616c5374617274696e6754696d653a207374617274696e672074696d652073686f756c6420626520696e2063757272656e742074696d652072616e67650000130012253309a0133712004008266e24010004c8ccc888cc0088cc0088c888c00800ccc01400800448940044cc00488940044894004894ccc2c404cdc400100089198008018010a9985a80a48123557070657220626f756e6420626967676572207468616e206c6f77657220626f756e6400163253330b001323370e6164026ea8005200230b70130b601001132323253330b3013370e900100109857009bad30ba0100115330b70106510af0130bb0100230b2010013754616e020022a661680292014663757272656e7450726f706f73616c54696d653a206c6f77657220626f756e64206f66207468652074696d652072616e67652073686f756c6420626520696e636c75736976650010ac0130b70130b6010013232323253330b3013370e900100109857009bad30ba0100115330b70106510af0130bb0100230b2010013754616e02002616e02616c02616a02002616c020046eb4c2c804050c2c804134dd6985900985880800899299985600800880089985800a48118636f7079206f76657220636f6e66696775726174696f6e7300001533094013375e61640200661640202e266ebcc2c804004c2c80405452615330af0149011650726f706f73616c20646174756d20636f7272656374001630b00100130af0100130ae0100130ad0100130ac0100130ab01001330a1014911e50726f706f73616c206f75747075742073686f756c642070726573656e7400330a20100637586156020902a661500292011d52657175697265206d696e696d756d20616d6f756e74206f6620475473001615330a8014913850726f706f73616c73206372656174656420627920746865207374616b65206d757374206e6f742065786365656420746865206c696d6974001630a90100130a8010013309e014911a5374616b6520696e7075742073686f756c642070726573656e74003309f0133222323253330a6013370e660fc00a6eacc2b4040052002130a1015330aa014901135265736f6c7665207374616b6520646174756d0013758664461320266136024646464646464646464646464646464646464646402aa66617e020022930a9986000860808b1860808019984b80919191919191919191919190062999864008008a4c2a6619202194022c61940200ca6661860266e1d20000021324994ccc3180400452615330c7010c80116153330c3013370e90010010991919191929998640099b89480000044c8c92653330cc01001149854cc334043380458c3380400c54cc330043280458dd68009866808009865808019bad00130ca01001153330c3013370e900200109924ca66618c020022930a9986380864008b0a9986380854808b1865808011861008009baa00130c60100130c401003375a0026186020026eb0004dd6000986000800985f00803299985b8099b87480000084c8c8c8c8c8c8c92653330c001001149854cc304043080458c308040194ccc2ec04cdc3a400000426464a66617a0266e1cdc6800a407026464932999860808008a4c2a6618402186022c6186020062a6618202138022c6eb8004c3080400454ccc2ec04cdc3a400400426464a66617a0266e1cdc6800a407026464932999860808008a4c2a6618402186022c6186020062a6618202144022c6eb8004c3080400454cc2fc042840458c30c04008c2e804004dd5000985f008008a99985b8099b87480080084c92653330ba01001149854cc2ec042f0045854cc2ec042740458c2fc04008c2d804004dd5000985d00800985c0080329998588099b87480000084c8c94ccc2cc04cdc39b8d001480e04c8c92653330b701001149854cc2e0042e40458c2e40400c54cc2dc042480458dd7000985c008008a9998588099b87480080084c8c94ccc2cc04cdc39b8d001480e04c8c92653330b701001149854cc2e0042e40458c2e40400c54cc2dc042600458dd7000985c008008a9985a8084b808b185c808011858008009baa00130b40100130b201003375a0026162020026eb0004cc27004008004c2b404c2b004004010428804c2ac04004c2b004c2ac04c2a804c2b004004c8c8c88cc00400c008c2a804c2a404008c2a404004dd60289bab30a80130a70130a701042375861500208c2a6614a029212945786163746c79206f6e652070726f706f73616c20746f6b656e206d757374206265206d696e746564001615330a501491234f6e6c79206e6578742070726f706f73616c206964206765747320616476616e6365640016153330a1013370e00290010a999850809982a0029bac04d153330a1013370e6611a020926466612402446644666460b6446e98cc00cdd58011bab0012233305c22375066e00dd68011bad0010020010020013237566158026156020026158026461580261560200261580200400210a020026eb0c2a0041192002132323253330a4013375e61560200498101020013253330a501333230a50122233002223300322533096013300700300113300800400214a0266002449405289119b8f375c00400260b8002646644646615002446600244660ce0046008002244a00266150024466002446600244600c6615c024466002446600244660de6600844666616c0244446600244a66617a026660ec02e00a0042660ee00a66600c0040020082660ee00466600c00a0080022660ea0060040040020082004600c0022006244a00200a2004244a00200266614e0244466002446600244660024466002446464446600400800666018016004a666166026660d80140100082a666166026660d801400c0042666660d601401000c0080042666660d601401000400800c2a666166026660d801400c0042666660d601400800c0100042666660d601400800401000c26464446600400800644a002a666162026660d401000c0042a666162026660d401000c0082a666162026660d4010008004264446600401200664446600400e00664446600400a00644a002264446600401200664446600400a00664446600400e00644a0022a666162026660d401000c004264446600400e00664446600401200664446600400a00644a002264446600400e00664446600400a00664446600401200644a0022a666162026660d40100040082a666162026660d401000800c264446600400a00664446600400e00664446600401200644a002264446600400a00664446600401200664446600400e00644a0022a666162026660d401000400c264446600400e00664446600400a00664446600401200644a002264446600400e00664446600401200664446600400a00644a00226464446600400800644a002a66615e026660d000c008004264446600400e00664446600400a00644a002264446600400a00664446600400e00644a00226464446600400800644a00264446600400a00644a002244a002004002466002e3dc880099918528091299985580800891280089998019857808009198318009801985780801098011857008009191929998540099b8733306323300170ee24cc25004144dd5985780800a400490000852008a9998540099b8733306323300170ee24cc25004144dd5985780800a4004900109919299985500a998498099299985580800880089985780a49094741542076616c6964000013307d0530051533093013253330ab0100110011330af014910d436f727265637420646174756d000013371e6eb8c2c404004c8c8c94ccc2b404cdc3a400400426eb8c2d00400454ccc2b404cdc3a40080042646e50dd9800985a008008a9985880a4921657870637465642065666665637420646174756d2c20676f74206e6f7468696e67001630b50100230ac010013754616202616002006264a66615602002200226615e0292012956616c756520636f72726563746c7920656e636f646573204175746820436865636b20736372697074000013370e661040266122020a664646464a66615c0266e1d20020021096011375c616a02002616c02004615a020026ea8004c2c404c2c004004dd5985880801a40042614a020042a6615c02920116417574686f72697479206f75747075742076616c69640016330a6014912652656365697665722073686f756c6420626520696e20746865206566666563742067726f7570003330a10123222300200337586166020026ea4004014cc2940524011f4741542072656365697665722073686f756c642062652061207363726970740030930130af0100215330ac0149011d4d6f7265207468616e206f6e652047415420696e206f6e65205554784f001630ad0100130ae0100137586158020922930a9985480a492a456163682073637269707420696e20746865206566666563742067726f7570206765747320612047415400163322330a30149127706c6f6f6b75705061727469616c3a204e6f2076616c756520666f756e6420666f72206b65792e0033309e0123222300200337566160020026ea0008004ccc888ccc8c8c94ccc2a8054cc24c04c94ccc2ac0400440044cc2bc05240110416d626967756f75732077696e6e6572000013370e6661340244a6661580266e1cdd6985a80801001899b800014800840052000006480084c94ccc2ac0400440044cc2bc0524013b4869676865737420766f746520636f756e742073686f756c64206265206174206c6561737420746865206d696e696d756d207468726573686f6c64000013371200a0022446004008244a0026eb4c2c804008dd698548080099984b809129998548099b88375a6164020026eb4c2c80400840084004c2b80400c00c80044004dd59855809855008009bad3230ac01375800261560200264612c0266146024a66614c026100026eacc2bc040044c888c00800cdd698538080089128008009bab30ab0100337566156020062a66150029214850726f706f73616c206d75737420626520696e206c6f636b65642865786563757461626c652920737461746520696e206f7264657220746f20657865637574652065666665637473001630a90130a90100130a80100130a7013309e014911850726f706f73616c20696e707574206e6f7420666f756e64003309f012300430a90130a80130aa01001375861500208c2a6614a029213454686520676f7665726e6f722063616e206f6e6c792070726f63657373206f6e652070726f706f73616c20617420612074696d65001615330a50149124476f7665726e6f722073746174652073686f756c64206e6f74206265206368616e6765640016153330a1013370e00290020a99985080982e8028a99985080a99845009929998510080088008998530083600099b873308d0104a375661500208860d8900109929998510080088008998530083700099b873306e23253330a3013307604c00113308f0104c37566154026152026156020022a6614e020f02c646154026152020026154020026eb0c2a0041192002149854cc294041dc5854cc294041e05854ccc28404c17401454ccc284054cc22804c94ccc2880400440044cc298041b0004cdc399846808251bab30a801044306c480084c94ccc2880400440044cc298041b8004cdc3998371192999851809983b026000899847808261bab30aa0130a90130ab0100115330a701078163230aa0130a90100130aa01001375861500208c90010a4c2a6614a020ee2c2a6614a020f02c6eb412cdd682511919299985080a998450099b873307900437566150020029001099b8f32330012001108a01308c0130a801002375c0a42613802a6614a0292011d5265736f6c76652070726f706f73616c206f757470757420646174756d001375866446128026612c02464646464646464646464646464646464646464646464646464646464646464646464646464646464646464a66619e0266e252000001132323253330d2013371290000008991919299986a8099b89480000044c8c8c94ccc36004cdc4a40000022646464a6661b60266e252000001132323253330de013371290000008991919191929998718099b89480000044c8c81094ccc39c0400452615330e8010e9011630e90100315330e7010e50116375a00261d00200261cc0202ca6661c4020022930a9987180872008b1872008018a9987100870008b1bad00130e30100130e10100315330df010dd0116375a00261c00200261bc020062a661b8021b4022c6eb4004c37404004c36c0400c54cc3640435c0458dd6800986d00800986c008018a9986b0086a008b1bad00130d70100130d50100315330d3010d10116375a00261a8020026eb0004c34804004c34004014c2a404dd58019985500919bb03230cb01002375a6194020026461a6020046eb4c34804004004dd5800986680800986580809a999863808008a4c2a6619002192022c6192020066eb4004c32004004c3180400cdd68009862808009861808019bad00130c20100130c001003375a002617e02002617a020066eb4004c2f004004dd6000985d00800985c008019984700919191919002a99985a8099b87480000084c8c94ccc2dc04cdc39b8d001480e04c8c92653330bb01001149854cc2f0042f40458c2f40400c54cc2ec042580458dd7000985e008008a99985a8099b87480080084c8c94ccc2dc04cdc39b8d001480e04c8c92653330bb01001149854cc2f0042f40458c2f40400c54cc2ec042700458dd7000985e008008a9985c8084d808b185e80801185a008009baa0013758002616e02002616a020066eb4004c2d004004c2c804014c22c04dd58019984600919bb03230ad01002375a615802002646464616e020086466615a0244a66616602002240082644a6661640260020042a6616c02126022c266008617002006466e4000400cdd7185880985b8080080092503756616c020066611c02466ec0c94ccc2b804cdc39b8d001480e04c2bc0400854cc2c80424c0458dd718570080099191929998580099b87371a6eb800920401323232323232323230c10100c53330ba01001149854cc2ec042f00458c2f0040194ccc2d404cdc3a400000426464a66616e0266e1cdc6800a40702646493299985d808008a4c2a661780217a022c617a020062a6617602138022c6eb8004c2f00400454ccc2d404cdc3a400400426493299985c008008a4c2a6617202174022c2a6617202136022c617a020046168020026ea8004c2e004004c2d80400c54cc2d0052412b7074727946726f6d2850446174756d48617368293a206d757374206265203332206279746573206c6f6e670016375c002616a020026eb0c2d804004004dd5985a008008009bab00130af0100130ad01003375a0026158020026eb0004cc25c04008004c2a004c29c04004dd5985400985380985380821084e809853008009853808009984200822842809984c80a49194f776e206f75747075742073686f756c642070726573656e74003309a01232323253330a001533089013253330a10100110011330a501491194f776e20627920676f7665726e6f722076616c696461746f720000133223300223300223371e00400229404cc0049280a51308b0130a701003308b0130a70100513253330a10100110011330a50149010f48617320676f7665726e6f72205354000013370e66118026eb813cdd5985380801240042613602a66148029201165265736f6c766520676f7665726e6f7220646174756d001375866446126026612a024646464646464646464646464646464646464646464646464646464a66617c0266e252000001132323253330c101337129000000899191929998620099b89480000044c8c8c94ccc31c04cdc4a40000022646464a6661940266e252000001132323253330cd013371290000008991919191929998690099b89480000044c8c8c8c8c80d54ccc3640400452615330da010db011630db01003375a00261b40200261b0020062a661ac021a8022c6eb4004c35c04004c354040594ccc3440400452615330d2010d3011630d30100315330d1010cf0116375a00261a40200261a0020062a6619c02198022c6eb4004c33c04004c3340400c54cc32c043240458dd68009866008009865008018a9986400863008b1bad00130c90100130c70100315330c5010c30116375a002618c020026188020062a6618402180022c6eb4004c30c04004dd6000986080800985f808019bad00130be0100130bc0101353330b801001149854cc2e4042e80458c2e80400cdd6800985c80800985b808019bad00130b60100130b401003375a0026166020026162020066eb4004c2c004004c2b80400cdd68009856808009bac00130ab0100137580026612c02004002614e020026eacc29c04c29804c29804104427004c29404004c29004004c29404004dd6185180820185180991851809851009852008009984c00a492d4d616c666f726d65642073637269707420636f6e746578743a206f776e20696e707574206e6f7420666f756e640033223309b012533309e013375e006614a02614c020022446004006244a0020026144020026eb0c2880410054cc27c052414f5061747465726e206d61746368206661696c75726520696e2027646f2720626c6f636b2061742061676f72612f41676f72612f476f7665726e6f722f536372697074732e68733a3239303a352d3532001630a301002309a010013754613e02613c0207e613a020026138020026136020026eb01014ccc258040045261533097010980116309801003375a002612e02002612a020062a6612602122022c6eb4004c25004004c248040594ccc23804004526153308f010900116309001003153308e0108c0116375a002611e02002611a020062a6611602112022c6eb4004c23004004c2280400c54cc220042180458dd68009844808009843808018a9984280841808b1bad0013086010013084010031533082010800116375a0026106020026102020062a660fe0fa2c6eb4004c20004004dd6000983f000983e0019bad001307b00130790135333075001149854cc1d81dc58c1dc00cdd6800983b000983a0019bad00130730013071003375a00260e000260dc0066eb4004c1b4004c1ac00cdd680098350009bac0013068001375801860ca0026460ca60ca00260c800260c660c600260c460c400260c600260c200260c20066eb8018dd70022493163757272656e7450726f706f73616c54696d653a2074696d652072616e67652073686f756c6420626520626f756e64656400223375e6e9c008dd3800911199980200191001001000918259801000911919119800801801111299982980089981a0018010991919299982999baf002001133037337600046601260b800c60b80066660104400400a60b20082a6660a666e40dd70011bae00113303700633330082200100330590040051330370033333008220010060053059004305300230520043057001225333051002100113333003220013055002305400200123304922533304f0011225001133006304d30530013002305200100122222533304d3330060050040031533304d3330060050020011533304d333006005003002132223300200700332223300200600332223300200500332223300200400322500113222330020070033222330020050033222330020060033222330020040032250011533304d333006005003001132223300200700332223300200600332223300200400332223300200500322500113222330020070033222330020040033222330020060033222330020050032250011533304d3330060050020011533304d333006005004002132223300200600332223300200700332223300200500332223300200400322500113222330020060033222330020050033222330020070033222330020040032250011533304d3330060050040011322233002006003322233002007003322233002004003322233002005003225001132223300200600332223300200400332223300200700332223300200500322500122230032233001004003222233002004003222300322533304a3300200400314800854ccc128cc00401000c520001480108c94cc0bcc94ccc11c00440044cc12c010004c010dd618268010a99817992999823800880089982580580098059bac304d0011325333047001100113304b00e001300e375a609a6098002609660960029201107468726573686f6c64732076616c696400232323253302f325333047001100113304b0060013371290001bad304d004153302f325333047001100113304b0070013371290001bad304d003153302f325333047001100113304b0080013371290001bad304d002153302f325333047001100113304b0090013371290001bad304d0011325333047001100113304b00a0013371290001bad304d304c001304b001304a001304900149012c45786563757465207468726573686f6c64206973206c657373207468616e206f7220657175616c20746f20300049012b437265617465207468726573686f6c64206973206c657373207468616e206f7220657175616c20746f20300049012d746f566f74696e67207468726573686f6c64206973206c657373207468616e206f7220657175616c20746f203000490129566f7465207468726573686f6c64206973206c657373207468616e206f7220657175616c20746f20300049012b436f7369676e207468726573686f6c64206973206c657373207468616e206f7220657175616c20746f20300049010d74696d696e67732076616c69640023232323232533304100110011330450070015330293371290001bad304700515330293371290001bad304700415330293371290001bad304700315330293371290001bad304700215330293371290001bad304700115330293371290001bad3047304600114a2608a002608800260860026084002920104676520300049011074696d652072616e67652076616c696400232533303a001100113303e003001337109000000a490e67726561746572207468616e20300049013373696e676c65417574686f72697479546f6b656e4275726e65643a204d757374206275726e2065786163746c79203120474154002337029000000a49254f6e6c79206f6e6520474154206d7573742065786973742061742074686520696e70757473002233003300700200130312223330040012300122333008220013005002330060050011300649894ccc0d400448940044c888c00800cc8c88cc00400c008c0e4008c0e40049c0124000446004002446466666603c0620726ea400cdd5981b981b0009191919299981a19b87480000084c94ccc0d400440044cc0e4024005280a51303c002303300137546070607260700042944c0dc00524137617574686f72697479546f6b656e7356616c6964496e3a2047415420696e636f72726563746c79206c69766573206174205075624b6579004901355768696c6520636f756e74696e67204741547320617420696e707574733a20616c6c2047415473206d7573742062652076616c6964004901134f6e652076616c696420474154206275726e740049011e476f7665726e6f72206f757470757420646174756d2069732076616c696400223002223302b2253330310011480004c94ccc0bccdd7981800080289929998198008a9981a0048b0a9998181805181b0008a99981819baf303130370010051375a6072606e0022a660680162c2a660680182c6eacc0e00044c00cc0d4008c0d400400d2412670747279456c696d53696e676c653a20466f756e6420656d707479206c6973742d6c696b652e00574692012766696e6456616c75653a20556e65787065637465646c79206d697373696e6720726573756c742e0049012e70747279456c696d53696e676c653a20466f756e64206e6f6e2d73696e676c65746f6e206c6973742d6c696b652e0023023225333029001100413300a3003302d0013002302c0014bd7024812c7074727946726f6d28505075624b657948617368293a206d757374206265203238206279746573206c6f6e6700233302022533302600112004132253330253001002153302900616133004302b0032337100020066eb4c090c0a800400492824810c756e736f72746564206d6170002301e225333024001100413300530033028001300230270014bd6f7b6302ba04912c7074727946726f6d285053637269707448617368293a206d757374206265203238206279746573206c6f6e670049013f7265616368656420656e64206f662073756d207768696c65207374696c6c206e6f7420686176696e6720666f756e642074686520636f6e7374727563746f720022323223300100300237520046ea40092201002233301900200100314a04646464a66603266e1d2002002132223002003375c6040002244a002604200460300026ea8c074c07800400488cccccc00c058078dd480100091998031119b80375a604200400290001bab0011480008888cccc050cc0140100080048c888c00800cc01000448940048894ccc050cdd780118018008911801001891280091180891299980b8008801899802180d8009801180d00091980090008a9980a0010b2481197066726f6d4a7573743a20666f756e6420504e6f7468696e67002233001232223002003300300112250012232323253330113370e90000010a9980a80308068a99980899b874800800854cc05401c4cc020dd7180c00080209a9980a8058806180c000980c80118080009baa002491086e6f20646174756d0049010a646174756d20686173680023300200337520024446601444a666020002244a0022a66601a66ebcc038c0500040104c014c0500044c008c04c0040048c888c00800cc04400524010c696e6c696e6520646174756d002223002003225001223300120011533009002162300222533300800112250011333003300c001222300200313002300b0012323002233002002001230022330020020015734aae752401257074727946726f6d28504f53495854696d65293a206d75737420626520706f736974697665005573eae71241317074727946726f6d2850446174615265636f72645b5d293a206c697374206973206c6f6e676572207468616e207a65726f005744ae848c008dd5000aab9e01", + "description": "agora:governorValidator", + "params": [ + "Ply.Core.Types:AsData#PlutusLedgerApi.V1.Scripts:ScriptHash", + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"StakeSTTag\"#Plutarch.Extra.AssetClass:AssetClass", + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"GovernorSTTag\"#PlutusLedgerApi.V1.Value:CurrencySymbol", + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"ProposalSTTag\"#PlutusLedgerApi.V1.Value:CurrencySymbol", + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"AuthorityTokenTag\"#PlutusLedgerApi.V1.Value:CurrencySymbol" + ], + "rawHex": "5929b90100003232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323222222222323232323232323232323232323232323232323232323232323232323232323232323232533307b3371290000008991919299983f19b89480000044c8c8c94ccc20404cdc4a40000022646464a6661080266e2520000011323232533308701337129000000899191929998450099b89480000044c8c8c8c8c94ccc23c04cdc4a40000022646464646464646464646464a6661360266e1d2002002132323232323253330a1013370e00290000a999850809982a002998428098540080699842809ba8323370000290011bad30a80100c330850130a80100b330850130a80100a330850130a80130a70100a07f153330a1013370e660f20086eacc2a0041112002132323253330a4013371064660e44646464a6661520266e1d20000021480085200030b10100230a8010013754615a026158026eb0004004dd61855809855008009bad30ab0130aa0100d153330a401337126eb4c8c2b004c2ac04dd60009855808081bad30ab0100313232323232323253330ab01533094015330940153309401533094015330940153309401533094013253330ac0100110011330b00149112686173206e65757472616c20656666656374000013233230ac012253330b20100114a02a66466160020022944c00cc2d8040044c008c2d4040048c21c04dd5985b008008009bab30b20100613253330ac0100110011330b001490116766f74657320686176652076616c69642073686170650000133223330ac012223300222330032253330b4013375e00800426600e00600229405280998009125014a260c800460c80026eacc2c804018dd5985900801099299985600800880089985800a4810f766f7465732061726520656d7074790000132332233230ae012253330b40100114a22a6613402600661700200226004616e02002460066eb4c2e0040040048cdc3800a40000026eacc2c8040084c94ccc2b00400440044cc2c0052410a696420636f7272656374000013375e61640200e61640202c264a666158020022002266160029210f737461747573206973204472616674000013375e61640200a98101000013253330ac0100110011330b00149111636f7369676e65727320636f7272656374000013330aa0122253330b101002153330b10100114a2294054ccc2c4040045280a9998570099baf30b50100230b50100113300330b40100230b40100114a06eb0c2c804010c8cc2400400422804c2c8040244c94ccc2b00400440044cc2c0052401137374617274696e672074696d652076616c696400001333222333222330012300300110034a04a661300264a6661600200220022661680292014363726561746550726f706f73616c5374617274696e6754696d653a20676976656e2074696d652072616e67652073686f756c6420626520746967687420656e6f756768000013371260024466e040040080104c94ccc2c00400440044cc2d0052414963726561746550726f706f73616c5374617274696e6754696d653a207374617274696e672074696d652073686f756c6420626520696e2063757272656e742074696d652072616e67650000130012253309a0133712004008266e24010004c8ccc888cc0088cc0088c888c00800ccc01400800448940044cc00488940044894004894ccc2c404cdc400100089198008018010a9985a80a48123557070657220626f756e6420626967676572207468616e206c6f77657220626f756e6400163253330b001323370e6164026ea8005200230b70130b601001132323253330b3013370e900100109857009bad30ba0100115330b70106510af0130bb0100230b2010013754616e020022a661680292014663757272656e7450726f706f73616c54696d653a206c6f77657220626f756e64206f66207468652074696d652072616e67652073686f756c6420626520696e636c75736976650010ac0130b70130b6010013232323253330b3013370e900100109857009bad30ba0100115330b70106510af0130bb0100230b2010013754616e02002616e02616c02616a02002616c020046eb4c2c804050c2c804134dd6985900985880800899299985600800880089985800a48118636f7079206f76657220636f6e66696775726174696f6e7300001533094013375e61640200661640202e266ebcc2c804004c2c80405452615330af0149011650726f706f73616c20646174756d20636f7272656374001630b00100130af0100130ae0100130ad0100130ac0100130ab01001330a1014911e50726f706f73616c206f75747075742073686f756c642070726573656e7400330a20100637586156020902a661500292011d52657175697265206d696e696d756d20616d6f756e74206f6620475473001615330a8014913850726f706f73616c73206372656174656420627920746865207374616b65206d757374206e6f742065786365656420746865206c696d6974001630a90100130a8010013309e014911a5374616b6520696e7075742073686f756c642070726573656e74003309f0133222323253330a6013370e660fc00a6eacc2b4040052002130a1015330aa014901135265736f6c7665207374616b6520646174756d0013758664461320266136024646464646464646464646464646464646464646402aa66617e020022930a9986000860808b1860808019984b80919191919191919191919190062999864008008a4c2a6619202194022c61940200ca6661860266e1d20000021324994ccc3180400452615330c7010c80116153330c3013370e90010010991919191929998640099b89480000044c8c92653330cc01001149854cc334043380458c3380400c54cc330043280458dd68009866808009865808019bad00130ca01001153330c3013370e900200109924ca66618c020022930a9986380864008b0a9986380854808b1865808011861008009baa00130c60100130c401003375a0026186020026eb0004dd6000986000800985f00803299985b8099b87480000084c8c8c8c8c8c8c92653330c001001149854cc304043080458c308040194ccc2ec04cdc3a400000426464a66617a0266e1cdc6800a407026464932999860808008a4c2a6618402186022c6186020062a6618202138022c6eb8004c3080400454ccc2ec04cdc3a400400426464a66617a0266e1cdc6800a407026464932999860808008a4c2a6618402186022c6186020062a6618202144022c6eb8004c3080400454cc2fc042840458c30c04008c2e804004dd5000985f008008a99985b8099b87480080084c92653330ba01001149854cc2ec042f0045854cc2ec042740458c2fc04008c2d804004dd5000985d00800985c0080329998588099b87480000084c8c94ccc2cc04cdc39b8d001480e04c8c92653330b701001149854cc2e0042e40458c2e40400c54cc2dc042480458dd7000985c008008a9998588099b87480080084c8c94ccc2cc04cdc39b8d001480e04c8c92653330b701001149854cc2e0042e40458c2e40400c54cc2dc042600458dd7000985c008008a9985a8084b808b185c808011858008009baa00130b40100130b201003375a0026162020026eb0004cc27004008004c2b404c2b004004010428804c2ac04004c2b004c2ac04c2a804c2b004004c8c8c88cc00400c008c2a804c2a404008c2a404004dd60289bab30a80130a70130a701042375861500208c2a6614a029212945786163746c79206f6e652070726f706f73616c20746f6b656e206d757374206265206d696e746564001615330a501491234f6e6c79206e6578742070726f706f73616c206964206765747320616476616e6365640016153330a1013370e00290010a999850809982a0029bac04d153330a1013370e6611a020926466612402446644666460b6446e98cc00cdd58011bab0012233305c22375066e00dd68011bad0010020010020013237566158026156020026158026461580261560200261580200400210a020026eb0c2a0041192002132323253330a4013375e61560200498101020013253330a501333230a50122233002223300322533096013300700300113300800400214a0266002449405289119b8f375c00400260b8002646644646615002446600244660ce0046008002244a00266150024466002446600244600c6615c024466002446600244660de6600844666616c0244446600244a66617a026660ec02e00a0042660ee00a66600c0040020082660ee00466600c00a0080022660ea0060040040020082004600c0022006244a00200a2004244a00200266614e0244466002446600244660024466002446464446600400800666018016004a666166026660d80140100082a666166026660d801400c0042666660d601401000c0080042666660d601401000400800c2a666166026660d801400c0042666660d601400800c0100042666660d601400800401000c26464446600400800644a002a666162026660d401000c0042a666162026660d401000c0082a666162026660d4010008004264446600401200664446600400e00664446600400a00644a002264446600401200664446600400a00664446600400e00644a0022a666162026660d401000c004264446600400e00664446600401200664446600400a00644a002264446600400e00664446600400a00664446600401200644a0022a666162026660d40100040082a666162026660d401000800c264446600400a00664446600400e00664446600401200644a002264446600400a00664446600401200664446600400e00644a0022a666162026660d401000400c264446600400e00664446600400a00664446600401200644a002264446600400e00664446600401200664446600400a00644a00226464446600400800644a002a66615e026660d000c008004264446600400e00664446600400a00644a002264446600400a00664446600400e00644a00226464446600400800644a00264446600400a00644a002244a002004002466002e3dc880099918528091299985580800891280089998019857808009198318009801985780801098011857008009191929998540099b8733306323300170ee24cc25004144dd5985780800a400490000852008a9998540099b8733306323300170ee24cc25004144dd5985780800a4004900109919299985500a998498099299985580800880089985780a49094741542076616c6964000013307d0530051533093013253330ab0100110011330af014910d436f727265637420646174756d000013371e6eb8c2c404004c8c8c94ccc2b404cdc3a400400426eb8c2d00400454ccc2b404cdc3a40080042646e50dd9800985a008008a9985880a4921657870637465642065666665637420646174756d2c20676f74206e6f7468696e67001630b50100230ac010013754616202616002006264a66615602002200226615e0292012956616c756520636f72726563746c7920656e636f646573204175746820436865636b20736372697074000013370e661040266122020a664646464a66615c0266e1d20020021096011375c616a02002616c02004615a020026ea8004c2c404c2c004004dd5985880801a40042614a020042a6615c02920116417574686f72697479206f75747075742076616c69640016330a6014912652656365697665722073686f756c6420626520696e20746865206566666563742067726f7570003330a10123222300200337586166020026ea4004014cc2940524011f4741542072656365697665722073686f756c642062652061207363726970740030930130af0100215330ac0149011d4d6f7265207468616e206f6e652047415420696e206f6e65205554784f001630ad0100130ae0100137586158020922930a9985480a492a456163682073637269707420696e20746865206566666563742067726f7570206765747320612047415400163322330a30149127706c6f6f6b75705061727469616c3a204e6f2076616c756520666f756e6420666f72206b65792e0033309e0123222300200337566160020026ea0008004ccc888ccc8c8c94ccc2a8054cc24c04c94ccc2ac0400440044cc2bc05240110416d626967756f75732077696e6e6572000013370e6661340244a6661580266e1cdd6985a80801001899b800014800840052000006480084c94ccc2ac0400440044cc2bc0524013b4869676865737420766f746520636f756e742073686f756c64206265206174206c6561737420746865206d696e696d756d207468726573686f6c64000013371200a0022446004008244a0026eb4c2c804008dd698548080099984b809129998548099b88375a6164020026eb4c2c80400840084004c2b80400c00c80044004dd59855809855008009bad3230ac01375800261560200264612c0266146024a66614c026100026eacc2bc040044c888c00800cdd698538080089128008009bab30ab0100337566156020062a66150029214850726f706f73616c206d75737420626520696e206c6f636b65642865786563757461626c652920737461746520696e206f7264657220746f20657865637574652065666665637473001630a90130a90100130a80100130a7013309e014911850726f706f73616c20696e707574206e6f7420666f756e64003309f012300430a90130a80130aa01001375861500208c2a6614a029213454686520676f7665726e6f722063616e206f6e6c792070726f63657373206f6e652070726f706f73616c20617420612074696d65001615330a50149124476f7665726e6f722073746174652073686f756c64206e6f74206265206368616e6765640016153330a1013370e00290020a99985080982e8028a99985080a99845009929998510080088008998530083600099b873308d0104a375661500208860d8900109929998510080088008998530083700099b873306e23253330a3013307604c00113308f0104c37566154026152026156020022a6614e020f02c646154026152020026154020026eb0c2a0041192002149854cc294041dc5854cc294041e05854ccc28404c17401454ccc284054cc22804c94ccc2880400440044cc298041b0004cdc399846808251bab30a801044306c480084c94ccc2880400440044cc298041b8004cdc3998371192999851809983b026000899847808261bab30aa0130a90130ab0100115330a701078163230aa0130a90100130aa01001375861500208c90010a4c2a6614a020ee2c2a6614a020f02c6eb412cdd682511919299985080a998450099b873307900437566150020029001099b8f32330012001108a01308c0130a801002375c0a42613802a6614a0292011d5265736f6c76652070726f706f73616c206f757470757420646174756d001375866446128026612c02464646464646464646464646464646464646464646464646464646464646464646464646464646464646464a66619e0266e252000001132323253330d2013371290000008991919299986a8099b89480000044c8c8c94ccc36004cdc4a40000022646464a6661b60266e252000001132323253330de013371290000008991919191929998718099b89480000044c8c81094ccc39c0400452615330e8010e9011630e90100315330e7010e50116375a00261d00200261cc0202ca6661c4020022930a9987180872008b1872008018a9987100870008b1bad00130e30100130e10100315330df010dd0116375a00261c00200261bc020062a661b8021b4022c6eb4004c37404004c36c0400c54cc3640435c0458dd6800986d00800986c008018a9986b0086a008b1bad00130d70100130d50100315330d3010d10116375a00261a8020026eb0004c34804004c34004014c2a404dd58019985500919bb03230cb01002375a6194020026461a6020046eb4c34804004004dd5800986680800986580809a999863808008a4c2a6619002192022c6192020066eb4004c32004004c3180400cdd68009862808009861808019bad00130c20100130c001003375a002617e02002617a020066eb4004c2f004004dd6000985d00800985c008019984700919191919002a99985a8099b87480000084c8c94ccc2dc04cdc39b8d001480e04c8c92653330bb01001149854cc2f0042f40458c2f40400c54cc2ec042580458dd7000985e008008a99985a8099b87480080084c8c94ccc2dc04cdc39b8d001480e04c8c92653330bb01001149854cc2f0042f40458c2f40400c54cc2ec042700458dd7000985e008008a9985c8084d808b185e80801185a008009baa0013758002616e02002616a020066eb4004c2d004004c2c804014c22c04dd58019984600919bb03230ad01002375a615802002646464616e020086466615a0244a66616602002240082644a6661640260020042a6616c02126022c266008617002006466e4000400cdd7185880985b8080080092503756616c020066611c02466ec0c94ccc2b804cdc39b8d001480e04c2bc0400854cc2c80424c0458dd718570080099191929998580099b87371a6eb800920401323232323232323230c10100c53330ba01001149854cc2ec042f00458c2f0040194ccc2d404cdc3a400000426464a66616e0266e1cdc6800a40702646493299985d808008a4c2a661780217a022c617a020062a6617602138022c6eb8004c2f00400454ccc2d404cdc3a400400426493299985c008008a4c2a6617202174022c2a6617202136022c617a020046168020026ea8004c2e004004c2d80400c54cc2d0052412b7074727946726f6d2850446174756d48617368293a206d757374206265203332206279746573206c6f6e670016375c002616a020026eb0c2d804004004dd5985a008008009bab00130af0100130ad01003375a0026158020026eb0004cc25c04008004c2a004c29c04004dd5985400985380985380821084e809853008009853808009984200822842809984c80a49194f776e206f75747075742073686f756c642070726573656e74003309a01232323253330a001533089013253330a10100110011330a501491194f776e20627920676f7665726e6f722076616c696461746f720000133223300223300223371e00400229404cc0049280a51308b0130a701003308b0130a70100513253330a10100110011330a50149010f48617320676f7665726e6f72205354000013370e66118026eb813cdd5985380801240042613602a66148029201165265736f6c766520676f7665726e6f7220646174756d001375866446126026612a024646464646464646464646464646464646464646464646464646464a66617c0266e252000001132323253330c101337129000000899191929998620099b89480000044c8c8c94ccc31c04cdc4a40000022646464a6661940266e252000001132323253330cd013371290000008991919191929998690099b89480000044c8c8c8c8c80d54ccc3640400452615330da010db011630db01003375a00261b40200261b0020062a661ac021a8022c6eb4004c35c04004c354040594ccc3440400452615330d2010d3011630d30100315330d1010cf0116375a00261a40200261a0020062a6619c02198022c6eb4004c33c04004c3340400c54cc32c043240458dd68009866008009865008018a9986400863008b1bad00130c90100130c70100315330c5010c30116375a002618c020026188020062a6618402180022c6eb4004c30c04004dd6000986080800985f808019bad00130be0100130bc0101353330b801001149854cc2e4042e80458c2e80400cdd6800985c80800985b808019bad00130b60100130b401003375a0026166020026162020066eb4004c2c004004c2b80400cdd68009856808009bac00130ab0100137580026612c02004002614e020026eacc29c04c29804c29804104427004c29404004c29004004c29404004dd6185180820185180991851809851009852008009984c00a492d4d616c666f726d65642073637269707420636f6e746578743a206f776e20696e707574206e6f7420666f756e640033223309b012533309e013375e006614a02614c020022446004006244a0020026144020026eb0c2880410054cc27c052414f5061747465726e206d61746368206661696c75726520696e2027646f2720626c6f636b2061742061676f72612f41676f72612f476f7665726e6f722f536372697074732e68733a3239303a352d3532001630a301002309a010013754613e02613c0207e613a020026138020026136020026eb01014ccc258040045261533097010980116309801003375a002612e02002612a020062a6612602122022c6eb4004c25004004c248040594ccc23804004526153308f010900116309001003153308e0108c0116375a002611e02002611a020062a6611602112022c6eb4004c23004004c2280400c54cc220042180458dd68009844808009843808018a9984280841808b1bad0013086010013084010031533082010800116375a0026106020026102020062a660fe0fa2c6eb4004c20004004dd6000983f000983e0019bad001307b00130790135333075001149854cc1d81dc58c1dc00cdd6800983b000983a0019bad00130730013071003375a00260e000260dc0066eb4004c1b4004c1ac00cdd680098350009bac0013068001375801860ca0026460ca60ca00260c800260c660c600260c460c400260c600260c200260c20066eb8018dd70022493163757272656e7450726f706f73616c54696d653a2074696d652072616e67652073686f756c6420626520626f756e64656400223375e6e9c008dd3800911199980200191001001000918259801000911919119800801801111299982980089981a0018010991919299982999baf002001133037337600046601260b800c60b80066660104400400a60b20082a6660a666e40dd70011bae00113303700633330082200100330590040051330370033333008220010060053059004305300230520043057001225333051002100113333003220013055002305400200123304922533304f0011225001133006304d30530013002305200100122222533304d3330060050040031533304d3330060050020011533304d333006005003002132223300200700332223300200600332223300200500332223300200400322500113222330020070033222330020050033222330020060033222330020040032250011533304d333006005003001132223300200700332223300200600332223300200400332223300200500322500113222330020070033222330020040033222330020060033222330020050032250011533304d3330060050020011533304d333006005004002132223300200600332223300200700332223300200500332223300200400322500113222330020060033222330020050033222330020070033222330020040032250011533304d3330060050040011322233002006003322233002007003322233002004003322233002005003225001132223300200600332223300200400332223300200700332223300200500322500122230032233001004003222233002004003222300322533304a3300200400314800854ccc128cc00401000c520001480108c94cc0bcc94ccc11c00440044cc12c010004c010dd618268010a99817992999823800880089982580580098059bac304d0011325333047001100113304b00e001300e375a609a6098002609660960029201107468726573686f6c64732076616c696400232323253302f325333047001100113304b0060013371290001bad304d004153302f325333047001100113304b0070013371290001bad304d003153302f325333047001100113304b0080013371290001bad304d002153302f325333047001100113304b0090013371290001bad304d0011325333047001100113304b00a0013371290001bad304d304c001304b001304a001304900149012c45786563757465207468726573686f6c64206973206c657373207468616e206f7220657175616c20746f20300049012b437265617465207468726573686f6c64206973206c657373207468616e206f7220657175616c20746f20300049012d746f566f74696e67207468726573686f6c64206973206c657373207468616e206f7220657175616c20746f203000490129566f7465207468726573686f6c64206973206c657373207468616e206f7220657175616c20746f20300049012b436f7369676e207468726573686f6c64206973206c657373207468616e206f7220657175616c20746f20300049010d74696d696e67732076616c69640023232323232533304100110011330450070015330293371290001bad304700515330293371290001bad304700415330293371290001bad304700315330293371290001bad304700215330293371290001bad304700115330293371290001bad3047304600114a2608a002608800260860026084002920104676520300049011074696d652072616e67652076616c696400232533303a001100113303e003001337109000000a490e67726561746572207468616e20300049013373696e676c65417574686f72697479546f6b656e4275726e65643a204d757374206275726e2065786163746c79203120474154002337029000000a49254f6e6c79206f6e6520474154206d7573742065786973742061742074686520696e70757473002233003300700200130312223330040012300122333008220013005002330060050011300649894ccc0d400448940044c888c00800cc8c88cc00400c008c0e4008c0e40049c0124000446004002446466666603c0620726ea400cdd5981b981b0009191919299981a19b87480000084c94ccc0d400440044cc0e4024005280a51303c002303300137546070607260700042944c0dc00524137617574686f72697479546f6b656e7356616c6964496e3a2047415420696e636f72726563746c79206c69766573206174205075624b6579004901355768696c6520636f756e74696e67204741547320617420696e707574733a20616c6c2047415473206d7573742062652076616c6964004901134f6e652076616c696420474154206275726e740049011e476f7665726e6f72206f757470757420646174756d2069732076616c696400223002223302b2253330310011480004c94ccc0bccdd7981800080289929998198008a9981a0048b0a9998181805181b0008a99981819baf303130370010051375a6072606e0022a660680162c2a660680182c6eacc0e00044c00cc0d4008c0d400400d2412670747279456c696d53696e676c653a20466f756e6420656d707479206c6973742d6c696b652e00574692012766696e6456616c75653a20556e65787065637465646c79206d697373696e6720726573756c742e0049012e70747279456c696d53696e676c653a20466f756e64206e6f6e2d73696e676c65746f6e206c6973742d6c696b652e0023023225333029001100413300a3003302d0013002302c0014bd7024812c7074727946726f6d28505075624b657948617368293a206d757374206265203238206279746573206c6f6e6700233302022533302600112004132253330253001002153302900616133004302b0032337100020066eb4c090c0a800400492824810c756e736f72746564206d6170002301e225333024001100413300530033028001300230270014bd6f7b6302ba04912c7074727946726f6d285053637269707448617368293a206d757374206265203238206279746573206c6f6e670049013f7265616368656420656e64206f662073756d207768696c65207374696c6c206e6f7420686176696e6720666f756e642074686520636f6e7374727563746f720022323223300100300237520046ea40092201002233301900200100314a04646464a66603266e1d2002002132223002003375c6040002244a002604200460300026ea8c074c07800400488cccccc00c058078dd480100091998031119b80375a604200400290001bab0011480008888cccc050cc0140100080048c888c00800cc01000448940048894ccc050cdd780118018008911801001891280091180891299980b8008801899802180d8009801180d00091980090008a9980a0010b2481197066726f6d4a7573743a20666f756e6420504e6f7468696e67002233001232223002003300300112250012232323253330113370e90000010a9980a80308068a99980899b874800800854cc05401c4cc020dd7180c00080209a9980a8058806180c000980c80118080009baa002491086e6f20646174756d0049010a646174756d20686173680023300200337520024446601444a666020002244a0022a66601a66ebcc038c0500040104c014c0500044c008c04c0040048c888c00800cc04400524010c696e6c696e6520646174756d002223002003225001223300120011533009002162300222533300800112250011333003300c001222300200313002300b0012323002233002002001230022330020020015734aae752401257074727946726f6d28504f53495854696d65293a206d75737420626520706f736974697665005573eae71241317074727946726f6d2850446174615265636f72645b5d293a206c697374206973206c6f6e676572207468616e207a65726f005744ae848c008dd5000aab9e01", + "role": "ValidatorRole", + "version": "ScriptV2" + }, + "agora:mutateGovernorValidator": { + "cborHex": "591045591042010000323232323232323232323232323232323232323232323232323232323232323232323232323232323232322222223232323232323232323232323232323232323232323232323232323232323253330453371290000008991919299982419b89480000044c8c8c94ccc12ccdc4a40000022646464a66609c66e252000001132323253330513371290000008991919299982a19b89480000044c8c8c8c8c94ccc164cdc4a4000002264646464646464646464646464646464646464646464646464646464646464646464a6660f666e2520000011323232533307e337129000000899191929998408099b89480000044c8c8c94ccc21004cdc4a40000022646464a66610e0266e2520000011323232533308a013371290000008991919191929998478099b89480000044c8c8c8c8c8c8c8c8c8c94ccc26404cdc3a400400426464a66613602a660f864a666138020022002266144029213373696e676c65417574686f72697479546f6b656e4275726e65643a204d757374206275726e2065786163746c79203120474154000013370e66124020ea6eacc29004c27004c28c04004c8cdc0a40000029001099299984e00800880089985100a481254f6e6c79206f6e6520474154206d7573742065786973742061742074686520696e70757473000013370e66446661340244466a66614a02002244a002264446004006646446600200600461520200461520200246002446664e0088004c014008cc0180140044c920004988c00c0040048c94ccc27404c8cccccc25c04284042a404dd483c1bab30a70130a601001232323253330a2013370e9000001099299985180800880089985480a4937617574686f72697479546f6b656e7356616c6964496e3a2047415420696e636f72726563746c79206c69766573206174205075624b6579000014a02944c2b004008c28c04004dd51854009854809854008010a5130a701001133094010773756614c02614a02614e020022a66146029201355768696c6520636f756e74696e67204741547320617420696e707574733a20616c6c2047415473206d7573742062652076616c696400163230a60130a50100130a601001375861480200290010991919191929998500099b8733309d0122253330a8010011002133003337000049001185580800a400000290020a99985000992998410099299985100800880089985400a4812943616e206f6e6c79206d6f64696679207468652070696e6e656420676f7665726e6f7220646174756d0000133084015330a70108501137586610c0264615602614802615802002646156026154026158020026612a0212c0266446613202466e1ccc26c0400cc8dd5985700985680985780800985680985600985700800a40040026eb820004008dd5985500985480801999119191919852809857808029985280802198528098578080119852809857808009985280985780985700800852009856808009856008009855808011bac30aa010063230ab0130aa010015330a70108501137586610c0264615602614802615802002646156026154026158020026612a0212c0266446613202466e1ccc26c0400cc8dd5985700985680985780800985680985600985700800a40040026eb820004008dd5985500985480801899299985100800880089985400a4916476f7665726e6f722076616c696461746f722072756e000013371e610e0264646464a66614a0266e1d2002002132223002003375c615c02002244a002615e02004614c020026ea8c2ac04c2b004004c8c2ac04c2b004004c2a804c2a404004dd7040809855009984a0084a8099911984c00919b873309a01003323756615a02615802615c02002615802615602615a0200290010009bae07f001153330a001332253330a2013370e00490000a9998510099b87001480005288a9998510099b87001480085280a9998510099b87001480105280a50153330a2013370e00490010a9998510099b87001480005280a9998510099b87001480085288a9998510099b87001480105280a50153330a2013370e00490020a9998510099b87001480005280a9998510099b87001480085280a9998510099b87001480105288a51153330a2013370e00290000a50153330a2013370e00290010a50153330a2013370e00290020a5114a26eb4cc25005240124476f7665726e6f722072656465656d65722073686f756c64206265207265736f6c7665640033223308b01232002375a002666124021260200400266e9520023309f013230aa0130ab010013309401095013322330980123370e6613402006646eacc2b404c2b004c2b804004c2b004c2ac04c2b4040052002001375c0fe00213c026eacc2a4040092004153330a00133083015330a6014911e5265736f6c766520676f7665726e6f72206f75746f70757420646174756d00137586610a026461540261460261560200266128029201184e6f20676f7665726e6f72206f757470757420666f756e64003322330980123370e66134020066eacc2b004c2ac04c2b4040052002001375c0fe6eb0c2a40400cdd5985480985400801199119191919852009857008029985200802198520098570080119852009857008009985200985700985680800851809856008009855808009855008011bac30a90130a8010053230aa0130a9010015330a60108401137586610a026461540261460261560200264615402615202615602002661280212a0266446613002466e1ccc2680400cc8dd5985680985600985700800985600985580985680800a40040026eb81fc004dd59854809854008010a4c2a6614c029211a4e657720676f7665726e6f7220646174756d20636f7272656374001615330a6014912b5370656e6420676f7665726e6f7220776974682072656465656d6572204d7574617465476f7665726e6f72001615330a6014911e476f7665726e6f7220696e7075742073686f756c642062652076616c6964001615330a601491304f6e6c792073656c6620616e6420676f7665726e6f722073637269707420696e707574732061726520616c6c6f7765640016332309d012253330a70100110a00113253330a30130040011330a201001300330ab010021300330ab0100230ab01001232323330a2010014a0944c8c8c8c94ccc29404cdc3a400400429405289857808011853008009baa00130aa0130ab010013230aa0130ab0100130a90130a80130aa01001375861500200664614e02614e02614e02614002002614c02002614a02614a02002614c02614a020ea6eb01e054cc28405240128412073696e676c6520617574686f7269747920746f6b656e20686173206265656e206275726e6564001630a40130a30107330a201001153309f01491445061747465726e206d61746368206661696c75726520696e2027646f2720626c6f636b2061742061676f72612f41676f72612f4566666563742e68733a36333a352d3232001630a301002309a010013754613e02613c020dea666134020022930a9984d8084e008b184e0081b299984c008008a4c2a6613202134022c6134020066eb4004c26404004c25c0400c54cc2540424c0458dd6800984b00800984a0080b2999848008008a4c2a6612202124022c6124020062a661200211c022c6eb4004c24404004c23c0400c54cc2340422c0458dd68009847008009846008018a9984500844008b1bad001308b010013089010031533087010850116375a002611002002610c020062a6610802104022c6eb4004c21404004c20c0400c54cc204041fc58dd68009841008009bac001308001001307e003375a00260fa00260f6026a6660ee0022930a9983c03c8b183c8019bad00130780013076003375a00260ea00260e60066eb4004c1c8004c1c000cdd6800983780098368019bad001306c001375800260d40026eb0004c1a0004c1980d94ccc1880045261533063064163064003375a00260c600260c20062a660be0ba2c6eb4004c180004c1780594ccc168004526153305b05c16305c003153305a05816375a00260b600260b20062a660ae0aa2c6eb4004c160004c15800c54cc15014858dd6800982a80098298018a998288278b1bad00130520013050003153304e04c16375a002609e002609a0062a660960922c6eb4004c130004dd6000982500098240019bad001304700130450135333041001149854cc10810c58c10c00cdd6800982100098200019bad001303f001303d003375a002607800260740066eb4004c0e4004c0dc00cdd6800981b0009bac0013034001375800260640026eb0014c0c4008dd7002111998108010008018a50223375e6e9c008dd3800a4811c5265736f6c766520676f7665726e6f7220696e70757420646174756d00223003330050020012330012001153302100216491197066726f6d4a7573743a20666f756e6420504e6f7468696e6700223300300433005002001223300123222300200330030011225001232323232323232323232323232323232323232323232323232323253330323371290000008991919299981a99b89480000044c8c8c94ccc0e0cdc4a40000022646464a66607666e2520000011323232533303e3371290000008991919299982099b89480000044c8c8c8c8c94ccc118cdc4a40000022646464646406aa66609e0022930a998280288b18288019bad0013050001304e003153304c04a16375a002609a002609602ca66608e0022930a998240248b18248018a998238228b1bad00130480013046003153304404216375a002608a00260860062a6608207e2c6eb4004c108004c10000c54cc0f80f058dd6800981f800981e8018a9981d81c8b1bad001303c001303a003153303803616375a00260720026eb0004c0dc004c0d400cdd6800981a0009819009a9998170008a4c2a6605e0602c60600066eb4004c0bc004c0b400cdd6800981600098150019bad00130290013027003375a002604c00260480066eb4004c08c004dd600098108009bac00122323232533301a3370e90000010a9981000308038a99980d19b874800800854cc0800204cc024dd7181180080209a99810006080698118009812001180d8009baa002491086e6f20646174756d0022500149010a646174756d20686173680023300200337520024446602044a666034002244a0022a66602a66ebcc060c0780040104c014c0780044c008c0740040048c888c00800cc06c00524010c696e6c696e6520646174756d002223002003223300120011533014002164911e476f7665726e6f72205554584f2073686f756c6420636172727920475354003007222533301200112250011533300d30023016001132223002003301600113300300230150010012233333300300d0153752004002466600e4466e00dd6980c001000a40006eac004520002222333300533006004002001232223002003300400112250012300422533300e001122500113330033012001222300200313002301100122253330083375e00460060022446004006244a00244600644a66601a002200626600860220026004602000246460044660040040024600446600400400297ae05740ae688c020c0080048c01cc01c00555cea481257074727946726f6d28504f53495854696d65293a206d75737420626520706f736974697665005573eae71241317074727946726f6d2850446174615265636f72645b5d293a206c697374206973206c6f6e676572207468616e207a65726f005744ae848c008dd5000aab9e01", + "description": "agora:mutateGovernorValidator", + "params": [ + "Ply.Core.Types:AsData#PlutusLedgerApi.V1.Scripts:ScriptHash", + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"GovernorSTTag\"#PlutusLedgerApi.V1.Value:CurrencySymbol", + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"AuthorityTokenTag\"#PlutusLedgerApi.V1.Value:CurrencySymbol" + ], + "rawHex": "591042010000323232323232323232323232323232323232323232323232323232323232323232323232323232323232322222223232323232323232323232323232323232323232323232323232323232323253330453371290000008991919299982419b89480000044c8c8c94ccc12ccdc4a40000022646464a66609c66e252000001132323253330513371290000008991919299982a19b89480000044c8c8c8c8c94ccc164cdc4a4000002264646464646464646464646464646464646464646464646464646464646464646464a6660f666e2520000011323232533307e337129000000899191929998408099b89480000044c8c8c94ccc21004cdc4a40000022646464a66610e0266e2520000011323232533308a013371290000008991919191929998478099b89480000044c8c8c8c8c8c8c8c8c8c94ccc26404cdc3a400400426464a66613602a660f864a666138020022002266144029213373696e676c65417574686f72697479546f6b656e4275726e65643a204d757374206275726e2065786163746c79203120474154000013370e66124020ea6eacc29004c27004c28c04004c8cdc0a40000029001099299984e00800880089985100a481254f6e6c79206f6e6520474154206d7573742065786973742061742074686520696e70757473000013370e66446661340244466a66614a02002244a002264446004006646446600200600461520200461520200246002446664e0088004c014008cc0180140044c920004988c00c0040048c94ccc27404c8cccccc25c04284042a404dd483c1bab30a70130a601001232323253330a2013370e9000001099299985180800880089985480a4937617574686f72697479546f6b656e7356616c6964496e3a2047415420696e636f72726563746c79206c69766573206174205075624b6579000014a02944c2b004008c28c04004dd51854009854809854008010a5130a701001133094010773756614c02614a02614e020022a66146029201355768696c6520636f756e74696e67204741547320617420696e707574733a20616c6c2047415473206d7573742062652076616c696400163230a60130a50100130a601001375861480200290010991919191929998500099b8733309d0122253330a8010011002133003337000049001185580800a400000290020a99985000992998410099299985100800880089985400a4812943616e206f6e6c79206d6f64696679207468652070696e6e656420676f7665726e6f7220646174756d0000133084015330a70108501137586610c0264615602614802615802002646156026154026158020026612a0212c0266446613202466e1ccc26c0400cc8dd5985700985680985780800985680985600985700800a40040026eb820004008dd5985500985480801999119191919852809857808029985280802198528098578080119852809857808009985280985780985700800852009856808009856008009855808011bac30aa010063230ab0130aa010015330a70108501137586610c0264615602614802615802002646156026154026158020026612a0212c0266446613202466e1ccc26c0400cc8dd5985700985680985780800985680985600985700800a40040026eb820004008dd5985500985480801899299985100800880089985400a4916476f7665726e6f722076616c696461746f722072756e000013371e610e0264646464a66614a0266e1d2002002132223002003375c615c02002244a002615e02004614c020026ea8c2ac04c2b004004c8c2ac04c2b004004c2a804c2a404004dd7040809855009984a0084a8099911984c00919b873309a01003323756615a02615802615c02002615802615602615a0200290010009bae07f001153330a001332253330a2013370e00490000a9998510099b87001480005288a9998510099b87001480085280a9998510099b87001480105280a50153330a2013370e00490010a9998510099b87001480005280a9998510099b87001480085288a9998510099b87001480105280a50153330a2013370e00490020a9998510099b87001480005280a9998510099b87001480085280a9998510099b87001480105288a51153330a2013370e00290000a50153330a2013370e00290010a50153330a2013370e00290020a5114a26eb4cc25005240124476f7665726e6f722072656465656d65722073686f756c64206265207265736f6c7665640033223308b01232002375a002666124021260200400266e9520023309f013230aa0130ab010013309401095013322330980123370e6613402006646eacc2b404c2b004c2b804004c2b004c2ac04c2b4040052002001375c0fe00213c026eacc2a4040092004153330a00133083015330a6014911e5265736f6c766520676f7665726e6f72206f75746f70757420646174756d00137586610a026461540261460261560200266128029201184e6f20676f7665726e6f72206f757470757420666f756e64003322330980123370e66134020066eacc2b004c2ac04c2b4040052002001375c0fe6eb0c2a40400cdd5985480985400801199119191919852009857008029985200802198520098570080119852009857008009985200985700985680800851809856008009855808009855008011bac30a90130a8010053230aa0130a9010015330a60108401137586610a026461540261460261560200264615402615202615602002661280212a0266446613002466e1ccc2680400cc8dd5985680985600985700800985600985580985680800a40040026eb81fc004dd59854809854008010a4c2a6614c029211a4e657720676f7665726e6f7220646174756d20636f7272656374001615330a6014912b5370656e6420676f7665726e6f7220776974682072656465656d6572204d7574617465476f7665726e6f72001615330a6014911e476f7665726e6f7220696e7075742073686f756c642062652076616c6964001615330a601491304f6e6c792073656c6620616e6420676f7665726e6f722073637269707420696e707574732061726520616c6c6f7765640016332309d012253330a70100110a00113253330a30130040011330a201001300330ab010021300330ab0100230ab01001232323330a2010014a0944c8c8c8c94ccc29404cdc3a400400429405289857808011853008009baa00130aa0130ab010013230aa0130ab0100130a90130a80130aa01001375861500200664614e02614e02614e02614002002614c02002614a02614a02002614c02614a020ea6eb01e054cc28405240128412073696e676c6520617574686f7269747920746f6b656e20686173206265656e206275726e6564001630a40130a30107330a201001153309f01491445061747465726e206d61746368206661696c75726520696e2027646f2720626c6f636b2061742061676f72612f41676f72612f4566666563742e68733a36333a352d3232001630a301002309a010013754613e02613c020dea666134020022930a9984d8084e008b184e0081b299984c008008a4c2a6613202134022c6134020066eb4004c26404004c25c0400c54cc2540424c0458dd6800984b00800984a0080b2999848008008a4c2a6612202124022c6124020062a661200211c022c6eb4004c24404004c23c0400c54cc2340422c0458dd68009847008009846008018a9984500844008b1bad001308b010013089010031533087010850116375a002611002002610c020062a6610802104022c6eb4004c21404004c20c0400c54cc204041fc58dd68009841008009bac001308001001307e003375a00260fa00260f6026a6660ee0022930a9983c03c8b183c8019bad00130780013076003375a00260ea00260e60066eb4004c1c8004c1c000cdd6800983780098368019bad001306c001375800260d40026eb0004c1a0004c1980d94ccc1880045261533063064163064003375a00260c600260c20062a660be0ba2c6eb4004c180004c1780594ccc168004526153305b05c16305c003153305a05816375a00260b600260b20062a660ae0aa2c6eb4004c160004c15800c54cc15014858dd6800982a80098298018a998288278b1bad00130520013050003153304e04c16375a002609e002609a0062a660960922c6eb4004c130004dd6000982500098240019bad001304700130450135333041001149854cc10810c58c10c00cdd6800982100098200019bad001303f001303d003375a002607800260740066eb4004c0e4004c0dc00cdd6800981b0009bac0013034001375800260640026eb0014c0c4008dd7002111998108010008018a50223375e6e9c008dd3800a4811c5265736f6c766520676f7665726e6f7220696e70757420646174756d00223003330050020012330012001153302100216491197066726f6d4a7573743a20666f756e6420504e6f7468696e6700223300300433005002001223300123222300200330030011225001232323232323232323232323232323232323232323232323232323253330323371290000008991919299981a99b89480000044c8c8c94ccc0e0cdc4a40000022646464a66607666e2520000011323232533303e3371290000008991919299982099b89480000044c8c8c8c8c94ccc118cdc4a40000022646464646406aa66609e0022930a998280288b18288019bad0013050001304e003153304c04a16375a002609a002609602ca66608e0022930a998240248b18248018a998238228b1bad00130480013046003153304404216375a002608a00260860062a6608207e2c6eb4004c108004c10000c54cc0f80f058dd6800981f800981e8018a9981d81c8b1bad001303c001303a003153303803616375a00260720026eb0004c0dc004c0d400cdd6800981a0009819009a9998170008a4c2a6605e0602c60600066eb4004c0bc004c0b400cdd6800981600098150019bad00130290013027003375a002604c00260480066eb4004c08c004dd600098108009bac00122323232533301a3370e90000010a9981000308038a99980d19b874800800854cc0800204cc024dd7181180080209a99810006080698118009812001180d8009baa002491086e6f20646174756d0022500149010a646174756d20686173680023300200337520024446602044a666034002244a0022a66602a66ebcc060c0780040104c014c0780044c008c0740040048c888c00800cc06c00524010c696e6c696e6520646174756d002223002003223300120011533014002164911e476f7665726e6f72205554584f2073686f756c6420636172727920475354003007222533301200112250011533300d30023016001132223002003301600113300300230150010012233333300300d0153752004002466600e4466e00dd6980c001000a40006eac004520002222333300533006004002001232223002003300400112250012300422533300e001122500113330033012001222300200313002301100122253330083375e00460060022446004006244a00244600644a66601a002200626600860220026004602000246460044660040040024600446600400400297ae05740ae688c020c0080048c01cc01c00555cea481257074727946726f6d28504f53495854696d65293a206d75737420626520706f736974697665005573eae71241317074727946726f6d2850446174615265636f72645b5d293a206c697374206973206c6f6e676572207468616e207a65726f005744ae848c008dd5000aab9e01", + "role": "ValidatorRole", + "version": "ScriptV2" + }, + "agora:noOpValidator": { + "cborHex": "59034259033f01000032323232323232323232323232323222223232323232533300f3370e9001001099192999808a99911998098010008a50325333012001100113301649013373696e676c65417574686f72697479546f6b656e4275726e65643a204d757374206275726e2065786163746c79203120474154000013370e6601800e6eacc05cc8c064c064c064004c060004c8cdc0a400000290010992999809000880089980b249254f6e6c79206f6e6520474154206d7573742065786973742061742074686520696e70757473000013370e664466602a44466a666032002244a0022644460040066464466002006004603c004603800246002446664e0088004c014008cc0180140044c920004988c00c0040048c94ccc04cc8cccccc044064074dd48051bab301a301b001232323253330183370e9000001099299980c800880089980ea4937617574686f72697479546f6b656e7356616c6964496e3a2047415420696e636f72726563746c79206c69766573206174205075624b6579000014a02944c080008c06c004dd5180d980e980d8010a51301b00113300e00937566032603460360022a6602e9201355768696c6520636f756e74696e67204741547320617420696e707574733a20616c6c2047415473206d7573742062652076616c69640016323019301a001301a0013758602e00290010a4c2a6602a920128412073696e676c6520617574686f7269747920746f6b656e20686173206265656e206275726e656400163018301600530150011533013491445061747465726e206d61746368206661696c75726520696e2027646f2720626c6f636b2061742061676f72612f41676f72612f4566666563742e68733a36333a352d323200163017002301200137546024602600260260046eb801000488cccccc00c02c03cdd480100091998041119b80375a602400400290001bab0011480008888cccc014cc0180100080048c888c00800cc01000448940048c014894ccc02000448940044ccc00cc02c004888c00800c4c008c0300048894ccc010cdd7801180180089118010018912800ab9a223003225333006001100313300430090013002300a0012323002233002002001230022330020020015573eae7155ceaba15744460046ea800555cf01", + "description": "agora:noOpValidator", + "params": [ + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"AuthorityTokenTag\"#PlutusLedgerApi.V1.Value:CurrencySymbol" + ], + "rawHex": "59033f01000032323232323232323232323232323222223232323232533300f3370e9001001099192999808a99911998098010008a50325333012001100113301649013373696e676c65417574686f72697479546f6b656e4275726e65643a204d757374206275726e2065786163746c79203120474154000013370e6601800e6eacc05cc8c064c064c064004c060004c8cdc0a400000290010992999809000880089980b249254f6e6c79206f6e6520474154206d7573742065786973742061742074686520696e70757473000013370e664466602a44466a666032002244a0022644460040066464466002006004603c004603800246002446664e0088004c014008cc0180140044c920004988c00c0040048c94ccc04cc8cccccc044064074dd48051bab301a301b001232323253330183370e9000001099299980c800880089980ea4937617574686f72697479546f6b656e7356616c6964496e3a2047415420696e636f72726563746c79206c69766573206174205075624b6579000014a02944c080008c06c004dd5180d980e980d8010a51301b00113300e00937566032603460360022a6602e9201355768696c6520636f756e74696e67204741547320617420696e707574733a20616c6c2047415473206d7573742062652076616c69640016323019301a001301a0013758602e00290010a4c2a6602a920128412073696e676c6520617574686f7269747920746f6b656e20686173206265656e206275726e656400163018301600530150011533013491445061747465726e206d61746368206661696c75726520696e2027646f2720626c6f636b2061742061676f72612f41676f72612f4566666563742e68733a36333a352d323200163017002301200137546024602600260260046eb801000488cccccc00c02c03cdd480100091998041119b80375a602400400290001bab0011480008888cccc014cc0180100080048c888c00800cc01000448940048c014894ccc02000448940044ccc00cc02c004888c00800c4c008c0300048894ccc010cdd7801180180089118010018912800ab9a223003225333006001100313300430090013002300a0012323002233002002001230022330020020015573eae7155ceaba15744460046ea800555cf01", + "role": "ValidatorRole", + "version": "ScriptV2" + }, + "agora:proposalPolicy": { + "cborHex": "5904b35904b001000032323232323232323232323232222323232323232533300e3370e90000010a9998071991980090008a99808249197066726f6d4a7573743a20666f756e6420504e6f7468696e67001633223300c23332230112253330140011003133004301b0013002301a0012230012253330153371090001bad301d004132233001002003337000046eb4c0740104c88cc004010008cdc00009bad301d004323223300100300248001200000133300d232223002003375660320026ea4008004dd7180a0009bab3014004225332233301200200114a066e1c009200213253330110011001133012491234275726e696e6720612070726f706f73616c206973206e6f7420737570706f72746564000013370e00290000a9998071991299980819b870024800054ccc040cdc3800a4000294454ccc040cdc3800a4004294054ccc040cdc3800a400829405280a99980819b870024800854ccc040cdc3800a4000294054ccc040cdc3800a4004294454ccc040cdc3800a400829405280a99980819b870024801054ccc040cdc3800a4000294054ccc040cdc3800a4004294054ccc040cdc3800a400829445288a99980819b87001480005280a99980819b87001480085280a99980819b87001480105288a5148000cc88cc004800454cc0440085924010f4753542073686f756c64206d6f7665003332223300d75a666601a466e95200233574000297ae0332301022533301300112250011333003301a001222300200313002301900123253330133370e64600c446602844a66602e00229000099299980c99baf301b0010051325333019001153301b4912670747279456c696d53696e676c653a20466f756e6420656d707479206c6973742d6c696b652e00161533301a35746603e0022a66603466ebcc070c0800040144dd6981118100008a9980da492766696e6456616c75653a20556e65787065637465646c79206d697373696e6720726573756c742e0016153301b4912e70747279456c696d53696e676c653a20466f756e64206e6f6e2d73696e676c65746f6e206c6973742d6c696b652e00163756604200226006603c004603c002006646eacc068c064c06c004c064c06000520021322230020033019001122500130190010022333222330030010022233010232002375a002666022464446004006603a002004002004002244a002646464466002006004602c602a004602a0026eb0024dd6180a0029bab301432301430120013013004149854cc03d24118476f76656e6f722072656465656d657220636f72726563740016153300f4911e4d696e7465642065786163746c79206f6e652070726f706f73616c2053540016153300f4914f5061747465726e206d61746368206661696c75726520696e2027646f2720626c6f636b2061742061676f72612f41676f72612f50726f706f73616c2f536372697074732e68733a3132323a352d343400163015002300e001375460226020006601a601e0026020601e002601e00244660024644460040066006002244a0024446600844a66600e002244a0022a66601066ebcc028c0380040104c014c0380044c008c0340040048c8c0088cc0080080048c0088cc00800800555cfab9a5738aae748c00cc0080048c008c0080055d12ba1230023754002aae781", + "description": "agora:proposalPolicy", + "params": [ + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"GovernorSTTag\"#Plutarch.Extra.AssetClass:AssetClass" + ], + "rawHex": "5904b001000032323232323232323232323232222323232323232533300e3370e90000010a9998071991980090008a99808249197066726f6d4a7573743a20666f756e6420504e6f7468696e67001633223300c23332230112253330140011003133004301b0013002301a0012230012253330153371090001bad301d004132233001002003337000046eb4c0740104c88cc004010008cdc00009bad301d004323223300100300248001200000133300d232223002003375660320026ea4008004dd7180a0009bab3014004225332233301200200114a066e1c009200213253330110011001133012491234275726e696e6720612070726f706f73616c206973206e6f7420737570706f72746564000013370e00290000a9998071991299980819b870024800054ccc040cdc3800a4000294454ccc040cdc3800a4004294054ccc040cdc3800a400829405280a99980819b870024800854ccc040cdc3800a4000294054ccc040cdc3800a4004294454ccc040cdc3800a400829405280a99980819b870024801054ccc040cdc3800a4000294054ccc040cdc3800a4004294054ccc040cdc3800a400829445288a99980819b87001480005280a99980819b87001480085280a99980819b87001480105288a5148000cc88cc004800454cc0440085924010f4753542073686f756c64206d6f7665003332223300d75a666601a466e95200233574000297ae0332301022533301300112250011333003301a001222300200313002301900123253330133370e64600c446602844a66602e00229000099299980c99baf301b0010051325333019001153301b4912670747279456c696d53696e676c653a20466f756e6420656d707479206c6973742d6c696b652e00161533301a35746603e0022a66603466ebcc070c0800040144dd6981118100008a9980da492766696e6456616c75653a20556e65787065637465646c79206d697373696e6720726573756c742e0016153301b4912e70747279456c696d53696e676c653a20466f756e64206e6f6e2d73696e676c65746f6e206c6973742d6c696b652e00163756604200226006603c004603c002006646eacc068c064c06c004c064c06000520021322230020033019001122500130190010022333222330030010022233010232002375a002666022464446004006603a002004002004002244a002646464466002006004602c602a004602a0026eb0024dd6180a0029bab301432301430120013013004149854cc03d24118476f76656e6f722072656465656d657220636f72726563740016153300f4911e4d696e7465642065786163746c79206f6e652070726f706f73616c2053540016153300f4914f5061747465726e206d61746368206661696c75726520696e2027646f2720626c6f636b2061742061676f72612f41676f72612f50726f706f73616c2f536372697074732e68733a3132323a352d343400163015002300e001375460226020006601a601e0026020601e002601e00244660024644460040066006002244a0024446600844a66600e002244a0022a66601066ebcc028c0380040104c014c0380044c008c0340040048c8c0088cc0080080048c0088cc00800800555cfab9a5738aae748c00cc0080048c008c0080055d12ba1230023754002aae781", + "role": "MintingPolicyRole", + "version": "ScriptV2" + }, + "agora:proposalValidator": { + "cborHex": "592a9f592a9c01000032323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323222222223232323232323232323232533305f3370e90010010991919191919191919191919191919191919191919191919191919191919191919191919191919191919191929998458099b89480000044c8c8c94ccc23804cdc4a40000022646464a6661220266e25200000113232325333094013371290000008991919299984b8099b89480000044c8c8c94ccc26804cdc4a400000226464646464a66613e0266e252000001132323232323232323232323232323232323232323232323232323253330ba013370e900000109804919299985e0099b89375a6182020220022a66617802661080202090010a99985e0098381806a40042a666178026601c4664466e24c00488cdc0800801001191bad30c3013230c30130c30130c30130c201001375800261840202c0022a6617a02128022c264a66617a02610602660ee0026eacc3080405c54ccc2f404cc20804040cc2d004c30804070cc2d004c3080406ccc2d004c30804068cc2d004c30804064cc2d004c30804060cc2d004dd31999111985f0091299986080800885c0089929998618099b870010051333006375a6194026190020044661760266ec0dd40011ba8001300430c8010031300330c701002153330c3013371200a00226617402619002004618e02004266174026190020046006618e020046eb4c31004c31c040040048c888c00800ccdc00008018009bab30c201017330b40130c201016330b40130c20130c1010160ad01149854cc2f80524011f4f75747075742070726f706f73616c2073686f756c642062652076616c6964001615330be014911b566f7465206f7074696f6e2073686f756c642062652076616c69640016375a6182020062a6617a0292012d5769647468206f662074696d652073686f756c64206d656574206d6178696d756d20726571756972656d656e74001615330bd014912f50726f706f73616c2074696d652073686f756c6420626520777468696e2074686520766f74696e6720706572696f64001615330bd014912b496e7075742070726f706f73616c206d75737420626520696e20566f74696e675265616479207374617465001615330bd01491174174206c65617374206d696e696d756d20616d6f756e74001633223330bb012223333001223222300200323300100300212250012300122333270044002600a0046600c00a002264900024c460060020024a66617802611c0260e4660fe6eb4c3040406cdd6186080985f8098600080089bad30c10100115330bd014913453616d65207374616b652073686f756c646e277420766f7465206f6e207468652073616d652070726f706f73616c2074776963650016001153330ba013370e9001001098049299985d809984180807a400026464a66617a0266e24ccc2ec048894ccc2fc0400440084cc00ccdc00012400461880200290000009bad06d153330bd01337126eb4c30804c30404048dd69861008010a99985e8099841008081985a0098610080e1985a0098610080d9985a0098610080d1985a009ba7001330b40130c201018330b40130c201017330b40130c201016330b40130c20130c1010160ad01149854cc2f8052401325369676e6174757265732061726520636f72726563746c7920616464656420746f20636f7369676e6174757265206c697374001615330be014911b4d656574206d696e696d756d20475420726571756972656d656e74001615330be01491214c65737320636f7369676e657273207468616e206d6178696d756d206c696d697400165330bd01490114557064617465207369676e6174757265207365740013332230bc012253330bf010011330b7010030b001153330c001323005223300200600330c50100115330c1014911d696e7365727465642076616c756520616c7265616479206578697374730016153330c0013230052253309d013095013300200600313300100600330c5010011330b701003330b70130c50100130c4010011330b70130c501001300230c4010013232300122323223300100300222330043007002300700122330043006002300600123300108c0108e01200130c10130c0010013758618202030a661780292011745786163746c79206f6e65207374616b6520696e707574001330b90122330012253330bf01309201001100215330c0014901154d6f7265207468616e206f6e6520656c656d656e74001615330be014910a456d707479206c697374001600115330bc0149011853686f756c6420626520696e2064726166742073746174650016153330ba013370e9002001098049299985d80a99985d80a9984a809984180807a4004260de601890010a9984a8099299985e00800880089985e80a490d566f746573206368616e67656400001308d013375e6e98ccc1c088c94ccc2f804c24004c2440400454ccc2f804c1d00044ccc1d8c1f4004dd698618080100188018a9985f80840008b19840009bad30c20101c37586184026180026182020026eacc30004054004c300040544c94ccc2f00400440044cc2f4052411750726f706f73616c2075706461746520636f7272656374000013308001330b20130c00101a330b20130c001019330b20130c001018330b20130c001017330b20130c001016330b201374c6660e04464a66617c026120026122020022a66617c0260e800226660ec60fa0026eb4c30c0400800c400c54cc2fc042000458cc20004dd698610080e1bac30c20130c00130c101001375661800202a00266164026180020286616402618002617e020281560201c264a66617802002200226617a029211250726f706f73616c20756e6368616e67656400001330800100e37580d42930a9985e00a4811750726f706f73616c206f757470757420636f7272656374001613253330bb01330800100e330b20130c00101a330b20130c001019330b2013750002661640261800202e661640261800202c661640261800202a66164026180020286616402618002617e02028156022a6661760266e1c03d20001300923001223253330bf013370e00290000a99985f8099b89375a61880202a0062a66617e0266617a024446600444a66618602006294054cc27804cc014004c3200400c4cc24c04008c3240400c4c26004004008dd618620080d8a99985f809984380802a40042930a9986000a492250726f706f73616c207374617475732073657420746f20566f74696e675265616479001615330c00149135416c6c206e657720636f7369676e65727320617265207769746e6573736564206279207468656972205374616b6520646174756d73001615330c001491204d6f726520636f7369676e73207468616e206d696e696d756d20616d6f756e740016153330bf013370e00290010a99985f809984380802a400c2930a9986000843008b0a99985f809984380802a400c2930a9986000843008b1807a40002a6661760266e1c03d200213253330bc013370e00290000a99985e009984200801240082a666178026104026644646464a66618202a661360264a6661840200220022661860292110416d626967756f75732077696e6e6572000013370e6661440244a6661860266e1cdd6986500801001899b800014800840052000005480084c94ccc3080400440044cc30c0524013b4869676865737420766f746520636f756e742073686f756c64206265206174206c6561737420746865206d696e696d756d207468726573686f6c6400001337120080022446004008244a0026eb4c31c04008dd698608080099984f809129998600099b88375a618e020026eb4c31c0400840084004c30c04008008dd598608080b1bad30c101014149854cc2f40524011857696e6e6572206f7574636f6d65206e6f7420666f756e64001615330bd014911d50726f706f73616c207374617475732073657420746f204c6f636b65640016153330bc013370e00290010a99985e0099842008012400c2930a9985e80841808b0a99985e0099842008012400c2930a9985e80841808b1806240082a6661760266e1c03d2004153330bb0133083010014801854ccc2ec04cc94ccc2f004cdc3800a4000240022a6661780266e1c0052002108e01108e01300c48018cc8c2e804894ccc2f4040045280a9984380980198618080089801186100800919b873309901375c0dc646eacc30804c30404c30c04004c30404c30004c30804005200237586180020ca2930a9985e00a492a475354206e6f74206d6f76656420696620746f6f206c6174652c206d6f766564206f7468657277697365001615330bc014911f50726f706f73616c207374617475732073657420746f2046696e69736865640016153330bb013370e01e90030a9985e00843008b0a9985e00843008b0a9985e00a492a4f6e6c7920737461747573206368616e67657320696e20746865206f75747075742070726f706f73616c0016375a617e02617a0201a6180020046174020026ea81954ccc2d804cdc3a400000426464646493299985c008008a4c2a6617402164022c6178020066eb4004c2ec0400454ccc2d804cdc3a400400426493299985a808008a4c2a6616e0215e022c2a66616c0266e1d20040021324994ccc2d40400452615330b7010af0116153330b6013370e900300109924ca66616a020022930a9985b80857808b0a9985b80858008b185e00801185b008009baa061230013230012232233001004002332232330b701223300122330920100230040011225001330b70122330012233001223006330bd0122330012233001223309a01330042233330c5012222330012253330cd0133309a010170050021330a2010053330060020010041330a2010023330060050040011330a0010030020020010041002300600110031225001005100212250010013330b6012223300122330012233001223300122323222330020040033300c00b00253330c3013330900100a008004153330c3013330900100a00600213333308f0100a00800600400213333308f0100a008002004006153330c3013330900100a00600213333308f0100a00400600800213333308f0100a00400200800613232223300200400322500153330c10133308e01008006002153330c10133308e01008006004153330c10133308e0100800400213222330020090033222330020070033222330020050032250011322233002009003322233002005003322233002007003225001153330c10133308e0100800600213222330020070033222330020090033222330020050032250011322233002007003322233002005003322233002009003225001153330c10133308e01008002004153330c10133308e0100800400613222330020050033222330020070033222330020090032250011322233002005003322233002009003322233002007003225001153330c10133308e010080020061322233002007003322233002005003322233002009003225001132223300200700332223300200900332223300200500322500113232223300200400322500153330bf0133308c010060040021322233002007003322233002005003225001132223300200500332223300200700322500113232223300200400322500132223300200500322500112250010020012330010850108701001333230b20122253330b60100110021330033300400230bc0100130bb0100122332233001230030011004230032232322330010030023308e0130be0130bd01004002337000046eb4c2f40400cc014004c8c88cc00400c008894005200037586170020b8464a66616602610a02610c02002260040022a6616802921155374616b6520696e70757473206e6f74206e756c6c001633086010023758616e020b8664446464a66616a0266e1cc8c01888cc2d804894ccc2e4040045200013253330bb013375e617a0200200a264a666176020022a6617a029212670747279456c696d53696e676c653a20466f756e6420656d707479206c6973742d6c696b652e0016153330bc0130920130c001001153330bc013375e617c0261820200200a26eb4c30c04c3040400454cc2f4052412766696e6456616c75653a20556e65787065637465646c79206d697373696e6720726573756c742e001615330bd014912e70747279456c696d53696e676c653a20466f756e64206e6f6e2d73696e676c65746f6e206c6973742d6c696b652e0016375661840200226006617e02004617e020020066eacc2e8040052002130a1015330b601491135265736f6c7665207374616b6520646174756d0013758664461320266136024646464646464646464646464646464646464646402aa666194020022930a9986600862008b1867008019985c00919191919191919191919190062999869808008a4c2a661aa0219a022c61ae0200ca6661a40266e1d20000021324994ccc3440400452615330d3010cb0116153330d2013370e900100109919191919299986b8099b89480000044c8c92653330d701001149854cc364043440458c36c0400c54cc360043140458dd6800986d00800986c008019bad00130d701001153330d2013370e900200109924ca6661a2020022930a9986980865808b0a9986980866008b186c008011869008009baa00130d30100130d101003375a00261a0020026eb0004dd600098668080098658080329998630099b87480000084c8c8c8c8c8c8c92653330cb01001149854cc334043140458c33c040194ccc32804cdc3a400000426464a6661980266e1cdc6800a407026464932999866008008a4c2a6619c0218c022c61a0020062a6619a0217a022c6eb8004c33c0400454ccc32804cdc3a400400426464a6661980266e1cdc6800a407026464932999866008008a4c2a6619c0218c022c61a0020062a6619a02188022c6eb8004c33c0400454cc32c043100458c34004008c32804004dd50009865808008a9998630099b87480080084c92653330c501001149854cc31c042fc045854cc31c043000458c33004008c31804004dd500098638080098628080329998600099b87480000084c8c94ccc30804cdc39b8d001480e04c8c92653330c201001149854cc310042f00458c3180400c54cc30c042cc0458dd70009862808008a9998600099b87480080084c8c94ccc30804cdc39b8d001480e04c8c92653330c201001149854cc310042f00458c3180400c54cc30c042e80458dd70009862808008a998608085d008b1863008011860008009baa00130c10100130bf01003375a002617c020026eb0004cc27004008004c2e804c2e404004010428804c2e004004c2e404c2e004c2dc04c2e404004c8c8c88cc00400c008c2dc04c2d804008c2d804004dd60319bab30b50130b40130b4010553300123332222323232323006223232323253330be013370e01690000a99985f00a9984c0099b8900d00613371200a008290000a99985f0099b8800400614800854cc2fc04254045854ccc2f804cdc3805a40042a66617c02a661300266e240100184cdc48028018a40002a66617c0266e2000c0185200215330bf010950116153330be013370e01690020a99985f00a9984c0099b8900300613371200a004290000a99985f0099b8800200614800854cc2fc04254045854ccc2f804cdc3805a400c2a66617c02a661300266e240080184cdc48028008a40002a66617c0266e200040185200215330bf010950116153330be01533098013371200400c266e2401400452000153330be013371000200c290010a9985f8084a808b19b80001375a61840200e66e00004dd698608080399b80001375a61800200e66e00024dd6985f80805185d80800985d00800985c80800985c008021bac30b501009375a616a026168020120022a661600210e022c6464666444660044660044644460040066600a004002244a002266002444a002244a00244a6661640266e2000800448cc00400c00854cc2cc0524123557070657220626f756e6420626967676572207468616e206c6f77657220626f756e6400163253330b101323370e6168026ea8005200230b60130b501001132323253330b4013370e900100109850009bad30b90100115330b50108d0110a10130ba0100230b4010013754616c020022a661640292014663757272656e7450726f706f73616c54696d653a206c6f77657220626f756e64206f66207468652074696d652072616e67652073686f756c6420626520696e636c757369766500109e0130b60130b5010013232323253330b4013370e900100109850009bad30b90100115330b50108d0110a10130ba0100230b4010013754616c02002616c02616a02616802002616a020026166020a866152029211d70726f706f73616c20696e7075742073686f756c642070726573656e7400330aa01232323253330b10153308b013253330b20100110011330b301491194f776e2062792070726f706f73616c2076616c696461746f720000133223300223300223371e00400229404cc0049280a51308d0130b601003308d0130b60105213253330b20100110011330b30149010f4861732070726f706f73616c205354000013370e6611c026eb8188dd5985b00801240042613a026eb14cc2c8052401165265736f6c76652070726f706f73616c20646174756d0013322309501330970123232323232323232323232323232323232323232323232323232323232323232323232323232323232323253330df01337129000000899191929998710099b89480000044c8c8c94ccc39404cdc4a40000022646464a6661d00266e252000001132323253330eb01337129000000899191929998770099b89480000044c8c8c8c8c94ccc3cc04cdc4a400000226464084a6661e6020022930a9987a80876808b187b808018a9987a00870808b1bad00130f60100130f40101653330ee01001149854cc3c0043a00458c3c80400c54cc3bc043700458dd68009878808009877808018a998760086c808b1bad00130ee0100130ec0100315330e9010d60116375a00261d60200261d2020062a661cc021a6022c6eb4004c3a004004c3980400c54cc38c043400458dd68009872808009871808018a9987000866808b1bad00130e201001375800261c00200261bc0200a6196026eac00ccc334048cdd819186e008011bad30db010013230e101002375a61c0020020026eac004c36c04004c3640404d4ccc34c0400452615330d5010cd011630d701003375a00261ac0200261a8020066eb4004c34c04004c3440400cdd68009868008009867008019bad00130cd0100130cb01003375a0026194020026eb0004c32004004c3180400ccc2c0048c8c8c8c80154ccc31404cdc3a400000426464a66618e0266e1cdc6800a407026464932999863808008a4c2a6619202182022c6196020062a6619002170022c6eb8004c3280400454ccc31404cdc3a400400426464a66618e0266e1cdc6800a407026464932999863808008a4c2a6619202182022c6196020062a661900217e022c6eb8004c3280400454cc318042fc0458c32c04008c31404004dd50009bac00130c50100130c301003375a00261840200261800200a615a026eac00ccc2bc048cdd819185f008011bad30bd0100132323230c50100430b00137566188020066616202466ec0c94ccc2f804cdc39b8d001480e04c3000400854cc2fc042d80458dd7185f8080099191929998600099b87371a6eb800920401323232323232323230cf0100c53330c601001149854cc320043000458c328040194ccc31404cdc3a400000426464a66618e0266e1cdc6800a407026464932999863808008a4c2a6619202182022c6196020062a661900217e022c6eb8004c3280400454ccc31404cdc3a4004004264932999862008008a4c2a6618c0217c022c2a6618c0217e022c619602004618a020026ea8004c31804004c3100400c54cc304042ec0458dd70009861808009bac30c40100100137566184020020026eac004c2f404004c2ec0400cdd6800985d008009bac001330980100200130b6010013756616c02616a02616a020ac213c026168020026166020026168020026eb0c2c804154dd69858808049857808009857008009856808009bac30ad0100330ab0100130aa0100130a90100130a80100130a70100130a60100137580a0a66613e020022930a998508084c808b1851808018a9985000846808b1bad00130a20100130a001016533309a01001149854cc270042500458c2780400c54cc26c042200458dd6800984e80800984d808018a9984c00842808b1bad001309a010013098010031533095010820116375a002612e02002612a020062a66124020fe2c6eb4004c25004004c2480400c54cc23c041f058dd68009848808009847808018a998460083c8b1bad001308e01001375800261180200261140200a60ee6eac00ccc1e48cdd8191844008011bad30870100132308d01002375a6118020020026eac004c21c04004c2140404d4ccc1fc00452615330810107916308301003375a0026104020026100020066eb4004c1fc004c1f400cdd6800983e000983d0019bad00130790013077003375a00260ec0026eb0004c1d0004c1c800ccc1708c8c8c8c80154ccc1c4cdc3a400000426464a6660e666e1cdc6800a4070264649329998398008a4c2a660ea0da2c60ee0062a660e80c82c6eb8004c1d800454ccc1c4cdc3a400400426464a6660e666e1cdc6800a4070264649329998398008a4c2a660ea0da2c60ee0062a660e80d62c6eb8004c1d800454cc1c81ac58c1dc008c1c4004dd50009bac0013071001306f003375a00260dc00260d800a60b26eac00ccc16c8cdd81918350011bad30690013232323071004305c375660e0006660ba466ec0c94ccc1a8cdc39b8d001480e04c1b000854cc1ac18858dd71835800991919299983619b87371a6eb8009204013232323232323232307b00c5333072001149854cc1d01b058c1d80194ccc1c4cdc3a400000426464a6660e666e1cdc6800a4070264649329998398008a4c2a660ea0da2c60ee0062a660e80d62c6eb8004c1d800454ccc1c4cdc3a40040042649329998380008a4c2a660e40d42c2a660e40d62c60ee00460e20026ea8004c1c8004c1c000c54cc1b419c58dd700098378009bac3070001001375660dc0020026eac004c1a4004c19c00cdd680098330009bac00f3065323065306430660013305b4901184f776e20696e7075742073686f756c642070726573656e740033223305e253330623375e00660ce60d00022446004006244a00200260c80026eb0c19002454cc1812414f5061747465726e206d61746368206661696c75726520696e2027646f2720626c6f636b2061742061676f72612f41676f72612f50726f706f73616c2f536372697074732e68733a3235323a352d353100163065002305f001375460c260c001060be00260ba60bc00260ba60ba00260b800260b600260b800260b400260b40024a66609a66e1c005200014a22a66609a66e1c005200214a029408c128888cc00488cc014cc0180100080044008c0048ccc0049288a5014a046090446600244a6602e600a004260080022940888ccc0108c94ccc134cdc4a400000224460040062a6609c0162c66e0400400c00c004888cccc0100080048ccc0100048ccc02001000400c4ccc020800400c00840048cc0c0008dd40009191118010019bad304d001223300323303e337606ea000cdd4001000801111199822112999823800891800980301f8991299982519b88002006133004304e003230023304230500040011533304a3370e00400c26002600e609c00626002600e66082609e006609c0066eb4c128c134004004800524012a526573756c74696e6720766f746520636f756e742067726561746572206f7220657175616c20746f20300023303e00233003233300102f10301030001491096e6f7420766f746572002303e223300122333005002222300200313004001122500149011e5374616b6520696e7075742073686f756c642062652072656c6576616e740023012232330043370e0066eb4c114004c8c8c94ccc10ccdc3a40000042444a0042a66608666e1d20020021322223003004375a60900022444a002609200460860026ea8c114c110004dd600091299981f0010981500088159119baf374e0046e9c0048cc0049288a5049012150726f706f73616c2073686f756c64206661696c3a206e6f74206f6e2074696d650022533303a3370e00490000a99981d19b87001480005288a99981d19b87001480085280a99981d19b87001480105280a99981d19b87001480185280a501533303a3370e00490010a99981d19b87001480005280a99981d19b87001480085288a99981d19b87001480105280a99981d19b87001480185280a501533303a3370e00490020a99981d19b87001480005280a99981d19b87001480085280a99981d19b87001480105288a99981d19b87001480185280a501533303a3370e00490030a99981d19b87001480005280a99981d19b87001480085280a99981d19b87001480105280a99981d19b87001480185288a511533303a3370e00290000a501533303a3370e00290010a501533303a3370e00290020a501533303a3370e00290030a5114a246607000200429452412546696e69736865642070726f706f73616c732063616e6e6f7420626520616476616e6365640022222533303933300600500400315333039333006005002001153330393330060050030021322233002007003322233002006003322233002005003322233002004003225001132223300200700332223300200500332223300200600332223300200400322500115333039333006005003001132223300200700332223300200600332223300200400332223300200500322500113222330020070033222330020040033222330020060033222330020050032250011533303933300600500200115333039333006005004002132223300200600332223300200700332223300200500332223300200400322500113222330020060033222330020050033222330020070033222330020040032250011533303933300600500400113222330020060033222330020070033222330020040033222330020050032250011322233002006003322233002004003322233002007003322233002005003225001222300322330010040030012232323253330363370e90010010991919299981c99b8748000008528099baf374e0086e9c004c0fc008c0e4004dd50020991919299981c99b8748008008528099baf374e0086e9c004c0fc008c0e4004dd5002181e001181b0009baa0020012232323232533303533710004002294454ccc0d4cdc38010008991919b91375c60780046eb8c0f0004c0f4010c0f0010528181b001181a8011baa0023754004466605e002941289198009125014a24605644a66605c002244a0022666006606800246600a00260066068004260046066002444466004008006ae8d2412f7067657452656c6174696f6e3a20746f6f206561726c79206f7220696e76616c69642063757272656e742074696d650049011e556e61626c6520746f207265736f6c76652063757272656e742074696d650049013163757272656e7450726f706f73616c54696d653a2074696d652072616e67652073686f756c6420626520626f756e646564002233302800200100314a04646464a66605066e1d2002002132223002003375c605a002244a002605c00460500026ea8c0a8c0ac00400488cccccc00c0980acdd480100091998031119b80375a605c00400290001bab0011480008888cccc088cc0140100080048c888c00800cc01000448940048894ccc08ccdd780118018008911801001891280091180f912999811000880189980218140009801181380091980090008a998100010b2481197066726f6d4a7573743a20666f756e6420504e6f7468696e67002233001232223002003300300112250012232323253330203370e90000010a9981080308068a99981019b874800800854cc08401c4cc020dd7181280080209a9981080588061812800981300118100009baa002491086e6f20646174756d0049010a646174756d20686173680023300200337520024446603044a666036002244a0022a66603866ebcc078c0840040104c014c0840044c008c0800040048c888c00800cc07800524010c696e6c696e6520646174756d0022230020032250014901257074727946726f6d28504f53495854696d65293a206d75737420626520706f7369746976650023010225333013001100413300b30033019001300230180014bd7024812c7074727946726f6d28505075624b657948617368293a206d757374206265203238206279746573206c6f6e6700233300d2253330100011200413225333013300100215330140071613300430170032337100020066eb4c04cc0580040049281199806112999807800890020991299980918008010a998098030b099802180b001919b90001003375c6024602a00200249412410c756e736f72746564206d6170002300a22533300d001100413300530033013001300230120014bd6f7b6302ba04912c7074727946726f6d285053637269707448617368293a206d757374206265203238206279746573206c6f6e67004901317074727946726f6d2850446174615265636f72645b5d293a206c697374206973206c6f6e676572207468616e207a65726f0049013f7265616368656420656e64206f662073756d207768696c65207374696c6c206e6f7420686176696e6720666f756e642074686520636f6e7374727563746f720049012b7074727946726f6d2850446174756d48617368293a206d757374206265203332206279746573206c6f6e6700223300120011533007002162300222533300500112250011333003300b001222300200313002300a0012323002233002002001230022330020020015573eae695ce2ab9d2300230020015744ae848c008dd5000aab9e01", + "description": "agora:proposalValidator", + "params": [ + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"StakeSTTag\"#Plutarch.Extra.AssetClass:AssetClass", + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"GovernorSTTag\"#PlutusLedgerApi.V1.Value:CurrencySymbol", + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"ProposalSTTag\"#PlutusLedgerApi.V1.Value:CurrencySymbol", + "Ply.Core.Types:AsData#GHC.Num.Integer:Integer" + ], + "rawHex": "592a9c01000032323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323222222223232323232323232323232533305f3370e90010010991919191919191919191919191919191919191919191919191919191919191919191919191919191919191929998458099b89480000044c8c8c94ccc23804cdc4a40000022646464a6661220266e25200000113232325333094013371290000008991919299984b8099b89480000044c8c8c94ccc26804cdc4a400000226464646464a66613e0266e252000001132323232323232323232323232323232323232323232323232323253330ba013370e900000109804919299985e0099b89375a6182020220022a66617802661080202090010a99985e0098381806a40042a666178026601c4664466e24c00488cdc0800801001191bad30c3013230c30130c30130c30130c201001375800261840202c0022a6617a02128022c264a66617a02610602660ee0026eacc3080405c54ccc2f404cc20804040cc2d004c30804070cc2d004c3080406ccc2d004c30804068cc2d004c30804064cc2d004c30804060cc2d004dd31999111985f0091299986080800885c0089929998618099b870010051333006375a6194026190020044661760266ec0dd40011ba8001300430c8010031300330c701002153330c3013371200a00226617402619002004618e02004266174026190020046006618e020046eb4c31004c31c040040048c888c00800ccdc00008018009bab30c201017330b40130c201016330b40130c20130c1010160ad01149854cc2f80524011f4f75747075742070726f706f73616c2073686f756c642062652076616c6964001615330be014911b566f7465206f7074696f6e2073686f756c642062652076616c69640016375a6182020062a6617a0292012d5769647468206f662074696d652073686f756c64206d656574206d6178696d756d20726571756972656d656e74001615330bd014912f50726f706f73616c2074696d652073686f756c6420626520777468696e2074686520766f74696e6720706572696f64001615330bd014912b496e7075742070726f706f73616c206d75737420626520696e20566f74696e675265616479207374617465001615330bd01491174174206c65617374206d696e696d756d20616d6f756e74001633223330bb012223333001223222300200323300100300212250012300122333270044002600a0046600c00a002264900024c460060020024a66617802611c0260e4660fe6eb4c3040406cdd6186080985f8098600080089bad30c10100115330bd014913453616d65207374616b652073686f756c646e277420766f7465206f6e207468652073616d652070726f706f73616c2074776963650016001153330ba013370e9001001098049299985d809984180807a400026464a66617a0266e24ccc2ec048894ccc2fc0400440084cc00ccdc00012400461880200290000009bad06d153330bd01337126eb4c30804c30404048dd69861008010a99985e8099841008081985a0098610080e1985a0098610080d9985a0098610080d1985a009ba7001330b40130c201018330b40130c201017330b40130c201016330b40130c20130c1010160ad01149854cc2f8052401325369676e6174757265732061726520636f72726563746c7920616464656420746f20636f7369676e6174757265206c697374001615330be014911b4d656574206d696e696d756d20475420726571756972656d656e74001615330be01491214c65737320636f7369676e657273207468616e206d6178696d756d206c696d697400165330bd01490114557064617465207369676e6174757265207365740013332230bc012253330bf010011330b7010030b001153330c001323005223300200600330c50100115330c1014911d696e7365727465642076616c756520616c7265616479206578697374730016153330c0013230052253309d013095013300200600313300100600330c5010011330b701003330b70130c50100130c4010011330b70130c501001300230c4010013232300122323223300100300222330043007002300700122330043006002300600123300108c0108e01200130c10130c0010013758618202030a661780292011745786163746c79206f6e65207374616b6520696e707574001330b90122330012253330bf01309201001100215330c0014901154d6f7265207468616e206f6e6520656c656d656e74001615330be014910a456d707479206c697374001600115330bc0149011853686f756c6420626520696e2064726166742073746174650016153330ba013370e9002001098049299985d80a99985d80a9984a809984180807a4004260de601890010a9984a8099299985e00800880089985e80a490d566f746573206368616e67656400001308d013375e6e98ccc1c088c94ccc2f804c24004c2440400454ccc2f804c1d00044ccc1d8c1f4004dd698618080100188018a9985f80840008b19840009bad30c20101c37586184026180026182020026eacc30004054004c300040544c94ccc2f00400440044cc2f4052411750726f706f73616c2075706461746520636f7272656374000013308001330b20130c00101a330b20130c001019330b20130c001018330b20130c001017330b20130c001016330b201374c6660e04464a66617c026120026122020022a66617c0260e800226660ec60fa0026eb4c30c0400800c400c54cc2fc042000458cc20004dd698610080e1bac30c20130c00130c101001375661800202a00266164026180020286616402618002617e020281560201c264a66617802002200226617a029211250726f706f73616c20756e6368616e67656400001330800100e37580d42930a9985e00a4811750726f706f73616c206f757470757420636f7272656374001613253330bb01330800100e330b20130c00101a330b20130c001019330b2013750002661640261800202e661640261800202c661640261800202a66164026180020286616402618002617e02028156022a6661760266e1c03d20001300923001223253330bf013370e00290000a99985f8099b89375a61880202a0062a66617e0266617a024446600444a66618602006294054cc27804cc014004c3200400c4cc24c04008c3240400c4c26004004008dd618620080d8a99985f809984380802a40042930a9986000a492250726f706f73616c207374617475732073657420746f20566f74696e675265616479001615330c00149135416c6c206e657720636f7369676e65727320617265207769746e6573736564206279207468656972205374616b6520646174756d73001615330c001491204d6f726520636f7369676e73207468616e206d696e696d756d20616d6f756e740016153330bf013370e00290010a99985f809984380802a400c2930a9986000843008b0a99985f809984380802a400c2930a9986000843008b1807a40002a6661760266e1c03d200213253330bc013370e00290000a99985e009984200801240082a666178026104026644646464a66618202a661360264a6661840200220022661860292110416d626967756f75732077696e6e6572000013370e6661440244a6661860266e1cdd6986500801001899b800014800840052000005480084c94ccc3080400440044cc30c0524013b4869676865737420766f746520636f756e742073686f756c64206265206174206c6561737420746865206d696e696d756d207468726573686f6c6400001337120080022446004008244a0026eb4c31c04008dd698608080099984f809129998600099b88375a618e020026eb4c31c0400840084004c30c04008008dd598608080b1bad30c101014149854cc2f40524011857696e6e6572206f7574636f6d65206e6f7420666f756e64001615330bd014911d50726f706f73616c207374617475732073657420746f204c6f636b65640016153330bc013370e00290010a99985e0099842008012400c2930a9985e80841808b0a99985e0099842008012400c2930a9985e80841808b1806240082a6661760266e1c03d2004153330bb0133083010014801854ccc2ec04cc94ccc2f004cdc3800a4000240022a6661780266e1c0052002108e01108e01300c48018cc8c2e804894ccc2f4040045280a9984380980198618080089801186100800919b873309901375c0dc646eacc30804c30404c30c04004c30404c30004c30804005200237586180020ca2930a9985e00a492a475354206e6f74206d6f76656420696620746f6f206c6174652c206d6f766564206f7468657277697365001615330bc014911f50726f706f73616c207374617475732073657420746f2046696e69736865640016153330bb013370e01e90030a9985e00843008b0a9985e00843008b0a9985e00a492a4f6e6c7920737461747573206368616e67657320696e20746865206f75747075742070726f706f73616c0016375a617e02617a0201a6180020046174020026ea81954ccc2d804cdc3a400000426464646493299985c008008a4c2a6617402164022c6178020066eb4004c2ec0400454ccc2d804cdc3a400400426493299985a808008a4c2a6616e0215e022c2a66616c0266e1d20040021324994ccc2d40400452615330b7010af0116153330b6013370e900300109924ca66616a020022930a9985b80857808b0a9985b80858008b185e00801185b008009baa061230013230012232233001004002332232330b701223300122330920100230040011225001330b70122330012233001223006330bd0122330012233001223309a01330042233330c5012222330012253330cd0133309a010170050021330a2010053330060020010041330a2010023330060050040011330a0010030020020010041002300600110031225001005100212250010013330b6012223300122330012233001223300122323222330020040033300c00b00253330c3013330900100a008004153330c3013330900100a00600213333308f0100a00800600400213333308f0100a008002004006153330c3013330900100a00600213333308f0100a00400600800213333308f0100a00400200800613232223300200400322500153330c10133308e01008006002153330c10133308e01008006004153330c10133308e0100800400213222330020090033222330020070033222330020050032250011322233002009003322233002005003322233002007003225001153330c10133308e0100800600213222330020070033222330020090033222330020050032250011322233002007003322233002005003322233002009003225001153330c10133308e01008002004153330c10133308e0100800400613222330020050033222330020070033222330020090032250011322233002005003322233002009003322233002007003225001153330c10133308e010080020061322233002007003322233002005003322233002009003225001132223300200700332223300200900332223300200500322500113232223300200400322500153330bf0133308c010060040021322233002007003322233002005003225001132223300200500332223300200700322500113232223300200400322500132223300200500322500112250010020012330010850108701001333230b20122253330b60100110021330033300400230bc0100130bb0100122332233001230030011004230032232322330010030023308e0130be0130bd01004002337000046eb4c2f40400cc014004c8c88cc00400c008894005200037586170020b8464a66616602610a02610c02002260040022a6616802921155374616b6520696e70757473206e6f74206e756c6c001633086010023758616e020b8664446464a66616a0266e1cc8c01888cc2d804894ccc2e4040045200013253330bb013375e617a0200200a264a666176020022a6617a029212670747279456c696d53696e676c653a20466f756e6420656d707479206c6973742d6c696b652e0016153330bc0130920130c001001153330bc013375e617c0261820200200a26eb4c30c04c3040400454cc2f4052412766696e6456616c75653a20556e65787065637465646c79206d697373696e6720726573756c742e001615330bd014912e70747279456c696d53696e676c653a20466f756e64206e6f6e2d73696e676c65746f6e206c6973742d6c696b652e0016375661840200226006617e02004617e020020066eacc2e8040052002130a1015330b601491135265736f6c7665207374616b6520646174756d0013758664461320266136024646464646464646464646464646464646464646402aa666194020022930a9986600862008b1867008019985c00919191919191919191919190062999869808008a4c2a661aa0219a022c61ae0200ca6661a40266e1d20000021324994ccc3440400452615330d3010cb0116153330d2013370e900100109919191919299986b8099b89480000044c8c92653330d701001149854cc364043440458c36c0400c54cc360043140458dd6800986d00800986c008019bad00130d701001153330d2013370e900200109924ca6661a2020022930a9986980865808b0a9986980866008b186c008011869008009baa00130d30100130d101003375a00261a0020026eb0004dd600098668080098658080329998630099b87480000084c8c8c8c8c8c8c92653330cb01001149854cc334043140458c33c040194ccc32804cdc3a400000426464a6661980266e1cdc6800a407026464932999866008008a4c2a6619c0218c022c61a0020062a6619a0217a022c6eb8004c33c0400454ccc32804cdc3a400400426464a6661980266e1cdc6800a407026464932999866008008a4c2a6619c0218c022c61a0020062a6619a02188022c6eb8004c33c0400454cc32c043100458c34004008c32804004dd50009865808008a9998630099b87480080084c92653330c501001149854cc31c042fc045854cc31c043000458c33004008c31804004dd500098638080098628080329998600099b87480000084c8c94ccc30804cdc39b8d001480e04c8c92653330c201001149854cc310042f00458c3180400c54cc30c042cc0458dd70009862808008a9998600099b87480080084c8c94ccc30804cdc39b8d001480e04c8c92653330c201001149854cc310042f00458c3180400c54cc30c042e80458dd70009862808008a998608085d008b1863008011860008009baa00130c10100130bf01003375a002617c020026eb0004cc27004008004c2e804c2e404004010428804c2e004004c2e404c2e004c2dc04c2e404004c8c8c88cc00400c008c2dc04c2d804008c2d804004dd60319bab30b50130b40130b4010553300123332222323232323006223232323253330be013370e01690000a99985f00a9984c0099b8900d00613371200a008290000a99985f0099b8800400614800854cc2fc04254045854ccc2f804cdc3805a40042a66617c02a661300266e240100184cdc48028018a40002a66617c0266e2000c0185200215330bf010950116153330be013370e01690020a99985f00a9984c0099b8900300613371200a004290000a99985f0099b8800200614800854cc2fc04254045854ccc2f804cdc3805a400c2a66617c02a661300266e240080184cdc48028008a40002a66617c0266e200040185200215330bf010950116153330be01533098013371200400c266e2401400452000153330be013371000200c290010a9985f8084a808b19b80001375a61840200e66e00004dd698608080399b80001375a61800200e66e00024dd6985f80805185d80800985d00800985c80800985c008021bac30b501009375a616a026168020120022a661600210e022c6464666444660044660044644460040066600a004002244a002266002444a002244a00244a6661640266e2000800448cc00400c00854cc2cc0524123557070657220626f756e6420626967676572207468616e206c6f77657220626f756e6400163253330b101323370e6168026ea8005200230b60130b501001132323253330b4013370e900100109850009bad30b90100115330b50108d0110a10130ba0100230b4010013754616c020022a661640292014663757272656e7450726f706f73616c54696d653a206c6f77657220626f756e64206f66207468652074696d652072616e67652073686f756c6420626520696e636c757369766500109e0130b60130b5010013232323253330b4013370e900100109850009bad30b90100115330b50108d0110a10130ba0100230b4010013754616c02002616c02616a02616802002616a020026166020a866152029211d70726f706f73616c20696e7075742073686f756c642070726573656e7400330aa01232323253330b10153308b013253330b20100110011330b301491194f776e2062792070726f706f73616c2076616c696461746f720000133223300223300223371e00400229404cc0049280a51308d0130b601003308d0130b60105213253330b20100110011330b30149010f4861732070726f706f73616c205354000013370e6611c026eb8188dd5985b00801240042613a026eb14cc2c8052401165265736f6c76652070726f706f73616c20646174756d0013322309501330970123232323232323232323232323232323232323232323232323232323232323232323232323232323232323253330df01337129000000899191929998710099b89480000044c8c8c94ccc39404cdc4a40000022646464a6661d00266e252000001132323253330eb01337129000000899191929998770099b89480000044c8c8c8c8c94ccc3cc04cdc4a400000226464084a6661e6020022930a9987a80876808b187b808018a9987a00870808b1bad00130f60100130f40101653330ee01001149854cc3c0043a00458c3c80400c54cc3bc043700458dd68009878808009877808018a998760086c808b1bad00130ee0100130ec0100315330e9010d60116375a00261d60200261d2020062a661cc021a6022c6eb4004c3a004004c3980400c54cc38c043400458dd68009872808009871808018a9987000866808b1bad00130e201001375800261c00200261bc0200a6196026eac00ccc334048cdd819186e008011bad30db010013230e101002375a61c0020020026eac004c36c04004c3640404d4ccc34c0400452615330d5010cd011630d701003375a00261ac0200261a8020066eb4004c34c04004c3440400cdd68009868008009867008019bad00130cd0100130cb01003375a0026194020026eb0004c32004004c3180400ccc2c0048c8c8c8c80154ccc31404cdc3a400000426464a66618e0266e1cdc6800a407026464932999863808008a4c2a6619202182022c6196020062a6619002170022c6eb8004c3280400454ccc31404cdc3a400400426464a66618e0266e1cdc6800a407026464932999863808008a4c2a6619202182022c6196020062a661900217e022c6eb8004c3280400454cc318042fc0458c32c04008c31404004dd50009bac00130c50100130c301003375a00261840200261800200a615a026eac00ccc2bc048cdd819185f008011bad30bd0100132323230c50100430b00137566188020066616202466ec0c94ccc2f804cdc39b8d001480e04c3000400854cc2fc042d80458dd7185f8080099191929998600099b87371a6eb800920401323232323232323230cf0100c53330c601001149854cc320043000458c328040194ccc31404cdc3a400000426464a66618e0266e1cdc6800a407026464932999863808008a4c2a6619202182022c6196020062a661900217e022c6eb8004c3280400454ccc31404cdc3a4004004264932999862008008a4c2a6618c0217c022c2a6618c0217e022c619602004618a020026ea8004c31804004c3100400c54cc304042ec0458dd70009861808009bac30c40100100137566184020020026eac004c2f404004c2ec0400cdd6800985d008009bac001330980100200130b6010013756616c02616a02616a020ac213c026168020026166020026168020026eb0c2c804154dd69858808049857808009857008009856808009bac30ad0100330ab0100130aa0100130a90100130a80100130a70100130a60100137580a0a66613e020022930a998508084c808b1851808018a9985000846808b1bad00130a20100130a001016533309a01001149854cc270042500458c2780400c54cc26c042200458dd6800984e80800984d808018a9984c00842808b1bad001309a010013098010031533095010820116375a002612e02002612a020062a66124020fe2c6eb4004c25004004c2480400c54cc23c041f058dd68009848808009847808018a998460083c8b1bad001308e01001375800261180200261140200a60ee6eac00ccc1e48cdd8191844008011bad30870100132308d01002375a6118020020026eac004c21c04004c2140404d4ccc1fc00452615330810107916308301003375a0026104020026100020066eb4004c1fc004c1f400cdd6800983e000983d0019bad00130790013077003375a00260ec0026eb0004c1d0004c1c800ccc1708c8c8c8c80154ccc1c4cdc3a400000426464a6660e666e1cdc6800a4070264649329998398008a4c2a660ea0da2c60ee0062a660e80c82c6eb8004c1d800454ccc1c4cdc3a400400426464a6660e666e1cdc6800a4070264649329998398008a4c2a660ea0da2c60ee0062a660e80d62c6eb8004c1d800454cc1c81ac58c1dc008c1c4004dd50009bac0013071001306f003375a00260dc00260d800a60b26eac00ccc16c8cdd81918350011bad30690013232323071004305c375660e0006660ba466ec0c94ccc1a8cdc39b8d001480e04c1b000854cc1ac18858dd71835800991919299983619b87371a6eb8009204013232323232323232307b00c5333072001149854cc1d01b058c1d80194ccc1c4cdc3a400000426464a6660e666e1cdc6800a4070264649329998398008a4c2a660ea0da2c60ee0062a660e80d62c6eb8004c1d800454ccc1c4cdc3a40040042649329998380008a4c2a660e40d42c2a660e40d62c60ee00460e20026ea8004c1c8004c1c000c54cc1b419c58dd700098378009bac3070001001375660dc0020026eac004c1a4004c19c00cdd680098330009bac00f3065323065306430660013305b4901184f776e20696e7075742073686f756c642070726573656e740033223305e253330623375e00660ce60d00022446004006244a00200260c80026eb0c19002454cc1812414f5061747465726e206d61746368206661696c75726520696e2027646f2720626c6f636b2061742061676f72612f41676f72612f50726f706f73616c2f536372697074732e68733a3235323a352d353100163065002305f001375460c260c001060be00260ba60bc00260ba60ba00260b800260b600260b800260b400260b40024a66609a66e1c005200014a22a66609a66e1c005200214a029408c128888cc00488cc014cc0180100080044008c0048ccc0049288a5014a046090446600244a6602e600a004260080022940888ccc0108c94ccc134cdc4a400000224460040062a6609c0162c66e0400400c00c004888cccc0100080048ccc0100048ccc02001000400c4ccc020800400c00840048cc0c0008dd40009191118010019bad304d001223300323303e337606ea000cdd4001000801111199822112999823800891800980301f8991299982519b88002006133004304e003230023304230500040011533304a3370e00400c26002600e609c00626002600e66082609e006609c0066eb4c128c134004004800524012a526573756c74696e6720766f746520636f756e742067726561746572206f7220657175616c20746f20300023303e00233003233300102f10301030001491096e6f7420766f746572002303e223300122333005002222300200313004001122500149011e5374616b6520696e7075742073686f756c642062652072656c6576616e740023012232330043370e0066eb4c114004c8c8c94ccc10ccdc3a40000042444a0042a66608666e1d20020021322223003004375a60900022444a002609200460860026ea8c114c110004dd600091299981f0010981500088159119baf374e0046e9c0048cc0049288a5049012150726f706f73616c2073686f756c64206661696c3a206e6f74206f6e2074696d650022533303a3370e00490000a99981d19b87001480005288a99981d19b87001480085280a99981d19b87001480105280a99981d19b87001480185280a501533303a3370e00490010a99981d19b87001480005280a99981d19b87001480085288a99981d19b87001480105280a99981d19b87001480185280a501533303a3370e00490020a99981d19b87001480005280a99981d19b87001480085280a99981d19b87001480105288a99981d19b87001480185280a501533303a3370e00490030a99981d19b87001480005280a99981d19b87001480085280a99981d19b87001480105280a99981d19b87001480185288a511533303a3370e00290000a501533303a3370e00290010a501533303a3370e00290020a501533303a3370e00290030a5114a246607000200429452412546696e69736865642070726f706f73616c732063616e6e6f7420626520616476616e6365640022222533303933300600500400315333039333006005002001153330393330060050030021322233002007003322233002006003322233002005003322233002004003225001132223300200700332223300200500332223300200600332223300200400322500115333039333006005003001132223300200700332223300200600332223300200400332223300200500322500113222330020070033222330020040033222330020060033222330020050032250011533303933300600500200115333039333006005004002132223300200600332223300200700332223300200500332223300200400322500113222330020060033222330020050033222330020070033222330020040032250011533303933300600500400113222330020060033222330020070033222330020040033222330020050032250011322233002006003322233002004003322233002007003322233002005003225001222300322330010040030012232323253330363370e90010010991919299981c99b8748000008528099baf374e0086e9c004c0fc008c0e4004dd50020991919299981c99b8748008008528099baf374e0086e9c004c0fc008c0e4004dd5002181e001181b0009baa0020012232323232533303533710004002294454ccc0d4cdc38010008991919b91375c60780046eb8c0f0004c0f4010c0f0010528181b001181a8011baa0023754004466605e002941289198009125014a24605644a66605c002244a0022666006606800246600a00260066068004260046066002444466004008006ae8d2412f7067657452656c6174696f6e3a20746f6f206561726c79206f7220696e76616c69642063757272656e742074696d650049011e556e61626c6520746f207265736f6c76652063757272656e742074696d650049013163757272656e7450726f706f73616c54696d653a2074696d652072616e67652073686f756c6420626520626f756e646564002233302800200100314a04646464a66605066e1d2002002132223002003375c605a002244a002605c00460500026ea8c0a8c0ac00400488cccccc00c0980acdd480100091998031119b80375a605c00400290001bab0011480008888cccc088cc0140100080048c888c00800cc01000448940048894ccc08ccdd780118018008911801001891280091180f912999811000880189980218140009801181380091980090008a998100010b2481197066726f6d4a7573743a20666f756e6420504e6f7468696e67002233001232223002003300300112250012232323253330203370e90000010a9981080308068a99981019b874800800854cc08401c4cc020dd7181280080209a9981080588061812800981300118100009baa002491086e6f20646174756d0049010a646174756d20686173680023300200337520024446603044a666036002244a0022a66603866ebcc078c0840040104c014c0840044c008c0800040048c888c00800cc07800524010c696e6c696e6520646174756d0022230020032250014901257074727946726f6d28504f53495854696d65293a206d75737420626520706f7369746976650023010225333013001100413300b30033019001300230180014bd7024812c7074727946726f6d28505075624b657948617368293a206d757374206265203238206279746573206c6f6e6700233300d2253330100011200413225333013300100215330140071613300430170032337100020066eb4c04cc0580040049281199806112999807800890020991299980918008010a998098030b099802180b001919b90001003375c6024602a00200249412410c756e736f72746564206d6170002300a22533300d001100413300530033013001300230120014bd6f7b6302ba04912c7074727946726f6d285053637269707448617368293a206d757374206265203238206279746573206c6f6e67004901317074727946726f6d2850446174615265636f72645b5d293a206c697374206973206c6f6e676572207468616e207a65726f0049013f7265616368656420656e64206f662073756d207768696c65207374696c6c206e6f7420686176696e6720666f756e642074686520636f6e7374727563746f720049012b7074727946726f6d2850446174756d48617368293a206d757374206265203332206279746573206c6f6e6700223300120011533007002162300222533300500112250011333003300b001222300200313002300a0012323002233002002001230022330020020015573eae695ce2ab9d2300230020015744ae848c008dd5000aab9e01", + "role": "ValidatorRole", + "version": "ScriptV2" + }, + "agora:stakePolicy": { + "cborHex": "590bc5590bc2010000323232323232323232323232323232323232323232323232323232222323232323232323232533301f3370e90000010991919809191980a919980f11180091299981399b8848000dd6981780209911980080100199b80002375a605e00826446600200800466e00004dd69817802191911980080180124000900000099980d1191118010019bab302b00137520060026eacc09c01c894ccc08ccdc4240000042a66604666e1c00d2000153330233370e00490010a9998119919191929980aa9980aa9980a9929998140008800899815a492e5374616b65206f757075742068617320657870656374656420616d6f756e74206f66207374616b6520746f6b656e000013370e66446004446605244a66605e00229000099299981719baf3032001005132533303100115330324912670747279456c696d53696e676c653a20466f756e6420656d707479206c6973742d6c696b652e00161533302f301f30340011533302f3375e6066606a00200a26eb4c0dcc0d400454cc0c92412766696e6456616c75653a20556e65787065637465646c79206d697373696e6720726573756c742e001615330324912e70747279456c696d53696e676c653a20466f756e64206e6f6e2d73696e676c65746f6e206c6973742d6c696b652e00163756606c0022600660660046066002006646464466002006004605e605c004605c0026eb0050dd598168021bad302d0031325333028001100113302b4901275374616b65204f776e65722073686f756c64207369676e20746865207472616e73616374696f6e000013322300222323232533302e3370e9001001099918169129998198008a50153323303200114a26006606e00226004606c00246644646464a66606866e1d2002002132323253330373370e90000010a5013375e6e9c010dd3800981f001181c8009baa004132323253330373370e90010010a5013375e6e9c010dd3800981f001181c8009baa004303b0023036001375400464606c606e00264606c606e002606a6068606c00200e0082646605a44a666066002294054ccc0c4cdd7981b8008018a51130023036001006303400130350023030001375400664644660020060046eb0c0b8040dd61816806181680109929998140008800899815a48127496e697469616c2064656c6567617465652073686f756c642073657420746f206e6f7468696e670000132323232533302b3370e90000010a5014a26064004605a0026ea8004c0b40044c94ccc0a000440044cc0ad2411d496e697469616c206c6f636b732073686f756c6420626520656d7074790000130173758605a6058002605600260540026eb0cc88c05ccc0648c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c80554ccc0f0004526153303d02f16303e003332303722533303d00114bd7009981e18019820800980118200009191919191919191919191900629998228008a4c2a6608c0702c608e00ca66608266e1d20000021324994ccc10c004526153304403616153330413370e900100109919191919299982319b89480000044c8c9265333049001149854cc1280f058c12c00c54cc125241257074727946726f6d28504f53495854696d65293a206d75737420626520706f7369746976650016375a002609400260900066eb4004c11c00454ccc104cdc3a40080042649329998218008a4c2a6608806c2c2a660880702c609000460860026ea8004c10c004c10400cdd680098200009bac0013758002607a002607600ca66606a66e1d20000021323232323232324994ccc0f4004526153303e03016303f00653330393370e900000109919299981d99b87371a002901c0991924ca66607c0022930a9981f8188b18200018a9981f0178b1bae001303f001153330393370e900100109919299981d99b87371a002901c0991924ca66607c0022930a9981f8188b18200018a9981f0188b1bae001303f001153303c030163040002303b001375400260760022a66606a66e1d20020021324994ccc0dc004526153303802a16153303802c16303c00230370013754002606e002606a00ca66605e66e1d20000021323253330313370e6e340052038132324994ccc0d00045261533035027163036003153303402516375c002606a0022a66605e66e1d20020021323253330313370e6e340052038132324994ccc0d00045261533035027163036003153303402716375c002606a0022a6606404c2c606c00460620026ea8004c0c4004c0bc00cdd680098170009bac00132323253330293370e90000010a998162481086e6f20646174756d001225001153330293370e90010010a9981624810a646174756d206861736800133233022232223002003303300137520026eb8c0bc0040104d4cc0b12410c696e6c696e6520646174756d0012223002003302f0013030002302b0013754004605460520026eacc0a8c0a4c0a4024c0a0c0a8cc88cc004800454cc0a00085924011a4f757470757420746f20736372697074206e6f7420666f756e640033302122253330280011225001153330263002302c001132223002003302c001133003002302b00123232323253330283370e90000010a5013370e666444666604800490001199981280124000eb4dd58008019bab302e302d004009375c605c0029001181780118150009baa32302c302d001302b001302b001375860520142930a998132492941205554584f206d75737420657869737420776974682074686520636f7272656374206f7574707574001615330264911b4d696e746564205354206d7573742062652065786163746c7920310016153302649116535420617420696e70757473206d75737420626520300016153330233370e00266e052000003149854cc0992410d416c6c205354206275726e656400163233332233332302222533302800112250011333003302c001222300200313002302b001253330243375e00660500022446004006244a0020024644460040066058002244a0026ea40080048ccc07488cdc01bad302c00200148000dd58008a40006466603844664466646044446e98cc00cdd58011bab0012233302322375066e00dd68011bad0010020010020013237566054605200260546460546052002605400400297adef6c600013758604c0106eb8c09400454cc0892414c5061747465726e206d61746368206661696c75726520696e2027646f2720626c6f636b2061742061676f72612f41676f72612f5374616b652f536372697074732e68733a3135303a352d323300163026002302100137546044604200c646042604260420026040002603e603e002603c603c002603e002603a002603a0024466602800400200629415d191980090008a998098010b2481197066726f6d4a7573743a20666f756e6420504e6f7468696e67002233001232223002003300300112250014912c7074727946726f6d28505075624b657948617368293a206d757374206265203238206279746573206c6f6e67004901317074727946726f6d2850446174615265636f72645b5d293a206c697374206973206c6f6e676572207468616e207a65726f0049012c7074727946726f6d285053637269707448617368293a206d757374206265203238206279746573206c6f6e670049013f7265616368656420656e64206f662073756d207768696c65207374696c6c206e6f7420686176696e6720666f756e642074686520636f6e7374727563746f72002223300922533300f00112250011533300d3375e602260260020082600a6026002260046024002002460046ea40048888cc020894ccc038004401454ccc030cdd79808180900080309802180a1809000898011808800800911802912999805800880189980218078009801180700091119998020019100100100091801180180091918011198010010009180111980100100091191911980080180111129998048008998040018010991919299980519baf00200113300b3376000466012602400c60240066660104400400a601e0082a66601466e40dd70011bae00113300b006333300822001003300f00400513300b003333300822001006005300f004300d002300c004300d00122533300700210011333300322001300b002300a0020015734ae8155cfab9c5573aae895d0918011baa0015573c1", + "description": "agora:stakePolicy", + "params": [ + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"GTTag\"#Plutarch.Extra.AssetClass:AssetClass" + ], + "rawHex": "590bc2010000323232323232323232323232323232323232323232323232323232222323232323232323232533301f3370e90000010991919809191980a919980f11180091299981399b8848000dd6981780209911980080100199b80002375a605e00826446600200800466e00004dd69817802191911980080180124000900000099980d1191118010019bab302b00137520060026eacc09c01c894ccc08ccdc4240000042a66604666e1c00d2000153330233370e00490010a9998119919191929980aa9980aa9980a9929998140008800899815a492e5374616b65206f757075742068617320657870656374656420616d6f756e74206f66207374616b6520746f6b656e000013370e66446004446605244a66605e00229000099299981719baf3032001005132533303100115330324912670747279456c696d53696e676c653a20466f756e6420656d707479206c6973742d6c696b652e00161533302f301f30340011533302f3375e6066606a00200a26eb4c0dcc0d400454cc0c92412766696e6456616c75653a20556e65787065637465646c79206d697373696e6720726573756c742e001615330324912e70747279456c696d53696e676c653a20466f756e64206e6f6e2d73696e676c65746f6e206c6973742d6c696b652e00163756606c0022600660660046066002006646464466002006004605e605c004605c0026eb0050dd598168021bad302d0031325333028001100113302b4901275374616b65204f776e65722073686f756c64207369676e20746865207472616e73616374696f6e000013322300222323232533302e3370e9001001099918169129998198008a50153323303200114a26006606e00226004606c00246644646464a66606866e1d2002002132323253330373370e90000010a5013375e6e9c010dd3800981f001181c8009baa004132323253330373370e90010010a5013375e6e9c010dd3800981f001181c8009baa004303b0023036001375400464606c606e00264606c606e002606a6068606c00200e0082646605a44a666066002294054ccc0c4cdd7981b8008018a51130023036001006303400130350023030001375400664644660020060046eb0c0b8040dd61816806181680109929998140008800899815a48127496e697469616c2064656c6567617465652073686f756c642073657420746f206e6f7468696e670000132323232533302b3370e90000010a5014a26064004605a0026ea8004c0b40044c94ccc0a000440044cc0ad2411d496e697469616c206c6f636b732073686f756c6420626520656d7074790000130173758605a6058002605600260540026eb0cc88c05ccc0648c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c80554ccc0f0004526153303d02f16303e003332303722533303d00114bd7009981e18019820800980118200009191919191919191919191900629998228008a4c2a6608c0702c608e00ca66608266e1d20000021324994ccc10c004526153304403616153330413370e900100109919191919299982319b89480000044c8c9265333049001149854cc1280f058c12c00c54cc125241257074727946726f6d28504f53495854696d65293a206d75737420626520706f7369746976650016375a002609400260900066eb4004c11c00454ccc104cdc3a40080042649329998218008a4c2a6608806c2c2a660880702c609000460860026ea8004c10c004c10400cdd680098200009bac0013758002607a002607600ca66606a66e1d20000021323232323232324994ccc0f4004526153303e03016303f00653330393370e900000109919299981d99b87371a002901c0991924ca66607c0022930a9981f8188b18200018a9981f0178b1bae001303f001153330393370e900100109919299981d99b87371a002901c0991924ca66607c0022930a9981f8188b18200018a9981f0188b1bae001303f001153303c030163040002303b001375400260760022a66606a66e1d20020021324994ccc0dc004526153303802a16153303802c16303c00230370013754002606e002606a00ca66605e66e1d20000021323253330313370e6e340052038132324994ccc0d00045261533035027163036003153303402516375c002606a0022a66605e66e1d20020021323253330313370e6e340052038132324994ccc0d00045261533035027163036003153303402716375c002606a0022a6606404c2c606c00460620026ea8004c0c4004c0bc00cdd680098170009bac00132323253330293370e90000010a998162481086e6f20646174756d001225001153330293370e90010010a9981624810a646174756d206861736800133233022232223002003303300137520026eb8c0bc0040104d4cc0b12410c696e6c696e6520646174756d0012223002003302f0013030002302b0013754004605460520026eacc0a8c0a4c0a4024c0a0c0a8cc88cc004800454cc0a00085924011a4f757470757420746f20736372697074206e6f7420666f756e640033302122253330280011225001153330263002302c001132223002003302c001133003002302b00123232323253330283370e90000010a5013370e666444666604800490001199981280124000eb4dd58008019bab302e302d004009375c605c0029001181780118150009baa32302c302d001302b001302b001375860520142930a998132492941205554584f206d75737420657869737420776974682074686520636f7272656374206f7574707574001615330264911b4d696e746564205354206d7573742062652065786163746c7920310016153302649116535420617420696e70757473206d75737420626520300016153330233370e00266e052000003149854cc0992410d416c6c205354206275726e656400163233332233332302222533302800112250011333003302c001222300200313002302b001253330243375e00660500022446004006244a0020024644460040066058002244a0026ea40080048ccc07488cdc01bad302c00200148000dd58008a40006466603844664466646044446e98cc00cdd58011bab0012233302322375066e00dd68011bad0010020010020013237566054605200260546460546052002605400400297adef6c600013758604c0106eb8c09400454cc0892414c5061747465726e206d61746368206661696c75726520696e2027646f2720626c6f636b2061742061676f72612f41676f72612f5374616b652f536372697074732e68733a3135303a352d323300163026002302100137546044604200c646042604260420026040002603e603e002603c603c002603e002603a002603a0024466602800400200629415d191980090008a998098010b2481197066726f6d4a7573743a20666f756e6420504e6f7468696e67002233001232223002003300300112250014912c7074727946726f6d28505075624b657948617368293a206d757374206265203238206279746573206c6f6e67004901317074727946726f6d2850446174615265636f72645b5d293a206c697374206973206c6f6e676572207468616e207a65726f0049012c7074727946726f6d285053637269707448617368293a206d757374206265203238206279746573206c6f6e670049013f7265616368656420656e64206f662073756d207768696c65207374696c6c206e6f7420686176696e6720666f756e642074686520636f6e7374727563746f72002223300922533300f00112250011533300d3375e602260260020082600a6026002260046024002002460046ea40048888cc020894ccc038004401454ccc030cdd79808180900080309802180a1809000898011808800800911802912999805800880189980218078009801180700091119998020019100100100091801180180091918011198010010009180111980100100091191911980080180111129998048008998040018010991919299980519baf00200113300b3376000466012602400c60240066660104400400a601e0082a66601466e40dd70011bae00113300b006333300822001003300f00400513300b003333300822001006005300f004300d002300c004300d00122533300700210011333300322001300b002300a0020015734ae8155cfab9c5573aae895d0918011baa0015573c1", + "role": "MintingPolicyRole", + "version": "ScriptV2" + }, + "agora:stakeValidator": { + "cborHex": "591cb4591cb1010000323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232222222323232323232323232323232533305c3370e90010010991919191919191999812111918011111919191911998008020018012998230020a9982419baf302a30710073071307000c13375e60e260e000e60e260e0018a6608a0082a6608e004266ebcc1c0c1bc018c0a4c1c002d4cc1100104004cdd798370021837004983480119191911998008020018012514a2944008888c8c8c8c8c8c8c8c8c8c8c8c8c94ccc1cccdc3a400000426607446002444444a6660f46608694001c4c8c8c94ccc1f4c124c12000c4ccc01c8c94ccc1fccdc4a40000022a6660fe66086660d26ea0004cc1a4c21004010cc1a4c2100400ccc1a4c21004c20c0400c1a14cc200052411353696e676c65207374616b65206f7574707574001303700a149854cc200052411256616c6964206f757470757420646174756d00161533080014911a4e6f6e2d6e65676174697665207374616b656420616d6f756e740016337006eb4c20c0401000494cc1fc0d45854cc1f80d05854cc1f924010e5374616b6520756e6c6f636b65640016308001001307f00153307b49011253696e676c65207374616b6520696e7075740013032006153307b048163009322223003004375a60f00022a6660e666e1d200400213302e2300122222232323066374e00266600644464646464a6661040266e1d200000215333082013304b4a201e2600a44600c66e9520023306e37506eb4c2240400ccc1b8dd40008368a9984180a49284f776e6572206f722064656c656761746565207369676e7320746865207472616e73616374696f6e001615333082013370e900100109804180219ba5480101ac54cc20c0524117457870656374656420566f7465206f7220436f7369676e001630880100230820100137540064660d2610802008660d20020d046004660cc6ea0004cc198cdd2a40000ca0ca2a660f89212a457870656374656420612070726f706f73616c20746f206265207370656e74206f72206372656174656400162533307b330792233001204d14a000e2a6660f666088940020400454cc1f01245854cc1f12411c4f6e6c79206f6e65207374616b6520696e70757420616c6c6f7765640016008153330733370e90030010998171180091111119980111119191929998400099b87480100084c94ccc20404cc12928807099999111191801911918438091299984500800883a099299984600980200089983b0009801984800801098019848008011848008009182a9929983219b87009375a611e020022646464a66611a0266e1d20020021533308d0100814a22a66611a0266e24cdc01bad30920130910100100b00714a22a6611c02920123566f746572206c6f636b2073686f756c646e277420626520696e20636f6f6c646f776e00161008309301002308d010013754611e02611c020026eb0004c8cc0084cc0045288a5013300114a02944894004dd6984300803991bad3087013230870130500013758002610c02609c610a0200200aa666102026644a6661060266e1c009200015333083013370e00290000a5115333083013370e00290010a5015333083013370e00290020a5015333083013370e00290030a5014a02a6661060266e1c009200215333083013370e00290000a5015333083013370e00290010a5115333083013370e00290020a5015333083013370e00290030a5014a02a6661060266e1c009200415333083013370e00290000a5015333083013370e00290010a5015333083013370e00290020a5115333083013370e00290030a5014a02a6661060266e1c009200615333083013370e00290000a5015333083013370e00290010a5015333083013370e00290020a5015333083013370e00290030a5114a22a6661060266e1c005200014a02a6661060266e1c005200214a02a6661060266e1c005200414a02a6661060266e1c005200614a22944dd6984300800a400c244a002244a0042a6610402920128417574686f72697a656420627920656974686572206f70776e6572206f722064656c656761746565001630840130840100615330810149010f457870656374656420756e6c6f636b001630860100230800100137540044a660f80702c2a660f606e2c0102a6660e666e1d20080021330322333001260321630093222230020043078001153330733370e900500109981911998009313099ba5480081740204cc0e88c0048888894ccc1e8cc10d280038a99983d18231983c11198009129982d1824801098020008a500061533307a3049005149854cc1ed24110416c6c207374616b6573206275726e740016153307b49113416c6c207374616b657320756e6c6f636b65640016153307b04816008307900230730013754044a6660de66e1d20000021323232324994ccc1c4004526153307305f163075003375a00260e80022a6660de66e1d20020021324994ccc1b8004526153307005c161533306f3370e900200109924ca6660dc0022930a9983802e0b0a99983799b87480180084c926533306e001149854cc1c01705854ccc1bccdc3a401000426464646464646493299983a0008a4c2a660ec0c42c60f000ca6660e666e1d20000021323253330753370e6e340052038132324994ccc1d40045261533077063163079003153307606116375c00260f00022a6660e666e1d20020021323253330753370e6e340052038132324994ccc1d40045261533077063163079003153307606316375c00260f00022a660e80c42c60f200460e60026ea8004c1d000454ccc1bccdc3a40140042649329998370008a4c2a660e00b82c2a660e00bc2c60ea00460de0026ea8078c004889400488cccccc00403401400801800c06d4ccc1a4cdc39982598201bac01e375660dc02890010991111801002191bad306f001330654911e50726f706f73616c206f75747075742073686f756c642070726573656e740033066001375860dc02a266446600240022004444a002660ce446600244a6660da6078002260ca0042a660dc92112416d626967756f75732070726f706f73616c0016105d330482323305223232222333003006005004330694911c53686f756c64207265736f6c76652070726f706f73616c2074696d6500323233322233002233002232223002003330050020011225001133001222500112250012253330713371000400224660020060042a660e492123557070657220626f756e6420626967676572207468616e206c6f77657220626f756e640016325333070323370e60e66ea8005200230753074001132323253330733370e9001001098359bad30780011533074043106530790023073001375460ea0022a660e292014663757272656e7450726f706f73616c54696d653a206c6f77657220626f756e64206f66207468652074696d652072616e67652073686f756c6420626520696e636c7573697665001062307530740013232323253330733370e9001001098359bad30780011533074043106530790023073001375460ea00260ea60e860e600260e800260e402e6464646464660da0846608666e9520023305b00505a375660ec032a6660e066e1d20000021323232324994ccc1c80045261533074060163076003375a00260ea0022a6660e066e1d20020021324994ccc1bc004526153307105d16153330703370e900200109924ca6660de0022930a9983882e8b0a99983819b87480180084c926533306f001149854cc1c41745854cc1c417c58c1d8008c1c0004dd51983481f1981f99ba548008cc15c004158dd5983900a983880118019838183780098380009bac306e0172323232533306c3370e6609c60866eb0084dd5983880124004260c86eb0cc88c19ccc1548c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c94ccc26804cdc4a40000022646464a66613a0266e252000001132323253330a001337129000000899191929998518099b89480000044c8c8c94ccc29804cdc4a40000022646464a6661520266e2520000011323232323253330ae01337129000000899190212999857008008a4c2a6616002138022c6164020062a6615e02132022c6eb4004c2c404004c2bc040594ccc2a40400452615330ab01097011630ad0100315330aa010940116375a0026158020026154020062a6614e02122022c6eb4004c2a404004c29c0400c54cc290042380458dd68009853008009852008018a9985080845808b1bad00130a30100130a101003153309e010880116375a002614002002613c020062a661360210a022c6eb4004c27404004dd6000984d80800984c8080298339bab0033306823376064612e020046eb4c25804004c8c27004008dd6984d808008009bab001309601001309401013533308e01001149854cc240041f058c2480400cdd68009848808009847808019bad001308e01001308c01003375a0026116020026112020066eb4004c22004004c2180400cdd68009842808009bac001308301001308101003330642323232320055333080013370e90000010991929998410099b87371a002901c0991924ca666104020022930a99842008380b1843008018a99841808370b1bae00130850100115333080013370e90010010991929998410099b87371a002901c0991924ca666104020022930a99842008380b1843008018a99841808380b1bae00130850100115330810106f1630860100230800100137540026eb0004c20004004c1f800cdd6800983e800983d80298249bab0033304a2337606460f20046eb4c1e0004c8c8c8c20004010c8ccc1dc894ccc1e8004480104c894ccc1f4c00400854cc1f8144584cc010c2040400c8cdc80008019bae307d30800100100124a06eacc1fc00ccc1308cdd819299983c99b87371a002901c0983d8010a9983d0338b1bae307a001323232533307b3370e6e34dd70012408026464646464646464611402018a666102020022930a99841808378b18428080329998400099b87480000084c8c94ccc20804cdc39b8d001480e04c8c926533308201001149854cc210041c058c2180400c54cc20c041c058dd70009842808008a9998400099b87480080084c926533307f001149854cc204041b45854cc204041bc58c21804008c20004004dd5000984080800983f8018a9983e24812b7074727946726f6d2850446174756d48617368293a206d757374206265203332206279746573206c6f6e670016375c00260fc0026eb0c1fc004004dd5983e8008009bab00130780013076003375a00260ea0026eb0004cc178008004c1c4004dd59838983800a082f183780098370009837800998231198279299983499b87375a60dc0026609660806eb0074dd598371836983780108008a99835248112556e6d6174636865642047542076616c75650016300a001375860d80266464644666002008006004a6660d0a6608400a2600c60da0102444a0062a6660d0a66088a6608400626660829408c01c004c1b4c1b002054cc1080104c018c1b40204889400848894004c1b0c1ac01cc1ac018c88c00888c8c8c94ccc1a4cdc3a4004004266460d044a6660d6002294054cc120c00cc1c40044c008c1c00048cc120c8c1c0c1c4004c8c1c0c1c4004c1bcc1b8c1c000401c0104c8cc1a0894ccc1ac0045280a99983619baf307100100314a22600460e000200c60dc00260de00460d20026ea800cc8c88cc00400c008dd618340089bac306700b33002220011630643300122002163303e23002306530643066001375860c801a46464a6660c266e1cccc1088cc005c3b8933043004375660cc00290012400020a62a6660c266e1cccc1088cc005c3b8933043004375660cc0029001240042a6660c266e3cc168c170c1980080144c1654cc189241135265736f6c7665207374616b6520646174756d0013758664460b8660944646464646464646464646464646464646464646402aa6660ec0022930a9983c0320b183d0019982e91919191919191919191919006299983f8008a4c2a66102020da2c61060200ca6660fc66e1d20000021324994ccc1f4004526153307f06b161533307e3370e90010010991919191929998418099b89480000044c8c926533308301001149854cc214041c458c21c0400c54cc210041b858dd68009843008009842008019bad0013083010011533307e3370e900200109924ca6660fa0022930a9983f8358b0a9983f8368b184200801183f0009baa001307f001307d003375a00260f80026eb0004dd6000983c800983b803299983919b87480000084c8c8c8c8c8c8c9265333077001149854cc1e419458c1ec0194ccc1d8cdc3a400000426464a6660f066e1cdc6800a40702646493299983c0008a4c2a660f40cc2c60f80062a660f20c82c6eb8004c1ec00454ccc1d8cdc3a400400426464a6660f066e1cdc6800a40702646493299983c0008a4c2a660f40cc2c60f80062a660f20cc2c6eb8004c1ec00454cc1dc19458c1f0008c1d8004dd5000983b8008a99983919b87480080084c9265333071001149854cc1cc17c5854cc1cc18458c1e0008c1c8004dd500098398009838803299983619b87480000084c8c94ccc1b8cdc39b8d001480e04c8c926533306e001149854cc1c017058c1c800c54cc1bc16858dd700098388008a99983619b87480080084c8c94ccc1b8cdc39b8d001480e04c8c926533306e001149854cc1c017058c1c800c54cc1bc17058dd700098388008a9983682d8b183900118360009baa001306d001306b003375a00260d40026eb0004cc14c008004c198c194004dd5983318328048a9983124811f53686f756c64206f776e6564206279207374616b652076616c696461746f72001615330624911d4d6f7265207468616e206f6e652053535420696e206f6e65205554784f0016306400130650013322323223300100300237520046ea4008dd7009800982a982b9918311831800991831183098318009982c2481334d616c666f726d65642073637269707420636f6e746578743a2076616c69646174656420696e707574206e6f7420666f756e640033223305b2533305f3375e00660c860ca0022446004006244a00200260c20026eb0c18402854cc1752414c5061747465726e206d61746368206661696c75726520696e2027646f2720626c6f636b2061742061676f72612f41676f72612f5374616b652f536372697074732e68733a3238333a352d323700163062002305c001375460bc60ba01260b800260b600260b260b400260b260b200260b000260ae00260b000260ac00260ac00292014e5061747465726e206d61746368206661696c75726520696e2027646f2720626c6f636b2061742061676f72612f41676f72612f5374616b652f52656465656d6572732e68733a3437393a352d3331003046223300122533304c301b0011002153304d00516153304b00416491154d6f7265207468616e206f6e6520656c656d656e740049010a456d707479206c69737400225333047330033002001001149854cc120030588c01488c8c8cc034cc0ccc138010cc0ccc138008cc0ccc138004cc0ccdd398029bac304e304d001032003304c001304b0024911a4578706563746564207370656e64696e672070726f706f73616c0023374a9000198168008161180491800911111180191129998261980aa5000a1533304c3330254a24603266056008002601600e2a66609866018446464660286607460aa0086607460aa00466074601e0166607460aa60a800207200660a600260a40040142930a998268088b0a998268090b0a9982680d0b111800911111180b99980491805980480080280311181f91198009119803001180200088019181e91198009129998219802801080089981180118020008a998210020b24811543616e6e6f742064656c65746520656c656d656e7400223375e6e9c008dd3800a4810f436f7272656374206f7574707574730049011c43616e6e6f742064656c656761746520746f20746865206f776e65720022300122222253330413330022224a04940528898040038a998210048b2481164e6f2070726f706f73616c20697320616c6c6f7765640022333300300114a2200429408c004888888c00c8880048c008c068dd6181d9801800919981a800a504a246070606e00292011c4f776e6572207369676e732074686973207472616e73616374696f6e00233001224a029452413163757272656e7450726f706f73616c54696d653a2074696d652072616e67652073686f756c6420626520626f756e646564004901424d616c666f726d65642073637269707420636f6e746578743a2070726f70736f616c20696e707574206e6f7420666f756e6420696e2072656465656d6572206d617000233024025001233302c22533302f0011200413225333032300100215330330061613300430360032337100020066eb4c0c8c0d400400492824810c756e736f72746564206d6170002302a22533302d001100413301830033033001300230320014bd6f7b63000091919119800801801181798170011817000911191919299981699b874800800840184c014c0c8004c0cc008c0b4004dd5000911998140010008018a5023302500100214a244646464a66604e66e1d20020021323232533302a3370e90000010a5013375e6e9c010dd3800981800118150009baa0041323232533302a3370e90010010a5013375e6e9c010dd3800981800118150009baa004302d002302700137540044604044a666046002244a0022666006605200246600a00260066052004260046050002444466004008006444600644a66604866004008006290010a999812198008020018a40002900211180111198101129998118008a4000264a66604a66ebcc09c0040144c94ccc09400454cc09c0245854ccc098c028c0a800454ccc098cdd79814181580080289bad302d302b001153302700b16153302700c163756605800226006605200460520020069212670747279456c696d53696e676c653a20466f756e6420656d707479206c6973742d6c696b652e00574692012766696e6456616c75653a20556e65787065637465646c79206d697373696e6720726573756c742e0049012e70747279456c696d53696e676c653a20466f756e64206e6f6e2d73696e676c65746f6e206c6973742d6c696b652e002233001232223002003300300112250012301722533301a0011004133005300330200013002301f0014bd702ba0491257074727946726f6d28504f53495854696d65293a206d75737420626520706f7369746976650049012c7074727946726f6d28505075624b657948617368293a206d757374206265203238206279746573206c6f6e67004901317074727946726f6d2850446174615265636f72645b5d293a206c697374206973206c6f6e676572207468616e207a65726f0049012c7074727946726f6d285053637269707448617368293a206d757374206265203238206279746573206c6f6e670049013f7265616368656420656e64206f662073756d207768696c65207374696c6c206e6f7420686176696e6720666f756e642074686520636f6e7374727563746f72002232323253330153370e90000010a9980b00308038a99980a99b874800800854cc0580204cc024dd7180d00080209a9980b0060806980d000980d801180a8009baa0024901086e6f20646174756d0022500149010a646174756d20686173680023300200337520024446601844a66601e002244a0022a66602066ebcc048c0540040104c014c0540044c008c0500040048c888c00800cc04800524010c696e6c696e6520646174756d00222300200323300120011533009002164901197066726f6d4a7573743a20666f756e6420504e6f7468696e6700232323253330093370e90010010991118010019bae300e0011225001300f0023009001375460166018002446600240022a6600e0042c4600444a66600a002244a002266600660160024446004006260046014002464600446600400400246004466004004002aae7d5cd2b9c5573a460046004002ae895d0918011baa0015573c1", + "description": "agora:stakeValidator", + "params": [ + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"StakeSTTag\"#PlutusLedgerApi.V1.Value:CurrencySymbol", + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"ProposalSTTag\"#Plutarch.Extra.AssetClass:AssetClass", + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"GTTag\"#Plutarch.Extra.AssetClass:AssetClass" + ], + "rawHex": "591cb1010000323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232222222323232323232323232323232533305c3370e90010010991919191919191999812111918011111919191911998008020018012998230020a9982419baf302a30710073071307000c13375e60e260e000e60e260e0018a6608a0082a6608e004266ebcc1c0c1bc018c0a4c1c002d4cc1100104004cdd798370021837004983480119191911998008020018012514a2944008888c8c8c8c8c8c8c8c8c8c8c8c8c94ccc1cccdc3a400000426607446002444444a6660f46608694001c4c8c8c94ccc1f4c124c12000c4ccc01c8c94ccc1fccdc4a40000022a6660fe66086660d26ea0004cc1a4c21004010cc1a4c2100400ccc1a4c21004c20c0400c1a14cc200052411353696e676c65207374616b65206f7574707574001303700a149854cc200052411256616c6964206f757470757420646174756d00161533080014911a4e6f6e2d6e65676174697665207374616b656420616d6f756e740016337006eb4c20c0401000494cc1fc0d45854cc1f80d05854cc1f924010e5374616b6520756e6c6f636b65640016308001001307f00153307b49011253696e676c65207374616b6520696e7075740013032006153307b048163009322223003004375a60f00022a6660e666e1d200400213302e2300122222232323066374e00266600644464646464a6661040266e1d200000215333082013304b4a201e2600a44600c66e9520023306e37506eb4c2240400ccc1b8dd40008368a9984180a49284f776e6572206f722064656c656761746565207369676e7320746865207472616e73616374696f6e001615333082013370e900100109804180219ba5480101ac54cc20c0524117457870656374656420566f7465206f7220436f7369676e001630880100230820100137540064660d2610802008660d20020d046004660cc6ea0004cc198cdd2a40000ca0ca2a660f89212a457870656374656420612070726f706f73616c20746f206265207370656e74206f72206372656174656400162533307b330792233001204d14a000e2a6660f666088940020400454cc1f01245854cc1f12411c4f6e6c79206f6e65207374616b6520696e70757420616c6c6f7765640016008153330733370e90030010998171180091111119980111119191929998400099b87480100084c94ccc20404cc12928807099999111191801911918438091299984500800883a099299984600980200089983b0009801984800801098019848008011848008009182a9929983219b87009375a611e020022646464a66611a0266e1d20020021533308d0100814a22a66611a0266e24cdc01bad30920130910100100b00714a22a6611c02920123566f746572206c6f636b2073686f756c646e277420626520696e20636f6f6c646f776e00161008309301002308d010013754611e02611c020026eb0004c8cc0084cc0045288a5013300114a02944894004dd6984300803991bad3087013230870130500013758002610c02609c610a0200200aa666102026644a6661060266e1c009200015333083013370e00290000a5115333083013370e00290010a5015333083013370e00290020a5015333083013370e00290030a5014a02a6661060266e1c009200215333083013370e00290000a5015333083013370e00290010a5115333083013370e00290020a5015333083013370e00290030a5014a02a6661060266e1c009200415333083013370e00290000a5015333083013370e00290010a5015333083013370e00290020a5115333083013370e00290030a5014a02a6661060266e1c009200615333083013370e00290000a5015333083013370e00290010a5015333083013370e00290020a5015333083013370e00290030a5114a22a6661060266e1c005200014a02a6661060266e1c005200214a02a6661060266e1c005200414a02a6661060266e1c005200614a22944dd6984300800a400c244a002244a0042a6610402920128417574686f72697a656420627920656974686572206f70776e6572206f722064656c656761746565001630840130840100615330810149010f457870656374656420756e6c6f636b001630860100230800100137540044a660f80702c2a660f606e2c0102a6660e666e1d20080021330322333001260321630093222230020043078001153330733370e900500109981911998009313099ba5480081740204cc0e88c0048888894ccc1e8cc10d280038a99983d18231983c11198009129982d1824801098020008a500061533307a3049005149854cc1ed24110416c6c207374616b6573206275726e740016153307b49113416c6c207374616b657320756e6c6f636b65640016153307b04816008307900230730013754044a6660de66e1d20000021323232324994ccc1c4004526153307305f163075003375a00260e80022a6660de66e1d20020021324994ccc1b8004526153307005c161533306f3370e900200109924ca6660dc0022930a9983802e0b0a99983799b87480180084c926533306e001149854cc1c01705854ccc1bccdc3a401000426464646464646493299983a0008a4c2a660ec0c42c60f000ca6660e666e1d20000021323253330753370e6e340052038132324994ccc1d40045261533077063163079003153307606116375c00260f00022a6660e666e1d20020021323253330753370e6e340052038132324994ccc1d40045261533077063163079003153307606316375c00260f00022a660e80c42c60f200460e60026ea8004c1d000454ccc1bccdc3a40140042649329998370008a4c2a660e00b82c2a660e00bc2c60ea00460de0026ea8078c004889400488cccccc00403401400801800c06d4ccc1a4cdc39982598201bac01e375660dc02890010991111801002191bad306f001330654911e50726f706f73616c206f75747075742073686f756c642070726573656e740033066001375860dc02a266446600240022004444a002660ce446600244a6660da6078002260ca0042a660dc92112416d626967756f75732070726f706f73616c0016105d330482323305223232222333003006005004330694911c53686f756c64207265736f6c76652070726f706f73616c2074696d6500323233322233002233002232223002003330050020011225001133001222500112250012253330713371000400224660020060042a660e492123557070657220626f756e6420626967676572207468616e206c6f77657220626f756e640016325333070323370e60e66ea8005200230753074001132323253330733370e9001001098359bad30780011533074043106530790023073001375460ea0022a660e292014663757272656e7450726f706f73616c54696d653a206c6f77657220626f756e64206f66207468652074696d652072616e67652073686f756c6420626520696e636c7573697665001062307530740013232323253330733370e9001001098359bad30780011533074043106530790023073001375460ea00260ea60e860e600260e800260e402e6464646464660da0846608666e9520023305b00505a375660ec032a6660e066e1d20000021323232324994ccc1c80045261533074060163076003375a00260ea0022a6660e066e1d20020021324994ccc1bc004526153307105d16153330703370e900200109924ca6660de0022930a9983882e8b0a99983819b87480180084c926533306f001149854cc1c41745854cc1c417c58c1d8008c1c0004dd51983481f1981f99ba548008cc15c004158dd5983900a983880118019838183780098380009bac306e0172323232533306c3370e6609c60866eb0084dd5983880124004260c86eb0cc88c19ccc1548c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c94ccc26804cdc4a40000022646464a66613a0266e252000001132323253330a001337129000000899191929998518099b89480000044c8c8c94ccc29804cdc4a40000022646464a6661520266e2520000011323232323253330ae01337129000000899190212999857008008a4c2a6616002138022c6164020062a6615e02132022c6eb4004c2c404004c2bc040594ccc2a40400452615330ab01097011630ad0100315330aa010940116375a0026158020026154020062a6614e02122022c6eb4004c2a404004c29c0400c54cc290042380458dd68009853008009852008018a9985080845808b1bad00130a30100130a101003153309e010880116375a002614002002613c020062a661360210a022c6eb4004c27404004dd6000984d80800984c8080298339bab0033306823376064612e020046eb4c25804004c8c27004008dd6984d808008009bab001309601001309401013533308e01001149854cc240041f058c2480400cdd68009848808009847808019bad001308e01001308c01003375a0026116020026112020066eb4004c22004004c2180400cdd68009842808009bac001308301001308101003330642323232320055333080013370e90000010991929998410099b87371a002901c0991924ca666104020022930a99842008380b1843008018a99841808370b1bae00130850100115333080013370e90010010991929998410099b87371a002901c0991924ca666104020022930a99842008380b1843008018a99841808380b1bae00130850100115330810106f1630860100230800100137540026eb0004c20004004c1f800cdd6800983e800983d80298249bab0033304a2337606460f20046eb4c1e0004c8c8c8c20004010c8ccc1dc894ccc1e8004480104c894ccc1f4c00400854cc1f8144584cc010c2040400c8cdc80008019bae307d30800100100124a06eacc1fc00ccc1308cdd819299983c99b87371a002901c0983d8010a9983d0338b1bae307a001323232533307b3370e6e34dd70012408026464646464646464611402018a666102020022930a99841808378b18428080329998400099b87480000084c8c94ccc20804cdc39b8d001480e04c8c926533308201001149854cc210041c058c2180400c54cc20c041c058dd70009842808008a9998400099b87480080084c926533307f001149854cc204041b45854cc204041bc58c21804008c20004004dd5000984080800983f8018a9983e24812b7074727946726f6d2850446174756d48617368293a206d757374206265203332206279746573206c6f6e670016375c00260fc0026eb0c1fc004004dd5983e8008009bab00130780013076003375a00260ea0026eb0004cc178008004c1c4004dd59838983800a082f183780098370009837800998231198279299983499b87375a60dc0026609660806eb0074dd598371836983780108008a99835248112556e6d6174636865642047542076616c75650016300a001375860d80266464644666002008006004a6660d0a6608400a2600c60da0102444a0062a6660d0a66088a6608400626660829408c01c004c1b4c1b002054cc1080104c018c1b40204889400848894004c1b0c1ac01cc1ac018c88c00888c8c8c94ccc1a4cdc3a4004004266460d044a6660d6002294054cc120c00cc1c40044c008c1c00048cc120c8c1c0c1c4004c8c1c0c1c4004c1bcc1b8c1c000401c0104c8cc1a0894ccc1ac0045280a99983619baf307100100314a22600460e000200c60dc00260de00460d20026ea800cc8c88cc00400c008dd618340089bac306700b33002220011630643300122002163303e23002306530643066001375860c801a46464a6660c266e1cccc1088cc005c3b8933043004375660cc00290012400020a62a6660c266e1cccc1088cc005c3b8933043004375660cc0029001240042a6660c266e3cc168c170c1980080144c1654cc189241135265736f6c7665207374616b6520646174756d0013758664460b8660944646464646464646464646464646464646464646402aa6660ec0022930a9983c0320b183d0019982e91919191919191919191919006299983f8008a4c2a66102020da2c61060200ca6660fc66e1d20000021324994ccc1f4004526153307f06b161533307e3370e90010010991919191929998418099b89480000044c8c926533308301001149854cc214041c458c21c0400c54cc210041b858dd68009843008009842008019bad0013083010011533307e3370e900200109924ca6660fa0022930a9983f8358b0a9983f8368b184200801183f0009baa001307f001307d003375a00260f80026eb0004dd6000983c800983b803299983919b87480000084c8c8c8c8c8c8c9265333077001149854cc1e419458c1ec0194ccc1d8cdc3a400000426464a6660f066e1cdc6800a40702646493299983c0008a4c2a660f40cc2c60f80062a660f20c82c6eb8004c1ec00454ccc1d8cdc3a400400426464a6660f066e1cdc6800a40702646493299983c0008a4c2a660f40cc2c60f80062a660f20cc2c6eb8004c1ec00454cc1dc19458c1f0008c1d8004dd5000983b8008a99983919b87480080084c9265333071001149854cc1cc17c5854cc1cc18458c1e0008c1c8004dd500098398009838803299983619b87480000084c8c94ccc1b8cdc39b8d001480e04c8c926533306e001149854cc1c017058c1c800c54cc1bc16858dd700098388008a99983619b87480080084c8c94ccc1b8cdc39b8d001480e04c8c926533306e001149854cc1c017058c1c800c54cc1bc17058dd700098388008a9983682d8b183900118360009baa001306d001306b003375a00260d40026eb0004cc14c008004c198c194004dd5983318328048a9983124811f53686f756c64206f776e6564206279207374616b652076616c696461746f72001615330624911d4d6f7265207468616e206f6e652053535420696e206f6e65205554784f0016306400130650013322323223300100300237520046ea4008dd7009800982a982b9918311831800991831183098318009982c2481334d616c666f726d65642073637269707420636f6e746578743a2076616c69646174656420696e707574206e6f7420666f756e640033223305b2533305f3375e00660c860ca0022446004006244a00200260c20026eb0c18402854cc1752414c5061747465726e206d61746368206661696c75726520696e2027646f2720626c6f636b2061742061676f72612f41676f72612f5374616b652f536372697074732e68733a3238333a352d323700163062002305c001375460bc60ba01260b800260b600260b260b400260b260b200260b000260ae00260b000260ac00260ac00292014e5061747465726e206d61746368206661696c75726520696e2027646f2720626c6f636b2061742061676f72612f41676f72612f5374616b652f52656465656d6572732e68733a3437393a352d3331003046223300122533304c301b0011002153304d00516153304b00416491154d6f7265207468616e206f6e6520656c656d656e740049010a456d707479206c69737400225333047330033002001001149854cc120030588c01488c8c8cc034cc0ccc138010cc0ccc138008cc0ccc138004cc0ccdd398029bac304e304d001032003304c001304b0024911a4578706563746564207370656e64696e672070726f706f73616c0023374a9000198168008161180491800911111180191129998261980aa5000a1533304c3330254a24603266056008002601600e2a66609866018446464660286607460aa0086607460aa00466074601e0166607460aa60a800207200660a600260a40040142930a998268088b0a998268090b0a9982680d0b111800911111180b99980491805980480080280311181f91198009119803001180200088019181e91198009129998219802801080089981180118020008a998210020b24811543616e6e6f742064656c65746520656c656d656e7400223375e6e9c008dd3800a4810f436f7272656374206f7574707574730049011c43616e6e6f742064656c656761746520746f20746865206f776e65720022300122222253330413330022224a04940528898040038a998210048b2481164e6f2070726f706f73616c20697320616c6c6f7765640022333300300114a2200429408c004888888c00c8880048c008c068dd6181d9801800919981a800a504a246070606e00292011c4f776e6572207369676e732074686973207472616e73616374696f6e00233001224a029452413163757272656e7450726f706f73616c54696d653a2074696d652072616e67652073686f756c6420626520626f756e646564004901424d616c666f726d65642073637269707420636f6e746578743a2070726f70736f616c20696e707574206e6f7420666f756e6420696e2072656465656d6572206d617000233024025001233302c22533302f0011200413225333032300100215330330061613300430360032337100020066eb4c0c8c0d400400492824810c756e736f72746564206d6170002302a22533302d001100413301830033033001300230320014bd6f7b63000091919119800801801181798170011817000911191919299981699b874800800840184c014c0c8004c0cc008c0b4004dd5000911998140010008018a5023302500100214a244646464a66604e66e1d20020021323232533302a3370e90000010a5013375e6e9c010dd3800981800118150009baa0041323232533302a3370e90010010a5013375e6e9c010dd3800981800118150009baa004302d002302700137540044604044a666046002244a0022666006605200246600a00260066052004260046050002444466004008006444600644a66604866004008006290010a999812198008020018a40002900211180111198101129998118008a4000264a66604a66ebcc09c0040144c94ccc09400454cc09c0245854ccc098c028c0a800454ccc098cdd79814181580080289bad302d302b001153302700b16153302700c163756605800226006605200460520020069212670747279456c696d53696e676c653a20466f756e6420656d707479206c6973742d6c696b652e00574692012766696e6456616c75653a20556e65787065637465646c79206d697373696e6720726573756c742e0049012e70747279456c696d53696e676c653a20466f756e64206e6f6e2d73696e676c65746f6e206c6973742d6c696b652e002233001232223002003300300112250012301722533301a0011004133005300330200013002301f0014bd702ba0491257074727946726f6d28504f53495854696d65293a206d75737420626520706f7369746976650049012c7074727946726f6d28505075624b657948617368293a206d757374206265203238206279746573206c6f6e67004901317074727946726f6d2850446174615265636f72645b5d293a206c697374206973206c6f6e676572207468616e207a65726f0049012c7074727946726f6d285053637269707448617368293a206d757374206265203238206279746573206c6f6e670049013f7265616368656420656e64206f662073756d207768696c65207374696c6c206e6f7420686176696e6720666f756e642074686520636f6e7374727563746f72002232323253330153370e90000010a9980b00308038a99980a99b874800800854cc0580204cc024dd7180d00080209a9980b0060806980d000980d801180a8009baa0024901086e6f20646174756d0022500149010a646174756d20686173680023300200337520024446601844a66601e002244a0022a66602066ebcc048c0540040104c014c0540044c008c0500040048c888c00800cc04800524010c696e6c696e6520646174756d00222300200323300120011533009002164901197066726f6d4a7573743a20666f756e6420504e6f7468696e6700232323253330093370e90010010991118010019bae300e0011225001300f0023009001375460166018002446600240022a6600e0042c4600444a66600a002244a002266600660160024446004006260046014002464600446600400400246004466004004002aae7d5cd2b9c5573a460046004002ae895d0918011baa0015573c1", + "role": "ValidatorRole", + "version": "ScriptV2" + }, + "agora:treasuryValidator": { + "cborHex": "590345590342010000323232323232323232323232323232222232323232533300e3370e90010010992999807a99911998088010008a50325333010001100113301449013373696e676c65417574686f72697479546f6b656e4275726e65643a204d757374206275726e2065786163746c79203120474154000013370e660146eb8024dd5980a99180b980b980b800980b0009919b8148000005200213253330100011001133014491254f6e6c79206f6e6520474154206d7573742065786973742061742074686520696e70757473000013370e664466602644466a66602e002244a00226444600400664644660020060046038004603400246002446664e0088004c014008cc0180140044c920004988c00c0040048c94ccc044cc88c8cccccc044064074dd48019bab301a301b001232323253330183370e9000001099299980c800880089980ea4937617574686f72697479546f6b656e7356616c6964496e3a2047415420696e636f72726563746c79206c69766573206174205075624b6579000014a02944c080008c06c004dd5180d980e980d8010a51301b001375c0160022660186eb802cdd5980b980c180c8008a9980aa49355768696c6520636f756e74696e67204741547320617420696e707574733a20616c6c2047415473206d7573742062652076616c69640016323017301800130180013758602a00290010a4c2a66026920128412073696e676c6520617574686f7269747920746f6b656e20686173206265656e206275726e656400163016301400415330124901465061747465726e206d61746368206661696c75726520696e2027646f2720626c6f636b2061742061676f72612f41676f72612f54726561737572792e68733a33393a332d313300163016002301100137546022602400260240020024466666600601601e6ea40080048ccc02088cdc01bad301200200148000dd58008a40004444666600a6600c0080040024644460040066008002244a0024600a44a666010002244a002266600660160024446004006260046018002444a66600866ebc008c00c004488c00800c48940055cd1118019129998030008801899802180480098011805000919180111980100100091801119801001000aab9f5738aae755d0aba2230023754002aae79", + "description": "agora:treasuryValidator", + "params": [ + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"AuthorityTokenTag\"#PlutusLedgerApi.V1.Value:CurrencySymbol" + ], + "rawHex": "590342010000323232323232323232323232323232222232323232533300e3370e90010010992999807a99911998088010008a50325333010001100113301449013373696e676c65417574686f72697479546f6b656e4275726e65643a204d757374206275726e2065786163746c79203120474154000013370e660146eb8024dd5980a99180b980b980b800980b0009919b8148000005200213253330100011001133014491254f6e6c79206f6e6520474154206d7573742065786973742061742074686520696e70757473000013370e664466602644466a66602e002244a00226444600400664644660020060046038004603400246002446664e0088004c014008cc0180140044c920004988c00c0040048c94ccc044cc88c8cccccc044064074dd48019bab301a301b001232323253330183370e9000001099299980c800880089980ea4937617574686f72697479546f6b656e7356616c6964496e3a2047415420696e636f72726563746c79206c69766573206174205075624b6579000014a02944c080008c06c004dd5180d980e980d8010a51301b001375c0160022660186eb802cdd5980b980c180c8008a9980aa49355768696c6520636f756e74696e67204741547320617420696e707574733a20616c6c2047415473206d7573742062652076616c69640016323017301800130180013758602a00290010a4c2a66026920128412073696e676c6520617574686f7269747920746f6b656e20686173206265656e206275726e656400163016301400415330124901465061747465726e206d61746368206661696c75726520696e2027646f2720626c6f636b2061742061676f72612f41676f72612f54726561737572792e68733a33393a332d313300163016002301100137546022602400260240020024466666600601601e6ea40080048ccc02088cdc01bad301200200148000dd58008a40004444666600a6600c0080040024644460040066008002244a0024600a44a666010002244a002266600660160024446004006260046018002444a66600866ebc008c00c004488c00800c48940055cd1118019129998030008801899802180480098011805000919180111980100100091801119801001000aab9f5738aae755d0aba2230023754002aae79", + "role": "ValidatorRole", + "version": "ScriptV2" + }, + "agora:treasuryWithdrawalValidator": { + "cborHex": "590d27590d2401000032323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323222223232323232323232323232323253330433370e9001001099192999822a9981d1929998230008800899825a493373696e676c65417574686f72697479546f6b656e4275726e65643a204d757374206275726e2065786163746c79203120474154000013370e6602801e6eacc134c8c124c124c124004c120004c0c520021325333046001100113304b491254f6e6c79206f6e6520474154206d7573742065786973742061742074686520696e70757473000013370e664466608644466604200246002446664e0088004c014008cc0180140044c92000498c0880080048c94ccc11cc8cccccc06413c148dd48091bab3050304b0012323232533304c3370e900000109929998268008800899829248137617574686f72697479546f6b656e7356616c6964496e3a2047415420696e636f72726563746c79206c69766573206174205075624b6579000014a02944c154008c144004dd51828982918288010a5130500011330160113756609e609460a00022a660989201355768696c6520636f756e74696e67204741547320617420696e707574733a20616c6c2047415473206d7573742062652076616c6964001632304f304a001304f0013758609a00290010991929998239981c981d119b8700148000ccc081c0998129980e11919192999825a99821192999826000899828a4810c45666665637420696e70757400001100133223375e6e9cc158008dd3982b00098298018040992999826000899828a4810c5075626b657920696e707574000011001323232533304e3370e90010010a5014a260ae00460a60026ea8004412054ccc12cc94ccc1300044cc1452410e547265617375727920696e70757400001100133027001375860a6609c00c26eacc14cc13800854cc1412410d556e6b6e6f776e20696e70757400163230533054001305200130523051304c00130510013758609e0026603846604a440020026eb0c13c008cc0708c8c94ccc1294cc0fcc94ccc12c00440044cc14124012453686f756c642073656e7420746f206f6e65206f66207468652074726561737572696573000013302632305330540013052002375860a4609a00a264a66609600220022660a0070002660706460a660a800260a400460a4609a00226eacc148004411cc130004c1440054cc131240116436865636b207265636569766572206f757470757473001333043222533304b00210011533304b001153304f49011b556e61626c6520746f206578686175737420726563656976657273001613232533304c330292253304353304332533304f00110011330544911056616c69642063726564656e7469616c000013232323253330523370e90010010991919299982a99b8748000008528099baf374e0086e9c004c178008c168004dd50020991919299982a99b8748008008528099baf374e0086e9c004c178008c168004dd5002182d801182b8009baa00332305730580013056004132533304f001100113305449010b56616c69642076616c7565000013322323304330442337129000000800998170010009bab3056003001132533304f001100113305403c0013303c002305630510033054004133005304f004304f003153305149117496e76616c6964207265636569766572206f75747075740016304e001305330520013758609e0046eb0c13cc128c128004526153304c490132556e757365642074726561737572792073686f756c6420737461792061742074726561737572792076616c696461746f72730016304f304e00f37580242a6609492128412073696e676c6520617574686f7269747920746f6b656e20686173206265656e206275726e65640016304d304c00d304b0011533048491445061747465726e206d61746368206661696c75726520696e2027646f2720626c6f636b2061742061676f72612f41676f72612f4566666563742e68733a36333a352d32320016304c0023048001375460906086012a6660800022930a998220208b182080199816919191919002a99982099b87480000084c8c94ccc10ccdc39b8d001480e04c8c9265333045001149854cc12411858c11800c54cc12010858dd700098248008a99982099b87480080084c8c94ccc10ccdc39b8d001480e04c8c9265333045001149854cc12411858c11800c54cc12011c58dd700098248008a998230238b182500118230009baa00137580026088002607c0066605446464646400aa66607c66e1d20000021323232323232323232323232324994ccc12c004526153304f04c16304c0063253330493303b23303d233710900000080080088008a99827249184e6567617469766520616d6f756e7420696e2056616c75650016375600860806eac00ccc1048cdd819192999824a9982019b87001480004cdc3800a4070260a00062a6609c9201387074727946726f6d2843757272656e637953796d626f6c293a206d757374206265203238206279746573206c6f6e67206f7220656d7074790016371a0026eb8c138004c8c8c8c150010c108dd5982980199821919bb032533304a337126e34005204013051002153304f4901327074727946726f6d28546f6b656e4e616d65293a206d757374206265206174206d6f7374203332204279746573206c6f6e670016375c60a00026460a80046eb4c14c004004dd598288008009bab001304c001304600653330423370e900000109919299982219b87371a002901c0991924ca66608c0022930a998250238b18238018a998248218b1bae001304a001153330423370e900100109919299982219b87371a002901c0991924ca66608c0022930a998250238b18238018a998248240b1bae001304a001153304704816304b00230470013754002608c0022a660860882c608e00460860026ea8004dd600098208009bac0053040002375c008002446666660060720786ea40080048ccc01c88cdc01bad303f00200148000dd58008a40004444666600a6600c0080040024644460040066008002244a0024605644a666064002244a002266600660720024446004006260046068002444a66606066ebc008c00c004488c00800c489400488c0a8894ccc0c4004400c4cc010c0e0004c008c0cc00488cc00cc020008004c098888ccc0100048c00488ccc02088004c014008cc0180140044c01d262533302b00112250011322230020033232233001003002302e00230320012223330047000040024446660124466601800a00400200400240484460040024604244a666050002294054ccc09ccdd798178008018a5113002302a001223233003302e0013756605c6052002605c002446660066008e00008cc020c02c0400048c00c88dd3198019bab002375600246004446ea0cc00cdd68011bad0012223333004003220020020012301b30020012232322330010030022225333024001133021003002132323253330263375e00400226604866ec0008cc024c0c0018c0c000cccc02088008014c0a401054ccc098cdc81bae002375c00226604800c666601044002006605200800a26604800666660104400200c00a605200860580046056008605600244a6660440042002266660064400260520046048004002446660060120040024446600e660080060040024446464646466ec0dd48011ba600130050023005002375660500046eb8c09000488ccc00c018008004888cc010cc01400c00800488cc050008004888c8c8c8c8cdd81ba90023750002600a004600a0046eb4c090008dd718100009000919b81480000052411256616c6964206f757470757420646174756d002232323253330173370e90000010a511323232533301a3370e90000010a501533301a3370e90020010a5113371e0126eb8c088004c08c008c07c004dd50021810001180e0009baa002488120923918e403bf43c34b4ef6b48eb2ee04babed17320d8d1b9ff9ad086e86f44ec002300d22533301400110041330113003301b001300230160014bd701119802118019bab301b001001223300323003375a60340020024601244a666020002294454cc010c00cc05c0044c008c04800488ccc03400800400c5281198050008010a51233300422533300b001120041322533300c3001002153301100616133004300f0032337200020066eb8c044c0480040049282490c756e736f72746564206d617000230022253330090011005133006300330100013002300b0012323002233002002001230022330020020014bd6f7b6302ba04912c7074727946726f6d28505075624b657948617368293a206d757374206265203238206279746573206c6f6e67005734aae7d241317074727946726f6d2850446174615265636f72645b5d293a206c697374206973206c6f6e676572207468616e207a65726f00574492012c7074727946726f6d285053637269707448617368293a206d757374206265203238206279746573206c6f6e6700573892013f7265616368656420656e64206f662073756d207768696c65207374696c6c206e6f7420686176696e6720666f756e642074686520636f6e7374727563746f72005573aae848c008dd5000aab9e1", + "description": "agora:treasuryWithdrawalValidator", + "params": [ + "Ply.Core.Types:AsData#Data.Tagged:Tagged#GHC.TypeLits:\"AuthorityTokenTag\"#PlutusLedgerApi.V1.Value:CurrencySymbol" + ], + "rawHex": "590d2401000032323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323222223232323232323232323232323253330433370e9001001099192999822a9981d1929998230008800899825a493373696e676c65417574686f72697479546f6b656e4275726e65643a204d757374206275726e2065786163746c79203120474154000013370e6602801e6eacc134c8c124c124c124004c120004c0c520021325333046001100113304b491254f6e6c79206f6e6520474154206d7573742065786973742061742074686520696e70757473000013370e664466608644466604200246002446664e0088004c014008cc0180140044c92000498c0880080048c94ccc11cc8cccccc06413c148dd48091bab3050304b0012323232533304c3370e900000109929998268008800899829248137617574686f72697479546f6b656e7356616c6964496e3a2047415420696e636f72726563746c79206c69766573206174205075624b6579000014a02944c154008c144004dd51828982918288010a5130500011330160113756609e609460a00022a660989201355768696c6520636f756e74696e67204741547320617420696e707574733a20616c6c2047415473206d7573742062652076616c6964001632304f304a001304f0013758609a00290010991929998239981c981d119b8700148000ccc081c0998129980e11919192999825a99821192999826000899828a4810c45666665637420696e70757400001100133223375e6e9cc158008dd3982b00098298018040992999826000899828a4810c5075626b657920696e707574000011001323232533304e3370e90010010a5014a260ae00460a60026ea8004412054ccc12cc94ccc1300044cc1452410e547265617375727920696e70757400001100133027001375860a6609c00c26eacc14cc13800854cc1412410d556e6b6e6f776e20696e70757400163230533054001305200130523051304c00130510013758609e0026603846604a440020026eb0c13c008cc0708c8c94ccc1294cc0fcc94ccc12c00440044cc14124012453686f756c642073656e7420746f206f6e65206f66207468652074726561737572696573000013302632305330540013052002375860a4609a00a264a66609600220022660a0070002660706460a660a800260a400460a4609a00226eacc148004411cc130004c1440054cc131240116436865636b207265636569766572206f757470757473001333043222533304b00210011533304b001153304f49011b556e61626c6520746f206578686175737420726563656976657273001613232533304c330292253304353304332533304f00110011330544911056616c69642063726564656e7469616c000013232323253330523370e90010010991919299982a99b8748000008528099baf374e0086e9c004c178008c168004dd50020991919299982a99b8748008008528099baf374e0086e9c004c178008c168004dd5002182d801182b8009baa00332305730580013056004132533304f001100113305449010b56616c69642076616c7565000013322323304330442337129000000800998170010009bab3056003001132533304f001100113305403c0013303c002305630510033054004133005304f004304f003153305149117496e76616c6964207265636569766572206f75747075740016304e001305330520013758609e0046eb0c13cc128c128004526153304c490132556e757365642074726561737572792073686f756c6420737461792061742074726561737572792076616c696461746f72730016304f304e00f37580242a6609492128412073696e676c6520617574686f7269747920746f6b656e20686173206265656e206275726e65640016304d304c00d304b0011533048491445061747465726e206d61746368206661696c75726520696e2027646f2720626c6f636b2061742061676f72612f41676f72612f4566666563742e68733a36333a352d32320016304c0023048001375460906086012a6660800022930a998220208b182080199816919191919002a99982099b87480000084c8c94ccc10ccdc39b8d001480e04c8c9265333045001149854cc12411858c11800c54cc12010858dd700098248008a99982099b87480080084c8c94ccc10ccdc39b8d001480e04c8c9265333045001149854cc12411858c11800c54cc12011c58dd700098248008a998230238b182500118230009baa00137580026088002607c0066605446464646400aa66607c66e1d20000021323232323232323232323232324994ccc12c004526153304f04c16304c0063253330493303b23303d233710900000080080088008a99827249184e6567617469766520616d6f756e7420696e2056616c75650016375600860806eac00ccc1048cdd819192999824a9982019b87001480004cdc3800a4070260a00062a6609c9201387074727946726f6d2843757272656e637953796d626f6c293a206d757374206265203238206279746573206c6f6e67206f7220656d7074790016371a0026eb8c138004c8c8c8c150010c108dd5982980199821919bb032533304a337126e34005204013051002153304f4901327074727946726f6d28546f6b656e4e616d65293a206d757374206265206174206d6f7374203332204279746573206c6f6e670016375c60a00026460a80046eb4c14c004004dd598288008009bab001304c001304600653330423370e900000109919299982219b87371a002901c0991924ca66608c0022930a998250238b18238018a998248218b1bae001304a001153330423370e900100109919299982219b87371a002901c0991924ca66608c0022930a998250238b18238018a998248240b1bae001304a001153304704816304b00230470013754002608c0022a660860882c608e00460860026ea8004dd600098208009bac0053040002375c008002446666660060720786ea40080048ccc01c88cdc01bad303f00200148000dd58008a40004444666600a6600c0080040024644460040066008002244a0024605644a666064002244a002266600660720024446004006260046068002444a66606066ebc008c00c004488c00800c489400488c0a8894ccc0c4004400c4cc010c0e0004c008c0cc00488cc00cc020008004c098888ccc0100048c00488ccc02088004c014008cc0180140044c01d262533302b00112250011322230020033232233001003002302e00230320012223330047000040024446660124466601800a00400200400240484460040024604244a666050002294054ccc09ccdd798178008018a5113002302a001223233003302e0013756605c6052002605c002446660066008e00008cc020c02c0400048c00c88dd3198019bab002375600246004446ea0cc00cdd68011bad0012223333004003220020020012301b30020012232322330010030022225333024001133021003002132323253330263375e00400226604866ec0008cc024c0c0018c0c000cccc02088008014c0a401054ccc098cdc81bae002375c00226604800c666601044002006605200800a26604800666660104400200c00a605200860580046056008605600244a6660440042002266660064400260520046048004002446660060120040024446600e660080060040024446464646466ec0dd48011ba600130050023005002375660500046eb8c09000488ccc00c018008004888cc010cc01400c00800488cc050008004888c8c8c8c8cdd81ba90023750002600a004600a0046eb4c090008dd718100009000919b81480000052411256616c6964206f757470757420646174756d002232323253330173370e90000010a511323232533301a3370e90000010a501533301a3370e90020010a5113371e0126eb8c088004c08c008c07c004dd50021810001180e0009baa002488120923918e403bf43c34b4ef6b48eb2ee04babed17320d8d1b9ff9ad086e86f44ec002300d22533301400110041330113003301b001300230160014bd701119802118019bab301b001001223300323003375a60340020024601244a666020002294454cc010c00cc05c0044c008c04800488ccc03400800400c5281198050008010a51233300422533300b001120041322533300c3001002153301100616133004300f0032337200020066eb8c044c0480040049282490c756e736f72746564206d617000230022253330090011005133006300330100013002300b0012323002233002002001230022330020020014bd6f7b6302ba04912c7074727946726f6d28505075624b657948617368293a206d757374206265203238206279746573206c6f6e67005734aae7d241317074727946726f6d2850446174615265636f72645b5d293a206c697374206973206c6f6e676572207468616e207a65726f00574492012c7074727946726f6d285053637269707448617368293a206d757374206265203238206279746573206c6f6e6700573892013f7265616368656420656e64206f662073756d207768696c65207374696c6c206e6f7420686176696e6720666f756e642074686520636f6e7374727563746f72005573aae848c008dd5000aab9e1", + "role": "ValidatorRole", + "version": "ScriptV2" + } + } +} \ No newline at end of file diff --git a/agora-testlib/Test/Specification.hs b/agora-testlib/Test/Specification.hs index 2280af9..8fb1bd2 100644 --- a/agora-testlib/Test/Specification.hs +++ b/agora-testlib/Test/Specification.hs @@ -49,21 +49,25 @@ module Test.Specification ( toTestTree, ) where -import Agora.Utils (CompiledEffect (..), CompiledMintingPolicy (..), CompiledValidator (..)) import Control.Composition ((.**), (.***)) import Data.Coerce (coerce) +import Data.Text qualified as Text import Plutarch.Evaluate (evalScript) -import PlutusLedgerApi.V1 ( +import Plutarch.Script (Script (Script)) +import PlutusCore.Data qualified as PLC +import PlutusCore.MkPlc qualified as PLC +import PlutusLedgerApi.V2 ( Datum (..), Redeemer (Redeemer), - Script, ScriptContext, ToData (toBuiltinData), + toData, ) -import PlutusLedgerApi.V1.Scripts (Context (..), applyMintingPolicyScript, applyValidator) +import PlutusPrelude (over) import PlutusTx.IsData qualified as PlutusTx (ToData) import Test.Tasty (TestTree, testGroup) import Test.Tasty.HUnit (assertFailure, testCase) +import UntypedPlutusCore qualified as UPLC {- | Expectations upon execution of script @Success@ indicates a successful execution. @@ -129,8 +133,12 @@ toTestTree (Terminal (Specification name expectation script)) = Failure -> onFailure FailureWith s -> onFailureWith s where + beautifyTraces = + Text.unpack + . Text.intercalate "\n" + . map (" " <>) (res, _budget, traces) = evalScript script - ts = " Traces: " <> show traces + ts = " Traces:\n" <> beautifyTraces traces onSuccess = case res of Left e -> assertFailure $ @@ -159,9 +167,6 @@ scriptSucceeds name script = Terminal $ Specification name Success script scriptFails :: String -> Script -> SpecificationTree scriptFails name script = Terminal $ Specification name Failure script -mkContext :: ScriptContext -> Context -mkContext = Context . toBuiltinData - mkRedeemer :: forall redeemer. (PlutusTx.ToData redeemer) => @@ -178,37 +183,39 @@ mkDatum = Datum . toBuiltinData applyMintingPolicy' :: (PlutusTx.ToData redeemer) => - CompiledMintingPolicy redeemer -> + Script -> redeemer -> ScriptContext -> Script applyMintingPolicy' policy redeemer scriptContext = - applyMintingPolicyScript - (mkContext scriptContext) - (getCompiledMintingPolicy policy) - (mkRedeemer redeemer) + applyArguments + policy + [ toData $ mkRedeemer redeemer + , toData scriptContext + ] applyValidator' :: ( PlutusTx.ToData datum , PlutusTx.ToData redeemer ) => - CompiledValidator datum redeemer -> + Script -> datum -> redeemer -> ScriptContext -> Script applyValidator' validator datum redeemer scriptContext = - applyValidator - (mkContext scriptContext) - (getCompiledValidator validator) - (mkDatum datum) - (mkRedeemer redeemer) + applyArguments + validator + [ toData $ mkDatum datum + , toData $ mkRedeemer redeemer + , toData scriptContext + ] -- | Check that a policy script succeeds, given a name and arguments. policySucceedsWith :: (PlutusTx.ToData redeemer) => String -> - CompiledMintingPolicy redeemer -> + Script -> redeemer -> ScriptContext -> SpecificationTree @@ -219,7 +226,7 @@ policySucceedsWith tag = policyFailsWith :: (PlutusTx.ToData redeemer) => String -> - CompiledMintingPolicy redeemer -> + Script -> redeemer -> ScriptContext -> SpecificationTree @@ -232,7 +239,7 @@ validatorSucceedsWith :: , PlutusTx.ToData redeemer ) => String -> - CompiledValidator datum redeemer -> + Script -> datum -> redeemer -> ScriptContext -> @@ -246,7 +253,7 @@ validatorFailsWith :: , PlutusTx.ToData redeemer ) => String -> - CompiledValidator datum redeemer -> + Script -> datum -> redeemer -> ScriptContext -> @@ -259,7 +266,7 @@ effectSucceedsWith :: ( PlutusTx.ToData datum ) => String -> - CompiledEffect datum -> + Script -> datum -> ScriptContext -> SpecificationTree @@ -270,7 +277,7 @@ effectFailsWith :: ( PlutusTx.ToData datum ) => String -> - CompiledEffect datum -> + Script -> datum -> ScriptContext -> SpecificationTree @@ -283,7 +290,7 @@ testValidator :: -- | Is this test case expected to succeed? Bool -> String -> - CompiledValidator datum redeemer -> + Script -> datum -> redeemer -> ScriptContext -> @@ -300,7 +307,7 @@ testPolicy :: -- | Is this test case expected to succeed? Bool -> String -> - CompiledMintingPolicy redeemer -> + Script -> redeemer -> ScriptContext -> SpecificationTree @@ -308,3 +315,11 @@ testPolicy isValid = if isValid then policySucceedsWith else policyFailsWith + +-------------------------------------------------------------------------------- + +applyArguments :: Script -> [PLC.Data] -> Script +applyArguments (Script p) args = + let termArgs = fmap (PLC.mkConstant ()) args + applied t = PLC.mkIterApp () t termArgs + in Script $ over UPLC.progTerm applied p diff --git a/agora-testlib/Test/Util.hs b/agora-testlib/Test/Util.hs index d0b0a7b..6009968 100644 --- a/agora-testlib/Test/Util.hs +++ b/agora-testlib/Test/Util.hs @@ -15,6 +15,7 @@ module Test.Util ( sortValue, blake2b_224, pubKeyHashes, + scriptHashes, userCredentials, scriptCredentials, validatorHashes, @@ -22,6 +23,7 @@ module Test.Util ( mkSpending, mkMinting, CombinableBuilder, + subtractValue, ) where -------------------------------------------------------------------------------- @@ -36,31 +38,32 @@ import Data.ByteString.Lazy qualified as ByteString.Lazy import Data.List (sortOn) import Plutarch.Context ( Builder, - buildMintingUnsafe, - buildSpendingUnsafe, + buildMinting', + buildSpending', withMinting, withSpendingOutRef, ) import Plutarch.Crypto (pblake2b_256) -import PlutusLedgerApi.V1 ( +import PlutusLedgerApi.V1.Interval qualified as PlutusTx +import PlutusLedgerApi.V1.Value (Value (..)) +import PlutusLedgerApi.V1.Value qualified as Value +import PlutusLedgerApi.V2 ( Credential ( PubKeyCredential, ScriptCredential ), CurrencySymbol, + Datum (Datum), + DatumHash (DatumHash), PubKeyHash (..), ScriptContext, + ScriptHash (ScriptHash), TxOutRef, - ValidatorHash (ValidatorHash), ) -import PlutusLedgerApi.V1.Interval qualified as PlutusTx -import PlutusLedgerApi.V1.Scripts (Datum (Datum), DatumHash (DatumHash)) -import PlutusLedgerApi.V1.Value (Value (..)) import PlutusTx.AssocMap qualified as AssocMap import PlutusTx.Builtins qualified as PlutusTx import PlutusTx.IsData qualified as PlutusTx import PlutusTx.Ord qualified as PlutusTx -import Prelude -------------------------------------------------------------------------------- @@ -155,13 +158,17 @@ userCredentials :: [Credential] userCredentials = PubKeyCredential <$> pubKeyHashes -- | An infinite list of *valid* validator hashes. -validatorHashes :: [ValidatorHash] -validatorHashes = ValidatorHash . PlutusTx.toBuiltin <$> blake2b_224Hashes +validatorHashes :: [ScriptHash] +validatorHashes = ScriptHash . PlutusTx.toBuiltin <$> blake2b_224Hashes -- | An infinite list of *valid* script credentials. scriptCredentials :: [Credential] scriptCredentials = ScriptCredential <$> validatorHashes +-- | An infinite list of *valid* script hashes. +scriptHashes :: [ScriptHash] +scriptHashes = ScriptHash . PlutusTx.toBuiltin <$> blake2b_224Hashes + -------------------------------------------------------------------------------- -- | Turn the given list in to groups which have the given length. @@ -190,7 +197,7 @@ mkSpending :: TxOutRef -> ScriptContext mkSpending mkBuilder ps oref = - buildSpendingUnsafe $ + buildSpending' $ mkBuilder ps <> withSpendingOutRef oref {- | Given the builder generator and the parameters, create a 'ScriptContext' @@ -203,7 +210,12 @@ mkMinting :: CurrencySymbol -> ScriptContext mkMinting mkBuilder ps cs = - buildMintingUnsafe $ + buildMinting' $ mkBuilder ps <> withMinting cs type CombinableBuilder b = (Monoid b, Builder b) + +-------------------------------------------------------------------------------- + +subtractValue :: Value -> Value -> Value +subtractValue = Value.unionWith (-) diff --git a/agora.cabal b/agora.cabal index d9819e1..a7a1aad 100644 --- a/agora.cabal +++ b/agora.cabal @@ -1,6 +1,6 @@ cabal-version: 3.0 name: agora -version: 0.2.0 +version: 1.0.0 extra-source-files: CHANGELOG.md author: Emily Martins license: Apache-2.0 @@ -18,10 +18,6 @@ common lang -Wmissing-deriving-strategies -Wno-name-shadowing -Wunused-foralls -fprint-explicit-foralls -fprint-explicit-kinds -Wunused-do-bind - mixins: - base hiding (Prelude), - pprelude (PPrelude as Prelude) - default-extensions: NoStarIsType BangPatterns @@ -81,6 +77,7 @@ common lang TypeSynonymInstances UndecidableInstances ViewPatterns + NoFieldSelectors OverloadedRecordDot default-language: Haskell2010 @@ -89,7 +86,7 @@ common deps build-depends: , aeson , ansi-terminal - , base >=4.14 && <5 + , base >=4.14 && <5 , base-compat , base16 , bytestring @@ -99,15 +96,18 @@ common deps , containers , data-default , data-default-class + , filepath , generics-sop , liqwid-plutarch-extra + , liqwid-script-export + , optics , plutarch - , plutarch-numeric - , plutarch-safe-money - , plutarch-script-export + , plutarch-extra , plutus-core , plutus-ledger-api , plutus-tx + , ply-core + , ply-plutarch , pprelude , prettyprinter , recursion-schemes @@ -116,13 +116,17 @@ common deps , template-haskell , text +common plutarch-prelude mixins: + base hiding (Prelude), + pprelude (PPrelude as Prelude) common test-deps build-depends: , agora , cryptonite , data-default-class + , directory , memory , mtl , plutarch-context-builder @@ -130,6 +134,7 @@ common test-deps , QuickCheck , quickcheck-instances , tasty + , tasty-golden , tasty-hedgehog , tasty-hunit , tasty-quickcheck @@ -139,25 +144,30 @@ common test-deps common exe-opts ghc-options: -threaded -rtsopts -with-rtsopts=-N -O0 +common test-opts + ghc-options: -threaded -rtsopts -with-rtsopts=-N -O2 + library - import: lang, deps + import: lang, deps, plutarch-prelude exposed-modules: Agora.Aeson.Orphans Agora.AuthorityToken Agora.Bootstrap + Agora.Credential Agora.Effect Agora.Effect.GovernorMutation Agora.Effect.NoOp Agora.Effect.TreasuryWithdrawal Agora.Governor Agora.Governor.Scripts + Agora.Linker Agora.Plutarch.Orphans Agora.Proposal Agora.Proposal.Scripts Agora.Proposal.Time Agora.SafeMoney - Agora.Scripts Agora.Stake + Agora.Stake.Redeemers Agora.Stake.Scripts Agora.Treasury Agora.Utils @@ -174,7 +184,7 @@ library pprelude , plutarch library agora-testlib - import: lang, deps, test-deps + import: lang, deps, plutarch-prelude, test-deps exposed-modules: Test.Specification Test.Util @@ -182,10 +192,12 @@ library agora-testlib hs-source-dirs: agora-testlib library agora-specs - import: lang, deps, test-deps + import: lang, deps, plutarch-prelude, test-deps exposed-modules: Property.Generator Property.Governor + Property.Utils + Sample.AuthorityToken.UnauthorizedMintingExploit Sample.Effect.GovernorMutation Sample.Effect.TreasuryWithdrawal Sample.Governor.Initialize @@ -193,12 +205,16 @@ library agora-specs Sample.Proposal.Advance Sample.Proposal.Cosign Sample.Proposal.Create + Sample.Proposal.PrivilegeEscalate Sample.Proposal.Shared - Sample.Proposal.UnlockStake + Sample.Proposal.Unlock Sample.Proposal.Vote Sample.Shared Sample.Stake + Sample.Stake.Create + Sample.Stake.Destroy Sample.Stake.SetDelegate + Sample.Stake.UnauthorizedMintingExploit Sample.Treasury Spec.AuthorityToken Spec.Effect.GovernorMutation @@ -210,19 +226,23 @@ library agora-specs Spec.Utils hs-source-dirs: agora-specs - build-depends: agora-testlib + build-depends: + , agora-testlib + , ordered-containers test-suite agora-test - import: lang, deps, test-deps + import: lang, deps, plutarch-prelude, test-deps, test-opts type: exitcode-stdio-1.0 main-is: Spec.hs hs-source-dirs: agora-test + other-modules: Golden build-depends: + , agora , agora-specs , agora-testlib benchmark agora-bench - import: lang, deps + import: lang, deps, plutarch-prelude hs-source-dirs: agora-bench main-is: Main.hs other-modules: @@ -244,11 +264,14 @@ executable agora-scripts hs-source-dirs: agora-scripts other-modules: build-depends: + , aeson-pretty , agora , gitrev + mixins: base + executable agora-purescript-bridge - import: lang, deps, exe-opts + import: lang, deps, plutarch-prelude, exe-opts main-is: Bridge.hs hs-source-dirs: agora-purescript-bridge other-modules: diff --git a/agora/Agora/Aeson/Orphans.hs b/agora/Agora/Aeson/Orphans.hs index 2408add..e6bdbcd 100644 --- a/agora/Agora/Aeson/Orphans.hs +++ b/agora/Agora/Aeson/Orphans.hs @@ -5,7 +5,7 @@ module Agora.Aeson.Orphans (AsBase16Bytes (..)) where -------------------------------------------------------------------------------- import Data.Coerce (Coercible, coerce) -import Prelude +import Plutarch.Orphans () -------------------------------------------------------------------------------- @@ -20,7 +20,6 @@ import Data.Text.Encoding qualified as T import PlutusLedgerApi.V1 qualified as Plutus import PlutusLedgerApi.V1.Bytes qualified as Plutus -import PlutusLedgerApi.V1.Scripts qualified as Plutus import PlutusLedgerApi.V1.Value qualified as Plutus -------------------------------------------------------------------------------- @@ -38,19 +37,6 @@ deriving via instance Aeson.FromJSON Plutus.AssetClass -deriving via - AsBase16Bytes Plutus.TxId - instance - Aeson.FromJSON Plutus.TxId - -deriving via - AsBase16Bytes Plutus.TxId - instance - Aeson.ToJSON Plutus.TxId - -deriving anyclass instance Aeson.FromJSON Plutus.TxOutRef -deriving anyclass instance Aeson.ToJSON Plutus.TxOutRef - instance (Coercible a Plutus.LedgerBytes) => Aeson.ToJSON (AsBase16Bytes a) where toJSON = Aeson.String @@ -80,86 +66,3 @@ instance (Codec.Serialise a) => Aeson.FromJSON (AsBase16Codec a) where . Codec.deserialiseOrFail . Lazy.fromStrict . T.encodeUtf8 - --------------------------------------------------------------------------------- - -deriving via - (AsBase16Bytes Plutus.CurrencySymbol) - instance - (Aeson.ToJSON Plutus.CurrencySymbol) -deriving via - (AsBase16Bytes Plutus.CurrencySymbol) - instance - (Aeson.FromJSON Plutus.CurrencySymbol) - -deriving via - (AsBase16Bytes Plutus.TokenName) - instance - (Aeson.ToJSON Plutus.TokenName) -deriving via - (AsBase16Bytes Plutus.TokenName) - instance - (Aeson.FromJSON Plutus.TokenName) - -deriving via - (AsBase16Bytes Plutus.ValidatorHash) - instance - (Aeson.ToJSON Plutus.ValidatorHash) -deriving via - (AsBase16Bytes Plutus.ValidatorHash) - instance - (Aeson.FromJSON Plutus.ValidatorHash) - -deriving via - (AsBase16Bytes Plutus.ScriptHash) - instance - (Aeson.ToJSON Plutus.ScriptHash) -deriving via - (AsBase16Bytes Plutus.ScriptHash) - instance - (Aeson.FromJSON Plutus.ScriptHash) - -deriving via - (AsBase16Bytes Plutus.BuiltinByteString) - instance - (Aeson.ToJSON Plutus.BuiltinByteString) -deriving via - (AsBase16Bytes Plutus.BuiltinByteString) - instance - (Aeson.FromJSON Plutus.BuiltinByteString) - -deriving via - (AsBase16Codec Plutus.Validator) - instance - (Aeson.ToJSON Plutus.Validator) -deriving via - (AsBase16Codec Plutus.Validator) - instance - (Aeson.FromJSON Plutus.Validator) - -deriving via - (AsBase16Codec Plutus.MintingPolicy) - instance - (Aeson.ToJSON Plutus.MintingPolicy) -deriving via - (AsBase16Codec Plutus.MintingPolicy) - instance - (Aeson.FromJSON Plutus.MintingPolicy) - -deriving via - (AsBase16Codec Plutus.Script) - instance - (Aeson.ToJSON Plutus.Script) -deriving via - (AsBase16Codec Plutus.Script) - instance - (Aeson.FromJSON Plutus.Script) - -deriving via - Integer - instance - (Aeson.ToJSON Plutus.POSIXTime) -deriving via - Integer - instance - (Aeson.FromJSON Plutus.POSIXTime) diff --git a/agora/Agora/AuthorityToken.hs b/agora/Agora/AuthorityToken.hs index 630c07d..8bee251 100644 --- a/agora/Agora/AuthorityToken.hs +++ b/agora/Agora/AuthorityToken.hs @@ -9,56 +9,52 @@ module Agora.AuthorityToken ( authorityTokenPolicy, authorityTokensValidIn, singleAuthorityTokenBurned, - AuthorityToken (..), ) where +import Agora.Governor (PGovernorRedeemer (PMintGATs), presolveGovernorRedeemer) +import Agora.SafeMoney (AuthorityTokenTag, GovernorSTTag) +import Agora.Utils (ptag, ptaggedSymbolValueOf, ptoScottEncodingT, puntag) import Plutarch.Api.V1 ( - AmountGuarantees, - KeyGuarantees, - PAddress (..), PCredential (..), PCurrencySymbol (..), - PMintingPolicy, - PScriptContext (..), - PScriptPurpose (..), - PTxInInfo (PTxInInfo), - PTxInfo (..), - PTxOut (..), ) -import Plutarch.Api.V1.AssetClass (passetClass, passetClassValueOf) import Plutarch.Api.V1.AssocMap (PMap (PMap)) -import Plutarch.Api.V1.ScriptContext (pisTokenSpent) -import "liqwid-plutarch-extra" Plutarch.Api.V1.Value (psymbolValueOf) -import "plutarch" Plutarch.Api.V1.Value (PValue (PValue)) -import Plutarch.Builtin (pforgetData) -import Plutarch.Extra.List (plookup) -import Plutarch.Extra.TermCont (pguardC, pletFieldsC, pmatchC) -import PlutusLedgerApi.V1.Value (AssetClass (AssetClass)) - --------------------------------------------------------------------------------- - -{- | An AuthorityToken represents a proof that a particular token - spent in the same transaction the AuthorityToken was minted. - In effect, this means that the validator that locked such a token - must have approved the transaction in which an AuthorityToken is minted. - Said validator should be made aware of an AuthorityToken token's existence - in order to prevent incorrect minting. - - @since 0.1.0 --} -newtype AuthorityToken = AuthorityToken - { authority :: AssetClass - -- ^ Token that must move in order for minting this to be valid. - } - deriving stock - ( -- | @since 0.1.0 - Generic - ) +import Plutarch.Api.V1.Value (PValue (PValue)) +import Plutarch.Api.V2 ( + AmountGuarantees, + KeyGuarantees, + PAddress (PAddress), + PMintingPolicy, + PScriptPurpose (PMinting), + PTxInInfo (PTxInInfo), + PTxOut (PTxOut), + ) +import Plutarch.Extra.AssetClass (PAssetClassData) +import Plutarch.Extra.Bool (passert) +import Plutarch.Extra.Maybe (passertPJust, pfromJust) +import Plutarch.Extra.Sum (PSum (PSum)) +import Plutarch.Extra.Tagged (PTagged) +import Plutarch.Extra.Traversable (pfoldMap) +import Plutarch.Extra.Value (psymbolValueOf') +import "liqwid-plutarch-extra" Plutarch.Extra.List (plookupAssoc) +import "liqwid-plutarch-extra" Plutarch.Extra.TermCont ( + pguardC, + pletC, + pletFieldsC, + pmatchC, + ) -------------------------------------------------------------------------------- {- | Check that all GATs are valid in a particular TxOut. - How this is checked: an AuthorityToken should never leave + + WARNING: As of version 1.0.0, this has been weakened in order to be + compatible with RATs. The token name is no loger checked, meaning that a + GAT can escape from its effect script, if the effect script is vulnerable. + In order to prevent this, all effect scripts should be implemented carefully, + and ideally use the trusted effect base. See also 'Agora.Effect'. + + (before 1.0.0) How this is checked: an AuthorityToken should never leave the Effect it was initially sent to, so we simply check that the script address the token resides in matches the TokenName. Since the TokenName was tagged upon mint with the Effect script @@ -66,9 +62,9 @@ newtype AuthorityToken = AuthorityToken In other words, check that all assets of a particular currency symbol are tagged with a TokenName that matches where they live. - @since 0.1.0 + @since 1.0.0 -} -authorityTokensValidIn :: Term s (PCurrencySymbol :--> PTxOut :--> PBool) +authorityTokensValidIn :: forall (s :: S). Term s (PTagged AuthorityTokenTag PCurrencySymbol :--> PTxOut :--> PBool) authorityTokensValidIn = phoistAcyclic $ plam $ \authorityTokenSym txOut'' -> unTermCont $ do PTxOut txOut' <- pmatchC txOut'' @@ -77,25 +73,21 @@ authorityTokensValidIn = phoistAcyclic $ PValue value' <- pmatchC txOut.value PMap value <- pmatchC value' pure $ - pmatch (plookup # pdata authorityTokenSym # value) $ \case - PJust (pfromData -> tokenMap') -> + pmatch (plookupAssoc # pfstBuiltin # psndBuiltin # pdata (puntag authorityTokenSym) # value) $ \case + PJust (pfromData -> _tokenMap') -> pmatch (pfield @"credential" # address) $ \case PPubKeyCredential _ -> -- GATs should only be sent to Effect validators ptraceIfFalse "authorityTokensValidIn: GAT incorrectly lives at PubKey" $ pconstant False - PScriptCredential ((pfromData . (pfield @"_0" #)) -> cred) -> unTermCont $ do - PMap tokenMap <- pmatchC tokenMap' - pure $ - ptraceIfFalse "authorityTokensValidIn: GAT TokenName doesn't match ScriptHash" $ - pall - # plam - ( \pair -> - pforgetData (pfstBuiltin # pair) #== pforgetData (pdata cred) - ) - # tokenMap + PScriptCredential _ -> + -- NOTE: We no longer can perform a check on `TokenName` content here. + -- Instead, the auth check system uses `TokenName`s, but it cannot + -- check for GATs incorrectly escaping scripts. The effect scripts + -- need to be written very carefully in order to disallow this. + pcon PTrue PNothing -> -- No GATs exist at this output! - pconstant True + pcon PTrue {- | Assert that a single authority token has been burned. @@ -103,60 +95,97 @@ authorityTokensValidIn = phoistAcyclic $ -} singleAuthorityTokenBurned :: forall (keys :: KeyGuarantees) (amounts :: AmountGuarantees) (s :: S). - Term s PCurrencySymbol -> + Term s (PTagged AuthorityTokenTag PCurrencySymbol) -> Term s (PBuiltinList PTxInInfo) -> Term s (PValue keys amounts) -> Term s PBool singleAuthorityTokenBurned gatCs inputs mint = unTermCont $ do let gatAmountMinted :: Term _ PInteger - gatAmountMinted = psymbolValueOf # gatCs # mint + gatAmountMinted = ptaggedSymbolValueOf # gatCs # mint + + let inputsWithGAT = + pfoldMap + # plam + ( flip pmatch $ \case + PTxInInfo txInInfo -> unTermCont $ do + resolved <- pletC $ pfield @"resolved" # txInInfo + + pguardC "While counting GATs at inputs: all GATs must be valid" + $ authorityTokensValidIn + # gatCs + #$ pfromData + $ resolved + + pure . pcon . PSum $ + ptaggedSymbolValueOf + # gatCs + #$ pfield @"value" + #$ resolved + ) + # inputs pure $ foldr1 (#&&) - [ ptraceIfFalse "singleAuthorityTokenBurned: Must burn exactly 1 GAT" $ gatAmountMinted #== -1 - , ptraceIfFalse "singleAuthorityTokenBurned: All GAT tokens must be valid at the inputs" $ - pall - # plam - ( \txInInfo' -> unTermCont $ do - PTxInInfo txInInfo <- pmatchC txInInfo' - let txOut' = pfield @"resolved" # txInInfo - pure $ authorityTokensValidIn # gatCs # pfromData txOut' - ) - # inputs + [ ptraceIfFalse "singleAuthorityTokenBurned: Must burn exactly 1 GAT" $ + gatAmountMinted #== -1 + , ptraceIfFalse "Only one GAT must exist at the inputs" $ + inputsWithGAT #== 1 ] {- | Policy given 'AuthorityToken' params. + == Authority Token + + An AuthorityToken represents a proof that a particular token + spent in the same transaction the AuthorityToken was minted. + In effect, this means that the validator that locked such a token + must have approved the transaction in which an AuthorityToken is minted. + Said validator should be made aware of an AuthorityToken token's existence + in order to prevent incorrect minting. + @since 0.1.0 -} -authorityTokenPolicy :: AuthorityToken -> ClosedTerm PMintingPolicy -authorityTokenPolicy params = - plam $ \_redeemer ctx' -> - pmatch ctx' $ \(PScriptContext ctx') -> unTermCont $ do - ctx <- pletFieldsC @'["txInfo", "purpose"] ctx' - PTxInfo txInfo' <- pmatchC $ pfromData ctx.txInfo - txInfo <- pletFieldsC @'["inputs", "mint", "outputs"] txInfo' - let inputs = txInfo.inputs - mintedValue = pfromData txInfo.mint - AssetClass (govCs, govTn) = params.authority - govAc = passetClass # pconstant govCs # pconstant govTn - govTokenSpent = pisTokenSpent # govAc # inputs +authorityTokenPolicy :: ClosedTerm (PAsData (PTagged GovernorSTTag PAssetClassData) :--> PMintingPolicy) +authorityTokenPolicy = + plam $ \gstAssetClass _redeemer ctx -> unTermCont $ do + ctxF <- pletFieldsC @'["txInfo", "purpose"] ctx + txInfoF <- + pletFieldsC + @'[ "inputs" + , "mint" + , "outputs" + , "redeemers" + ] + ctxF.txInfo - PMinting ownSymbol' <- pmatchC $ pfromData ctx.purpose + PMinting ownSymbol' <- pmatchC $ pfromData ctxF.purpose - let ownSymbol = pfromData $ pfield @"_0" # ownSymbol' - mintedATs = passetClassValueOf # mintedValue # (passetClass # ownSymbol # pconstant "") - pure $ + let ownSymbol = pfromData $ pfield @"_0" # ownSymbol' + + PPair mintedATs burntATs <- + pmatchC $ pfromJust #$ psymbolValueOf' # ownSymbol # txInfoF.mint + + pure $ + popaque $ pif (0 #< mintedATs) ( unTermCont $ do - pguardC "Parent token did not move in minting GATs" govTokenSpent + pguardC "No GAT burnt" $ 0 #== burntATs + let governorRedeemer = + passertPJust + # "GST should move" + #$ presolveGovernorRedeemer + # (ptoScottEncodingT # pfromData gstAssetClass) + # pfromData txInfoF.inputs + # txInfoF.redeemers + pguardC "Governor redeemr correct" $ + pcon PMintGATs #== governorRedeemer pguardC "All outputs only emit valid GATs" $ pall # plam - (authorityTokensValidIn # ownSymbol #) - # txInfo.outputs - pure $ popaque $ pconstant () + (authorityTokensValidIn # ptag ownSymbol #) + # txInfoF.outputs + pure $ pconstant () ) - (popaque $ pconstant ()) + (passert "No GAT minted" (0 #== mintedATs) (pconstant ())) diff --git a/agora/Agora/Bootstrap.hs b/agora/Agora/Bootstrap.hs index 17d97d3..5f15a4f 100644 --- a/agora/Agora/Bootstrap.hs +++ b/agora/Agora/Bootstrap.hs @@ -4,64 +4,91 @@ Initialize a governance system -} -module Agora.Bootstrap (agoraScripts) where +module Agora.Bootstrap (agoraScripts, agoraScripts', alwaysSucceedsPolicyRoledScript) where -import Agora.AuthorityToken (AuthorityToken (..), authorityTokenPolicy) -import Agora.Governor (Governor (..)) +import Agora.AuthorityToken (authorityTokenPolicy) +import Agora.Effect.GovernorMutation (mutateGovernorValidator) +import Agora.Effect.NoOp (noOpValidator) +import Agora.Effect.TreasuryWithdrawal (treasuryWithdrawalValidator) import Agora.Governor.Scripts (governorPolicy, governorValidator) import Agora.Proposal.Scripts (proposalPolicy, proposalValidator) -import Agora.Scripts (AgoraScripts (AgoraScripts)) -import Agora.Scripts qualified as Scripts import Agora.Stake.Scripts (stakePolicy, stakeValidator) import Agora.Treasury (treasuryValidator) -import Agora.Utils ( - CompiledMintingPolicy (..), - CompiledValidator (..), - ) +import Data.Map (fromList) +import Data.Text (Text, unpack) import Plutarch (Config) -import Plutarch.Api.V1 ( - mintingPolicySymbol, - mkMintingPolicy, - mkValidator, - ) -import PlutusLedgerApi.V1.Value (AssetClass (..)) +import Plutarch.Api.V2 (PMintingPolicy) +import Plutarch.Extra.Compile (mustCompile) +import Ply (ScriptRole (MintingPolicyRole), TypedScriptEnvelope) +import Ply.Plutarch.TypedWriter (TypedWriter, mkEnvelope) +import ScriptExport.ScriptInfo (RawScriptExport (..), RoledScript (..)) -{- | Parameterize and precompiled core scripts, given the - 'Agora.Governor.Governor' parameters and plutarch configurations. +{- | Parameterize core scripts, given the 'Agora.Governor.Governor' + parameters and plutarch configurations. - @since 0.2.0 + @since 1.0.0 -} -agoraScripts :: Config -> Governor -> AgoraScripts -agoraScripts conf gov = scripts +agoraScripts :: Config -> RawScriptExport +agoraScripts conf = + RawScriptExport $ + fromList + [ envelope "agora:governorPolicy" governorPolicy + , envelope "agora:governorValidator" governorValidator + , envelope "agora:stakePolicy" stakePolicy + , envelope "agora:stakeValidator" stakeValidator + , envelope "agora:proposalPolicy" proposalPolicy + , envelope "agora:proposalValidator" proposalValidator + , envelope "agora:treasuryValidator" treasuryValidator + , envelope "agora:authorityTokenPolicy" authorityTokenPolicy + , envelope "agora:noOpValidator" noOpValidator + , envelope "agora:treasuryWithdrawalValidator" treasuryWithdrawalValidator + , envelope "agora:mutateGovernorValidator" mutateGovernorValidator + ] where - mkMintingPolicy' = mkMintingPolicy conf - mkValidator' = mkValidator conf + envelope :: + forall (pt :: S -> Type). + TypedWriter pt => + Text -> + ClosedTerm pt -> + (Text, TypedScriptEnvelope) + envelope d t = (d, either (error . unpack) id $ mkEnvelope conf d t) - compiledGovernorPolicy = mkMintingPolicy' $ governorPolicy gov.gstOutRef - compiledGovernorValidator = mkValidator' $ governorValidator scripts - governorSymbol = mintingPolicySymbol compiledGovernorPolicy - governorAssetClass = AssetClass (governorSymbol, "") +agoraScripts' :: Config -> Either Text [TypedScriptEnvelope] +agoraScripts' conf = + sequenceA + [ envelope "Governor Policy" governorPolicy + , envelope "Governor Validator" governorValidator + , envelope "Stake Policy" stakePolicy + , envelope "Stake Validator" stakeValidator + , envelope "Proposal Policy" proposalPolicy + , envelope "Proposal Validator" proposalValidator + , envelope "Treasury Validator" treasuryValidator + , envelope "Authority Token Policy" authorityTokenPolicy + , envelope "NoOp Validator" noOpValidator + , envelope "Treasury Withdrawal Validator" treasuryWithdrawalValidator + , envelope "Mutate Governor Validator" mutateGovernorValidator + , envelope "Always Succeeds Policy" ((plam $ \_ _ -> popaque $ pcon PUnit) :: Term s PMintingPolicy) + ] + where + envelope :: + forall (pt :: S -> Type). + TypedWriter pt => + Text -> + ClosedTerm pt -> + Either Text TypedScriptEnvelope + envelope = mkEnvelope conf - authority = AuthorityToken governorAssetClass - compiledAuthorityPolicy = mkMintingPolicy' $ authorityTokenPolicy authority - authorityTokenSymbol = mintingPolicySymbol compiledAuthorityPolicy +{- | A minting policy that always succeeds. - compiledProposalPolicy = mkMintingPolicy' $ proposalPolicy governorAssetClass - compiledProposalValidator = mkValidator' $ proposalValidator scripts gov.maximumCosigners + NOTE(Emily, Jan 3rd 2023): Adding this in here because it's useful for testnet GT. + In reality, it shouldn't be used by anyone on mainnet, but removing it is not + productive for off-chain testing. - compiledStakePolicy = mkMintingPolicy' $ stakePolicy gov.gtClassRef - compiledStakeValidator = mkValidator' $ stakeValidator scripts gov.gtClassRef - - compiledTreasuryValidator = mkValidator' $ treasuryValidator authorityTokenSymbol - - scripts = - AgoraScripts - { Scripts.compiledGovernorPolicy = CompiledMintingPolicy compiledGovernorPolicy - , Scripts.compiledGovernorValidator = CompiledValidator compiledGovernorValidator - , Scripts.compiledStakePolicy = CompiledMintingPolicy compiledStakePolicy - , Scripts.compiledStakeValidator = CompiledValidator compiledStakeValidator - , Scripts.compiledProposalPolicy = CompiledMintingPolicy compiledProposalPolicy - , Scripts.compiledProposalValidator = CompiledValidator compiledProposalValidator - , Scripts.compiledTreasuryValidator = CompiledValidator compiledTreasuryValidator - , Scripts.compiledAuthorityTokenPolicy = CompiledMintingPolicy compiledAuthorityPolicy - } + @since 1.0.0 +-} +alwaysSucceedsPolicyRoledScript :: RoledScript +alwaysSucceedsPolicyRoledScript = + RoledScript + { script = mustCompile @PMintingPolicy $ plam $ \_ _ -> popaque $ pcon PUnit + , role = MintingPolicyRole + } diff --git a/agora/Agora/Credential.hs b/agora/Agora/Credential.hs new file mode 100644 index 0000000..2f8ff90 --- /dev/null +++ b/agora/Agora/Credential.hs @@ -0,0 +1,77 @@ +{- | +Module : Agora.Stake.Scripts +Maintainer : emi@haskell.fyi +Description: Functions for dealing with generalized credentials. + +Functions for dealing with generalized credentials. +-} +module Agora.Credential ( + pauthorizedBy, + authorizationContext, +) where + +import GHC.Records (HasField) +import Plutarch.Api.V1 (PCredential (PPubKeyCredential, PScriptCredential), PPubKeyHash) +import Plutarch.Api.V2 (PTxInInfo) +import Plutarch.Extra.ScriptContext (ptxSignedBy) +import "liqwid-plutarch-extra" Plutarch.Extra.TermCont (pmatchC) + +{- | Context required in order to check 'AuthorizationCredential'. + + Construct using 'authorizationContext'. + + @since 1.0.0 +-} +data PAuthorizationContext (s :: S) = PAuthorizationContext + { signatories :: Term s (PBuiltinList (PAsData PPubKeyHash)) + , inputs :: Term s (PBuiltinList PTxInInfo) + } + deriving stock + ( -- | @since 1.0.0 + Generic + ) + deriving anyclass + ( -- | @since 1.0.0 + PlutusType + , -- | @since 1.0.0 + PEq + ) + +-- | @since 1.0.0 +instance DerivePlutusType PAuthorizationContext where + type DPTStrat _ = PlutusTypeScott + +{- | Build up 'PAuthorizationContext' from fields. + + @since 1.0.0 +-} +authorizationContext :: + forall (s :: S) (r :: Type). + ( HasField "inputs" r (Term s (PBuiltinList PTxInInfo)) + , HasField "signatories" r (Term s (PBuiltinList (PAsData PPubKeyHash))) + ) => + r -> + Term s PAuthorizationContext +authorizationContext f = + pcon (PAuthorizationContext f.signatories f.inputs) + +{- | Check for authorization by credential. + + @since 1.0.0 +-} +pauthorizedBy :: forall (s :: S). Term s (PAuthorizationContext :--> PCredential :--> PBool) +pauthorizedBy = phoistAcyclic $ + plam $ \ctx credential -> unTermCont $ do + ctxF <- pmatchC ctx + pure $ + pmatch credential $ \case + PPubKeyCredential ((pfield @"_0" #) -> pk) -> + ptxSignedBy # ctxF.signatories # pk + PScriptCredential ((pfield @"_0" #) -> _) -> + pany + # plam + ( \input -> + (pfield @"credential" #$ pfield @"address" #$ pfield @"resolved" # input) + #== credential + ) + # ctxF.inputs diff --git a/agora/Agora/Effect.hs b/agora/Agora/Effect.hs index 4f94426..e7fed4a 100644 --- a/agora/Agora/Effect.hs +++ b/agora/Agora/Effect.hs @@ -8,17 +8,18 @@ Helpers for constructing effects. module Agora.Effect (makeEffect) where import Agora.AuthorityToken (singleAuthorityTokenBurned) +import Agora.SafeMoney (AuthorityTokenTag) import Plutarch.Api.V1 ( PCurrencySymbol, + ) +import Plutarch.Api.V2 ( PScriptPurpose (PSpending), PTxInfo, PTxOutRef, PValidator, - PValue, ) -import Plutarch.Extra.TermCont (pguardC, pletC, pletFieldsC, pmatchC, ptryFromC) -import Plutarch.TryFrom () -import PlutusLedgerApi.V1.Value (CurrencySymbol) +import Plutarch.Extra.Tagged (PTagged) +import "liqwid-plutarch-extra" Plutarch.Extra.TermCont (pguardC, pletC, pletFieldsC, pmatchC, ptryFromC) {- | Helper "template" for creating effect validator. @@ -26,36 +27,46 @@ import PlutusLedgerApi.V1.Value (CurrencySymbol) an effect is implemented. In such situations, it's okay to not use this helper. - @since 0.1.0 + @since 1.0.0 -} makeEffect :: - forall (datum :: PType). + forall (datum :: PType) (s :: S). (PTryFrom PData datum, PIsData datum) => - CurrencySymbol -> - (forall (s :: S). Term s PCurrencySymbol -> Term s datum -> Term s PTxOutRef -> Term s (PAsData PTxInfo) -> Term s POpaque) -> - ClosedTerm PValidator -makeEffect gatCs' f = + ( Term s (PTagged AuthorityTokenTag PCurrencySymbol) -> + Term s datum -> + Term s PTxOutRef -> + Term s (PAsData PTxInfo) -> + Term s POpaque + ) -> + Term s (PAsData (PTagged AuthorityTokenTag PCurrencySymbol)) -> + Term s PValidator +makeEffect f atSymbol' = plam $ \datum _redeemer ctx' -> unTermCont $ do + atSymbol <- pletC $ pfromData atSymbol' ctx <- pletFieldsC @'["txInfo", "purpose"] ctx' - -- convert input datum, PData, into desierable type + -- Convert input datum, PData, into desierable type -- the way this conversion is performed should be defined -- by PTryFrom for each datum in effect script. - (datum', _) <- ptryFromC datum + datum' <- fst <$> ptryFromC datum - -- ensure purpose is Spending. + -- Ensure purpose is Spending. Why? The only way that this + -- effect script can actually pass any validation onto other + -- scripts is by preventing the spend of the GAT. + -- + -- - In the case of GATs which don't get burned, that will + -- allow reuse of the GAT. + -- + -- - In the case of GATs which get _referenced_, this script + -- won't be run at all, in which case. The auth check needs + -- to be especially written with that in mind. PSpending txOutRef <- pmatchC $ pfromData ctx.purpose txOutRef' <- pletC (pfield @"_0" # txOutRef) - -- fetch minted values to ensure single GAT is burned txInfo <- pletFieldsC @'["mint", "inputs"] ctx.txInfo - let mint :: Term _ (PValue _ _) - mint = txInfo.mint - -- fetch script context - gatCs <- pletC $ pconstant gatCs' - - pguardC "A single authority token has been burned" $ singleAuthorityTokenBurned gatCs txInfo.inputs mint + pguardC "A single authority token has been burned" $ + singleAuthorityTokenBurned atSymbol txInfo.inputs txInfo.mint -- run effect function - pure $ f gatCs datum' txOutRef' ctx.txInfo + pure $ f atSymbol datum' txOutRef' ctx.txInfo diff --git a/agora/Agora/Effect/GovernorMutation.hs b/agora/Agora/Effect/GovernorMutation.hs index 22f539c..4e4efc7 100644 --- a/agora/Agora/Effect/GovernorMutation.hs +++ b/agora/Agora/Effect/GovernorMutation.hs @@ -21,32 +21,43 @@ module Agora.Effect.GovernorMutation ( import Agora.Effect (makeEffect) import Agora.Governor ( GovernorDatum, - PGovernorDatum, - pisGovernorDatumValid, + GovernorRedeemer (MutateGovernor), + PGovernorDatum (PGovernorDatum), + PGovernorRedeemer, ) -import Agora.Plutarch.Orphans () -import Agora.Scripts (AgoraScripts, authorityTokenSymbol, governorSTAssetClass) -import Plutarch.Api.V1 ( - PTxOutRef, +import Agora.Proposal (PProposalId) +import Agora.SafeMoney (AuthorityTokenTag, GovernorSTTag) +import Agora.Utils (pfindInputWithStateThreadToken, pfindOutputWithStateThreadToken) +import Generics.SOP qualified as SOP +import Plutarch.Api.V1 (PCurrencySymbol) +import Plutarch.Api.V2 ( + PScriptHash, + PScriptPurpose (PSpending), PValidator, - PValue, ) -import Plutarch.Api.V1.ScriptContext (pisScriptAddress, ptryFindDatum) -import "liqwid-plutarch-extra" Plutarch.Api.V1.Value (pvalueOf) import Plutarch.DataRepr ( - DerivePConstantViaData (..), PDataFields, ) -import Plutarch.Extra.Maybe ( - passertPDJust, - passertPJust, +import Plutarch.Extra.Field (pletAll, pletAllC) +import Plutarch.Extra.IsData ( + DerivePConstantViaDataList (DerivePConstantViaDataList), + PlutusTypeDataList, + ProductIsData (ProductIsData), ) -import Plutarch.Extra.TermCont (pguardC, pletFieldsC) +import Plutarch.Extra.Maybe (passertPJust, pfromJust) +import Plutarch.Extra.Record (mkRecordConstr, (.&), (.=)) +import Plutarch.Extra.ScriptContext ( + pisScriptAddress, + pscriptHashFromAddress, + ptryFromOutputDatum, + ptryFromRedeemer, + ) +import Plutarch.Extra.Tagged (PTagged) import Plutarch.Lift (PConstantDecl, PLifted, PUnsafeLiftDecl) -import PlutusLedgerApi.V1 (TxOutRef) -import PlutusLedgerApi.V1.Value (AssetClass (..)) import PlutusTx qualified +import "liqwid-plutarch-extra" Plutarch.Extra.TermCont (pguardC, pletC, pletFieldsC) + -------------------------------------------------------------------------------- {- | Haskell-level datum for the governor mutation effect script. @@ -54,8 +65,8 @@ import PlutusTx qualified @since 0.1.0 -} data MutateGovernorDatum = MutateGovernorDatum - { governorRef :: TxOutRef - -- ^ Referenced governor state UTXO should be updated by the effect. + { oldDatum :: GovernorDatum + -- ^ The governor datum value on which this effect is valid , newDatum :: GovernorDatum -- ^ The new settings for the governor. } @@ -65,8 +76,17 @@ data MutateGovernorDatum = MutateGovernorDatum , -- | @since 0.1.ç Generic ) - -PlutusTx.makeIsDataIndexed ''MutateGovernorDatum [('MutateGovernorDatum, 0)] + deriving anyclass + ( -- | @since 1.0.0 + SOP.Generic + ) + deriving + ( -- | @since 1.0.0 + PlutusTx.ToData + , -- | @since 1.0.0 + PlutusTx.FromData + ) + via (ProductIsData MutateGovernorDatum) -------------------------------------------------------------------------------- @@ -79,7 +99,7 @@ newtype PMutateGovernorDatum (s :: S) ( Term s ( PDataRecord - '[ "governorRef" ':= PTxOutRef + '[ "oldDatum" ':= PGovernorDatum , "newDatum" ':= PGovernorDatum ] ) @@ -100,16 +120,20 @@ newtype PMutateGovernorDatum (s :: S) ) instance DerivePlutusType PMutateGovernorDatum where - type DPTStrat _ = PlutusTypeData + type DPTStrat _ = PlutusTypeDataList -- | @since 0.1.0 -instance PUnsafeLiftDecl PMutateGovernorDatum where type PLifted PMutateGovernorDatum = MutateGovernorDatum +instance PUnsafeLiftDecl PMutateGovernorDatum where + type PLifted PMutateGovernorDatum = MutateGovernorDatum -- | @since 0.1.0 -deriving via (DerivePConstantViaData MutateGovernorDatum PMutateGovernorDatum) instance (PConstantDecl MutateGovernorDatum) +deriving via + (DerivePConstantViaDataList MutateGovernorDatum PMutateGovernorDatum) + instance + (PConstantDecl MutateGovernorDatum) -- | @since 0.1.0 -deriving anyclass instance PTryFrom PData PMutateGovernorDatum +deriving anyclass instance PTryFrom PData (PAsData PMutateGovernorDatum) -------------------------------------------------------------------------------- @@ -136,83 +160,137 @@ deriving anyclass instance PTryFrom PData PMutateGovernorDatum * It has valid governor state datum. * The datum is exactly the same as the 'newDatum'. - @since 0.1.0 + @since 1.0.0 -} mutateGovernorValidator :: - -- | Lazy precompiled scripts. This is beacuse we need the symbol of GST. - AgoraScripts -> - ClosedTerm PValidator -mutateGovernorValidator as = makeEffect (authorityTokenSymbol as) $ - \_gatCs (datum :: Term _ PMutateGovernorDatum) _ txInfo -> unTermCont $ do - datumF <- pletFieldsC @'["newDatum", "governorRef"] datum - txInfoF <- pletFieldsC @'["mint", "inputs", "outputs", "datums"] txInfo + ClosedTerm + ( PAsData PScriptHash + :--> PAsData (PTagged GovernorSTTag PCurrencySymbol) + :--> PAsData (PTagged AuthorityTokenTag PCurrencySymbol) + :--> PValidator + ) +mutateGovernorValidator = + plam $ \govValidatorHash gstSymbol -> makeEffect @(PAsData PMutateGovernorDatum) $ + \_gatCs (pfromData -> effectDatum) _ txInfo -> unTermCont $ do + effectDatumF <- pletAllC effectDatum + txInfoF <- pletFieldsC @'["inputs", "outputs", "datums", "redeemers"] txInfo - let mint :: Term _ (PBuiltinList _) - mint = pto $ pto $ pto $ pfromData txInfoF.mint + -------------------------------------------------------------------------- - pguardC "Nothing should be minted/burnt other than GAT" $ - plength # mint #== 1 - - -- Only two script inputs are alloed: one from the effect, one from the governor. - pguardC "Only self and governor script inputs are allowed" $ - pfoldr - # phoistAcyclic - ( plam $ \inInfo count -> - let address = pfield @"address" #$ pfield @"resolved" # inInfo - in pif - (pisScriptAddress # address) - (count + 1) - count - ) - # (0 :: Term _ PInteger) - # pfromData txInfoF.inputs - #== 2 - - -- Find the governor input by looking for GST. - let inputWithGST = - passertPJust # "Governor input not found" #$ pfind - # phoistAcyclic - ( plam $ \inInfo -> - let value = pfield @"value" #$ pfield @"resolved" # inInfo - in gstValueOf # value #== 1 + scriptInputs <- + pletC $ + pfilter + # plam + ( \inInfo -> + pisScriptAddress + #$ pfield @"address" + #$ pfield @"resolved" + # inInfo ) # pfromData txInfoF.inputs - govInInfo <- pletFieldsC @'["outRef", "resolved"] $ inputWithGST + -- Only two script inputs are alloed: one from the effect script, another from the governor. + pguardC "Only self and governor script inputs are allowed" $ + plength # scriptInputs #== 2 - -- The effect can only modify the governor UTXO referenced in the datum. - pguardC "Can only modify the pinned governor" $ - govInInfo.outRef #== datumF.governorRef + let + governorInput = + passertPJust + # "Governor UTXO should carry GST" + # ( pfindInputWithStateThreadToken + # pfromData gstSymbol + # scriptInputs + ) - -- The transaction can only have one output, which should be sent to the governor. - pguardC "Only governor output is allowed" $ - plength # pfromData txInfoF.outputs #== 1 + governorRef = pfield @"outRef" # governorInput - let govAddress = pfield @"address" #$ govInInfo.resolved - govOutput' = phead # pfromData txInfoF.outputs + governorInputDatum = + ptrace "Resolve governor input datum" $ + pfromData $ + ptryFromOutputDatum @(PAsData PGovernorDatum) + # (pfield @"datum" #$ pfield @"resolved" # governorInput) + # txInfoF.datums - govOutput <- pletFieldsC @'["address", "value", "datumHash"] govOutput' + inputProposalId = pfield @"nextProposalId" # governorInputDatum - pguardC "No output to the governor" $ - govOutput.address #== govAddress + expectedInputDatum = + replaceProposalId # effectDatumF.oldDatum # inputProposalId - pguardC "Governor output doesn't carry the GST" $ - gstValueOf # govOutput.value #== 1 + pguardC "Governor input should be valid" $ + ( pletAll governorInput $ \inputF -> + let + isGovernorInput = + foldl1 + (#&&) + [ ptraceIfFalse "Can only modify the pinned governor datum" $ + governorInputDatum #== expectedInputDatum + , ptraceIfFalse "Governor validator run" $ + let inputScriptHash = + pfromJust + #$ pscriptHashFromAddress + #$ pfield @"address" + # inputF.resolved + in inputScriptHash #== pfromData govValidatorHash + ] + in + isGovernorInput + ) + + let + governorRedeemer = + pfromData $ + passertPJust + # "Governor redeemer should be resolved" + #$ ptryFromRedeemer @(PAsData PGovernorRedeemer) + # mkRecordConstr PSpending (#_0 .= governorRef) + # txInfoF.redeemers + + pguardC "Spend governor with redeemer MutateGovernor" $ + governorRedeemer #== pconstant MutateGovernor + + ---------------------------------------------------------------------------- + + let + governorOutput = + passertPJust + # "No governor output found" + #$ pfindOutputWithStateThreadToken + # pfromData gstSymbol + # pfromData txInfoF.outputs - let governorOutputDatumHash = - passertPDJust # "Governor output doesn't have datum" # govOutput.datumHash governorOutputDatum = - passertPJust @PGovernorDatum # "Governor output datum not found" - #$ ptryFindDatum # governorOutputDatumHash # txInfoF.datums + ptrace "Resolve governor outoput datum" $ + pfromData $ + ptryFromOutputDatum @(PAsData PGovernorDatum) + # (pfield @"datum" # governorOutput) + # txInfoF.datums - -- Ensure the output governor datum is what we want. - pguardC "Unexpected governor datum" $ datumF.newDatum #== governorOutputDatum - pguardC "New governor datum should be valid" $ pisGovernorDatumValid # governorOutputDatum + expectedOutputDatum = + replaceProposalId # effectDatumF.newDatum # inputProposalId - return $ popaque $ pconstant () + pguardC "New governor datum correct" $ + governorOutputDatum #== expectedOutputDatum + + return $ popaque $ pconstant () where - -- Get the amount of GST in the a given value. - gstValueOf :: Term s (PValue _ _ :--> PInteger) - gstValueOf = phoistAcyclic $ plam $ \v -> pvalueOf # v # pconstant cs # pconstant tn - where - AssetClass (cs, tn) = governorSTAssetClass as + replaceProposalId :: + ClosedTerm + ( PGovernorDatum + :--> PAsData PProposalId + :--> PGovernorDatum + ) + replaceProposalId = plam $ \datum proposalId -> + pletAll datum $ \datumF -> + mkRecordConstr + PGovernorDatum + ( #proposalThresholds + .= datumF.proposalThresholds + .& #nextProposalId + .= proposalId + .& #proposalTimings + .= datumF.proposalTimings + .& #createProposalTimeRangeMaxWidth + .= datumF.createProposalTimeRangeMaxWidth + .& #maximumCreatedProposalsPerStake + .= datumF.maximumCreatedProposalsPerStake + ) diff --git a/agora/Agora/Effect/NoOp.hs b/agora/Agora/Effect/NoOp.hs index 4027a6c..a927fea 100644 --- a/agora/Agora/Effect/NoOp.hs +++ b/agora/Agora/Effect/NoOp.hs @@ -8,9 +8,10 @@ A dumb effect that only burns its GAT. module Agora.Effect.NoOp (noOpValidator, PNoOp) where import Agora.Effect (makeEffect) -import Agora.Plutarch.Orphans () -import Plutarch.Api.V1 (PValidator) -import PlutusLedgerApi.V1.Value (CurrencySymbol) +import Agora.SafeMoney (AuthorityTokenTag) +import Plutarch.Api.V1 (PCurrencySymbol) +import Plutarch.Api.V2 (PValidator) +import Plutarch.Extra.Tagged (PTagged) {- | Dummy datum for NoOp effect. @@ -37,8 +38,9 @@ instance PTryFrom PData (PAsData PNoOp) {- | Dummy effect which can only burn its GAT. - @since 0.1.0 + @since 1.0.0 -} -noOpValidator :: CurrencySymbol -> ClosedTerm PValidator -noOpValidator curr = makeEffect curr $ - \_ (_datum :: Term s (PAsData PNoOp)) _ _ -> popaque (pconstant ()) +noOpValidator :: ClosedTerm (PAsData (PTagged AuthorityTokenTag PCurrencySymbol) :--> PValidator) +noOpValidator = plam $ + makeEffect $ + \_ (_datum :: Term s (PAsData PNoOp)) _ _ -> popaque (pconstant ()) diff --git a/agora/Agora/Effect/TreasuryWithdrawal.hs b/agora/Agora/Effect/TreasuryWithdrawal.hs index 3bb058b..32e7c79 100644 --- a/agora/Agora/Effect/TreasuryWithdrawal.hs +++ b/agora/Agora/Effect/TreasuryWithdrawal.hs @@ -9,32 +9,50 @@ An Effect that withdraws treasury deposit -} module Agora.Effect.TreasuryWithdrawal ( TreasuryWithdrawalDatum (..), - PTreasuryWithdrawalDatum (..), + PTreasuryWithdrawalDatum (PTreasuryWithdrawalDatum), treasuryWithdrawalValidator, ) where import Agora.Effect (makeEffect) -import Agora.Plutarch.Orphans () -import Plutarch.Api.V1 ( +import Agora.SafeMoney (AuthorityTokenTag) +import Agora.Utils (pisSubValueOf, psubtractSortedValue, puncurryTuple) +import Generics.SOP qualified as SOP +import Plutarch.Api.Internal.Hashing (hashData) +import Plutarch.Api.V1 (PCredential, PCurrencySymbol, PValue) +import Plutarch.Api.V1.Address (PCredential (PPubKeyCredential)) +import Plutarch.Api.V1.Value (pforgetPositive) +import Plutarch.Api.V2 ( AmountGuarantees (Positive), KeyGuarantees (Sorted), - PCredential (..), PTuple, + PTxInInfo, + PTxOut, PValidator, - PValue, - ptuple, ) -import Plutarch.Api.V1.ScriptContext (pfindTxInByTxOutRef, pisPubKey) -import "plutarch" Plutarch.Api.V1.Value (pnormalize) +import Plutarch.Api.V2.Tx (POutputDatum (..)) import Plutarch.DataRepr ( - DerivePConstantViaData (..), PDataFields, ) -import Plutarch.Extra.TermCont (pguardC, pletC, pletFieldsC, pmatchC) -import Plutarch.Lift (PConstantDecl, PUnsafeLiftDecl (..)) +import Plutarch.Extra.Field (pletAllC) +import Plutarch.Extra.IsData ( + DerivePConstantViaDataList ( + DerivePConstantViaDataList + ), + ProductIsData (ProductIsData), + ) +import Plutarch.Extra.ScriptContext (pisPubKey) +import Plutarch.Extra.Tagged (PTagged) +import Plutarch.Extra.Traversable (pfoldMap) +import Plutarch.Lift (PConstantDecl, PUnsafeLiftDecl (PLifted)) import PlutusLedgerApi.V1.Credential (Credential) -import PlutusLedgerApi.V1.Value (CurrencySymbol, Value) +import PlutusLedgerApi.V1.Scripts (DatumHash (DatumHash)) +import PlutusLedgerApi.V1.Value (Value) import PlutusTx qualified +import "liqwid-plutarch-extra" Plutarch.Extra.TermCont ( + pguardC, + pletC, + pletFieldsC, + ) {- | Datum that encodes behavior of Treasury Withdrawal effect. @@ -56,12 +74,17 @@ data TreasuryWithdrawalDatum = TreasuryWithdrawalDatum , -- | @since 0.1.0 Generic ) - --- | @since 0.1.0 -PlutusTx.makeLift ''TreasuryWithdrawalDatum - --- | @since 0.1.0 -PlutusTx.makeIsDataIndexed ''TreasuryWithdrawalDatum [('TreasuryWithdrawalDatum, 0)] + deriving anyclass + ( -- | @since 1.0.0 + SOP.Generic + ) + deriving + ( -- | @since 1.0.0 + PlutusTx.ToData + , -- | @since 1.0.0 + PlutusTx.FromData + ) + via (ProductIsData TreasuryWithdrawalDatum) {- | Haskell-level version of 'TreasuryWithdrawalDatum'. @@ -91,7 +114,7 @@ newtype PTreasuryWithdrawalDatum (s :: S) ) instance DerivePlutusType PTreasuryWithdrawalDatum where - type DPTStrat _ = PlutusTypeData + type DPTStrat _ = PlutusTypeNewtype -- | @since 0.1.0 instance PUnsafeLiftDecl PTreasuryWithdrawalDatum where @@ -99,12 +122,12 @@ instance PUnsafeLiftDecl PTreasuryWithdrawalDatum where -- | @since 0.1.0 deriving via - (DerivePConstantViaData TreasuryWithdrawalDatum PTreasuryWithdrawalDatum) + (DerivePConstantViaDataList TreasuryWithdrawalDatum PTreasuryWithdrawalDatum) instance (PConstantDecl TreasuryWithdrawalDatum) -- | @since 0.1.0 -instance PTryFrom PData PTreasuryWithdrawalDatum +instance PTryFrom PData (PAsData PTreasuryWithdrawalDatum) {- | Withdraws given list of values to specific target addresses. It can be evoked by burning GAT. The transaction should have correct @@ -119,77 +142,156 @@ instance PTryFrom PData PTreasuryWithdrawalDatum 2. Left over assets should be redirected back to Treasury - It can be more flexiable over... + The output order should be: - - The number of outputs themselves + 1. Receiver outputs. They should be in the same order as the 'receivers' field of the datum. - @since 0.1.0 + 2. Other outputs: treasury outputs, colleteral outputs, etc. + + @since 1.0.0 -} -treasuryWithdrawalValidator :: forall {s :: S}. CurrencySymbol -> Term s PValidator -treasuryWithdrawalValidator currSymbol = makeEffect currSymbol $ - \_cs (datum' :: Term _ PTreasuryWithdrawalDatum) txOutRef' txInfo' -> unTermCont $ do - datum <- pletFieldsC @'["receivers", "treasuries"] datum' - txInfo <- pletFieldsC @'["outputs", "inputs"] txInfo' - PJust ((pfield @"resolved" #) -> txOut) <- pmatchC $ pfindTxInByTxOutRef # txOutRef' # pfromData txInfo.inputs - effInput <- pletFieldsC @'["address", "value"] $ txOut - outputValues <- - pletC $ - pmap - # plam - ( \txOut' -> unTermCont $ do - txOut <- pletFieldsC @'["address", "value"] $ txOut' - let cred = pfield @"credential" # pfromData txOut.address - pure . pdata $ ptuple # cred # txOut.value - ) - # pfromData txInfo.outputs - inputValues <- - pletC $ - pmap - # plam - ( \((pfield @"resolved" #) -> txOut') -> unTermCont $ do - txOut <- pletFieldsC @'["address", "value"] $ txOut' - let cred = pfield @"credential" # pfromData txOut.address - pure . pdata $ ptuple # cred # txOut.value - ) - # txInfo.inputs - let ofTreasury = - pfilter - # plam (\((pfield @"_0" #) . pfromData -> cred) -> pelem # cred # datum.treasuries) - sumValues = phoistAcyclic $ - plam $ \v -> - pnormalize - #$ pfoldr - # plam (\(pfromData . (pfield @"_1" #) -> x) y -> x <> y) - # mempty - # v - treasuryInputValuesSum = sumValues #$ ofTreasury # inputValues - treasuryOutputValuesSum = sumValues #$ ofTreasury # outputValues - receiverValuesSum = sumValues # datum.receivers - -- Constraints - outputContentMatchesRecivers = - pall # plam (\out -> pelem # out # outputValues) - #$ datum.receivers - excessShouldBePaidToInputs = - treasuryOutputValuesSum <> receiverValuesSum #== treasuryInputValuesSum - shouldNotPayToEffect = - pnot #$ pany - # plam - ( \x -> - effInput.address #== pfield @"address" # x - ) - # pfromData txInfo.outputs - inputsAreOnlyTreasuriesOrCollateral = - pall - # plam - ( \((pfield @"_0" #) . pfromData -> cred) -> - cred #== pfield @"credential" # effInput.address - #|| pelem # cred # datum.treasuries - #|| pisPubKey # pfromData cred - ) - # inputValues +treasuryWithdrawalValidator :: + forall (s :: S). + Term s (PAsData (PTagged AuthorityTokenTag PCurrencySymbol) :--> PValidator) +treasuryWithdrawalValidator = plam $ + makeEffect @(PAsData PTreasuryWithdrawalDatum) $ + \_cs (pfromData -> datum) effectInputRef txInfo -> unTermCont $ do + datumF <- pletAllC datum + txInfoF <- pletFieldsC @'["outputs", "inputs"] txInfo - pguardC "Transaction should not pay to effects" shouldNotPayToEffect - pguardC "Transaction output does not match receivers" outputContentMatchesRecivers - pguardC "Remainders should be returned to the treasury" excessShouldBePaidToInputs - pguardC "Transaction should only have treasuries specified in the datum as input" inputsAreOnlyTreasuriesOrCollateral - pure . popaque $ pconstant () + let + -- Validate the input and if it's from one of the treasuries, + -- return the value. + -- + -- Only effect inputs, treasury inputs and public key inputs are + -- allowed. + extractTreasuryInputValue :: + Term _ (PTxInInfo :--> PValue 'Sorted 'Positive) + extractTreasuryInputValue = plam $ \input -> unTermCont $ do + inputF <- pletAllC input + resolvedF <- pletFieldsC @'["address", "value"] inputF.resolved + + cred <- pletC $ pfield @"credential" # resolvedF.address + + let isEffectInput = + ptraceIfTrue "Effect input" $ + inputF.outRef #== effectInputRef + isTreasuryInput = + ptraceIfTrue "Treasury input" $ + pelem # pdata cred # datumF.treasuries + isPubkeyInput = + ptraceIfTrue "Pubkey input" $ + pisPubKey # cred + pure + $ pif + (isEffectInput #|| isPubkeyInput) + mempty + $ pif isTreasuryInput resolvedF.value + $ ptraceError "Unknown input" + + treasuryInputAmount = + pfoldMap + # extractTreasuryInputValue + # txInfoF.inputs + + sentAmout = + pfoldMap + # plam ((puncurryTuple # plam (const id) #) . pfromData) + # pfromData datumF.receivers + + treasuryLeftOverAmount = + psubtractSortedValue + # treasuryInputAmount + # sentAmout + + remainingOutputs = + ptrace "Check receiver outputs" $ + checkReceiverOutputs + # datumF.receivers + # txInfoF.outputs + + extractTreasuryOutputValue :: + Term _ (PTxOut :--> PValue 'Sorted 'Positive) + extractTreasuryOutputValue = plam $ + flip (pletFields @'["address", "value", "datum"]) $ \outputF -> + let cred = pfield @"credential" # outputF.address + + isTreasuryOutput = + ptraceIfFalse "Should sent to one of the treasuries" $ + pelem # pdata cred # datumF.treasuries + + isDatumValid = + ptraceIfFalse "Valid output datum" $ + checkOutputDatum # cred # outputF.datum + in pif + (isTreasuryOutput #&& isDatumValid) + outputF.value + mempty + + -- Return the value if it'll be sent to one of the treasuries. + treasuryOutputAmount = + pfoldMap + # extractTreasuryOutputValue + # remainingOutputs + + pguardC "Unused treasury should stay at treasury validators" $ + treasuryLeftOverAmount #== pforgetPositive treasuryOutputAmount + + pure . popaque $ pconstant () + where + -- Make sure that all the receivers get the correct payment, return the + -- remaining outputs. + -- + -- This function is not hoisted cause it's used only once. + checkReceiverOutputs :: + Term + s + ( PBuiltinList + (PAsData (PTuple PCredential (PValue 'Sorted 'Positive))) + :--> PBuiltinList PTxOut + :--> PBuiltinList PTxOut + ) + checkReceiverOutputs = pfix #$ plam $ \self receivers outputs -> + pelimList + ( \r rs -> + pelimList + ( \o os -> pletFields @'["value", "address", "datum"] o $ \oF -> + let isValidReceiverOutput = + puncurryTuple + # plam + ( \expCred expVal -> + foldl1 + (#&&) + [ ptraceIfFalse "Valid credential" $ + expCred #== pfield @"credential" # oF.address + , ptraceIfFalse "Valid value" $ + pisSubValueOf # oF.value # expVal + , ptraceIfFalse "Valid output datum" $ + checkOutputDatum # expCred # oF.datum + ] + ) + # pfromData r + in pif + isValidReceiverOutput + (self # rs # os) + (ptraceError "Invalid receiver output") + ) + (ptraceError "Unable to exhaust receivers") + outputs + ) + outputs + receivers + + unitDatum = PlutusTx.toData () + + unitDatumHash = DatumHash $ hashData unitDatum + + checkOutputDatum :: Term s (PCredential :--> POutputDatum :--> PBool) + checkOutputDatum = phoistAcyclic $ plam $ \cred datum -> pmatch cred $ + \case + PPubKeyCredential _ -> pcon PTrue + _ -> pmatch datum $ \case + PNoOutputDatum _ -> pcon PFalse + POutputDatum _ -> pcon PTrue + POutputDatumHash ((pfield @"datumHash" #) -> hash) -> + pconstant unitDatumHash #== hash diff --git a/agora/Agora/Governor.hs b/agora/Agora/Governor.hs index 6d594ed..c0e6839 100644 --- a/agora/Agora/Governor.hs +++ b/agora/Agora/Governor.hs @@ -21,11 +21,13 @@ module Agora.Governor ( pgetNextProposalId, getNextProposalId, pisGovernorDatumValid, + presolveGovernorRedeemer, ) where +import Agora.Aeson.Orphans () import Agora.Proposal ( - PProposalId (..), - PProposalThresholds (..), + PProposalId (PProposalId), + PProposalThresholds, ProposalId (ProposalId), ProposalThresholds, pisProposalThresholdsValid, @@ -38,22 +40,37 @@ import Agora.Proposal.Time ( pisMaxTimeRangeWidthValid, pisProposalTimingConfigValid, ) -import Agora.SafeMoney (GTTag) -import Data.Tagged (Tagged (..)) -import Plutarch.DataRepr ( - DerivePConstantViaData (..), - PDataFields, - ) +import Agora.SafeMoney (GTTag, GovernorSTTag) +import Data.Aeson qualified as Aeson +import Data.Tagged (Tagged) +import Generics.SOP qualified as SOP +import Optics.TH (makeFieldLabelsNoPrefix) +import Plutarch.Api.V1.Scripts (PRedeemer) +import Plutarch.Api.V2 (KeyGuarantees (Unsorted), PMap, PScriptPurpose (PSpending), PTxInInfo) +import Plutarch.DataRepr (PDataFields) +import Plutarch.Extra.AssetClass (AssetClass, PAssetClass) +import Plutarch.Extra.Bind (PBind ((#>>=))) +import Plutarch.Extra.Field (pletAll) +import Plutarch.Extra.Function (pflip) +import Plutarch.Extra.Functor (PFunctor (pfmap)) import Plutarch.Extra.IsData ( - DerivePConstantViaEnum (..), - EnumIsData (..), + DerivePConstantViaDataList (DerivePConstantViaDataList), + DerivePConstantViaEnum (DerivePConstantEnum), + EnumIsData (EnumIsData), + PlutusTypeDataList, PlutusTypeEnumData, + ProductIsData (ProductIsData), ) -import Plutarch.Extra.TermCont (pletFieldsC) -import Plutarch.Lift (PConstantDecl, PUnsafeLiftDecl (..)) +import Plutarch.Extra.Maybe (pjust, pnothing) +import Plutarch.Extra.Record (mkRecordConstr, (.=)) +import Plutarch.Extra.ScriptContext (ptryFromRedeemer) +import Plutarch.Extra.Tagged (PTagged) +import Plutarch.Extra.Value (passetClassValueOfT) +import Plutarch.Lift (PConstantDecl, PUnsafeLiftDecl (PLifted)) import PlutusLedgerApi.V1 (TxOutRef) -import PlutusLedgerApi.V1.Value (AssetClass (..)) import PlutusTx qualified +import "liqwid-plutarch-extra" Plutarch.Extra.List (pfindJust) +import "liqwid-plutarch-extra" Plutarch.Extra.TermCont (pletFieldsC) -------------------------------------------------------------------------------- @@ -71,9 +88,8 @@ data GovernorDatum = GovernorDatum -- Will get copied over upon the creation of proposals. , createProposalTimeRangeMaxWidth :: MaxTimeRangeWidth -- ^ The maximum valid duration of a transaction that creats a proposal. - , maximumProposalsPerStake :: Integer - -- ^ The maximum number of unfinished proposals that a stake is allowed to be - -- associated to. + , maximumCreatedProposalsPerStake :: Integer + -- ^ The maximum number of proposals created by any given stakes. } deriving stock ( -- | @since 0.1.0 @@ -81,9 +97,17 @@ data GovernorDatum = GovernorDatum , -- | @since 0.1.0 Generic ) - --- | @since 0.1.0 -PlutusTx.makeIsDataIndexed ''GovernorDatum [('GovernorDatum, 0)] + deriving anyclass + ( -- | @since 1.0.0 + SOP.Generic + ) + deriving + ( -- | @since 1.0.0 + PlutusTx.ToData + , -- | @since 1.0.0 + PlutusTx.FromData + ) + via (ProductIsData GovernorDatum) {- | Redeemer for Governor script. The governor has two primary responsibilities: @@ -140,6 +164,14 @@ data Governor = Governor , -- | @since 0.2.0 Show ) + deriving anyclass + ( -- | @since 1.0.0 + Aeson.ToJSON + , -- | @since 1.0.0 + Aeson.FromJSON + ) + +makeFieldLabelsNoPrefix ''Governor -------------------------------------------------------------------------------- @@ -156,7 +188,7 @@ newtype PGovernorDatum (s :: S) = PGovernorDatum , "nextProposalId" ':= PProposalId , "proposalTimings" ':= PProposalTimingConfig , "createProposalTimeRangeMaxWidth" ':= PMaxTimeRangeWidth - , "maximumProposalsPerStake" ':= PInteger + , "maximumCreatedProposalsPerStake" ':= PInteger ] ) } @@ -173,20 +205,25 @@ newtype PGovernorDatum (s :: S) = PGovernorDatum PDataFields , -- | @since 0.1.0 PEq + , -- | @since 0.2.1 + PShow ) -- | @since 0.2.0 instance DerivePlutusType PGovernorDatum where - type DPTStrat _ = PlutusTypeData + type DPTStrat _ = PlutusTypeDataList -- | @since 0.1.0 -instance PUnsafeLiftDecl PGovernorDatum where type PLifted PGovernorDatum = GovernorDatum +instance PUnsafeLiftDecl PGovernorDatum where type PLifted _ = GovernorDatum -- | @since 0.1.0 -deriving via (DerivePConstantViaData GovernorDatum PGovernorDatum) instance (PConstantDecl GovernorDatum) +deriving via + (DerivePConstantViaDataList GovernorDatum PGovernorDatum) + instance + (PConstantDecl GovernorDatum) -- | @since 0.1.0 -deriving anyclass instance PTryFrom PData PGovernorDatum +deriving anyclass instance PTryFrom PData (PAsData PGovernorDatum) {- | Plutarch-level version of 'GovernorRedeemer'. @@ -232,7 +269,7 @@ deriving via (DerivePConstantViaEnum GovernorRedeemer PGovernorRedeemer) instanc @since 0.1.0 -} -pgetNextProposalId :: Term s (PProposalId :--> PProposalId) +pgetNextProposalId :: forall (s :: S). Term s (PProposalId :--> PProposalId) pgetNextProposalId = phoistAcyclic $ plam $ \(pto -> pid) -> pcon $ PProposalId $ pid + 1 {- | Get next proposal id. @@ -248,7 +285,7 @@ getNextProposalId (ProposalId pid) = ProposalId $ pid + 1 @since 0.1.0 -} -pisGovernorDatumValid :: Term s (PGovernorDatum :--> PBool) +pisGovernorDatumValid :: forall (s :: S). Term s (PGovernorDatum :--> PBool) pisGovernorDatumValid = phoistAcyclic $ plam $ \datum -> unTermCont $ do datumF <- @@ -269,3 +306,53 @@ pisGovernorDatumValid = phoistAcyclic $ , ptraceIfFalse "time range valid" $ pisMaxTimeRangeWidthValid # datumF.createProposalTimeRangeMaxWidth ] + +{- | Find the governor input and resolve the corresponding governor redeemer, + given the assetclass of GST. + + @since 1.0.0 +-} +presolveGovernorRedeemer :: + forall (s :: S). + Term + s + ( PTagged GovernorSTTag PAssetClass + :--> PBuiltinList PTxInInfo + :--> PMap 'Unsorted PScriptPurpose PRedeemer + :--> PMaybe PGovernorRedeemer + ) +presolveGovernorRedeemer = phoistAcyclic $ + plam $ \gstClass inputs redeemers -> + let governorInputRef = + pfindJust + # plam + ( flip pletAll $ \inputF -> + let value = pfield @"value" # inputF.resolved + isGovernorInput = + passetClassValueOfT + # gstClass + # value + #== 1 + in pif + isGovernorInput + (pjust # inputF.outRef) + pnothing + ) + # inputs + + governorScriptPurpose = + pfmap + # plam + ( \ref -> + mkRecordConstr + PSpending + (#_0 .= ref) + ) + # governorInputRef + + governorRedeemer = + governorScriptPurpose + #>>= pflip + # ptryFromRedeemer @(PAsData PGovernorRedeemer) + # redeemers + in pfmap # plam pfromData # governorRedeemer diff --git a/agora/Agora/Governor/Scripts.hs b/agora/Agora/Governor/Scripts.hs index 683815e..396d679 100644 --- a/agora/Agora/Governor/Scripts.hs +++ b/agora/Agora/Governor/Scripts.hs @@ -21,8 +21,8 @@ import Agora.AuthorityToken ( singleAuthorityTokenBurned, ) import Agora.Governor ( - GovernorRedeemer (..), PGovernorDatum (PGovernorDatum), + PGovernorRedeemer (..), pgetNextProposalId, pisGovernorDatumValid, ) @@ -35,52 +35,43 @@ import Agora.Proposal ( pneutralOption, pwinner, ) -import Agora.Proposal.Time (createProposalStartingTime) -import Agora.Scripts (AgoraScripts, authorityTokenSymbol, governorSTSymbol, proposalSTSymbol, proposalValidatoHash, stakeSTSymbol) +import Agora.Proposal.Time (pvalidateProposalStartingTime) +import Agora.SafeMoney (AuthorityTokenTag, GovernorSTTag, ProposalSTTag, StakeSTTag) import Agora.Stake ( - PProposalLock (..), - PStakeDatum (..), pnumCreatedProposals, + presolveStakeInputDatum, ) -import Agora.Utils ( - mustFindDatum', - validatorHashToAddress, - ) -import Plutarch.Api.V1 ( - PAddress, - PCurrencySymbol, - PDatumHash, - PMap, - PMintingPolicy, - PScriptPurpose (PMinting, PSpending), - PTxOut, - PValidator, - PValidatorHash, - ) -import Plutarch.Api.V1.AssetClass ( - passetClass, - passetClassValueOf, - ) -import Plutarch.Api.V1.ScriptContext ( - pfindOutputsToAddress, +import Agora.Utils (phashDatum, ptaggedSymbolValueOf, ptoScottEncodingT, puntag) +import Data.Function (on) +import Plutarch.Api.V1 (PCurrencySymbol) +import Plutarch.Api.V1.AssocMap (plookup) +import Plutarch.Api.V1.AssocMap qualified as AssocMap +import Plutarch.Api.V2 (PDatum, PMintingPolicy, PScriptHash, PScriptPurpose (PMinting, PSpending), PTxOut, PTxOutRef, PValidator) +import Plutarch.Api.V2.Tx (POutputDatum (..)) +import Plutarch.Extra.AssetClass (PAssetClassData, passetClass) +import Plutarch.Extra.Field (pletAll, pletAllC) +import Plutarch.Extra.Maybe (passertPJust, pfromMaybe, pjust, pmaybeData, pnothing) +import Plutarch.Extra.Ord (POrdering (..), pcompareBy, pfromOrd, psort) +import Plutarch.Extra.Record (mkRecordConstr, (.&), (.=)) +import Plutarch.Extra.ScriptContext ( pfindTxInByTxOutRef, pisUTXOSpent, pscriptHashFromAddress, - ptryFindDatum, + pscriptHashToTokenName, + ptryFromOutputDatum, pvalueSpent, ) -import "liqwid-plutarch-extra" Plutarch.Api.V1.Value (phasOnlyOneTokenOfCurrencySymbol, psymbolValueOf) -import Plutarch.Extra.Field (pletAllC) -import Plutarch.Extra.IsData (pmatchEnumFromData) -import Plutarch.Extra.List (pfirstJust) -import Plutarch.Extra.Map ( - plookup, - plookup', +import Plutarch.Extra.Tagged (PTagged) +import Plutarch.Extra.Value (passetClassValueOf, psymbolValueOf) +import "liqwid-plutarch-extra" Plutarch.Extra.List (pfindJust, plistEqualsBy, pmapMaybe) +import "liqwid-plutarch-extra" Plutarch.Extra.Map (pkeys, ptryLookup) +import "liqwid-plutarch-extra" Plutarch.Extra.TermCont ( + pguardC, + pletC, + pletFieldsC, + pmatchC, + ptryFromC, ) -import Plutarch.Extra.Maybe (passertPDJust, passertPJust, pfromJust, pisDJust) -import Plutarch.Extra.Record (mkRecordConstr, (.&), (.=)) -import Plutarch.Extra.TermCont (pguardC, pletC, pletFieldsC, pmatchC, ptryFromC) -import PlutusLedgerApi.V1 (TxOutRef) -------------------------------------------------------------------------------- @@ -109,41 +100,63 @@ import PlutusLedgerApi.V1 (TxOutRef) NOTE: It's user's responsibility to make sure the token is sent to the corresponding governor validator. We /can't/ really check this in the policy, otherwise we create a cyclic reference issue. - @since 0.1.0 + @since 1.0.0 -} -governorPolicy :: TxOutRef -> ClosedTerm PMintingPolicy -governorPolicy initialSpend = - plam $ \_ ctx' -> unTermCont $ do - let oref = pconstant initialSpend +governorPolicy :: ClosedTerm (PAsData PTxOutRef :--> PMintingPolicy) +governorPolicy = + plam $ \initialSpend _ ctx -> unTermCont $ do + PMinting ((pfield @"_0" #) -> gstSymbol) <- + pmatchC (pfromData $ pfield @"purpose" # ctx) - PMinting ((pfield @"_0" #) -> ownSymbol) <- pmatchC (pfromData $ pfield @"purpose" # ctx') - let ownAssetClass = passetClass # ownSymbol # pconstant "" - txInfo = pfromData $ pfield @"txInfo" # ctx' + let txInfo = pfromData $ pfield @"txInfo" # ctx - txInfoF <- pletFieldsC @'["mint", "inputs", "outputs", "datums", "validRange"] txInfo + txInfoF <- + pletFieldsC + @'[ "mint" + , "inputs" + , "outputs" + , "datums" + , "validRange" + ] + txInfo pguardC "Referenced utxo should be spent" $ - pisUTXOSpent # oref # txInfoF.inputs + pisUTXOSpent # pfromData initialSpend # txInfoF.inputs pguardC "Exactly one token should be minted" $ - psymbolValueOf # ownSymbol # txInfoF.mint #== 1 - #&& passetClassValueOf # txInfoF.mint # ownAssetClass #== 1 + let vMap = pfromData $ pto txInfoF.mint + tnMap = + passertPJust + # "GST symbol entry" + #$ plookup + # gstSymbol + # vMap + in tnMap #== AssocMap.psingleton # pconstant "" # 1 - govOutput <- - pletC $ - passertPJust - # "Governor output not found" - #$ pfind - # plam - ( \((pfield @"value" #) -> value) -> - psymbolValueOf # ownSymbol # value #== 1 - ) - # pfromData txInfoF.outputs + let governorOutputDatum = + passertPJust + # "Governor output should present" + #$ pfindJust + # plam + ( flip (pletFields @'["value", "datum"]) $ \txOutF -> + let isGovernorUTxO = + psymbolValueOf + # gstSymbol + # txOutF.value + #== 1 - let datumHash = pfield @"datumHash" # govOutput - datum = mustFindDatum' @PGovernorDatum # datumHash # txInfoF.datums + governorDatum = + ptrace "Resolve governor datum" $ + pfromData $ + ptryFromOutputDatum @(PAsData PGovernorDatum) + # txOutF.datum + # txInfoF.datums + in pif isGovernorUTxO (pjust # governorDatum) pnothing + ) + # pfromData txInfoF.outputs - pguardC "Governor output datum valid" $ pisGovernorDatumValid # datum + pguardC "Governor output datum valid" $ + pisGovernorDatumValid # governorOutputDatum pure $ popaque $ pconstant () @@ -231,359 +244,360 @@ governorPolicy initialSpend = - Exactly one GAT is burnt in the transaction. - Said GAT is tagged by the effect. - @since 0.1.0 + == Arguments + + Following arguments should be provided(in this order): + 1. proposal validator address + 2. state ST symbol + 3. governor ST symbol + 4. proposal ST symbol + 5. authority token symbol. + + @since 1.0.0 -} governorValidator :: -- | Lazy precompiled scripts. - AgoraScripts -> - ClosedTerm PValidator -governorValidator as = - plam $ \datum' redeemer' ctx' -> unTermCont $ do - ctxF <- pletAllC ctx' + ClosedTerm + ( PAsData PScriptHash + :--> PAsData (PTagged StakeSTTag PAssetClassData) + :--> PAsData (PTagged GovernorSTTag PCurrencySymbol) + :--> PAsData (PTagged ProposalSTTag PCurrencySymbol) + :--> PAsData (PTagged AuthorityTokenTag PCurrencySymbol) + :--> PValidator + ) +governorValidator = + plam $ \proposalScriptHash sstClass gstSymbol pstSymbol' atSymbol' datum redeemer ctx -> unTermCont $ do + atSymbol <- pletC $ pfromData atSymbol' + pstSymbol <- pletC $ pfromData pstSymbol' + ctxF <- pletAllC ctx + txInfo <- pletC $ pfromData ctxF.txInfo + txInfoF <- + pletFieldsC + @'[ "mint" + , "inputs" + , "outputs" + , "datums" + , "signatories" + , "validRange" + ] + txInfo - txInfo' <- pletC $ pfromData $ ctxF.txInfo - txInfoF <- pletFieldsC @'["mint", "inputs", "outputs", "datums", "signatories", "validRange"] txInfo' + ---------------------------------------------------------------------------- - PSpending (pfromData . (pfield @"_0" #) -> ownInputRef) <- pmatchC $ pfromData ctxF.purpose + governorInputDatum <- pfromData . fst <$> ptryFromC @(PAsData PGovernorDatum) datum + governorInputDatumF <- pletAllC governorInputDatum - ((pfield @"resolved" #) -> ownInput) <- + PSpending ((pfield @"_0" #) -> governorInputRef) <- + pmatchC $ pfromData ctxF.purpose + + let governorInput = + pfield @"resolved" + #$ passertPJust + # "Malformed script context: own input not found" + #$ pfindTxInByTxOutRef + # governorInputRef + # txInfoF.inputs + + governorInputF <- pletFieldsC @'["address", "value"] governorInput + + ---------------------------------------------------------------------------- + + governorOutputDatum <- pletC $ - passertPJust # "Own input not found" - #$ pfindTxInByTxOutRef # ownInputRef # txInfoF.inputs - ownInputF <- pletFieldsC @'["address", "value"] ownInput - let ownAddress = pfromData $ ownInputF.address + passertPJust + # "Own output should present" + #$ pfindJust + # plam + ( flip pletAll $ \outputF -> + let isGovernorUTxO = + foldl1 + (#&&) + [ ptraceIfFalse "Own by governor validator" $ + ((#==) `on` (pscriptHashFromAddress #)) + outputF.address + governorInputF.address + , ptraceIfFalse "Has governor ST" $ + ptaggedSymbolValueOf # pfromData gstSymbol # outputF.value #== 1 + ] - (oldGovernorDatum :: Term _ PGovernorDatum, _) <- ptryFromC datum' - oldGovernorDatumF <- pletAllC oldGovernorDatum + datum = + ptrace "Resolve governor datum" $ + pfromData $ + ptryFromOutputDatum @(PAsData PGovernorDatum) + # outputF.datum + # txInfoF.datums + in pif + isGovernorUTxO + (pjust # datum) + pnothing + ) + # pfromData txInfoF.outputs - -- Check that GST will be returned to the governor. - let ownInputGSTAmount = psymbolValueOf # pgstSymbol # ownInputF.value - pguardC "Own input should have exactly one state token" $ - ownInputGSTAmount #== 1 + ---------------------------------------------------------------------------- - ownOutputs <- pletC $ pfindOutputsToAddress # txInfoF.outputs # ownAddress - pguardC "Exactly one utxo should be sent to the governor" $ - plength # ownOutputs #== 1 + pstClass <- pletC $ passetClass # pto pstSymbol # pconstant "" - ownOutput <- pletFieldsC @'["value", "datumHash"] $ phead # ownOutputs - let ownOuputGSTAmount = psymbolValueOf # pgstSymbol # ownOutput.value - pguardC "State token should stay at governor's address" $ - ownOuputGSTAmount #== 1 - - -- Check that own output have datum of type 'GovernorDatum'. - let outputGovernorStateDatumHash = - passertPDJust # "Governor output doesn't have datum" # ownOutput.datumHash - newGovernorDatum <- + getProposalDatum :: Term _ (PTxOut :--> PMaybe PProposalDatum) <- pletC $ - passertPJust # "Ouput governor state datum not found" - #$ ptryFindDatum # outputGovernorStateDatumHash # txInfoF.datums + plam $ + flip (pletFields @'["value", "datum", "address"]) $ \txOutF -> + let isProposalUTxO = + passetClassValueOf + # pstClass + # txOutF.value + #== 1 + #&& (pfromMaybe # pconstant "" #$ pscriptHashFromAddress # pfromData txOutF.address) + #== pfromData proposalScriptHash - pguardC "New datum is valid" $ pisGovernorDatumValid # newGovernorDatum + proposalDatum = + ptrace "Resolve proposal output datum" $ + pfromData $ + ptryFromOutputDatum + # txOutF.datum + # txInfoF.datums + in pif isProposalUTxO (pjust # proposalDatum) pnothing + + ---------------------------------------------------------------------------- + + governorRedeemer <- pfromData . fst <$> ptryFromC redeemer pure $ - pmatchEnumFromData redeemer' $ \case - Just CreateProposal -> unTermCont $ do + pmatch governorRedeemer $ \case + PCreateProposal -> unTermCont $ do -- Check that the transaction advances proposal id. - let expectedNextProposalId = pgetNextProposalId # oldGovernorDatumF.nextProposalId + let expectedNextProposalId = + pgetNextProposalId + # governorInputDatumF.nextProposalId expectedNewDatum = mkRecordConstr PGovernorDatum - ( #proposalThresholds .= oldGovernorDatumF.proposalThresholds - .& #nextProposalId .= pdata expectedNextProposalId - .& #proposalTimings .= oldGovernorDatumF.proposalTimings + ( #proposalThresholds + .= governorInputDatumF.proposalThresholds + .& #nextProposalId + .= pdata expectedNextProposalId + .& #proposalTimings + .= governorInputDatumF.proposalTimings .& #createProposalTimeRangeMaxWidth - .= oldGovernorDatumF.createProposalTimeRangeMaxWidth - .& #maximumProposalsPerStake - .= oldGovernorDatumF.maximumProposalsPerStake + .= governorInputDatumF.createProposalTimeRangeMaxWidth + .& #maximumCreatedProposalsPerStake + .= governorInputDatumF.maximumCreatedProposalsPerStake ) - pguardC "Unexpected governor state datum" $ - newGovernorDatum #== expectedNewDatum + + pguardC "Only next proposal id gets advanced" $ + governorOutputDatum #== expectedNewDatum -- Check that exactly one proposal token is being minted. pguardC "Exactly one proposal token must be minted" $ - phasOnlyOneTokenOfCurrencySymbol # ppstSymbol # txInfoF.mint + passetClassValueOf # pstClass # txInfoF.mint #== 1 -- Check that a stake is spent to create the propsal, -- and the value it contains meets the requirement. - stakeInputs <- - pletC $ - pfilter - # phoistAcyclic - ( plam $ - \((pfield @"value" #) . (pfield @"resolved" #) -> value) -> - psymbolValueOf # psstSymbol # value #== 1 - ) - # pfromData txInfoF.inputs + let stakeInputDatum = + passertPJust + # "Stake input should present" + #$ pfindJust + # ( presolveStakeInputDatum + # (ptoScottEncodingT # pfromData sstClass) + # txInfoF.datums + ) + # pfromData txInfoF.inputs - pguardC "Can process only one stake" $ - plength # stakeInputs #== 1 + stakeInputDatumF <- pletAllC stakeInputDatum - stakeInput <- pletC $ phead # stakeInputs + pguardC "Proposals created by the stake must not exceed the limit" $ + pnumCreatedProposals + # stakeInputDatumF.lockedBy + #< governorInputDatumF.maximumCreatedProposalsPerStake - stakeInputF <- pletFieldsC @'["datumHash", "value"] $ pfield @"resolved" # stakeInput + let gtThreshold = + pfromData $ + pfield @"create" + # governorInputDatumF.proposalThresholds - pguardC "Stake input doesn't have datum" $ - pisDJust # stakeInputF.datumHash - - let stakeInputDatum = mustFindDatum' @(PAsData PStakeDatum) # stakeInputF.datumHash # txInfoF.datums - - stakeInputDatumF <- pletAllC $ pto $ pfromData stakeInputDatum - - pguardC "Proposals created by the stake must not exceed the number stored in the governor." $ - pnumCreatedProposals # stakeInputDatumF.lockedBy - #< oldGovernorDatumF.maximumProposalsPerStake + pguardC "Require minimum amount of GTs" $ + gtThreshold #<= stakeInputDatumF.stakedAmount -- Check that the newly minted PST is sent to the proposal validator, -- and the datum it carries is legal. - outputsToProposalValidatorWithStateToken <- - pletC $ - pfilter - # phoistAcyclic - ( plam $ - \txOut' -> unTermCont $ do - txOut <- pletFieldsC @'["address", "value"] txOut' + let proposalOutputDatum = + passertPJust + # "Proposal output should present" + #$ pfindJust + # getProposalDatum + # pfromData txInfoF.outputs - pure $ - txOut.address #== pdata pproposalValidatorAddress - #&& psymbolValueOf # ppstSymbol # txOut.value #== 1 - ) - # pfromData txInfoF.outputs + proposalOutputDatumF <- pletAllC proposalOutputDatum - pguardC "Exactly one UTXO with proposal state token should be sent to the proposal validator" $ - plength # outputsToProposalValidatorWithStateToken #== 1 - - outputDatumHash <- pletC $ pfield @"datumHash" #$ phead # outputsToProposalValidatorWithStateToken - - proposalOutputDatum' <- - pletC $ - mustFindDatum' @(PAsData PProposalDatum) - # outputDatumHash - # txInfoF.datums - - proposalOutputDatum <- pletAllC $ pto $ pfromData proposalOutputDatum' - - let expectedStartingTime = - pfromJust #$ createProposalStartingTime - # oldGovernorDatumF.createProposalTimeRangeMaxWidth - # txInfoF.validRange - - expectedCosigners = psingleton @PBuiltinList # stakeInputDatumF.owner + let expectedCosigners = psingleton @PBuiltinList # stakeInputDatumF.owner pguardC "Proposal datum correct" $ foldl1 (#&&) [ ptraceIfFalse "has neutral effect" $ - phasNeutralEffect # proposalOutputDatum.effects + phasNeutralEffect # proposalOutputDatumF.effects , ptraceIfFalse "votes have valid shape" $ - pisEffectsVotesCompatible # proposalOutputDatum.effects # proposalOutputDatum.votes + pisEffectsVotesCompatible # proposalOutputDatumF.effects # proposalOutputDatumF.votes , ptraceIfFalse "votes are empty" $ - pisVotesEmpty # proposalOutputDatum.votes + pisVotesEmpty # proposalOutputDatumF.votes , ptraceIfFalse "id correct" $ - proposalOutputDatum.proposalId #== oldGovernorDatumF.nextProposalId + proposalOutputDatumF.proposalId #== governorInputDatumF.nextProposalId , ptraceIfFalse "status is Draft" $ - proposalOutputDatum.status #== pconstantData Draft + proposalOutputDatumF.status #== pconstantData Draft , ptraceIfFalse "cosigners correct" $ - plistEquals # pfromData proposalOutputDatum.cosigners # expectedCosigners - , ptraceIfFalse "starting time correct" $ - proposalOutputDatum.startingTime #== expectedStartingTime + plistEquals # pfromData proposalOutputDatumF.cosigners # expectedCosigners + , ptraceIfFalse "starting time valid" $ + pvalidateProposalStartingTime + # governorInputDatumF.createProposalTimeRangeMaxWidth + # txInfoF.validRange + # proposalOutputDatumF.startingTime , ptraceIfFalse "copy over configurations" $ - proposalOutputDatum.thresholds #== oldGovernorDatumF.proposalThresholds - #&& proposalOutputDatum.timingConfig #== oldGovernorDatumF.proposalTimings + proposalOutputDatumF.thresholds + #== governorInputDatumF.proposalThresholds + #&& proposalOutputDatumF.timingConfig + #== governorInputDatumF.proposalTimings ] - -- Check the output stake has been proposly updated. - let stakeOutputDatumHash = - passertPJust # "Output stake should be presented" - #$ pfirstJust - # phoistAcyclic - ( plam - ( \txOut -> unTermCont $ do - txOutF <- pletFieldsC @'["datumHash", "value"] txOut - - pure $ - pif - (psymbolValueOf # psstSymbol # txOutF.value #== 1) - ( pcon $ - PJust $ - passertPDJust # "Output stake datum should be presented" - # txOutF.datumHash - ) - (pcon PNothing) - ) - ) - # pfromData txInfoF.outputs - - stakeOutputDatum = - passertPJust @(PAsData PStakeDatum) # "Stake output datum presented" - #$ ptryFindDatum # stakeOutputDatumHash # txInfoF.datums - - stakeOutputLocks = - pfromData $ pfield @"lockedBy" #$ pto $ pfromData stakeOutputDatum - - -- The stake should be locked by the newly created proposal. - newLock = - mkRecordConstr - PCreated - ( #created .= oldGovernorDatumF.nextProposalId - ) - - -- Append new locks to existing locks - expectedProposalLocks = - pcons # pdata newLock # stakeInputDatumF.lockedBy - - pguardC "Stake output locks correct" $ - plistEquals # stakeOutputLocks # expectedProposalLocks - pure $ popaque $ pconstant () - -------------------------------------------------------------------------- + ------------------------------------------------------------------------ - Just MintGATs -> unTermCont $ do - pguardC "Governor state should not be changed" $ newGovernorDatum #== oldGovernorDatum + PMintGATs -> unTermCont $ do + pguardC "Governor state should not be changed" $ governorOutputDatum #== governorInputDatum -- Filter out proposal inputs and ouputs using PST and the address of proposal validator. pguardC "The governor can only process one proposal at a time" $ - (psymbolValueOf # ppstSymbol #$ pvalueSpent # txInfoF.inputs) #== 1 + (ptaggedSymbolValueOf # pstSymbol #$ pvalueSpent # txInfoF.inputs) #== 1 - proposalInputF <- - pletFieldsC @'["datumHash"] $ - pfield @"resolved" - #$ passertPJust - # "Proposal input not found" - #$ pfind - # plam - ( \((pfield @"resolved" #) -> txOut) -> unTermCont $ do - txOutF <- pletFieldsC @'["address", "value"] txOut - - pure $ - psymbolValueOf # ppstSymbol # txOutF.value #== 1 - #&& txOutF.address #== pdata pproposalValidatorAddress - ) - # pfromData txInfoF.inputs - - proposalInputDatum <- - pletC $ - mustFindDatum' @(PAsData PProposalDatum) - # proposalInputF.datumHash - # txInfoF.datums + let proposalInputDatum = + passertPJust + # "Proposal input not found" + #$ pfindJust + # plam ((getProposalDatum #) . (pfield @"resolved" #)) + # pfromData txInfoF.inputs proposalInputDatumF <- - pletFieldsC @'["effects", "status", "thresholds", "votes"] $ - pto $ pfromData proposalInputDatum + pletFieldsC @'["effects", "status", "thresholds", "votes"] + proposalInputDatum -- Check that the proposal state is advanced so that a proposal cannot be executed twice. pguardC "Proposal must be in locked(executable) state in order to execute effects" $ proposalInputDatumF.status #== pconstantData Locked - -- TODO: anything else to check here? - -- 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 -- The effects of the winner outcome. - effectGroup <- pletC $ plookup' # finalResultTag #$ proposalInputDatumF.effects + effectGroup <- pletC $ ptryLookup # finalResultTag #$ proposalInputDatumF.effects - gatCount <- pletC $ plength #$ pto $ pto effectGroup + let + -- For a given output, check if it contains a single valid GAT. + getReceiverScriptHash = + plam + ( \output -> unTermCont $ do + outputF <- pletFieldsC @'["address", "datum", "value"] output - pguardC "Required amount of GATs should be minted" $ - psymbolValueOf # patSymbol # txInfoF.mint #== gatCount + let atAmount = + ptaggedSymbolValueOf + # atSymbol + # outputF.value - -- Ensure that every GAT goes to one of the effects in the winner effect group. - outputsWithGAT <- - pletC $ - pfilter - # phoistAcyclic - ( plam - ( \((pfield @"value" #) -> value) -> - 0 #< psymbolValueOf # patSymbol # value + handleAuthorityUTxO = + do + receiverScriptHash <- + pletC $ + passertPJust + # "GAT receiver should be a script" + #$ pscriptHashFromAddress + # outputF.address + + effect <- + pletAllC $ + passertPJust + # "Receiver should be in the effect group" + #$ AssocMap.plookup + # receiverScriptHash + # effectGroup + + let tagToken = + pmaybeData + # pconstant "" + # plam (pscriptHashToTokenName . pfromData) + # effect.scriptHash + gatAssetClass = passetClass # puntag atSymbol # tagToken + valueGATCorrect = + passetClassValueOf + # gatAssetClass + # outputF.value + #== 1 + + let outputDatumHash = pmatch outputF.datum $ \case + POutputDatum d -> phashDatum #$ pfield @"outputDatum" @PDatum # d + POutputDatumHash h -> pfield @"datumHash" # h + _ -> ptraceError "expcted effect datum, got nothing" + + hasCorrectDatum = + effect.datumHash #== outputDatumHash + + pguardC "Authority output valid" $ + foldr1 + (#&&) + [ ptraceIfFalse "GAT valid" $ authorityTokensValidIn # atSymbol # output + , ptraceIfFalse "Correct datum" hasCorrectDatum + , ptraceIfFalse "Value correctly encodes Auth Check script" valueGATCorrect + ] + + pure $ pjust # receiverScriptHash + + pmatchC + ( pcompareBy + # pfromOrd + # atAmount + # 1 ) - ) + >>= \case + -- atAmount == 1 + PEQ -> handleAuthorityUTxO + -- atAmount < 1 + PLT -> pure pnothing + -- atAmount > 1 + PGT -> pure $ ptraceError "More than one GAT in one UTxO" + ) + + -- The sorted hashes of all the GAT receivers. + actualReceivers = + psort + #$ pmapMaybe @PList + # getReceiverScriptHash # pfromData txInfoF.outputs - pguardC "Output GATs is more than minted GATs" $ - plength # outputsWithGAT #== gatCount + expectedReceivers = pkeys @PList # effectGroup - let gatOutputValidator' :: Term s (PMap _ PValidatorHash PDatumHash :--> PTxOut :--> PBool) - gatOutputValidator' = - phoistAcyclic $ - plam - ( \effects output' -> unTermCont $ do - output <- pletFieldsC @'["address", "datumHash"] output' - - let scriptHash = - passertPJust # "GAT receiver is not a script" - #$ pscriptHashFromAddress # output.address - datumHash = - passertPDJust # "Output to effect should have datum" - #$ output.datumHash - - expectedDatumHash = - passertPJust # "Receiver is not in the effect list" - #$ plookup # scriptHash # effects - - pure $ - foldr1 - (#&&) - [ ptraceIfFalse "GAT must be tagged by the effect hash" $ authorityTokensValidIn # patSymbol # output' - , ptraceIfFalse "Unexpected datum" $ datumHash #== expectedDatumHash - ] - ) - - gatOutputValidator = gatOutputValidator' # effectGroup - - pguardC "GATs valid" $ - pfoldr - # plam - ( \txOut r -> - let value = pfield @"value" # txOut - atValue = psymbolValueOf # patSymbol # value - in pif (atValue #== 0) r $ - pif (atValue #== 1) (r #&& gatOutputValidator # txOut) $ pconstant False - ) - # pconstant True - # pfromData txInfoF.outputs + -- This check ensures that it's impossible to send more than one GATs + -- to a validator in the winning effect group. + pguardC "Each script in the effect group gets a GAT" $ + plistEqualsBy + # plam (\(pfromData -> x) y -> x #== y) + # expectedReceivers + # actualReceivers pure $ popaque $ pconstant () - -------------------------------------------------------------------------- + ------------------------------------------------------------------------ + + PMutateGovernor -> unTermCont $ do + pguardC "Governor output datum is valid" $ + pisGovernorDatumValid # governorOutputDatum - Just MutateGovernor -> unTermCont $ do -- Check that a GAT is burnt. pguardC "One valid GAT burnt" $ - singleAuthorityTokenBurned patSymbol txInfoF.inputs txInfoF.mint + singleAuthorityTokenBurned atSymbol txInfoF.inputs txInfoF.mint pure $ popaque $ pconstant () - - -------------------------------------------------------------------------- - Nothing -> ptraceError "Unknown redeemer" - where - -- The currency symbol of authority token. - patSymbol :: Term s PCurrencySymbol - patSymbol = pconstant $ authorityTokenSymbol as - - -- The currency symbol of the proposal state token. - ppstSymbol :: Term s PCurrencySymbol - ppstSymbol = pconstant $ proposalSTSymbol as - - -- The address of the proposal validator. - pproposalValidatorAddress :: Term s PAddress - pproposalValidatorAddress = - pconstant $ - validatorHashToAddress $ - proposalValidatoHash as - - -- The currency symbol of the stake state token. - psstSymbol :: Term s PCurrencySymbol - psstSymbol = pconstant $ stakeSTSymbol as - - -- The currency symbol of the governor state token. - pgstSymbol :: Term s PCurrencySymbol - pgstSymbol = pconstant $ governorSTSymbol as diff --git a/agora/Agora/Linker.hs b/agora/Agora/Linker.hs new file mode 100644 index 0000000..61d85db --- /dev/null +++ b/agora/Agora/Linker.hs @@ -0,0 +1,193 @@ +{-# OPTIONS_GHC -Wno-unticked-promoted-constructors #-} + +module Agora.Linker (linker, AgoraScriptInfo (..)) where + +import Agora.Governor (Governor (gstOutRef, gtClassRef, maximumCosigners)) +import Agora.SafeMoney (AuthorityTokenTag, GTTag, GovernorSTTag, ProposalSTTag, StakeSTTag) +import Data.Aeson qualified as Aeson +import Data.Map (fromList) +import Data.Tagged (Tagged (Tagged)) +import Plutarch.Api.V2 (scriptHash) +import Plutarch.Extra.AssetClass (AssetClass (AssetClass)) +import Plutarch.Extra.ScriptContext (scriptHashToTokenName) +import PlutusLedgerApi.V2 (CurrencySymbol (CurrencySymbol), ScriptHash, TxOutRef, getScriptHash) +import Ply ( + AsData (AsData), + ScriptRole (MintingPolicyRole, ValidatorRole), + (#), + ) +import ScriptExport.ScriptInfo ( + Linker, + ScriptExport (..), + fetchTS, + getParam, + toRoledScript, + toScript, + ) +import Prelude hiding ((#)) + +{- | Additional information provided after linking. + + @since 1.0.0 +-} +data AgoraScriptInfo = AgoraScriptInfo + { governorAssetClass :: Tagged GovernorSTTag AssetClass + , authorityTokenSymbol :: Tagged AuthorityTokenTag CurrencySymbol + , proposalAssetClass :: Tagged ProposalSTTag AssetClass + , stakeAssetClass :: Tagged StakeSTTag AssetClass + , governor :: Governor + } + deriving stock (Generic, Show) + deriving anyclass (Aeson.FromJSON, Aeson.ToJSON) + +{- | Links parameterized Agora scripts given parameters. + + @since 1.0.0 +-} +linker :: Linker Governor (ScriptExport AgoraScriptInfo) +linker = do + govPol <- + fetchTS + @MintingPolicyRole + @'[AsData TxOutRef] + "agora:governorPolicy" + govVal <- + fetchTS + @ValidatorRole + @'[ AsData ScriptHash + , AsData (Tagged StakeSTTag AssetClass) + , AsData (Tagged GovernorSTTag CurrencySymbol) + , AsData (Tagged ProposalSTTag CurrencySymbol) + , AsData (Tagged AuthorityTokenTag CurrencySymbol) + ] + "agora:governorValidator" + stkPol <- + fetchTS + @MintingPolicyRole + @'[AsData (Tagged GTTag AssetClass)] + "agora:stakePolicy" + stkVal <- + fetchTS + @ValidatorRole + @'[ AsData (Tagged StakeSTTag CurrencySymbol) + , AsData (Tagged ProposalSTTag AssetClass) + , AsData (Tagged GTTag AssetClass) + ] + "agora:stakeValidator" + prpPol <- + fetchTS @MintingPolicyRole + @'[AsData (Tagged GovernorSTTag AssetClass)] + "agora:proposalPolicy" + prpVal <- + fetchTS + @ValidatorRole + @'[ AsData (Tagged StakeSTTag AssetClass) + , AsData (Tagged GovernorSTTag CurrencySymbol) + , AsData (Tagged ProposalSTTag CurrencySymbol) + , AsData Integer + ] + "agora:proposalValidator" + treVal <- + fetchTS + @ValidatorRole + @'[AsData (Tagged AuthorityTokenTag CurrencySymbol)] + "agora:treasuryValidator" + atkPol <- + fetchTS + @MintingPolicyRole + @'[AsData (Tagged GovernorSTTag AssetClass)] + "agora:authorityTokenPolicy" + noOpVal <- + fetchTS + @ValidatorRole + @'[AsData (Tagged AuthorityTokenTag CurrencySymbol)] + "agora:noOpValidator" + treaWithdrawalVal <- + fetchTS + @ValidatorRole + @'[AsData (Tagged AuthorityTokenTag CurrencySymbol)] + "agora:treasuryWithdrawalValidator" + mutateGovVal <- + fetchTS + @ValidatorRole + @'[ AsData ScriptHash + , AsData (Tagged GovernorSTTag CurrencySymbol) + , AsData (Tagged AuthorityTokenTag CurrencySymbol) + ] + "agora:mutateGovernorValidator" + + governor <- getParam + + let govPol' = govPol # AsData governor.gstOutRef + govVal' = + govVal + # AsData propValHash + # AsData (Tagged sstAssetClass) + # AsData (Tagged gstSymbol) + # AsData (Tagged pstSymbol) + # AsData (Tagged atSymbol) + gstSymbol = CurrencySymbol . getScriptHash . scriptHash $ toScript govPol' + gstAssetClass = + AssetClass gstSymbol "" + govValHash = scriptHash $ toScript govVal' + + atPol' = atkPol # AsData (Tagged gstAssetClass) + atSymbol = CurrencySymbol . getScriptHash . scriptHash $ toScript atPol' + + propPol' = prpPol # AsData (Tagged gstAssetClass) + propVal' = + prpVal + # AsData (Tagged sstAssetClass) + # AsData (Tagged gstSymbol) + # AsData (Tagged pstSymbol) + # AsData governor.maximumCosigners + propValHash = scriptHash $ toScript propVal' + pstSymbol = CurrencySymbol . getScriptHash . scriptHash $ toScript propPol' + pstAssetClass = AssetClass pstSymbol "" + + stakPol' = stkPol # AsData governor.gtClassRef + stakVal' = + stkVal + # AsData (Tagged sstSymbol) + # AsData (Tagged pstAssetClass) + # AsData governor.gtClassRef + sstSymbol = CurrencySymbol . getScriptHash . scriptHash $ toScript stakPol' + stakValTokenName = + scriptHashToTokenName $ scriptHash $ toScript stakVal' + sstAssetClass = AssetClass sstSymbol stakValTokenName + + treaVal' = treVal # AsData (Tagged atSymbol) + + noOpVal' = noOpVal # AsData (Tagged atSymbol) + treaWithdrawalVal' = treaWithdrawalVal # AsData (Tagged atSymbol) + mutateGovVal' = + mutateGovVal + # AsData govValHash + # AsData (Tagged gstSymbol) + # AsData (Tagged atSymbol) + + return $ + ScriptExport + { scripts = + fromList + [ ("agora:governorPolicy", toRoledScript govPol') + , ("agora:governorValidator", toRoledScript govVal') + , ("agora:stakePolicy", toRoledScript stakPol') + , ("agora:stakeValidator", toRoledScript stakVal') + , ("agora:proposalPolicy", toRoledScript propPol') + , ("agora:proposalValidator", toRoledScript propVal') + , ("agora:treasuryValidator", toRoledScript treaVal') + , ("agora:authorityTokenPolicy", toRoledScript atPol') + , ("agora:noOpValidator", toRoledScript noOpVal') + , ("agora:treasuryWithdrawalValidator", toRoledScript treaWithdrawalVal') + , ("agora:mutateGovernorValidator", toRoledScript mutateGovVal') + ] + , information = + AgoraScriptInfo + { governorAssetClass = Tagged gstAssetClass + , authorityTokenSymbol = Tagged atSymbol + , proposalAssetClass = Tagged pstAssetClass + , stakeAssetClass = Tagged sstAssetClass + , governor = governor + } + } diff --git a/agora/Agora/Plutarch/Orphans.hs b/agora/Agora/Plutarch/Orphans.hs index 57778e6..6cb102e 100644 --- a/agora/Agora/Plutarch/Orphans.hs +++ b/agora/Agora/Plutarch/Orphans.hs @@ -1,39 +1,86 @@ {-# OPTIONS_GHC -Wno-orphans #-} -{- FIXME: All of the following instances and - types ought to belong in either plutarch or - plutarch-extra. --} - module Agora.Plutarch.Orphans () where -import Plutarch.Api.V1 (PDatumHash (..)) -import Plutarch.Builtin (PIsData (..)) -import Plutarch.Extra.TermCont (ptryFromC) -import Plutarch.TryFrom (PTryFrom (..)) -import Plutarch.Unsafe (punsafeCoerce) +import Plutarch.Lift (PConstantDecl (..), PUnsafeLiftDecl (PLifted)) -newtype Flip f a b = Flip (f b a) deriving stock (Generic) +import Data.Bifunctor (Bifunctor (bimap)) +import Data.Map.Strict qualified as StrictMap +import Data.Tagged (Tagged (Tagged)) +import Data.Traversable (for) +import Plutarch.Api.V1 (KeyGuarantees (Sorted), PMap) +import Plutarch.Extra.Tagged (PTagged) +import PlutusTx qualified +import PlutusTx.AssocMap qualified as AssocMap +import Ply (PlyArg) +import Ply.Plutarch.Class (PlyArgOf) --- | @since 0.1.0 -instance PTryFrom PData (PAsData PDatumHash) where - type PTryFromExcess PData (PAsData PDatumHash) = Flip Term PDatumHash - ptryFrom' opq = runTermCont $ do - (pfromData -> unwrapped, _) <- ptryFromC @(PAsData PByteString) opq +-- | @since 1.0.0 +instance + ( PConstantData k + , PConstantData v + , Ord k + ) => + PConstantDecl (StrictMap.Map k v) + where + type + PConstantRepr (StrictMap.Map k v) = + [(PlutusTx.Data, PlutusTx.Data)] + type + PConstanted (StrictMap.Map k v) = + PMap 'Sorted (PConstanted k) (PConstanted v) + pconstantToRepr m = + bimap + PlutusTx.toData + PlutusTx.toData + <$> StrictMap.toList m + pconstantFromRepr m = fmap StrictMap.fromList $ + for m $ \(x, y) -> do + x' <- PlutusTx.fromData x + y' <- PlutusTx.fromData y + Just (x', y') - tcont $ \f -> - pif - -- Blake2b_256 hash: 256 bits/32 bytes. - (plengthBS # unwrapped #== 32) - (f ()) - (ptraceError "ptryFrom(PDatumHash): must be 32 bytes long") +-- | @since 1.0.0 +instance + ( PLiftData k + , PLiftData v + , Ord (PLifted k) + ) => + PUnsafeLiftDecl (PMap 'Sorted k v) + where + type PLifted (PMap 'Sorted k v) = StrictMap.Map (PLifted k) (PLifted v) - pure (punsafeCoerce opq, pcon $ PDatumHash unwrapped) +-- | @since 1.0.0 +instance + (PlutusTx.ToData k, PlutusTx.ToData v) => + PlutusTx.ToData (StrictMap.Map k v) + where + toBuiltinData = PlutusTx.toBuiltinData . toAssocMap + where + toAssocMap :: StrictMap.Map k v -> AssocMap.Map k v + toAssocMap = AssocMap.fromList . StrictMap.toAscList --- | @since 0.2.0 -instance PTryFrom PData (PAsData PUnit) +-- | @since 1.0.0 +instance + (PlutusTx.FromData k, PlutusTx.FromData v, Ord k) => + PlutusTx.FromData (StrictMap.Map k v) + where + fromBuiltinData d = PlutusTx.fromBuiltinData d >>= toStrictMap + where + toStrictMap :: AssocMap.Map k v -> Maybe (StrictMap.Map k v) + toStrictMap m = + let l = AssocMap.toList m + in if isSorted $ fmap fst l + then Just $ StrictMap.fromAscList l + else Nothing --- | @since 0.2.0 -instance (PIsData a) => PIsData (PAsData a) where - pfromDataImpl = punsafeCoerce - pdataImpl = pdataImpl . pfromData + isSorted :: forall a. Ord a => [a] -> Bool + isSorted [] = True + isSorted [_] = True + isSorted (x : y : xs) = x < y && isSorted (y : xs) + +-- | @since 1.0.0 +type instance PlyArgOf (PTagged tag a) = Tagged tag (PlyArgOf a) + +-- | @since 1.0.0 +deriving newtype instance PlyArg a => PlyArg (Tagged tag a) diff --git a/agora/Agora/Proposal.hs b/agora/Agora/Proposal.hs index 8bc70af..7530246 100644 --- a/agora/Agora/Proposal.hs +++ b/agora/Agora/Proposal.hs @@ -9,8 +9,8 @@ Proposal scripts encoding effects that operate on the system. -} module Agora.Proposal ( -- * Haskell-land - - -- Proposal (..), + ProposalEffectMetadata (..), + ProposalEffectGroup, ProposalDatum (..), ProposalRedeemer (..), ProposalStatus (..), @@ -21,6 +21,8 @@ module Agora.Proposal ( emptyVotesFor, -- * Plutarch-land + PProposalEffectMetadata (..), + PProposalEffectGroup, PProposalDatum (..), PProposalRedeemer (..), PProposalStatus (..), @@ -41,44 +43,53 @@ module Agora.Proposal ( ) where import Agora.Plutarch.Orphans () -import Agora.Proposal.Time (PProposalStartingTime, PProposalTimingConfig, ProposalStartingTime, ProposalTimingConfig) +import Agora.Proposal.Time ( + PProposalStartingTime, + PProposalTimingConfig, + ProposalStartingTime, + ProposalTimingConfig, + ) import Agora.SafeMoney (GTTag) +import Data.Map.Strict qualified as StrictMap import Data.Tagged (Tagged) import Generics.SOP qualified as SOP -import Plutarch.Api.V1 ( - KeyGuarantees (Unsorted), - PDatumHash, - PMap, - PPubKeyHash, - PValidatorHash, - ) +import Plutarch.Api.V1 (PCredential, PMap) import Plutarch.Api.V1.AssocMap qualified as PAssocMap -import Plutarch.DataRepr (DerivePConstantViaData (..), PDataFields) -import Plutarch.Extra.Comonad (pextract) -import Plutarch.Extra.Field (pletAllC) +import Plutarch.Api.V2 ( + KeyGuarantees (Sorted), + PDatumHash, + PMaybeData, + PScriptHash, + ) +import Plutarch.DataRepr ( + DerivePConstantViaData ( + DerivePConstantViaData + ), + PDataFields, + ) +import Plutarch.Extra.Field (pletAll) import Plutarch.Extra.Function (pbuiltinUncurry) import Plutarch.Extra.IsData ( - DerivePConstantViaDataList (..), - DerivePConstantViaEnum (..), - EnumIsData (..), + DerivePConstantViaDataList (DerivePConstantViaDataList), + DerivePConstantViaEnum (DerivePConstantEnum), + EnumIsData (EnumIsData), + PlutusTypeDataList, PlutusTypeEnumData, ProductIsData (ProductIsData), ) -import Plutarch.Extra.List (pfirstJust) -import Plutarch.Extra.Map qualified as PM -import Plutarch.Extra.Map.Unsorted qualified as PUM import Plutarch.Extra.Maybe (pfromJust) -import Plutarch.Extra.TermCont (pguardC, pletC, pmatchC) +import Plutarch.Extra.Tagged (PTagged) import Plutarch.Lift ( - DerivePConstantViaNewtype (..), + DerivePConstantViaNewtype (DerivePConstantViaNewtype), PConstantDecl, - PUnsafeLiftDecl (..), + PUnsafeLiftDecl (type PLifted), ) -import Plutarch.SafeMoney (PDiscrete (..)) -import Plutarch.Show (PShow (..)) -import PlutusLedgerApi.V1 (DatumHash, PubKeyHash, ValidatorHash) +import Plutarch.Orphans () +import PlutusLedgerApi.V2 (Credential, DatumHash, ScriptHash) import PlutusTx qualified -import PlutusTx.AssocMap qualified as AssocMap +import "liqwid-plutarch-extra" Plutarch.Extra.List (pfindJust) +import "liqwid-plutarch-extra" Plutarch.Extra.Map qualified as PM +import "liqwid-plutarch-extra" Plutarch.Extra.TermCont (pguardC, pletC) -------------------------------------------------------------------------------- -- Haskell-land @@ -105,8 +116,6 @@ newtype ProposalId = ProposalId {proposalTag :: Integer} PlutusTx.ToData , -- | @since 0.1.0 PlutusTx.FromData - , -- | @since 0.1.0 - PlutusTx.UnsafeFromData ) {- | Encodes a result. Typically, for a Yes/No proposal, we encode it like this: @@ -151,7 +160,7 @@ newtype ResultTag = ResultTag {getResultTag :: Integer} data ProposalStatus = -- | A draft proposal represents a proposal that has yet to be realized. -- - -- In effect, this means one which didn't have enough LQ to be a full + -- In effect, this means one which didn't have enough GT to be a full -- proposal, and needs cosigners to enable that to happen. This is -- similar to a "temperature check", but only useful if multiple people -- want to pool governance tokens together. If the proposal doesn't get to @@ -201,8 +210,6 @@ data ProposalStatus PlutusTx.FromData , -- | @since 0.1.0 PlutusTx.ToData - , -- | @since 0.1.0 - PlutusTx.UnsafeFromData ) via (EnumIsData ProposalStatus) @@ -210,7 +217,7 @@ data ProposalStatus This data is stored centrally (in the 'Agora.Governor.Governor') and copied over to 'Proposal's when they are created. - @since 0.1.0 + @since 1.0.0 -} data ProposalThresholds = ProposalThresholds { execute :: Tagged GTTag Integer @@ -220,9 +227,12 @@ data ProposalThresholds = ProposalThresholds -- -- It is recommended this be a high enough amount, in order to prevent DOS from bad -- actors. + , toVoting :: Tagged GTTag Integer + -- ^ How much GT required to to move into 'VotingReady'. , vote :: Tagged GTTag Integer - -- ^ How much GT required to allow voting to happen. - -- (i.e. to move into 'VotingReady') + -- ^ How much GT required to vote on a outcome. + , cosign :: Tagged GTTag Integer + -- ^ How much GT required to cosign a proposal. } deriving stock ( -- | @since 0.1.0 @@ -232,8 +242,17 @@ data ProposalThresholds = ProposalThresholds , -- | @since 0.1.0 Generic ) - -PlutusTx.makeIsDataIndexed 'ProposalThresholds [('ProposalThresholds, 0)] + deriving anyclass + ( -- | @since 1.0.0 + SOP.Generic + ) + deriving + ( -- | @since 1.0.0 + PlutusTx.ToData + , -- | @since 1.0.0 + PlutusTx.FromData + ) + via (ProductIsData ProposalThresholds) {- | Map which encodes the total tally for each result. It's important that the "shape" is consistent with the shape of 'effects'. @@ -249,7 +268,7 @@ PlutusTx.makeIsDataIndexed 'ProposalThresholds [('ProposalThresholds, 0)] @since 0.1.0 -} newtype ProposalVotes = ProposalVotes - { getProposalVotes :: AssocMap.Map ResultTag Integer + { getProposalVotes :: StrictMap.Map ResultTag Integer } deriving stock ( -- | @since 0.1.0 @@ -270,8 +289,38 @@ newtype ProposalVotes = ProposalVotes @since 0.1.0 -} -emptyVotesFor :: forall a. AssocMap.Map ResultTag a -> ProposalVotes -emptyVotesFor = ProposalVotes . AssocMap.mapWithKey (const . const 0) +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 1.0.0 +type ProposalEffectGroup = StrictMap.Map ScriptHash ProposalEffectMetadata {- | Haskell-level datum for Proposal scripts. @@ -279,15 +328,17 @@ emptyVotesFor = ProposalVotes . AssocMap.mapWithKey (const . const 0) -} data ProposalDatum = ProposalDatum { proposalId :: ProposalId - -- ^ Identification of the proposal. + -- ^ Identification of the proposal. Note that this map should be sorted in + -- ascending order, and its keys should be unique. + -- -- TODO: could we encode this more efficiently? -- This is shaped this way for future proofing. -- See https://github.com/Liqwid-Labs/agora/issues/39 - , effects :: AssocMap.Map ResultTag (AssocMap.Map ValidatorHash DatumHash) + , effects :: StrictMap.Map ResultTag ProposalEffectGroup -- ^ Effect lookup table. First by result, then by effect hash. , status :: ProposalStatus -- ^ The status the proposal is in. - , cosigners :: [PubKeyHash] + , cosigners :: [Credential] -- ^ Who created the proposal initially, and who cosigned it later. -- -- This list should be sorted in **ascending** order. @@ -322,22 +373,20 @@ data ProposalDatum = ProposalDatum {- | Haskell-level redeemer for Proposal scripts. - @since 0.1.0 + @since 1.0.0 -} data ProposalRedeemer = -- | Cast one or more votes towards a particular 'ResultTag'. Vote ResultTag - | -- | Add one or more public keys to the cosignature list. - -- Must be signed by those cosigning. + | -- | Add a credential to the cosignature list. + -- Must be authorized by the stake owner. -- -- This is particularly used in the 'Draft' 'ProposalStatus', - -- where matching 'Agora.Stake.Stake's can be called to advance the proposal, - -- provided enough GT is shared among them. - -- - -- This list should be sorted in ascending order. - Cosign [PubKeyHash] + -- where matching 'Agora.Stake.Stake's can be witnessed to advance the + -- proposal, provided enough GT is shared among them. + Cosign | -- | Allow unlocking one or more stakes with votes towards particular 'ResultTag'. - Unlock + UnlockStake | -- | Advance the proposal, performing the required checks for whether that is legal. -- -- These are roughly the checks for each possible transition: @@ -377,7 +426,7 @@ PlutusTx.makeIsDataIndexed ''ProposalRedeemer [ ('Vote, 0) , ('Cosign, 1) - , ('Unlock, 2) + , ('UnlockStake, 2) , ('AdvanceProposal, 3) ] @@ -471,8 +520,8 @@ deriving via data PProposalStatus (s :: S) = -- | @since 0.2.0 PDraft - | -- | @since 0.2.0 - PVoting + | -- | @since 1.0.0 + PVotingReady | -- | @since 0.2.0 PLocked | -- | @since 0.2.0 @@ -509,16 +558,18 @@ deriving via (DerivePConstantViaEnum ProposalStatus PProposalStatus) instance (P {- | Plutarch-level version of 'ProposalThresholds'. - @since 0.1.0 + @since 1.0.0 -} newtype PProposalThresholds (s :: S) = PProposalThresholds { getProposalThresholds :: Term s ( PDataRecord - '[ "execute" ':= PDiscrete GTTag - , "create" ':= PDiscrete GTTag - , "vote" ':= PDiscrete GTTag + '[ "execute" ':= PTagged GTTag PInteger + , "create" ':= PTagged GTTag PInteger + , "toVoting" ':= PTagged GTTag PInteger + , "vote" ':= PTagged GTTag PInteger + , "cosign" ':= PTagged GTTag PInteger ] ) } @@ -533,30 +584,39 @@ newtype PProposalThresholds (s :: S) = PProposalThresholds PIsData , -- | @since 0.1.0 PDataFields + , -- | @since 0.2.1 + PShow ) -- | @since 0.2.0 instance DerivePlutusType PProposalThresholds where - type DPTStrat _ = PlutusTypeData + type DPTStrat _ = PlutusTypeNewtype -- | @since 0.1.0 -instance PTryFrom PData PProposalThresholds +instance PTryFrom PData (PAsData PProposalThresholds) -- | @since 0.1.0 instance PUnsafeLiftDecl PProposalThresholds where type PLifted PProposalThresholds = ProposalThresholds -- | @since 0.1.0 deriving via - (DerivePConstantViaData ProposalThresholds PProposalThresholds) + (DerivePConstantViaDataList ProposalThresholds PProposalThresholds) instance (PConstantDecl ProposalThresholds) {- | Plutarch-level version of 'ProposalVotes'. + Note: we don't really need this map to be ordered on chain, the purpose of + tagging it as sorted is to ensure the uniqueness of the keys. This + introduces some performance overhead cause sortness is unnecessarily + checked every time we try to recover a `PPropopsalVotes` from `PData`. + + FIXME(Connor): optimize away this. + @since 0.1.0 -} newtype PProposalVotes (s :: S) - = PProposalVotes (Term s (PMap 'Unsorted PResultTag PInteger)) + = PProposalVotes (Term s (PMap 'Sorted PResultTag PInteger)) deriving stock ( -- | @since 0.2.0 Generic @@ -566,6 +626,8 @@ newtype PProposalVotes (s :: S) PlutusType , -- | @since 0.1.0 PIsData + , -- | @since 1.0.0 + PShow ) -- | @since 0.2.0 @@ -580,10 +642,67 @@ instance PUnsafeLiftDecl PProposalVotes where type PLifted PProposalVotes = Prop -- | @since 0.1.0 deriving via - (DerivePConstantViaNewtype ProposalVotes PProposalVotes (PMap 'Unsorted PResultTag PInteger)) + (DerivePConstantViaNewtype ProposalVotes PProposalVotes (PMap 'Sorted PResultTag PInteger)) 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. + + @since 1.0.0 +-} +type PProposalEffectGroup = + PMap + 'Sorted + PScriptHash + PProposalEffectMetadata + {- | Plutarch-level version of 'ProposalDatum'. @since 0.1.0 @@ -594,9 +713,9 @@ newtype PProposalDatum (s :: S) = PProposalDatum s ( PDataRecord '[ "proposalId" ':= PProposalId - , "effects" ':= PMap 'Unsorted PResultTag (PMap 'Unsorted PValidatorHash PDatumHash) + , "effects" ':= PMap 'Sorted PResultTag PProposalEffectGroup , "status" ':= PProposalStatus - , "cosigners" ':= PBuiltinList (PAsData PPubKeyHash) + , "cosigners" ':= PBuiltinList (PAsData PCredential) , "thresholds" ':= PProposalThresholds , "votes" ':= PProposalVotes , "timingConfig" ':= PProposalTimingConfig @@ -615,16 +734,18 @@ newtype PProposalDatum (s :: S) = PProposalDatum PIsData , -- | @since 0.1.0 PEq + , -- | @since 1.0.0 + PDataFields ) --- | @since 0.2.0 +-- | @since 1.0.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) @@ -635,8 +756,8 @@ deriving via (DerivePConstantViaDataList ProposalDatum PProposalDatum) instance -} data PProposalRedeemer (s :: S) = PVote (Term s (PDataRecord '["resultTag" ':= PResultTag])) - | PCosign (Term s (PDataRecord '["newCosigners" ':= PBuiltinList (PAsData PPubKeyHash)])) - | PUnlock (Term s (PDataRecord '[])) + | PCosign (Term s (PDataRecord '[])) + | PUnlockStake (Term s (PDataRecord '[])) | PAdvanceProposal (Term s (PDataRecord '[])) deriving stock ( -- | @since 0.1.0 @@ -679,7 +800,7 @@ phasNeutralEffect :: forall (s :: S). Term s - ( PMap 'Unsorted PResultTag (PMap 'Unsorted PValidatorHash PDatumHash) + ( PMap 'Sorted PResultTag PProposalEffectGroup :--> PBool ) phasNeutralEffect = phoistAcyclic $ PAssocMap.pany # PAssocMap.pnull @@ -692,15 +813,15 @@ pisEffectsVotesCompatible :: forall (s :: S). Term s - ( PMap 'Unsorted PResultTag (PMap 'Unsorted PValidatorHash PDatumHash) + ( PMap 'Sorted PResultTag PProposalEffectGroup :--> PProposalVotes :--> PBool ) pisEffectsVotesCompatible = phoistAcyclic $ - plam $ \m (pto -> v :: Term _ (PMap _ _ _)) -> - PUM.pkeysEqual # m # v + plam $ \((PM.pkeys @PList #) -> effectKeys) ((PM.pkeys #) . pto -> voteKeys) -> + plistEquals # effectKeys # voteKeys -{- | Retutns true if vote counts of /all/ the options are zero. +{- | Returns true if vote counts of /all/ the options are zero. @since 0.2.0 -} @@ -721,6 +842,7 @@ pisVotesEmpty = phoistAcyclic $ @since 0.1.0 -} pwinner :: + forall (s :: S). Term s ( PProposalVotes @@ -741,6 +863,7 @@ pwinner = phoistAcyclic $ @since 0.1.0 -} pwinner' :: + forall (s :: S). Term s ( PProposalVotes @@ -774,8 +897,8 @@ pwinner' = phoistAcyclic $ pfoldr # f # 0 # l #== 1 exceedQuorum = - ptraceIfFalse "Highest vote count should exceed the minimum threshold" $ - quorum #< highestVotes + ptraceIfFalse "Highest vote count should be at least the minimum threshold" $ + quorum #<= highestVotes pure $ pif @@ -788,6 +911,7 @@ pwinner' = phoistAcyclic $ @since 0.1.0 -} phighestVotes :: + forall (s :: S). Term s ( PProposalVotes @@ -810,9 +934,10 @@ phighestVotes = phoistAcyclic $ @since 0.1.0 -} pneutralOption :: + forall (s :: S). Term s - ( PMap 'Unsorted PResultTag (PMap 'Unsorted PValidatorHash PDatumHash) + ( PMap 'Sorted PResultTag PProposalEffectGroup :--> PResultTag ) pneutralOption = phoistAcyclic $ @@ -827,7 +952,7 @@ pneutralOption = phoistAcyclic $ (PAssocMap.pnull # el) (pcon $ PJust rt) (pcon PNothing) - in pfromJust #$ pfirstJust # f # l + in pfromJust #$ pfindJust # f # l {- | Return true if the thresholds are valid. @@ -835,33 +960,30 @@ pneutralOption = phoistAcyclic $ -} pisProposalThresholdsValid :: forall (s :: S). Term s (PProposalThresholds :--> PBool) pisProposalThresholdsValid = phoistAcyclic $ - plam $ \thresholds -> unTermCont $ do - thresholdsF <- pletAllC thresholds - - PDiscrete execute' <- pmatchC thresholdsF.execute - PDiscrete draft' <- pmatchC thresholdsF.create - PDiscrete vote' <- pmatchC thresholdsF.vote - - execute <- pletC $ pextract # execute' - draft <- pletC $ pextract # draft' - vote <- pletC $ pextract # vote' - - pure $ + plam $ + flip pletAll $ \thresholdsF -> foldr1 (#&&) - [ ptraceIfFalse "Execute threshold is less than or equal to 0" $ 0 #<= execute - , ptraceIfFalse "Draft threshold is less than or equal to 0" $ 0 #<= draft - , ptraceIfFalse "Vote threshold is less than or equal to 0" $ 0 #<= vote + [ ptraceIfFalse "Execute threshold is less than or equal to 0" $ + 0 #<= pfromData thresholdsF.execute + , ptraceIfFalse "Create threshold is less than or equal to 0" $ + 0 #<= pfromData thresholdsF.create + , ptraceIfFalse "toVoting threshold is less than or equal to 0" $ + 0 #<= pfromData thresholdsF.toVoting + , ptraceIfFalse "Vote threshold is less than or equal to 0" $ + 0 #<= pfromData thresholdsF.vote + , ptraceIfFalse "Cosign threshold is less than or equal to 0" $ + 0 #<= pfromData thresholdsF.cosign ] {- | Retract votes given the option and the amount of votes. @since 0.1.0 -} -pretractVotes :: Term s (PResultTag :--> PInteger :--> PProposalVotes :--> PProposalVotes) +pretractVotes :: forall (s :: S). Term s (PResultTag :--> PInteger :--> PProposalVotes :--> PProposalVotes) pretractVotes = phoistAcyclic $ plam $ \rt count votes -> - let voteMap :: Term _ (PMap 'Unsorted PResultTag PInteger) + let voteMap :: Term _ (PMap 'Sorted PResultTag PInteger) voteMap = pto votes in pcon $ PProposalVotes $ diff --git a/agora/Agora/Proposal/Scripts.hs b/agora/Agora/Proposal/Scripts.hs index 1da4178..48d8f33 100644 --- a/agora/Agora/Proposal/Scripts.hs +++ b/agora/Agora/Proposal/Scripts.hs @@ -10,71 +10,83 @@ module Agora.Proposal.Scripts ( proposalPolicy, ) where +import Agora.Governor (PGovernorRedeemer (PCreateProposal), presolveGovernorRedeemer) import Agora.Proposal ( PProposalDatum (PProposalDatum), - PProposalRedeemer (..), + PProposalRedeemer (PAdvanceProposal, PCosign, PUnlockStake, PVote), + PProposalStatus (PDraft, PFinished, PLocked, PVotingReady), PProposalVotes (PProposalVotes), - ProposalStatus (..), + ProposalStatus (Draft, Finished, Locked, VotingReady), pretractVotes, pwinner', ) import Agora.Proposal.Time ( - currentProposalTime, - isDraftPeriod, - isExecutionPeriod, - isLockingPeriod, - isVotingPeriod, + PPeriod (PDraftingPeriod, PExecutingPeriod, PLockingPeriod, PVotingPeriod), + PTimingRelation (PAfter, PWithin), + pcurrentProposalTime, + pgetRelation, + pisWithin, + psatisfyMaximumWidth, ) -import Agora.Scripts (AgoraScripts, governorSTSymbol, proposalSTSymbol, stakeSTAssetClass) +import Agora.SafeMoney (GovernorSTTag, ProposalSTTag, StakeSTTag) import Agora.Stake ( - PProposalLock (..), - PStakeDatum (..), + PStakeDatum, pextractVoteOption, - pgetStakeRole, - pisCreator, + pgetStakeRoles, pisIrrelevant, - pisPureCreator, pisVoter, + presolveStakeInputDatum, ) -import Agora.Utils ( - mustFindDatum', - pltAsData, - ) -import Plutarch.Api.V1 ( - PDatumHash, +import Agora.Utils (ptaggedSymbolValueOf, ptoScottEncodingT) +import Data.Function (on) +import Plutarch.Api.V1 (PCredential, PCurrencySymbol) +import Plutarch.Api.V1.AssocMap (plookup) +import Plutarch.Api.V2 ( PMintingPolicy, - PPubKeyHash, - PScriptContext (PScriptContext), PScriptPurpose (PMinting, PSpending), - PTxInfo (PTxInfo), - PTxOut, + PTxInInfo, PValidator, ) -import Plutarch.Api.V1.AssetClass (passetClass, passetClassValueOf) -import Plutarch.Api.V1.ScriptContext ( - pfindTxInByTxOutRef, - pisTokenSpent, - ptryFindDatum, - ptxSignedBy, +import Plutarch.Extra.AssetClass ( + PAssetClassData, ) -import "liqwid-plutarch-extra" Plutarch.Api.V1.Value (psymbolValueOf) -import Plutarch.Extra.Comonad (pextract) -import Plutarch.Extra.Field (pletAllC) -import Plutarch.Extra.IsData (pmatchEnum) -import Plutarch.Extra.List (pisUniq', pmapMaybe, pmergeBy, pmsortBy) -import Plutarch.Extra.Map (plookup, pupdate) -import Plutarch.Extra.Maybe (passertPJust, pfromDJust, pfromJust, pisJust) +import Plutarch.Extra.Category (PCategory (pidentity)) +import Plutarch.Extra.Field (pletAll, pletAllC) +import Plutarch.Extra.Maybe ( + passertPJust, + pfromJust, + pisJust, + pjust, + pmaybe, + pnothing, + ) +import Plutarch.Extra.Ord (pfromOrdBy, pinsertUniqueBy, psort) import Plutarch.Extra.Record (mkRecordConstr, (.&), (.=)) -import Plutarch.Extra.TermCont ( +import Plutarch.Extra.ScriptContext ( + pfindTxInByTxOutRef, + pscriptHashFromAddress, + ptryFromOutputDatum, + ) +import Plutarch.Extra.Sum (PSum (PSum)) +import Plutarch.Extra.Tagged (PTagged) +import Plutarch.Extra.Time (PFullyBoundedTimeRange) +import Plutarch.Extra.Traversable (pfoldMap) +import Plutarch.Extra.Value (psymbolValueOf') +import Plutarch.Unsafe (punsafeCoerce) +import "liqwid-plutarch-extra" Plutarch.Extra.List ( + pfindJust, + plistEqualsBy, + pmapMaybe, + ptryFromSingleton, + ) +import "liqwid-plutarch-extra" Plutarch.Extra.TermCont ( pguardC, pletC, pletFieldsC, pmatchC, ptryFromC, ) -import Plutarch.SafeMoney (PDiscrete (..)) -import Plutarch.Unsafe (punsafeCoerce) -import PlutusLedgerApi.V1.Value (AssetClass (AssetClass)) +import "plutarch-extra" Plutarch.Extra.Map (pupdate) {- | Policy for Proposals. @@ -94,35 +106,85 @@ import PlutusLedgerApi.V1.Value (AssetClass (AssetClass)) - This policy cannot be burned. - @since 0.1.0 + == Arguments + + Following arguments should be provided(in this order): + 1. The assetclass of GST, see 'Agora.Governor.Scripts.governorPolicy'. + + @since 1.0.0 -} -proposalPolicy :: - -- | The assetclass of GST, see 'Agora.Governor.Scripts.governorPolicy'. - AssetClass -> - ClosedTerm PMintingPolicy -proposalPolicy (AssetClass (govCs, govTn)) = - plam $ \_redeemer ctx' -> unTermCont $ do - PScriptContext ctx' <- pmatchC ctx' - ctx <- pletAllC ctx' - PTxInfo txInfo' <- pmatchC $ pfromData ctx.txInfo - txInfo <- pletFieldsC @'["inputs", "mint"] txInfo' +proposalPolicy :: ClosedTerm (PAsData (PTagged GovernorSTTag PAssetClassData) :--> PMintingPolicy) +proposalPolicy = + plam $ \gstAssetClass _redeemer ctx -> unTermCont $ do + ctxF <- pletAllC ctx + txInfoF <- pletFieldsC @'["inputs", "mint", "redeemers"] ctxF.txInfo - PMinting ownSymbol' <- pmatchC $ pfromData ctx.purpose - let mintedProposalST = - passetClassValueOf - # pfromData txInfo.mint - # (passetClass # (pfield @"_0" # ownSymbol') # pconstant "") + PMinting ((pfield @"_0" #) -> ownSymbol) <- pmatchC $ pfromData ctxF.purpose - pguardC "Governance state-thread token must move" $ - pisTokenSpent - # (passetClass # pconstant govCs # pconstant govTn) - # txInfo.inputs + pguardC "Minted exactly one proposal ST" + $ pmatch + ( pfromJust + #$ psymbolValueOf' + # ownSymbol + # txInfoF.mint + ) + $ \(PPair minted burnt) -> + minted + #== 1 + #&& ptraceIfFalse "Burning a proposal is not supported" (burnt #== 0) - pguardC "Minted exactly one proposal ST" $ - mintedProposalST #== 1 + let governorRedeemer = + passertPJust + # "GST should move" + #$ presolveGovernorRedeemer + # (ptoScottEncodingT # pfromData gstAssetClass) + # pfromData txInfoF.inputs + # txInfoF.redeemers + + pguardC "Govenor redeemer correct" $ + pcon PCreateProposal #== governorRedeemer pure $ popaque (pconstant ()) +{- | Validation context for redeemers which witness multiple stake in the reference + inputs. + + @since 1.0.0 +-} +data PWitnessMultipleStakeContext (s :: S) = PWitnessMultipleStakeContext + { totalAmount :: Term s PInteger + , orderedOwners :: Term s (PList PCredential) + } + deriving stock + ( -- | @since 1.0.0 + Generic + ) + deriving anyclass + ( -- | @since 1.0.0 + PlutusType + ) + +-- | @since 1.0.0 +instance DerivePlutusType PWitnessMultipleStakeContext where + type DPTStrat _ = PlutusTypeScott + +-- | @since 1.0.0 +newtype PStakeInputsContext (s :: S) = PStakeInputsContext + { inputStakes :: Term s (PList PStakeDatum) + } + deriving stock + ( -- | @since 1.0.0 + Generic + ) + deriving anyclass + ( -- | @since 1.0.0 + PlutusType + ) + +-- | @since 1.0.0 +instance DerivePlutusType PStakeInputsContext where + type DPTStrat _ = PlutusTypeNewtype + {- | The validator for Proposals. The documentation for various of the redeemers lives at 'Agora.Proposal.ProposalRedeemer'. @@ -134,6 +196,7 @@ proposalPolicy (AssetClass (govCs, govTn)) = When voting and unlocking, the proposal must witness a state transition occuring in the relevant Stake. This transition must place a lock on the stake that is tagged with the right 'Agora.Proposal.ResultTag', and 'Agora.Proposal.ProposalId'. + Note that only one proposal per transaction is supported. === Periods @@ -149,557 +212,550 @@ proposalPolicy (AssetClass (govCs, govTn)) = (see 'Agora.Proposal.AdvanceProposal' docs). - 'Agora.Proposal.Unlock' is always valid. - @since 0.1.0 + == Arguments + + Following arguments should be provided(in this order): + 1. stake ST assetclass + 2. governor ST symbol + 3. proposal ST symbol + 4. maximum number of cosigners + + @since 1.0.0 -} proposalValidator :: - -- | Lazy precompiled scripts. - AgoraScripts -> - -- | See 'Agora.Governor.Governor.maximumCosigners'. - Integer -> - ClosedTerm PValidator -proposalValidator as maximumCosigners = - plam $ \datum redeemer ctx' -> unTermCont $ do - PScriptContext ctx' <- pmatchC ctx' - ctx <- pletFieldsC @'["txInfo", "purpose"] ctx' - txInfo <- pletC $ pfromData ctx.txInfo - PTxInfo txInfo' <- pmatchC txInfo + ClosedTerm + ( PAsData (PTagged StakeSTTag PAssetClassData) + :--> PAsData (PTagged GovernorSTTag PCurrencySymbol) + :--> PAsData (PTagged ProposalSTTag PCurrencySymbol) + :--> PAsData PInteger + :--> PValidator + ) +proposalValidator = + plam $ \sstClass gstSymbol pstSymbol maximumCosigners datum redeemer ctx -> unTermCont $ do + ctxF <- pletAllC ctx + + txInfo <- pletC $ pfromData ctxF.txInfo txInfoF <- pletFieldsC - @'[ "inputs" + @'[ "referenceInputs" + , "inputs" , "outputs" , "mint" , "datums" , "signatories" , "validRange" ] - txInfo' - PSpending ((pfield @"_0" #) -> txOutRef) <- pmatchC $ pfromData ctx.purpose + txInfo - PJust ((pfield @"resolved" #) -> txOut) <- pmatchC $ pfindTxInByTxOutRef # txOutRef # txInfoF.inputs - txOutF <- pletFieldsC @'["address", "value"] $ txOut + ---------------------------------------------------------------------------- - proposalDatum <- pfromData . fst <$> ptryFromC @(PAsData PProposalDatum) datum - proposalRedeemer <- fst <$> ptryFromC @PProposalRedeemer redeemer + PSpending ((pfield @"_0" #) -> propsalInputRef) <- + pmatchC $ pfromData ctxF.purpose - proposalF <- pletAllC $ pto proposalDatum + let proposalInput = + pfield @"resolved" + #$ passertPJust + # "Own input should present" + #$ pfindTxInByTxOutRef + # propsalInputRef + # txInfoF.inputs - ownAddress <- pletC $ txOutF.address + proposalInputF <- pletFieldsC @'["address", "value"] proposalInput - thresholdsF <- pletAllC proposalF.thresholds + proposalInputDatum <- pfromData . fst <$> ptryFromC @(PAsData PProposalDatum) datum + proposalInputDatumF <- pletAllC $ pto proposalInputDatum - currentStatus <- pletC $ pfromData $ proposalF.status - - let stCurrencySymbol = pconstant $ proposalSTSymbol as - - signedBy <- pletC $ ptxSignedBy # txInfoF.signatories - - currentTime <- pletC $ currentProposalTime # txInfoF.validRange + thresholdsF <- pletAllC proposalInputDatumF.thresholds + currentStatus <- pletC $ pfromData $ proposalInputDatumF.status -- Own output is an output that -- * is sent to the address of the proposal validator -- * has an PST -- * has the same proposal id as the proposal input -- - -- We match the proposal id here so that we can support multiple - -- proposal inputs in one thansaction. - ownOutput <- + -- We can handle only one proposal under current design. + proposalOutputDatum <- pletC $ - passertPJust # "Own output should be present" #$ pfind + passertPJust + # "proposal input should present" + #$ pfindJust # plam - ( \input -> unTermCont $ do - inputF <- pletAllC input + ( flip pletAll $ \outputF -> + let isProposalUTxO = + foldl1 + (#&&) + [ ptraceIfFalse "Own by proposal validator" $ + ((#==) `on` (pscriptHashFromAddress #)) + outputF.address + proposalInputF.address + , ptraceIfFalse "Has proposal ST" $ + ptaggedSymbolValueOf # pfromData pstSymbol # outputF.value #== 1 + ] - -- TODO: this is highly inefficient: O(n) for every output, - -- Maybe we can cache the sorted datum map? - let datum = + handleProposalUTxO = + -- Using inline datum to avoid O(n^2) lookup. pfromData $ - mustFindDatum' @(PAsData PProposalDatum) - # inputF.datumHash - # txInfoF.datums - - proposalId = pfield @"proposalId" # pto datum - - pure $ - inputF.address #== ownAddress - #&& psymbolValueOf # stCurrencySymbol # inputF.value #== 1 - #&& proposalId #== proposalF.proposalId + ptrace "Resolve proposal datum" $ + ptryFromOutputDatum @(PAsData PProposalDatum) + # outputF.datum + # txInfoF.datums + in pif + isProposalUTxO + (pjust # handleProposalUTxO) + pnothing ) # pfromData txInfoF.outputs - proposalOut <- - pletC $ - pfromData $ - mustFindDatum' @(PAsData PProposalDatum) - # (pfield @"datumHash" # ownOutput) - # txInfoF.datums + -------------------------------------------------------------------------- - proposalUnchanged <- pletC $ proposalOut #== proposalDatum + currentTime <- pletC $ pcurrentProposalTime # txInfoF.validRange - proposalOutStatus <- - pletC $ - pfromData $ - pfield @"status" # pto proposalOut + let withBoundedValidTimeRange :: + forall (a :: PType). + Term _ (PFullyBoundedTimeRange :--> a) -> + Term _ a + withBoundedValidTimeRange f = + pmatch currentTime $ \case + PJust currentTime -> f # currentTime + PNothing -> ptraceError "Unable to resolve current time" - onlyStatusChanged <- + getTimingRelation' <- pletC $ - -- Only the status of proposals is updated. - proposalOut - #== mkRecordConstr - PProposalDatum - ( #proposalId .= proposalF.proposalId - .& #effects .= proposalF.effects - .& #status .= pdata proposalOutStatus - .& #cosigners .= proposalF.cosigners - .& #thresholds .= proposalF.thresholds - .& #votes .= proposalF.votes - .& #timingConfig .= proposalF.timingConfig - .& #startingTime .= proposalF.startingTime - ) + withBoundedValidTimeRange $ + pgetRelation + # proposalInputDatumF.timingConfig + # proposalInputDatumF.startingTime + + let getTimingRelation = (getTimingRelation' #) . pcon -------------------------------------------------------------------------- - -- Find the stake inputs/outputs by SST. + -- Handle stake inputs/outputs. - let AssetClass (stakeSym, stakeTn) = stakeSTAssetClass as - stakeSTAssetClass <- - pletC $ passetClass # pconstant stakeSym # pconstant stakeTn - - filterStakeDatumHash :: Term _ (PTxOut :--> PMaybe (PAsData PDatumHash)) <- + resolveStakeInputDatum <- pletC $ - plam $ \txOut -> unTermCont $ do - txOutF <- pletFieldsC @'["value", "datumHash"] txOut - pure $ - pif - (passetClassValueOf # txOutF.value # stakeSTAssetClass #== 1) - ( let datumHash = pfromDJust # txOutF.datumHash - in pcon $ PJust $ pdata datumHash - ) - (pcon PNothing) + presolveStakeInputDatum + # (ptoScottEncodingT # pfromData sstClass) + # txInfoF.datums - stakeInputDatumHashes <- + spendStakes' :: Term _ ((PStakeInputsContext :--> PUnit) :--> PUnit) <- pletC $ - pmapMaybe @PBuiltinList - # plam ((filterStakeDatumHash #) . (pfield @"resolved" #)) - # txInfoF.inputs + plam $ \val -> unTermCont $ do + stakeInputs <- + pletC $ + pmapMaybe @PList + # resolveStakeInputDatum + # pfromData txInfoF.inputs - stakeOutputDatumHashes <- + pguardC "Stake inputs not null" $ + pnot #$ pnull # stakeInputs + + let ctx = pcon $ PStakeInputsContext stakeInputs + pure $ val # ctx + + let spendStakes :: + ( PStakeInputsContext _ -> + TermCont _ () + ) -> + Term _ POpaque + spendStakes c = popaque $ + spendStakes' #$ plam $ \sctx -> + unTermCont $ pmatchC sctx >>= c >> pure (pconstant ()) + + -- Witness stakes in reference inputs. + witnessStakes' :: + Term + s + ( (PWitnessMultipleStakeContext :--> PUnit) :--> PUnit + ) <- pletC $ - pmapMaybe @PBuiltinList - # filterStakeDatumHash - # txInfoF.outputs + let updateCtx = plam $ \ctx' stake -> unTermCont $ do + ctxF <- pmatchC ctx' - stakeInputNum <- pletC $ plength # stakeInputDatumHashes + stakeF <- + pletFieldsC @'["stakedAmount", "owner"] $ + pto stake - pguardC "Every stake input should have a correspoding output" $ - stakeInputNum #== plength # stakeOutputDatumHashes + pure $ + pcon $ + PWitnessMultipleStakeContext + { totalAmount = + ctxF.totalAmount + + punsafeCoerce + (pfromData stakeF.stakedAmount) + , orderedOwners = + pcons + # stakeF.owner + # ctxF.orderedOwners + } + + f :: Term _ (_ :--> PTxInInfo :--> _) + f = plam $ \ctx' input -> + let stakeDatum = resolveStakeInputDatum # input + updateCtx' = updateCtx # ctx' + in pmaybe # ctx' # updateCtx' # stakeDatum + + sortOwners = + plam $ + flip pmatch $ + \ctxF -> + pcon $ + ctxF + { orderedOwners = psort # ctxF.orderedOwners + } + + initialCtx = pcon $ PWitnessMultipleStakeContext 0 pnil + + ctx = + sortOwners + #$ pfoldl + # f + # initialCtx + # txInfoF.referenceInputs + in plam (# ctx) + + let witnessStakes :: + ( PWitnessMultipleStakeContext _ -> + TermCont _ () + ) -> + Term _ POpaque + witnessStakes c = popaque $ + witnessStakes' #$ plam $ \sctxF -> + unTermCont $ pmatchC sctxF >>= c >> pure (pconstant ()) ---------------------------------------------------------------------------- - withMultipleStakes' :: - Term - _ - ( ( PInteger - :--> PBuiltinList (PAsData PPubKeyHash) - :--> PUnit - ) - :--> PUnit - ) <- - pletC $ - plam $ \validationLogic -> unTermCont $ do - -- The following code ensures that all the stake datums are not - -- changed. - -- - -- TODO: This is quite inefficient (O(nlogn)) but for now we don't - -- have a nice way to check this. In plutus v2 we'll have map of - -- (Script -> Redeemer) in ScriptContext, which should be the - -- straight up solution. - let sortDatumHashes = phoistAcyclic $ pmsortBy # pltAsData - - sortedStakeInputDatumHashes = - sortDatumHashes # stakeInputDatumHashes - - sortedStakeOutputDatumHashes = - sortDatumHashes # stakeOutputDatumHashes - - pguardC "All stake datum are unchanged" $ - plistEquals - # sortedStakeInputDatumHashes - # sortedStakeOutputDatumHashes - - PPair totalStakedAmount stakeOwners <- - pmatchC $ - pfoldl - # plam - ( \l dh -> unTermCont $ do - let stake = - pfromData $ - pfromJust - #$ ptryFindDatum @(PAsData PStakeDatum) - # pfromData dh - # txInfoF.datums - - stakeF <- pletFieldsC @'["stakedAmount", "owner"] $ pto stake - - PPair amount owners <- pmatchC l - - let newAmount = amount + punsafeCoerce (pfromData stakeF.stakedAmount) - updatedOwners = pcons # stakeF.owner # owners - - pure $ pcon $ PPair newAmount updatedOwners - ) - # pcon (PPair (0 :: Term _ PInteger) (pnil @PBuiltinList)) - # stakeInputDatumHashes - - sortedStakeOwners <- pletC $ pmsortBy # pltAsData # stakeOwners - - pure $ validationLogic # totalStakedAmount # sortedStakeOwners - - withSingleStake' :: - Term - _ - ( ( PStakeDatum :--> PStakeDatum :--> PBool :--> PUnit - ) - :--> PUnit - ) <- pletC $ - plam $ \validationLogic -> unTermCont $ do - pguardC "Can only deal with one stake" $ - stakeInputNum #== 1 - - stakeInputHash <- pletC $ pfromData $ phead # stakeInputDatumHashes - stakeOutputHash <- pletC $ pfromData $ phead # stakeOutputDatumHashes - - stakeIn :: Term _ PStakeDatum <- - pletC $ pfromData $ pfromJust #$ ptryFindDatum # stakeInputHash # txInfoF.datums - - stakeOut :: Term _ PStakeDatum <- - pletC $ pfromData $ pfromJust #$ ptryFindDatum # stakeOutputHash # txInfoF.datums - - stakeUnchanged <- pletC $ stakeInputHash #== stakeOutputHash - - pure $ validationLogic # stakeIn # stakeOut # stakeUnchanged - - let withMultipleStakes val = - withMultipleStakes' #$ plam $ - \totalStakedAmount - sortedStakeOwner -> - unTermCont $ - val totalStakedAmount sortedStakeOwner - - withSingleStake val = - withSingleStake' #$ plam $ \stakeIn stakeOut stakeUnchange -> unTermCont $ do - stakeInF <- pletAllC $ pto stakeIn - - val stakeInF stakeOut stakeUnchange + proposalRedeemer <- fst <$> ptryFromC @PProposalRedeemer redeemer pure $ popaque $ pmatch proposalRedeemer $ \case - PCosign r -> withMultipleStakes $ \_ sortedStakeOwners -> do + PCosign _ -> spendStakes $ \sctxF -> do pguardC "Should be in draft state" $ currentStatus #== pconstant Draft - newSigs <- pletC $ pfield @"newCosigners" # r + stakeF <- + pletFieldsC @'["owner", "stakedAmount"] $ + ptrace "Exactly one stake input" $ + ptryFromSingleton # sctxF.inputStakes - pguardC "Signed by all new cosigners" $ - pall # signedBy # newSigs + let newCosigner = stakeF.owner updatedSigs <- pletC $ - pmergeBy # pltAsData - # newSigs - # proposalF.cosigners + ptrace "Update signature set" $ + pinsertUniqueBy + # (pfromOrdBy # plam pfromData) + # newCosigner + # proposalInputDatumF.cosigners pguardC "Less cosigners than maximum limit" $ - plength # updatedSigs #< pconstant maximumCosigners + plength # updatedSigs #<= pfromData maximumCosigners - pguardC "Cosigners are unique" $ - pisUniq' # updatedSigs - - pguardC "All new cosigners are witnessed by their Stake datums" $ - plistEquals # sortedStakeOwners # newSigs + pguardC "Meet minimum GT requirement" $ + pfromData thresholdsF.cosign #<= stakeF.stakedAmount let expectedDatum = mkRecordConstr PProposalDatum - ( #proposalId .= proposalF.proposalId - .& #effects .= proposalF.effects - .& #status .= proposalF.status - .& #cosigners .= pdata updatedSigs - .& #thresholds .= proposalF.thresholds - .& #votes .= proposalF.votes - .& #timingConfig .= proposalF.timingConfig - .& #startingTime .= proposalF.startingTime + ( #proposalId + .= proposalInputDatumF.proposalId + .& #effects + .= proposalInputDatumF.effects + .& #status + .= proposalInputDatumF.status + .& #cosigners + .= pdata updatedSigs + .& #thresholds + .= proposalInputDatumF.thresholds + .& #votes + .= proposalInputDatumF.votes + .& #timingConfig + .= proposalInputDatumF.timingConfig + .& #startingTime + .= proposalInputDatumF.startingTime ) pguardC "Signatures are correctly added to cosignature list" $ - proposalOut #== expectedDatum - - pure $ pconstant () + proposalOutputDatum #== expectedDatum ---------------------------------------------------------------------- - PVote r -> withSingleStake $ \stakeInF stakeOut _ -> do + PVote r -> spendStakes $ \sctxF -> do + totalStakeAmount <- + pletC $ + pto $ + pfoldMap + # plam + ( \stake -> unTermCont $ do + stakeF <- pletFieldsC @'["stakedAmount", "lockedBy"] stake + + pguardC "Same stake shouldn't vote on the same proposal twice" $ + pnot + #$ pisVoter + #$ pgetStakeRoles + # proposalInputDatumF.proposalId + # stakeF.lockedBy + + pure $ pcon $ PSum $ pfromData stakeF.stakedAmount + ) + # sctxF.inputStakes + + pguardC "At least minimum amount" $ + thresholdsF.vote #<= totalStakeAmount + pguardC "Input proposal must be in VotingReady state" $ currentStatus #== pconstant VotingReady pguardC "Proposal time should be wthin the voting period" $ - isVotingPeriod # proposalF.timingConfig - # proposalF.startingTime - #$ pfromJust - # currentTime + pisWithin # getTimingRelation PVotingPeriod + + pguardC "Width of time should meet maximum requirement" $ + withBoundedValidTimeRange $ + psatisfyMaximumWidth + #$ pfield @"votingTimeRangeMaxWidth" + # proposalInputDatumF.timingConfig -- Ensure the transaction is voting to a valid 'ResultTag'(outcome). - PProposalVotes voteMap <- pmatchC proposalF.votes + PProposalVotes voteMap <- pmatchC proposalInputDatumF.votes voteFor <- pletC $ pfromData $ pfield @"resultTag" # r pguardC "Vote option should be valid" $ pisJust #$ plookup # voteFor # voteMap - -- Ensure that no lock with the current proposal id has been put on the stake. - pguardC "Same stake shouldn't vote on the same proposal twice" $ - pnot #$ pisVoter #$ pgetStakeRole # proposalF.proposalId # pfromData stakeInF.lockedBy + let + -- The amount of new votes should be the 'stakedAmount'. + -- Update the vote counter of the proposal, and leave other stuff as is. + expectedNewVotes = + pcon $ + PProposalVotes $ + pupdate + # plam + ( \votes -> + pcon $ PJust $ votes + pto totalStakeAmount + ) + # voteFor + # pto (pfromData proposalInputDatumF.votes) - let -- The amount of new votes should be the 'stakedAmount'. - -- Update the vote counter of the proposal, and leave other stuff as is. - expectedNewVotes = pmatch (pfromData proposalF.votes) $ \(PProposalVotes m) -> - pcon $ - PProposalVotes $ - pupdate - # plam - ( \votes -> unTermCont $ do - PDiscrete v <- pmatchC stakeInF.stakedAmount - pure $ pcon $ PJust $ votes + (pextract # v) - ) - # voteFor - # m - expectedProposalOut = - mkRecordConstr - PProposalDatum - ( #proposalId .= proposalF.proposalId - .& #effects .= proposalF.effects - .& #status .= proposalF.status - .& #cosigners .= proposalF.cosigners - .& #thresholds .= proposalF.thresholds - .& #votes .= pdata expectedNewVotes - .& #timingConfig .= proposalF.timingConfig - .& #startingTime .= proposalF.startingTime - ) + expectedProposalOut = + mkRecordConstr + PProposalDatum + ( #proposalId + .= proposalInputDatumF.proposalId + .& #effects + .= proposalInputDatumF.effects + .& #status + .= proposalInputDatumF.status + .& #cosigners + .= proposalInputDatumF.cosigners + .& #thresholds + .= proposalInputDatumF.thresholds + .& #votes + .= pdata expectedNewVotes + .& #timingConfig + .= proposalInputDatumF.timingConfig + .& #startingTime + .= proposalInputDatumF.startingTime + ) - pguardC "Output proposal should be valid" $ proposalOut #== expectedProposalOut + pguardC "Output proposal should be valid" $ + proposalOutputDatum #== expectedProposalOut - -- We validate the output stake datum here as well: We need the vote option - -- to create a valid 'ProposalLock', however the vote option is encoded - -- in the proposal redeemer, which is invisible for the stake validator. - - let newProposalLock = - mkRecordConstr - PVoted - ( #votedOn .= proposalF.proposalId - .& #votedFor .= pdata voteFor - ) - -- Prepend the new lock to existing locks - expectedProposalLocks = - pcons - # pdata newProposalLock - # pfromData stakeInF.lockedBy - expectedStakeOut = - mkRecordConstr - PStakeDatum - ( #stakedAmount .= stakeInF.stakedAmount - .& #owner .= stakeInF.owner - .& #delegatedTo .= stakeInF.delegatedTo - .& #lockedBy .= pdata expectedProposalLocks - ) - - pguardC "Output stake should be locked by the proposal" $ expectedStakeOut #== stakeOut - - pure $ pconstant () + -- Note that the output stake locks validation now happens in the + -- stake validator. ---------------------------------------------------------------------- - PUnlock _ -> withSingleStake $ \stakeInF stakeOut _ -> do - stakeRole <- pletC $ pgetStakeRole # proposalF.proposalId # stakeInF.lockedBy + PUnlockStake _ -> spendStakes $ \sctxF -> do + let expectedVotes = + pdata $ + pfoldl + # plam + ( \votes stake -> unTermCont $ do + stakeF <- + pletFieldsC + @'["stakedAmount", "lockedBy"] + stake - pguardC "Stake input should be relevant" $ - pnot #$ pisIrrelevant # stakeRole + stakeRoles <- + pletC $ + pgetStakeRoles + # proposalInputDatumF.proposalId + # stakeF.lockedBy - retractCount <- - pletC $ - pmatch stakeInF.stakedAmount $ \(PDiscrete v) -> pextract # v + pguardC "Stake input should be relevant" $ + pnot #$ pisIrrelevant # stakeRoles - -- The votes can only change when the proposal still allows voting. - let shouldUpdateVotes = - currentStatus #== pconstant VotingReady - #&& pnot # (pisPureCreator # stakeRole) + let canRetractVotes = + pisVoter # stakeRoles - allowRemovingCreatorLock = - currentStatus #== pconstant Finished + voteCount = + pto $ + pfromData stakeF.stakedAmount - isCreator = pisCreator # stakeRole + newVotes = + pretractVotes + # (pextractVoteOption # stakeRoles) + # voteCount + # votes - -- If the stake has been used for creating the proposal, - -- the creator lock can only be removed when the proposal - -- is finished. - -- - -- In other cases, all the locks related to this - -- proposal should be removed. - validateOutputLocks = plam $ \locks -> - plet - ( pgetStakeRole # proposalF.proposalId # locks - ) - $ \newStakeRole -> - pif - (isCreator #&& pnot # allowRemovingCreatorLock) - (pisPureCreator # newStakeRole) - (pisIrrelevant # newStakeRole) + pure $ pif canRetractVotes newVotes votes + ) + # proposalInputDatumF.votes + # sctxF.inputStakes + + inVotingPeriod = + pisWithin # getTimingRelation PVotingPeriod + + -- The votes can only change when the proposal still allows voting. + shouldUpdateVotes = + currentStatus + #== pconstant VotingReady + #&& inVotingPeriod pguardC "Proposal output correct" $ pif shouldUpdateVotes - ( let -- Remove votes and leave other parts of the proposal as it. - expectedVotes = pretractVotes # (pextractVoteOption # stakeRole) # retractCount # proposalF.votes - - expectedProposalOut = - mkRecordConstr - PProposalDatum - ( #proposalId .= proposalF.proposalId - .& #effects .= proposalF.effects - .& #status .= proposalF.status - .& #cosigners .= proposalF.cosigners - .& #thresholds .= proposalF.thresholds - .& #votes .= pdata expectedVotes - .& #timingConfig .= proposalF.timingConfig - .& #startingTime .= proposalF.startingTime - ) - in ptraceIfFalse "Update votes" $ - expectedProposalOut #== proposalOut + ( let + -- Remove votes and leave other parts of the proposal as it. + expectedProposalOut = + mkRecordConstr + PProposalDatum + ( #proposalId + .= proposalInputDatumF.proposalId + .& #effects + .= proposalInputDatumF.effects + .& #status + .= proposalInputDatumF.status + .& #cosigners + .= proposalInputDatumF.cosigners + .& #thresholds + .= proposalInputDatumF.thresholds + .& #votes + .= expectedVotes + .& #timingConfig + .= proposalInputDatumF.timingConfig + .& #startingTime + .= proposalInputDatumF.startingTime + ) + in + foldl1 + (#&&) + [ ptraceIfFalse "Votes changed" $ + pnot #$ expectedVotes #== proposalInputDatumF.votes + , ptraceIfFalse "Proposal update correct" $ + expectedProposalOut #== proposalOutputDatum + ] ) -- No change to the proposal is allowed. - $ ptraceIfFalse "Proposal unchanged" proposalUnchanged - - -- At last, we ensure that all locks belong to this proposal will be removed. - stakeOutputLocks <- pletC $ pfield @"lockedBy" # pto stakeOut - - let templateStakeOut = - mkRecordConstr - PStakeDatum - ( #stakedAmount .= stakeInF.stakedAmount - .& #owner .= stakeInF.owner - .& #delegatedTo .= stakeInF.delegatedTo - .& #lockedBy .= pdata stakeOutputLocks - ) - - pguardC "Only locks updated in the output stake" $ - templateStakeOut #== stakeOut - - pguardC "All relevant locks removed from the stake" $ - validateOutputLocks # stakeOutputLocks - - pure $ pconstant () + ( ptraceIfFalse "Proposal unchanged" $ + proposalOutputDatum #== proposalInputDatum + ) ---------------------------------------------------------------------- - PAdvanceProposal _ -> - let currentTime' = pfromJust # currentTime - fromDraft = withMultipleStakes $ \totalStakedAmount sortedStakeOwners -> - pmatchC (isDraftPeriod # proposalF.timingConfig # proposalF.startingTime # currentTime') >>= \case - PTrue -> do - pguardC "More cosigns than minimum amount" $ - punsafeCoerce (pfromData thresholdsF.vote) #< totalStakedAmount + PAdvanceProposal _ -> unTermCont $ do + proposalOutputStatus <- + pletC $ + pfromData $ + pfield @"status" # pto proposalOutputDatum - pguardC "All new cosigners are witnessed by their Stake datums" $ - plistEquals # sortedStakeOwners # proposalF.cosigners + pguardC "Only status changes in the output proposal" $ + let expectedProposalOutputDatum = + mkRecordConstr + PProposalDatum + ( #proposalId + .= proposalInputDatumF.proposalId + .& #effects + .= proposalInputDatumF.effects + .& #status + .= pdata proposalOutputStatus + .& #cosigners + .= proposalInputDatumF.cosigners + .& #thresholds + .= proposalInputDatumF.thresholds + .& #votes + .= proposalInputDatumF.votes + .& #timingConfig + .= proposalInputDatumF.timingConfig + .& #startingTime + .= proposalInputDatumF.startingTime + ) + in proposalOutputDatum #== expectedProposalOutputDatum - -- 'Draft' -> 'VotingReady' - pguardC "Proposal status set to VotingReady" $ - proposalOutStatus #== pconstant VotingReady + pure $ + pmatch currentStatus $ \case + PDraft -> + witnessStakes $ \sctxF -> do + pmatchC (getTimingRelation PDraftingPeriod) >>= \case + PWithin -> do + pguardC "More cosigns than minimum amount" $ + punsafeCoerce (pfromData thresholdsF.toVoting) #<= sctxF.totalAmount - pure $ pconstant () - PFalse -> do - pguardC "Advance to failed state" $ proposalOutStatus #== pconstant Finished + pguardC "All new cosigners are witnessed by their Stake datums" $ + plistEqualsBy + # plam (\x (pfromData -> y) -> x #== y) + # sctxF.orderedOwners + # proposalInputDatumF.cosigners - pure $ pconstant () - - fromOther = withSingleStake $ \_ _ stakeUnchanged -> do - pguardC "Stake should not change" stakeUnchanged - - pguardC - "Only status changes in the output proposal" - onlyStatusChanged - - inVotingPeriod <- pletC $ isVotingPeriod # proposalF.timingConfig # proposalF.startingTime # currentTime' - inLockedPeriod <- pletC $ isLockingPeriod # proposalF.timingConfig # proposalF.startingTime # currentTime' - inExecutionPeriod <- pletC $ isExecutionPeriod # proposalF.timingConfig # proposalF.startingTime # currentTime' - - proposalStatus <- pletC $ pto $ pfromData proposalF.status - - -- Check the timings. - let isFinished = currentStatus #== pconstant Finished - - notTooLate = pmatchEnum proposalStatus $ \case - -- Can only advance after the voting period is over. - VotingReady -> inLockedPeriod - Locked -> inExecutionPeriod - _ -> pconstant False - - notTooEarly = pmatchEnum (pto $ pfromData proposalF.status) $ \case - VotingReady -> pnot # inVotingPeriod - Locked -> pnot # inLockedPeriod - _ -> pconstant True - - pguardC "Cannot advance ahead of time" notTooEarly - pguardC "Finished proposals cannot be advanced" $ pnot # isFinished - - let gstSymbol = pconstant $ governorSTSymbol as - - gstMoved <- - pletC $ - pany - # plam - ( \( (pfield @"value" #) - . (pfield @"resolved" #) -> - value - ) -> - psymbolValueOf # gstSymbol # value #== 1 - ) - # pfromData txInfoF.inputs - - let toFailedState = unTermCont $ do - pguardC "Proposal should fail: not on time" $ - proposalOutStatus #== pconstant Finished - - pguardC "GST not moved" $ pnot # gstMoved - - pure $ pconstant () - - toNextState = pmatchEnum proposalStatus $ \case - VotingReady -> unTermCont $ do - -- 'VotingReady' -> 'Locked' - pguardC "Proposal status set to Locked" $ - proposalOutStatus #== pconstant Locked - - pguardC "Winner outcome not found" $ - pisJust #$ pwinner' # proposalF.votes - #$ punsafeCoerce - $ pfromData thresholdsF.execute - - pure $ pconstant () - Locked -> unTermCont $ do - -- 'Locked' -> 'Finished' - pguardC "Proposal status set to Finished" $ - proposalOutStatus #== pconstant Finished - - pguardC "GST moved" gstMoved - - -- TODO: Perform other necessary checks. - pure $ pconstant () - _ -> pconstant () - - pure $ - pif - notTooLate - -- On time: advance to next status. - toNextState + -- 'Draft' -> 'VotingReady' + pguardC "Proposal status set to VotingReady" $ + proposalOutputStatus #== pconstant VotingReady -- Too late: failed proposal, status set to 'Finished'. - toFailedState - in pif (currentStatus #== pconstant Draft) fromDraft fromOther + PAfter -> + pguardC "Proposal should fail: not on time" $ + proposalOutputStatus #== pconstant Finished + + ---------------------------------------------------------------- + + PVotingReady -> unTermCont $ do + pmatchC (getTimingRelation PLockingPeriod) >>= \case + PWithin -> do + -- 'VotingReady' -> 'Locked' + pguardC "Proposal status set to Locked" $ + proposalOutputStatus #== pconstant Locked + + pguardC "Winner outcome not found" + $ pisJust + #$ pwinner' + # proposalInputDatumF.votes + #$ punsafeCoerce + $ pfromData thresholdsF.execute + -- Too late: failed proposal, status set to 'Finished'. + PAfter -> + pguardC "Proposal should fail: not on time" $ + proposalOutputStatus #== pconstant Finished + + pure $ popaque $ pconstant () + + ---------------------------------------------------------------- + + PLocked -> unTermCont $ do + pguardC "Proposal status set to Finished" $ + proposalOutputStatus #== pconstant Finished + + let gstMoved = + pany + # plam + ( \( (pfield @"value" #) + . (pfield @"resolved" #) -> + value + ) -> + ptaggedSymbolValueOf # pfromData gstSymbol # value #== 1 + ) + # pfromData txInfoF.inputs + + pguardC "GST not moved if too late, moved otherwise" $ + pmatch + (getTimingRelation PExecutingPeriod) + ( \case + PWithin -> pidentity + PAfter -> pnot + ) + # gstMoved + + pure $ popaque $ pconstant () + + ---------------------------------------------------------------- + + PFinished -> ptraceError "Finished proposals cannot be advanced" diff --git a/agora/Agora/Proposal/Time.hs b/agora/Agora/Proposal/Time.hs index 97d6196..67cfbf7 100644 --- a/agora/Agora/Proposal/Time.hs +++ b/agora/Agora/Proposal/Time.hs @@ -14,47 +14,59 @@ module Agora.Proposal.Time ( MaxTimeRangeWidth (..), -- * Plutarch-land - PProposalTime (..), + PProposalTime, PProposalTimingConfig (..), PProposalStartingTime (..), PMaxTimeRangeWidth (..), + PTimingRelation (..), + PPeriod (..), -- * Compute periods given config and starting time. - createProposalStartingTime, - currentProposalTime, - isDraftPeriod, - isVotingPeriod, - isLockingPeriod, - isExecutionPeriod, + pvalidateProposalStartingTime, + pcurrentProposalTime, pisProposalTimingConfigValid, pisMaxTimeRangeWidthValid, + pgetRelation, + pisWithin, + psatisfyMaximumWidth, ) where -import Control.Composition ((.*)) +import Data.Functor ((<&>)) +import Generics.SOP qualified as SOP import Plutarch.Api.V1 ( PExtended (PFinite), PInterval (PInterval), PLowerBound (PLowerBound), PPOSIXTime, - PPOSIXTimeRange, PUpperBound (PUpperBound), ) +import Plutarch.Api.V2 (PPOSIXTimeRange) import Plutarch.DataRepr ( - DerivePConstantViaData (..), PDataFields, ) import Plutarch.Extra.Applicative (PApply (pliftA2)) +import Plutarch.Extra.Bool (passert) import Plutarch.Extra.Field (pletAll, pletAllC) -import Plutarch.Extra.Maybe (pjust, pmaybe, pnothing) -import Plutarch.Extra.TermCont (pmatchC) -import Plutarch.Lift ( - DerivePConstantViaNewtype (..), - PConstantDecl, - PUnsafeLiftDecl (..), +import Plutarch.Extra.IsData ( + DerivePConstantViaDataList (DerivePConstantViaDataList), + PlutusTypeEnumData, + ProductIsData (ProductIsData), ) +import Plutarch.Extra.Maybe (pjust, pmaybe, pnothing) +import Plutarch.Extra.Time ( + PFullyBoundedTimeRange (PFullyBoundedTimeRange), + pisWithinTimeRange, + ptimeRangeDuration, + ) +import Plutarch.Lift ( + DerivePConstantViaNewtype (DerivePConstantViaNewtype), + PConstantDecl, + PUnsafeLiftDecl (PLifted), + ) +import Plutarch.Num (PNum) import PlutusLedgerApi.V1 (POSIXTime) import PlutusTx qualified -import Prelude +import "liqwid-plutarch-extra" Plutarch.Extra.TermCont (pletC, pmatchC) -------------------------------------------------------------------------------- @@ -78,37 +90,8 @@ newtype ProposalStartingTime = ProposalStartingTime PlutusTx.ToData , -- | @since 0.1.0 PlutusTx.FromData - , -- | @since 0.1.0 - PlutusTx.UnsafeFromData ) -{- | Configuration of proposal timings. - - See: https://liqwid.notion.site/Proposals-589853145a994057aa77f397079f75e4#d25ea378768d4c76b52dd4c1b6bc0fcd - - @since 0.1.0 --} -data ProposalTimingConfig = ProposalTimingConfig - { draftTime :: POSIXTime - -- ^ "D": the length of the draft period. - , votingTime :: POSIXTime - -- ^ "V": the length of the voting period. - , lockingTime :: POSIXTime - -- ^ "L": the length of the locking period. - , executingTime :: POSIXTime - -- ^ "E": the length of the execution period. - } - deriving stock - ( -- | @since 0.1.0 - Eq - , -- | @since 0.1.0 - Show - , -- | @since 0.1.0 - Generic - ) - -PlutusTx.makeIsDataIndexed 'ProposalTimingConfig [('ProposalTimingConfig, 0)] - -- | Represents the maximum width of a 'PlutusLedgerApi.V1.Time.POSIXTimeRange'. newtype MaxTimeRangeWidth = MaxTimeRangeWidth {getMaxWidth :: POSIXTime} deriving stock @@ -126,10 +109,50 @@ newtype MaxTimeRangeWidth = MaxTimeRangeWidth {getMaxWidth :: POSIXTime} PlutusTx.ToData , -- | @since 0.1.0 PlutusTx.FromData - , -- | @since 0.1.0 - PlutusTx.UnsafeFromData + , -- | @since 1.0.0 + Num ) +{- | Configuration of proposal timings. + + See: https://liqwid.notion.site/Proposals-589853145a994057aa77f397079f75e4#d25ea378768d4c76b52dd4c1b6bc0fcd + + @since 0.1.0 +-} +data ProposalTimingConfig = ProposalTimingConfig + { draftTime :: POSIXTime + -- ^ "D": the length of the draft period. + , votingTime :: POSIXTime + -- ^ "V": the length of the voting period. + , lockingTime :: POSIXTime + -- ^ "L": the length of the locking period. + , executingTime :: POSIXTime + -- ^ "E": the length of the execution period. + , minStakeVotingTime :: POSIXTime + -- ^ Minimum time from creating a voting lock until it can be destroyed. + , votingTimeRangeMaxWidth :: MaxTimeRangeWidth + -- ^ The maximum width of transaction time range while voting. + } + deriving stock + ( -- | @since 0.1.0 + Eq + , -- | @since 0.1.0 + Show + , -- | @since 0.1.0 + Generic + ) + deriving anyclass + ( -- | @since 1.0.0 + SOP.Generic + ) + deriving + ( -- | @since 1.0.0 + PlutusTx.ToData + , -- | @since 1.0.0 + PlutusTx.FromData + ) + via (ProductIsData ProposalTimingConfig) + -------------------------------------------------------------------------------- {- | == Establishing timing in Proposal interactions. @@ -159,23 +182,7 @@ newtype MaxTimeRangeWidth = MaxTimeRangeWidth {getMaxWidth :: POSIXTime} @since 0.1.0 -} -data PProposalTime (s :: S) = PProposalTime - { lowerBound :: Term s PPOSIXTime - , upperBound :: Term s PPOSIXTime - } - deriving stock - ( -- | @since 0.1.0 - Generic - ) - deriving anyclass - ( -- | @since 0.1.0 - PlutusType - , -- | @since 0.1.0 - PEq - ) - -instance DerivePlutusType PProposalTime where - type DPTStrat _ = PlutusTypeScott +type PProposalTime = PFullyBoundedTimeRange -- | Plutarch-level version of 'ProposalStartingTime'. newtype PProposalStartingTime (s :: S) = PProposalStartingTime (Term s PPOSIXTime) @@ -220,6 +227,8 @@ newtype PProposalTimingConfig (s :: S) = PProposalTimingConfig , "votingTime" ':= PPOSIXTime , "lockingTime" ':= PPOSIXTime , "executingTime" ':= PPOSIXTime + , "minStakeVotingTime" ':= PPOSIXTime + , "votingTimeRangeMaxWidth" ':= PMaxTimeRangeWidth ] ) } @@ -234,13 +243,15 @@ newtype PProposalTimingConfig (s :: S) = PProposalTimingConfig PIsData , -- | @since 0.1.0 PDataFields + , -- | @since 0.2.1 + PShow ) instance DerivePlutusType PProposalTimingConfig where - type DPTStrat _ = PlutusTypeData + type DPTStrat _ = PlutusTypeNewtype -- | @since 0.1.0 -instance PTryFrom PData PProposalTimingConfig +instance PTryFrom PData (PAsData PProposalTimingConfig) -- | @since 0.1.0 instance PUnsafeLiftDecl PProposalTimingConfig where @@ -248,7 +259,7 @@ instance PUnsafeLiftDecl PProposalTimingConfig where -- | @since 0.1.0 deriving via - (DerivePConstantViaData ProposalTimingConfig PProposalTimingConfig) + (DerivePConstantViaDataList ProposalTimingConfig PProposalTimingConfig) instance (PConstantDecl ProposalTimingConfig) @@ -270,6 +281,10 @@ newtype PMaxTimeRangeWidth (s :: S) PPartialOrd , -- | @since 0.1.0 POrd + , -- | @since 0.2.1 + PShow + , -- | @since 1.0.0 + PNum ) instance DerivePlutusType PMaxTimeRangeWidth where @@ -293,7 +308,7 @@ deriving via @since 0.2.0 -} -pisProposalTimingConfigValid :: Term s (PProposalTimingConfig :--> PBool) +pisProposalTimingConfigValid :: forall (s :: S). Term s (PProposalTimingConfig :--> PBool) pisProposalTimingConfigValid = phoistAcyclic $ plam $ \conf -> unTermCont $ do confF <- pletAllC conf @@ -313,6 +328,8 @@ pisProposalTimingConfigValid = phoistAcyclic $ , confF.votingTime , confF.lockingTime , confF.executingTime + , confF.minStakeVotingTime + , pto confF.votingTimeRangeMaxWidth ] {- | Return true if the maximum time width is greater than 0. @@ -326,162 +343,203 @@ pisMaxTimeRangeWidthValid = ptraceIfFalse "greater than 0" . (pconstant (MaxTimeRangeWidth 0) #<) -{- | Get the starting time of a proposal, from the 'PlutusLedgerApi.V1.txInfoValidPeriod' field. +{- | Validate starting time of a proposal, from the 'PlutusLedgerApi.V1.txInfoValidPeriod' field. For every proposal, this is only meant to run once upon creation. Given time range should be tight enough, meaning that the width of the time range should be less than the maximum value. - @since 0.1.0 + @since 1.0.0 -} -createProposalStartingTime :: +pvalidateProposalStartingTime :: forall (s :: S). Term s ( PMaxTimeRangeWidth :--> PPOSIXTimeRange - :--> PMaybe PProposalStartingTime + :--> PProposalStartingTime + :--> PBool ) -createProposalStartingTime = phoistAcyclic $ - plam $ \(pto -> maxDuration) iv -> - let ct = currentProposalTime # iv +pvalidateProposalStartingTime = phoistAcyclic $ + plam $ \maxWidth iv (pto -> st) -> + pmaybe + # pconstant False + # plam + ( \ct -> + let isTightEnough = + ptraceIfFalse + "createProposalStartingTime: given time range should be tight enough" + $ psatisfyMaximumWidth # maxWidth # ct + isInCurrentTimeRange = + ptraceIfFalse + "createProposalStartingTime: starting time should be in current time range" + $ pisWithinTimeRange # st # ct + in isTightEnough #&& isInCurrentTimeRange + ) + # (pcurrentProposalTime # iv) - f :: Term _ (PProposalTime :--> PMaybe PProposalStartingTime) - f = plam $ - flip pmatch $ \(PProposalTime lb ub) -> - let duration = ub - lb - - startingTime = pdiv # (lb + ub) # 2 - in pif - (duration #<= maxDuration) - (pjust #$ pcon $ PProposalStartingTime startingTime) - ( ptrace - "createProposalStartingTime: given time range should be tight enough" - pnothing - ) - in -- TODO: PMonad when? - pmaybe # pnothing # f # ct - -{- | Get the current proposal time, from the 'PlutusLedgerApi.V1.txInfoValidPeriod' field. +{- | Get the current proposal time, given the 'PlutusLedgerApi.V1.txInfoValidPeriod' field. If it's impossible to get a fully-bounded time, (e.g. either end of the 'PPOSIXTimeRange' is - an infinity) then we error out. + an infinity) then we return nothing. + + Note that we ignore the inclusiveness of the upper bound. Due to the fact + that there's no place in the Cardano domain transaction type to store the + inclusiveness information, we can never get a time range with closed upper + bound. See also the ledger implementation: https://bit.ly/3BDzW5R @since 0.1.0 -} -currentProposalTime :: forall (s :: S). Term s (PPOSIXTimeRange :--> PMaybe PProposalTime) -currentProposalTime = phoistAcyclic $ +pcurrentProposalTime :: forall (s :: S). Term s (PPOSIXTimeRange :--> PMaybe PProposalTime) +pcurrentProposalTime = phoistAcyclic $ plam $ \iv -> unTermCont $ do PInterval iv' <- pmatchC iv ivf <- pletAllC iv' PLowerBound lb <- pmatchC ivf.from PUpperBound ub <- pmatchC ivf.to - let getBound = phoistAcyclic $ - plam $ - flip pletAll $ \f -> - pif - f._1 - ( pmatch f._0 $ \case - PFinite (pfromData . (pfield @"_0" #) -> d) -> pjust # d - _ -> ptrace "currentProposalTime: time range should be bounded" pnothing - ) - (ptrace "currentProposalTime: time range should be inclusive" pnothing) + let lowerBound = pletAll lb $ \f -> + pif + f._1 + ( pmatch f._0 $ \case + PFinite (pfromData . (pfield @"_0" #) -> d) -> pjust # d + _ -> ptrace "currentProposalTime: time range should be bounded" pnothing + ) + (ptrace "currentProposalTime: lower bound of the time range should be inclusive" pnothing) - lowerBound = getBound # lb - upperBound = getBound # ub + upperBound = pletAll ub $ \f -> + pmatch f._0 $ \case + PFinite (pfromData . (pfield @"_0" #) -> d) -> pjust # d + _ -> ptrace "currentProposalTime: time range should be bounded" pnothing + + mkTime = phoistAcyclic $ + plam $ \lb ub -> + passert + "Upper bound bigger than lower bound" + (lb #< ub) + (pcon $ PFullyBoundedTimeRange lb ub) - mkTime = phoistAcyclic $ plam $ pcon .* PProposalTime pure $ pliftA2 # mkTime # lowerBound # upperBound -{- | Check if 'PProposalTime' is within two 'PPOSIXTime'. Inclusive. +{- | Represent relation between current time and a given period. - @since 0.1.0 + Note that the "before" relation isn't present due to the fact that + it's considered as an error in the proposal script. + + @since 1.0.0 -} -proposalTimeWithin :: +data PTimingRelation (s :: S) + = PWithin + | PAfter + deriving stock + ( -- | @since 1.0.0 + Generic + , -- | @since 1.0.0 + Enum + , -- | @since 1.0.0 + Bounded + ) + deriving anyclass + ( -- | @since 1.0.0 + PlutusType + ) + +-- | @since 1.0.0 +instance DerivePlutusType PTimingRelation where + type DPTStrat _ = PlutusTypeEnumData + +{- | Return true if a relation is 'PWithin'. + + @since 1.0.0 +-} +pisWithin :: forall (s :: S). Term s (PTimingRelation :--> PBool) +pisWithin = phoistAcyclic $ + plam $ + flip pmatch $ \case + PWithin -> pconstant True + _ -> pconstant False + +{- | Represent a proposal period. + + @since 1.0.0 +-} +data PPeriod (s :: S) + = PDraftingPeriod + | PVotingPeriod + | PLockingPeriod + | PExecutingPeriod + deriving stock + ( -- | @since 1.0.0 + Generic + , -- | @since 1.0.0 + Enum + , -- | @since 1.0.0 + Bounded + ) + deriving anyclass + ( -- | @since 1.0.0 + PlutusType + ) + +-- | @since 1.0.0 +instance DerivePlutusType PPeriod where + type DPTStrat _ = PlutusTypeEnumData + +{- | Compute the relation between current time range and the given peroid, + providing the starting time and timing configuration of a proposal. If the + relation cannot be determined, error out. + + @since 1.0.0 +-} +pgetRelation :: + forall (s :: S). Term s - ( PPOSIXTime - :--> PPOSIXTime + ( PProposalTimingConfig + :--> PProposalStartingTime :--> PProposalTime - :--> PBool + :--> PPeriod + :--> PTimingRelation ) -proposalTimeWithin = phoistAcyclic $ - plam $ \l h proposalTime' -> unTermCont $ do - PProposalTime ut lt <- pmatchC proposalTime' +pgetRelation = phoistAcyclic $ + plam $ \config startingTime currentTime period -> unTermCont $ do + configF <- pletAllC config + + PProposalStartingTime s <- pmatchC startingTime + PFullyBoundedTimeRange lb ub <- pmatchC currentTime + + dub <- pletC $ s + configF.draftTime + vub <- pletC $ dub + configF.votingTime + lub <- pletC $ vub + configF.lockingTime + eub <- pletC $ lub + configF.executingTime + + (plb, pub) <- + pmatchC period + <&> ( \case + PDraftingPeriod -> (s, dub) + PVotingPeriod -> (dub, vub) + PLockingPeriod -> (vub, lub) + PExecutingPeriod -> (lub, eub) + ) + pure $ - foldr1 - (#&&) - [ l #<= lt - , ut #<= h - ] + pif (plb #<= lb #&& ub #<= pub) (pcon PWithin) $ + pif (pub #< lb) (pcon PAfter) $ + ptraceError "pgetRelation: too early or invalid current time" -{- | True if the 'PProposalTime' is in the draft period. +{- | Return true if the width of given 'PProposalTime' is shorter than the + maximum. - @since 0.1.0 + @since 1.0.0 -} -isDraftPeriod :: +psatisfyMaximumWidth :: forall (s :: S). Term s - ( PProposalTimingConfig - :--> PProposalStartingTime + ( PMaxTimeRangeWidth :--> PProposalTime :--> PBool ) -isDraftPeriod = phoistAcyclic $ - plam $ \config s' -> pmatch s' $ \(PProposalStartingTime s) -> - proposalTimeWithin # s # (s + (pfield @"draftTime" # config)) - -{- | True if the 'PProposalTime' is in the voting period. - - @since 0.1.0 --} -isVotingPeriod :: - forall (s :: S). - Term - s - ( PProposalTimingConfig - :--> PProposalStartingTime - :--> PProposalTime - :--> PBool - ) -isVotingPeriod = phoistAcyclic $ - plam $ \config s' -> pmatch s' $ \(PProposalStartingTime s) -> - pletFields @'["draftTime", "votingTime"] config $ \f -> - proposalTimeWithin # s # (s + f.draftTime + f.votingTime) - -{- | True if the 'PProposalTime' is in the locking period. - - @since 0.1.0 --} -isLockingPeriod :: - forall (s :: S). - Term - s - ( PProposalTimingConfig - :--> PProposalStartingTime - :--> PProposalTime - :--> PBool - ) -isLockingPeriod = phoistAcyclic $ - plam $ \config s' -> pmatch s' $ \(PProposalStartingTime s) -> - pletFields @'["draftTime", "votingTime", "lockingTime"] config $ \f -> - proposalTimeWithin # s # (s + f.draftTime + f.votingTime + f.lockingTime) - -{- | True if the 'PProposalTime' is in the execution period. - - @since 0.1.0 --} -isExecutionPeriod :: - forall (s :: S). - Term - s - ( PProposalTimingConfig - :--> PProposalStartingTime - :--> PProposalTime - :--> PBool - ) -isExecutionPeriod = phoistAcyclic $ - plam $ \config s' -> pmatch s' $ \(PProposalStartingTime s) -> - pletFields @'["draftTime", "votingTime", "lockingTime", "executingTime"] config $ \f -> - proposalTimeWithin # s - # (s + f.draftTime + f.votingTime + f.lockingTime + f.executingTime) +psatisfyMaximumWidth = phoistAcyclic $ + plam $ \maxWidth time -> + let width = ptimeRangeDuration # time + max = pto maxWidth + in width #<= max diff --git a/agora/Agora/SafeMoney.hs b/agora/Agora/SafeMoney.hs index 77552ba..0310a8b 100644 --- a/agora/Agora/SafeMoney.hs +++ b/agora/Agora/SafeMoney.hs @@ -11,6 +11,7 @@ module Agora.SafeMoney ( GovernorSTTag, StakeSTTag, ProposalSTTag, + AuthorityTokenTag, adaRef, ) where @@ -21,31 +22,37 @@ import PlutusLedgerApi.V1.Value (AssetClass (AssetClass)) @since 0.1.0 -} -data GTTag +type GTTag = "GTTag" {- | ADA. @since 0.1.0 -} -data ADATag +type ADATag = "ADATag" {- | Governor ST token. @since 0.1.0 -} -data GovernorSTTag +type GovernorSTTag = "GovernorSTTag" {- | Stake ST token. @since 0.1.0 -} -data StakeSTTag +type StakeSTTag = "StakeSTTag" {- | Proposal ST token. @since 0.1.0 -} -data ProposalSTTag +type ProposalSTTag = "ProposalSTTag" + +{- | Authority token. + + @since 1.0.0 +-} +type AuthorityTokenTag = "AuthorityTokenTag" {- | Resolves ada tags. diff --git a/agora/Agora/Scripts.hs b/agora/Agora/Scripts.hs deleted file mode 100644 index 9a76167..0000000 --- a/agora/Agora/Scripts.hs +++ /dev/null @@ -1,138 +0,0 @@ -{- | Module : Agora.Scripts - Maintainer : connor@mlabs.city - Description: Precompiled core scripts and utilities - - Precompiled core scripts and utilities --} -module Agora.Scripts ( - AgoraScripts (..), - governorSTSymbol, - governorSTAssetClass, - governorValidatorHash, - proposalSTSymbol, - proposalSTAssetClass, - proposalValidatoHash, - stakeSTSymbol, - stakeSTAssetClass, - stakeValidatorHash, - authorityTokenSymbol, - treasuryValidatorHash, -) where - -import Agora.Governor (GovernorDatum, GovernorRedeemer) -import Agora.Proposal (ProposalDatum, ProposalRedeemer) -import Agora.Stake (StakeDatum, StakeRedeemer) -import Agora.Treasury (TreasuryRedeemer) -import Agora.Utils (CompiledMintingPolicy (..), CompiledValidator (..), validatorHashToTokenName) -import Plutarch.Api.V1 (mintingPolicySymbol, validatorHash) -import PlutusLedgerApi.V1 (CurrencySymbol) -import PlutusLedgerApi.V1.Scripts (ValidatorHash) -import PlutusLedgerApi.V1.Value (AssetClass (..)) - -{- | Precompiled core scripts. - - Including: - - - Governor policy - - Governor validator - - Proposal policy - - Proposal validator - - Stake policy - - Stake validator - - Treasury validator - - Authority token policy - - @since 0.2.0 --} -data AgoraScripts = AgoraScripts - { compiledGovernorPolicy :: CompiledMintingPolicy () - , compiledGovernorValidator :: CompiledValidator GovernorDatum GovernorRedeemer - , compiledStakePolicy :: CompiledMintingPolicy () - , compiledStakeValidator :: CompiledValidator StakeDatum StakeRedeemer - , compiledProposalPolicy :: CompiledMintingPolicy () - , compiledProposalValidator :: CompiledValidator ProposalDatum ProposalRedeemer - , compiledTreasuryValidator :: CompiledValidator () TreasuryRedeemer - , compiledAuthorityTokenPolicy :: CompiledMintingPolicy () - } - -{- | Get the currency symbol of the governor state token. - - @since 0.2.0 --} -governorSTSymbol :: AgoraScripts -> CurrencySymbol -governorSTSymbol = mintingPolicySymbol . getCompiledMintingPolicy . compiledGovernorPolicy - -{- | Get the asset class of the governor state token. - - @since 0.2.0 --} -governorSTAssetClass :: AgoraScripts -> AssetClass -governorSTAssetClass as = AssetClass (governorSTSymbol as, "") - -{- | Get the script hash of the governor validator. - - @since 0.2.0 --} -governorValidatorHash :: AgoraScripts -> ValidatorHash -governorValidatorHash = validatorHash . getCompiledValidator . compiledGovernorValidator - -{- | Get the currency symbol of the propsoal state token. - - @since 0.2.0 --} -proposalSTSymbol :: AgoraScripts -> CurrencySymbol -proposalSTSymbol as = mintingPolicySymbol $ getCompiledMintingPolicy as.compiledProposalPolicy - -{- | Get the asset class of the governor state token. - - @since 0.2.0 --} -proposalSTAssetClass :: AgoraScripts -> AssetClass -proposalSTAssetClass as = AssetClass (proposalSTSymbol as, "") - -{- | Get the script hash of the proposal validator. - - @since 0.2.0 --} -proposalValidatoHash :: AgoraScripts -> ValidatorHash -proposalValidatoHash = validatorHash . getCompiledValidator . compiledProposalValidator - -{- | Get the script hash of the governor validator. - - @since 0.2.0 --} -stakeSTSymbol :: AgoraScripts -> CurrencySymbol -stakeSTSymbol = mintingPolicySymbol . getCompiledMintingPolicy . compiledStakePolicy - -{- | Get the asset class of the stake state token. - - Note that this token is tagged with the hash of the stake validator. - See 'Agora.Stake.Script.stakePolicy'. - - @since 0.2.0 --} -stakeSTAssetClass :: AgoraScripts -> AssetClass -stakeSTAssetClass as = - let tn = validatorHashToTokenName $ stakeValidatorHash as - in AssetClass (stakeSTSymbol as, tn) - -{- | Get the script hash of the stake validator. - - @since 0.2.0 --} -stakeValidatorHash :: AgoraScripts -> ValidatorHash -stakeValidatorHash = validatorHash . getCompiledValidator . compiledStakeValidator - -{- | Get the currency symbol of the authority token. - - @since 0.2.0 --} -authorityTokenSymbol :: AgoraScripts -> CurrencySymbol -authorityTokenSymbol = mintingPolicySymbol . getCompiledMintingPolicy . compiledAuthorityTokenPolicy - -{- | Get the script hash of the treasury validator. - - @since 0.2.0 --} -treasuryValidatorHash :: AgoraScripts -> ValidatorHash -treasuryValidatorHash = validatorHash . getCompiledValidator . compiledTreasuryValidator diff --git a/agora/Agora/Stake.hs b/agora/Agora/Stake.hs index 423f347..b42e667 100644 --- a/agora/Agora/Stake.hs +++ b/agora/Agora/Stake.hs @@ -1,4 +1,5 @@ {-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE NoFieldSelectors #-} {- | Module : Agora.Stake @@ -11,53 +12,119 @@ module Agora.Stake ( -- * Haskell-land StakeDatum (..), StakeRedeemer (..), + ProposalAction (..), ProposalLock (..), -- * Plutarch-land PStakeDatum (..), PStakeRedeemer (..), + PProposalAction (..), PProposalLock (..), PStakeRole (..), + -- * Validation context + PSignedBy (..), + PSigContext (..), + PStakeRedeemerContext (..), + PStakeRedeemerHandlerContext (..), + PProposalContext (..), + PStakeRedeemerHandler, + StakeRedeemerImpl (..), + -- * Utility functions pstakeLocked, pnumCreatedProposals, pextractVoteOption, - pgetStakeRole, + pgetStakeRoles, pisVoter, pisCreator, - pisPureCreator, + pisCosigner, pisIrrelevant, + presolveStakeInputDatum, ) where -import Agora.Proposal (PProposalId, PResultTag, ProposalId (..), ResultTag (..)) -import Agora.SafeMoney (GTTag) -import Data.Tagged (Tagged (..)) +import Agora.Proposal ( + PProposalDatum, + PProposalId, + PProposalRedeemer, + PResultTag, + ProposalId, + ResultTag, + ) +import Agora.Proposal.Time (PProposalTime) +import Agora.SafeMoney (GTTag, StakeSTTag) +import Data.Tagged (Tagged) import Generics.SOP qualified as SOP -import Plutarch.Api.V1 ( +import Plutarch.Api.V1 (PCredential, PPOSIXTime) +import Plutarch.Api.V2 ( + KeyGuarantees (Unsorted), + PDatum, + PDatumHash, + PMap, PMaybeData, - PPubKeyHash, + PTxInInfo, + PTxInfo, ) import Plutarch.DataRepr ( - DerivePConstantViaData (..), + DerivePConstantViaData (DerivePConstantViaData), + PDataFields, ) -import Plutarch.Extra.Field (pletAll) +import Plutarch.Extra.Applicative (ppureIf) +import Plutarch.Extra.AssetClass (PAssetClass) import Plutarch.Extra.IsData ( - DerivePConstantViaDataList (..), + DerivePConstantViaDataList (DerivePConstantViaDataList), ProductIsData (ProductIsData), ) -import Plutarch.Extra.List (pnotNull) -import Plutarch.Extra.Sum (PSum (..)) +import Plutarch.Extra.Maybe (passertPJust, pjust, pnothing) +import Plutarch.Extra.ScriptContext (ptryFromOutputDatum) +import Plutarch.Extra.Sum (PSum (PSum)) +import Plutarch.Extra.Tagged (PTagged) import Plutarch.Extra.Traversable (pfoldMap) -import Plutarch.Lift (PConstantDecl, PUnsafeLiftDecl (..)) -import Plutarch.SafeMoney (PDiscrete) -import Plutarch.Show (PShow (..)) -import PlutusLedgerApi.V1 (PubKeyHash) +import Plutarch.Extra.Value (passetClassValueOfT) +import Plutarch.Lift (PConstantDecl, PUnsafeLiftDecl (PLifted)) +import PlutusLedgerApi.V2 (Credential, POSIXTime) import PlutusTx qualified -import Prelude hiding (Num (..)) +import "liqwid-plutarch-extra" Plutarch.Extra.List (pfindJust, pmapMaybe) -------------------------------------------------------------------------------- +{- | The action that was performed on a particular proposal. + + @since 1.0.0 +-} +data ProposalAction + = -- | The stake was used to create a proposal. + -- + -- This kind of lock is placed upon the creation of a proposal, in order + -- to limit creation of proposals per stake. + -- + -- See also: https://github.com/Liqwid-Labs/agora/issues/68 + Created + | -- | The stake was used to vote on a proposal. + -- + -- This kind of lock is placed while voting on a proposal, in order to + -- prevent depositing and withdrawing when votes are in place. + Voted + ResultTag + -- ^ The option which was voted on. This allows votes to be retracted. + POSIXTime + -- ^ The upper bound of the transaction time range when the lock is created. + | -- | The stake was used to cosign a proposal.` + Cosigned + deriving stock + ( -- | @since 1.0.0 + Show + , -- | @since 1.0.0 + Generic + ) + +PlutusTx.makeIsDataIndexed + ''ProposalAction + [ ('Created, 0) + , ('Voted, 1) + , ('Cosigned, 2) + ] + {- | Locks that are stored in the stake datums for various purposes. NOTE: Due to retracting votes always being possible, @@ -83,53 +150,41 @@ import Prelude hiding (Num (..)) └──────────────┘ └─────────────────┘ @ - @since 0.1.0 + @since 1.0.0 -} -data ProposalLock - = -- | The stake was used to create a proposal. - -- - -- This kind of lock is placed upon the creation of a proposal, in order - -- to limit creation of proposals per stake. - -- - -- See also: https://github.com/Liqwid-Labs/agora/issues/68 - -- - -- @since 0.2.0 - Created - ProposalId - -- ^ The identifier of the proposal. - | -- | The stake was used to vote on a proposal. - -- - -- This kind of lock is placed while voting on a proposal, in order to - -- prevent depositing and withdrawing when votes are in place. - -- - -- @since 0.2.0 - Voted - ProposalId - -- ^ The identifier of the proposal. - ResultTag - -- ^ The option which was voted on. This allows votes to be retracted. +data ProposalLock = ProposalLock + { proposalId :: ProposalId + -- ^ The identifier of the proposal. + , action :: ProposalAction + -- ^ The action that has been performed. + } deriving stock ( -- | @since 0.1.0 Show , -- | @since 0.1.0 Generic ) - -PlutusTx.makeIsDataIndexed - ''ProposalLock - [ ('Created, 0) - , ('Voted, 1) - ] + deriving anyclass + ( -- | @since 0.1.0 + SOP.Generic + ) + deriving + ( -- | @since 0.1.0 + PlutusTx.ToData + , -- | @since 0.1.0 + PlutusTx.FromData + ) + via (ProductIsData ProposalLock) {- | Haskell-level redeemer for Stake scripts. - @since 0.1.0 + @since 1.0.0 -} data StakeRedeemer = -- | Deposit or withdraw a discrete amount of the staked governance token. -- Stake must be unlocked. DepositWithdraw (Tagged GTTag Integer) - | -- | Destroy a stake, retrieving its LQ, the minimum ADA and any other assets. + | -- | Destroy a stake, retrieving its GT, the minimum ADA and any other assets. -- Stake must be unlocked. Destroy | -- | Permit a Vote to be added onto a 'Agora.Proposal.Proposal'. @@ -143,12 +198,9 @@ data StakeRedeemer -- always allowed to have votes retracted and won't affect the Proposal datum, -- allowing 'Stake's to be unlocked. RetractVotes - | -- | The owner can consume stake if nothing is changed about it. - -- If the proposal token moves, this is equivalent to the owner consuming it. - WitnessStake | -- | The owner can delegate the stake to another user, allowing the -- delegate to vote on prooposals with the stake. - DelegateTo PubKeyHash + DelegateTo Credential | -- | Revoke the existing delegation. ClearDelegate deriving stock @@ -164,9 +216,8 @@ PlutusTx.makeIsDataIndexed , ('Destroy, 1) , ('PermitVote, 2) , ('RetractVotes, 3) - , ('WitnessStake, 4) - , ('DelegateTo, 5) - , ('ClearDelegate, 6) + , ('DelegateTo, 4) + , ('ClearDelegate, 5) ] {- | Haskell-level datum for Stake scripts. @@ -177,12 +228,12 @@ data StakeDatum = StakeDatum { 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 :: PubKeyHash + , owner :: Credential -- ^ The hash of the public key this stake belongs to. -- -- TODO Support for MultiSig/Scripts is tracked here: -- https://github.com/Liqwid-Labs/agora/issues/45 - , delegatedTo :: Maybe PubKeyHash + , delegatedTo :: Maybe Credential -- ^ To whom this stake has been delegated. , lockedBy :: [ProposalLock] -- ^ The current proposals locking this stake. This field must be empty @@ -217,9 +268,9 @@ newtype PStakeDatum (s :: S) = PStakeDatum Term s ( PDataRecord - '[ "stakedAmount" ':= PDiscrete GTTag - , "owner" ':= PPubKeyHash - , "delegatedTo" ':= PMaybeData (PAsData PPubKeyHash) + '[ "stakedAmount" ':= PTagged GTTag PInteger + , "owner" ':= PCredential + , "delegatedTo" ':= PMaybeData (PAsData PCredential) , "lockedBy" ':= PBuiltinList (PAsData PProposalLock) ] ) @@ -235,37 +286,41 @@ newtype PStakeDatum (s :: S) = PStakeDatum PIsData , -- | @since 0.1.0 PEq + , -- | @since 1.0.0 + PDataFields + , -- | @since 1.0.0 + PShow ) +-- | @since 1.0.0 instance DerivePlutusType PStakeDatum where type DPTStrat _ = PlutusTypeNewtype --- | @since 0.1.0 -instance Plutarch.Lift.PUnsafeLiftDecl PStakeDatum where +-- | @since 1.0.0 +instance PUnsafeLiftDecl PStakeDatum where type PLifted PStakeDatum = StakeDatum -- | @since 0.1.0 deriving via (DerivePConstantViaDataList StakeDatum PStakeDatum) instance - (Plutarch.Lift.PConstantDecl StakeDatum) + (PConstantDecl StakeDatum) -- | @since 0.1.0 instance PTryFrom PData (PAsData PStakeDatum) {- | Plutarch-level redeemer for Stake scripts. - @since 0.1.0 + @since 1.0.0 -} data PStakeRedeemer (s :: S) = -- | Deposit or withdraw a discrete amount of the staked governance token. - PDepositWithdraw (Term s (PDataRecord '["delta" ':= PDiscrete GTTag])) - | -- | Destroy a stake, retrieving its LQ, the minimum ADA and any other assets. + PDepositWithdraw (Term s (PDataRecord '["delta" ':= PTagged GTTag PInteger])) + | -- | Destroy a stake, retrieving its GT, the minimum ADA and any other assets. PDestroy (Term s (PDataRecord '[])) | PPermitVote (Term s (PDataRecord '[])) | PRetractVotes (Term s (PDataRecord '[])) - | PWitnessStake (Term s (PDataRecord '[])) - | PDelegateTo (Term s (PDataRecord '["pkh" ':= PPubKeyHash])) + | PDelegateTo (Term s (PDataRecord '["pkh" ':= PCredential])) | PClearDelegate (Term s (PDataRecord '[])) deriving stock ( -- | @since 0.1.0 @@ -273,13 +328,12 @@ data PStakeRedeemer (s :: S) ) deriving anyclass ( -- | @since 0.1.0 - SOP.Generic - , -- | @since 0.1.0 PlutusType , -- | @since 0.1.0 PIsData ) +-- | @since 0.2.0 instance DerivePlutusType PStakeRedeemer where type DPTStrat _ = PlutusTypeData @@ -287,33 +341,74 @@ instance DerivePlutusType PStakeRedeemer where instance PTryFrom PData PStakeRedeemer -- | @since 0.1.0 -instance Plutarch.Lift.PUnsafeLiftDecl PStakeRedeemer where +instance PUnsafeLiftDecl PStakeRedeemer where type PLifted PStakeRedeemer = StakeRedeemer -- | @since 0.1.0 deriving via (DerivePConstantViaData StakeRedeemer PStakeRedeemer) instance - (Plutarch.Lift.PConstantDecl StakeRedeemer) + (PConstantDecl StakeRedeemer) -{- | Plutarch-level version of 'ProposalLock'. +{- | Plutarch-level version of 'ProposalAction'. - @since 0.2.0 + @since 1.0.0 -} -data PProposalLock (s :: S) - = PCreated - ( Term - s - ( PDataRecord - '["created" ':= PProposalId] - ) - ) +data PProposalAction (s :: S) + = PCreated (Term s (PDataRecord '[])) | PVoted ( Term s ( PDataRecord - '[ "votedOn" ':= PProposalId - , "votedFor" ':= PResultTag + '[ "votedFor" ':= PResultTag + , "createdAt" ':= PPOSIXTime + ] + ) + ) + | PCosigned (Term s (PDataRecord '[])) + 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 + PShow + ) + +-- | @since 1.0.0 +instance DerivePlutusType PProposalAction where + type DPTStrat _ = PlutusTypeData + +-- | @since 1.0.0 +instance PUnsafeLiftDecl PProposalAction where + type PLifted _ = ProposalAction + +-- | @since 1.0.0 +deriving via + (DerivePConstantViaData ProposalAction PProposalAction) + instance + (PConstantDecl ProposalAction) + +-- | @since 1.0.0 +instance PTryFrom PData PProposalAction + +{- | Plutarch-level version of 'ProposalLock'. + + @since 1.0.0 +-} +newtype PProposalLock (s :: S) + = PProposalLock + ( Term + s + ( PDataRecord + '[ "proposalId" ':= PProposalId + , "action" ':= PProposalAction ] ) ) @@ -328,35 +423,28 @@ data PProposalLock (s :: S) PIsData , -- | @since 0.1.0 PEq + , -- | @since 1.0.0 + PDataFields + , -- | @since 0.2.0 + PShow ) +-- | @since 0.2.0 instance DerivePlutusType PProposalLock where - type DPTStrat _ = PlutusTypeData - --- | @since 0.1.0 -instance PTryFrom PData PProposalLock + type DPTStrat _ = PlutusTypeNewtype -- | @since 0.2.0 instance PTryFrom PData (PAsData PProposalLock) -- | @since 0.1.0 -instance Plutarch.Lift.PUnsafeLiftDecl PProposalLock where +instance PUnsafeLiftDecl PProposalLock where type PLifted PProposalLock = ProposalLock -- | @since 0.1.0 deriving via - (DerivePConstantViaData ProposalLock PProposalLock) + (DerivePConstantViaDataList ProposalLock PProposalLock) instance - (Plutarch.Lift.PConstantDecl ProposalLock) - --- | @since 0.2.0 -instance PShow PProposalLock where - pshow' :: Bool -> Term s PProposalLock -> Term s PString - pshow' True x = "(" <> pshow' False x <> ")" - pshow' False lock = pmatch lock $ \case - PCreated ((pfield @"created" #) -> pid) -> "PCreated " <> pshow' True pid - PVoted x -> pletFields @'["votedOn", "votedFor"] x $ \xF -> - "PVoted " <> pshow' True xF.votedOn <> " " <> pshow' True xF.votedFor + (PConstantDecl ProposalLock) -------------------------------------------------------------------------------- @@ -367,28 +455,32 @@ instance PShow PProposalLock where pstakeLocked :: forall (s :: S). Term s (PStakeDatum :--> PBool) pstakeLocked = phoistAcyclic $ plam $ \stakeDatum -> - pnotNull #$ pfield @"lockedBy" @(PBuiltinList _) # pto stakeDatum + pnot #$ pnull #$ pfield @"lockedBy" @(PBuiltinList _) # pto stakeDatum {- | Get the number of *alive* proposals that were created by the given stake. @since 0.2.0 -} -pnumCreatedProposals :: Term s (PBuiltinList (PAsData PProposalLock) :--> PInteger) +pnumCreatedProposals :: + forall (s :: S). + Term s (PBuiltinList (PAsData PProposalLock) :--> PInteger) pnumCreatedProposals = phoistAcyclic $ plam $ \l -> pto $ pfoldMap # plam - ( \(pfromData -> lock) -> pmatch lock $ \case - PCreated _ -> pcon $ PSum 1 - _ -> mempty + ( \lock -> + let action = pfromData $ pfield @"action" # lock + in pmatch action $ \case + PCreated _ -> pcon $ PSum 1 + _ -> mempty ) # l {- | The role of a stake for a particular proposal. Scott-encoded. - @since 0.2.0 + @since 1.0.0 -} data PStakeRole (s :: S) = -- | The stake was used to vote on the proposal. @@ -397,122 +489,308 @@ data PStakeRole (s :: S) -- ^ The option which was voted for. | -- | The stake was used to create the proposal. PCreator - | -- | The stake was used to both create and vote on the proposal. - PBoth - (Term s PResultTag) - -- ^ The option which was voted for. - | -- | The stake has nothing to do with the given proposal. - PIrrelevant + | -- | The stake was used to cosign the propsoal. + PCosigner deriving stock - ( -- | @since 0.2.0 + ( -- | @since 1.0.0 Generic ) deriving anyclass - ( -- | @since 0.2.0 + ( -- | @since 1.0.0 PlutusType - , -- | @since 0.2.0 - PEq ) +-- | @since 1.0.0 instance DerivePlutusType PStakeRole where type DPTStrat _ = PlutusTypeScott -{- | Retutn true if the stake was used to voted on the proposal. +-- | @since 1.0.0 +type PStakeRoles = PList PStakeRole - @since 0.2.0 +-------------------------------------------------------------------------------- + +{- | Who authorizes the transaction? + + @since 1.0.0 -} -pisVoter :: Term s (PStakeRole :--> PBool) -pisVoter = phoistAcyclic $ - plam $ \sr -> pmatch sr $ \case - PVoter _ -> pconstant True - PBoth _ -> pconstant True - _ -> pconstant False +data PSignedBy (s :: S) + = -- | The stake owner authorized the transaction. + PSignedByOwner + | -- | The delegate authorized the transaction. + PSignedByDelegate + | -- | Both owner and delegate didn't authorize. + PUnknownSig + deriving stock + ( -- | @since 1.0.0 + Generic + ) + deriving anyclass + ( -- | @since 1.0.0 + PlutusType + ) -{- | Retutn true if the stake was used to create the proposal. +-- | @since 1.0.0 +instance DerivePlutusType PSignedBy where + type DPTStrat _ = PlutusTypeScott - @since 0.2.0 +{- | The signature context. + + @since 1.0.0 -} -pisCreator :: Term s (PStakeRole :--> PBool) -pisCreator = phoistAcyclic $ - plam $ \sr -> pmatch sr $ \case - PCreator -> pconstant True - PBoth _ -> pconstant True - _ -> pconstant False +data PSigContext (s :: S) = PSigContext + { owner :: Term s PCredential + , delegatee :: Term s (PMaybeData (PAsData PCredential)) + , signedBy :: Term s PSignedBy + } + deriving stock + ( -- | @since 1.0.0 + Generic + ) + deriving anyclass + ( -- | @since 1.0.0 + PlutusType + ) -{- | Retutn true if the stake was used to create the proposal, but not vote on - the proposal. +-- | @since 1.0.0 +instance DerivePlutusType PSigContext where + type DPTStrat _ = PlutusTypeScott - @since 0.2.0 +{- | The metadata carried by the stake redeemer. See also 'StakeRedeemer'. + + @since 1.0.0 -} -pisPureCreator :: Term s (PStakeRole :--> PBool) -pisPureCreator = phoistAcyclic $ - plam $ \sr -> pmatch sr $ \case - PCreator -> pconstant True - _ -> pconstant False +data PStakeRedeemerContext (s :: S) + = -- | See also 'DepositWithdraw'. + PDepositWithdrawDelta (Term s (PTagged GTTag PInteger)) + | -- | See also 'DelegateTo'. + PSetDelegateTo (Term s PCredential) + | PNoMetadata + deriving stock + ( -- | @since 1.0.0 + Generic + ) + deriving anyclass + ( -- | @since 1.0.0 + PlutusType + ) + +-- | @since 1.0.0 +instance DerivePlutusType PStakeRedeemerContext where + type DPTStrat _ = PlutusTypeScott + +{- | The usage of proposal in the transaction. + + @since 1.0.0 +-} +data PProposalContext (s :: S) + = -- | A proposal is spent. + PSpendProposal + (Term s PProposalDatum) + (Term s PProposalRedeemer) + (Term s PProposalTime) + | -- | A new proposal is created. + PNewProposal + (Term s PProposalId) + | -- | No proposal is spent or created. + PNoProposal + deriving stock + ( -- | @since 1.0.0 + Generic + ) + deriving anyclass + ( -- | @since 1.0.0 + PlutusType + ) + +-- | @since 1.0.0 +instance DerivePlutusType PProposalContext where + type DPTStrat _ = PlutusTypeScott + +{- | Context required in order for redeemer handlers to peform validation. + + @1.0.0 +-} +data PStakeRedeemerHandlerContext (s :: S) = PStakeRedeemerHandlerContext + { stakeInputDatums :: Term s (PList PStakeDatum) + , stakeOutputDatums :: Term s (PList PStakeDatum) + , redeemerContext :: Term s PStakeRedeemerContext + , sigContext :: Term s PSigContext + , proposalContext :: Term s PProposalContext + , extraTxContext :: Term s PTxInfo + } + deriving stock + ( -- | @since 1.0.0 + Generic + ) + deriving anyclass + ( -- | @since 1.0.0 + PlutusType + ) + +-- | @since 1.0.0 +instance DerivePlutusType PStakeRedeemerHandlerContext where + type DPTStrat _ = PlutusTypeScott + +{- | The plutarch type signature of the redeemer handlers. + + A redeemer handler is a piece of validation logic that performs a unique + set of checks for its corresponding stake redeemer. + + @since 1.0.0 +-} +type PStakeRedeemerHandler = PStakeRedeemerHandlerContext :--> PUnit + +{- | A collection of stake redeemer handlers for each stake redeemers. + + @since 1.0.0 +-} +data StakeRedeemerImpl (s :: S) = StakeRedeemerImpl + { onDepositWithdraw :: Term s PStakeRedeemerHandler + -- ^ Handler for 'DepositWithdraw'. + , onDestroy :: Term s PStakeRedeemerHandler + -- ^ Handler for 'Destroy'. + , onPermitVote :: Term s PStakeRedeemerHandler + -- ^ Handler for 'permitVotes'. + , onRetractVote :: Term s PStakeRedeemerHandler + -- ^ Handler for 'RetractVotes'. + , onDelegateTo :: Term s PStakeRedeemerHandler + -- ^ Handler for 'DelegateTo'. + , onClearDelegate :: Term s PStakeRedeemerHandler + -- ^ handler for 'ClearDelegate'. + } + +-------------------------------------------------------------------------------- + +{- | Return true if the stake was used to voted on the proposal. + + @since 1.0.0 +-} +pisVoter :: forall (s :: S). Term s (PStakeRoles :--> PBool) +pisVoter = + phoistAcyclic $ + pany + #$ plam + ( \r -> pmatch r $ \case + PVoter _ -> pconstant True + _ -> pconstant False + ) + +{- | Return true if the stake was used to create the proposal. + + @since 1.0.0 +-} +pisCreator :: forall (s :: S). Term s (PStakeRoles :--> PBool) +pisCreator = + phoistAcyclic $ + pany + #$ plam + ( \r -> pmatch r $ \case + PCreator -> pconstant True + _ -> pconstant False + ) + +{- | Return true if the stake was used to cosign the proposal. + + @since 1.0.0 +-} +pisCosigner :: forall (s :: S). Term s (PStakeRoles :--> PBool) +pisCosigner = + phoistAcyclic $ + pany + #$ plam + ( \r -> pmatch r $ \case + PCosigner -> pconstant True + _ -> pconstant False + ) {- | Return true if the stake isn't related to the proposal. - @since 0.2.0 + @since 1.0.0 -} -pisIrrelevant :: Term s (PStakeRole :--> PBool) -pisIrrelevant = phoistAcyclic $ - plam $ \sr -> pmatch sr $ \case - PIrrelevant -> pconstant True - _ -> pconstant False +pisIrrelevant :: forall (s :: S). Term s (PStakeRoles :--> PBool) +pisIrrelevant = pnull {- | Get the role of a stake for the proposal specified by the poroposal id, given the 'StakeDatum.lockedBy' field of the stake. - Note that the list of locks is cosidered valid only if it contains at most - two locks from the given proposal: one voter lock and one creator lock. - - @since 0.2.0 + @since 1.0.0 -} -pgetStakeRole :: Term s (PProposalId :--> PBuiltinList (PAsData PProposalLock) :--> PStakeRole) -pgetStakeRole = phoistAcyclic $ - plam $ \pid locks -> - pfoldl - # plam - ( \role (pfromData -> lock) -> - let thisRole = pmatch lock $ \case - PCreated ((pfield @"created" #) -> pid') -> - pif - (pid' #== pid) - (pcon PCreator) - (pcon PIrrelevant) - PVoted lock' -> pletAll lock' $ \lockF -> - pif - (lockF.votedOn #== pid) - (pcon $ PVoter lockF.votedFor) - (pcon PIrrelevant) - in pcombineStakeRole # thisRole # role - ) - # pcon PIrrelevant - # locks - where - pcombineStakeRole :: Term s (PStakeRole :--> PStakeRole :--> PStakeRole) - pcombineStakeRole = phoistAcyclic $ - plam $ \x y -> - let cannotCombine = ptraceError "duplicate roles" - in pmatch x $ \case - PVoter r -> pmatch y $ \case - PCreator -> pcon $ PBoth r - PIrrelevant -> x - _ -> cannotCombine - PCreator -> pmatch y $ \case - PVoter r -> pcon $ PBoth r - PIrrelevant -> x - _ -> cannotCombine - PBoth _ -> cannotCombine - PIrrelevant -> y +pgetStakeRoles :: + forall (s :: S). + Term + s + ( PProposalId + :--> PBuiltinList (PAsData PProposalLock) + :--> PStakeRoles + ) +pgetStakeRoles = phoistAcyclic $ + plam $ \pid -> + let getStakeRole = flip (pletFields @'["proposalId", "action"]) $ + \lockF -> + ppureIf + # (pid #== lockF.proposalId) + #$ pmatch lockF.action + $ \case + PCreated _ -> pcon PCreator + PVoted ((pfield @"votedFor" #) -> tag) -> + pcon $ PVoter tag + PCosigned _ -> pcon PCosigner + in pmapMaybe # plam (getStakeRole . pfromData) {- | Get the outcome that was voted for. - @since 0.2.0 + @since 1.0.0 -} -pextractVoteOption :: Term s (PStakeRole :--> PResultTag) -pextractVoteOption = phoistAcyclic $ - plam $ \sr -> pmatch sr $ \case - PVoter r -> r - PBoth r -> r - _ -> ptraceError "not voter" +pextractVoteOption :: forall (s :: S). Term s (PStakeRoles :--> PResultTag) +pextractVoteOption = + phoistAcyclic $ + plam $ + (passertPJust # "not voter" #) + . ( pfindJust + # plam + ( flip pmatch $ \case + PVoter r -> pjust # r + _ -> pnothing + ) + # + ) + +{- | Resolve stake datum, if the given `PTxInInfo` represents a stake input. + Return nothing otherwise. + + The first parameter is the assetclass of SST. + + @since 1.0.0 +-} +presolveStakeInputDatum :: + forall (s :: S). + Term + s + ( PTagged StakeSTTag PAssetClass + :--> PMap 'Unsorted PDatumHash PDatum + :--> PTxInInfo + :--> PMaybe PStakeDatum + ) +presolveStakeInputDatum = phoistAcyclic $ + plam $ \sstClass datums -> + flip + (pletFields @'["value", "datum", "address"]) + ( \txOutF -> + let isStakeUTxO = + passetClassValueOfT + # sstClass + # txOutF.value + #== 1 + + datum = + ptrace "Resolve stake datum" $ + pfromData $ + ptryFromOutputDatum @(PAsData PStakeDatum) + # txOutF.datum + # datums + in pif + isStakeUTxO + (pjust # datum) + pnothing + ) + . (pfield @"resolved" #) diff --git a/agora/Agora/Stake/Redeemers.hs b/agora/Agora/Stake/Redeemers.hs new file mode 100644 index 0000000..2ed44e0 --- /dev/null +++ b/agora/Agora/Stake/Redeemers.hs @@ -0,0 +1,500 @@ +{- | +Module : Agora.Stake.Redeemers +Maintainer : connor@mlabs.city +Description: Default implementation of stake redeemer handlers + +Default implementation of stake redeemer handlers. +-} +module Agora.Stake.Redeemers ( + ppermitVote, + pretractVote, + pdelegateTo, + pclearDelegate, + pdestroy, + pdepositWithdraw, +) where + +import Agora.Proposal ( + PProposalId, + PProposalRedeemer (PCosign, PUnlockStake, PVote), + ProposalStatus (Finished), + ) +import Agora.Proposal.Time (PProposalTime) +import Agora.Stake ( + PProposalAction (PCosigned, PCreated, PVoted), + PProposalContext ( + PNewProposal, + PNoProposal, + PSpendProposal + ), + PProposalLock (PProposalLock), + PSigContext (owner, signedBy), + PSignedBy ( + PSignedByDelegate, + PSignedByOwner, + PUnknownSig + ), + PStakeDatum (PStakeDatum), + PStakeRedeemerContext ( + PDepositWithdrawDelta, + PNoMetadata, + PSetDelegateTo + ), + PStakeRedeemerHandler, + PStakeRedeemerHandlerContext ( + proposalContext, + redeemerContext, + sigContext, + stakeInputDatums, + stakeOutputDatums + ), + pstakeLocked, + ) +import Plutarch.Api.V1.Address (PCredential) +import Plutarch.Api.V2 (PMaybeData, PPOSIXTime) +import Plutarch.Extra.Bool (passert) +import Plutarch.Extra.Field (pletAll, pletAllC) +import Plutarch.Extra.Maybe (pdjust, pdnothing, pmaybeData) +import Plutarch.Extra.Record (mkRecordConstr, (.&), (.=)) +import Plutarch.Extra.Time (PFullyBoundedTimeRange (PFullyBoundedTimeRange)) +import "liqwid-plutarch-extra" Plutarch.Extra.List ( + pisSingleton, + ptryDeleteFirstBy, + ptryFromSingleton, + ) +import "liqwid-plutarch-extra" Plutarch.Extra.TermCont (pguardC, pletC, pletFieldsC, pmatchC) + +-- | A wrapper which ensures that no proposal is presented in the transaction. +pwithoutProposal :: + forall (s :: S). + Term + s + (PStakeRedeemerHandler :--> PStakeRedeemerHandler) +pwithoutProposal = phoistAcyclic $ + plam $ \f ctx -> pmatch ctx $ \ctxF -> + pif + ( pmatch ctxF.proposalContext $ \case + PNoProposal -> pconstant True + _ -> pconstant False + ) + (f # ctx) + (ptraceError "No proposal is allowed") + +{- | Validate stake outputs given a function that converts an input stake datum + to an ouput stake datum. / O(n^2) /. +-} +pbatchUpdateInputs :: + forall (s :: S). + Term + s + ( (PStakeDatum :--> PStakeDatum :--> PBool) + :--> PStakeRedeemerHandlerContext + :--> PBool + ) +pbatchUpdateInputs = phoistAcyclic $ + plam $ \f -> flip pmatch $ \ctxF -> + pnull + #$ pfoldr + # plam (\x -> ptryDeleteFirstBy # (f # x)) + # ctxF.stakeOutputDatums + # ctxF.stakeInputDatums + +-- | Extract the 'PSigContext.signedBy' field from 'PStakeRedeemerHandlerContext'. +pgetSignedBy :: + forall (s :: S). + Term + s + (PStakeRedeemerHandlerContext :--> PSignedBy) +pgetSignedBy = phoistAcyclic $ + plam $ \ctx -> unTermCont $ do + ctxF <- pmatchC ctx + sctxF <- pmatchC ctxF.sigContext + pure sctxF.signedBy + +-- | Return true if the tx is authorized by either the owner or the delegatee. +pisSignedBy :: + forall (s :: S). + Term + s + (PBool :--> PStakeRedeemerHandlerContext :--> PBool) +pisSignedBy = phoistAcyclic $ + plam $ \byDelegate ctx -> + pmatch (pgetSignedBy # ctx) $ \case + PSignedByOwner -> pconstant True + PSignedByDelegate -> byDelegate + PUnknownSig -> pconstant False + +-- | Return true if only the @lockedBy@ field of the stake datum is updated. +ponlyLocksUpdated :: + forall (s :: S). + Term + s + ( ( PBuiltinList (PAsData PProposalLock) + :--> PBuiltinList (PAsData PProposalLock) + ) + :--> PStakeRedeemerHandlerContext + :--> PBool + ) +ponlyLocksUpdated = phoistAcyclic $ + plam $ \f -> + pbatchUpdateInputs #$ plam $ \i o -> + pletAll i $ \iF -> + let newLocks = f # pfromData iF.lockedBy + + expected = + mkRecordConstr + PStakeDatum + ( #stakedAmount + .= iF.stakedAmount + .& #owner + .= iF.owner + .& #delegatedTo + .= iF.delegatedTo + .& #lockedBy + .= pdata newLocks + ) + in expected #== o + +-- | Validation logic shared between 'ppermitVote' and 'retractVote'. +pvoteHelper :: + forall (s :: S). + Term + s + ( ( PStakeRedeemerHandlerContext + :--> PBuiltinList (PAsData PProposalLock) + :--> PBuiltinList (PAsData PProposalLock) + ) + :--> PStakeRedeemerHandler + ) +pvoteHelper = phoistAcyclic $ + plam $ \valProposalCtx ctx -> + -- This puts trust into the Proposal. The Proposal must necessarily check + -- that this is not abused. + passert + "Correct outputs" + (ponlyLocksUpdated # (valProposalCtx # ctx) # ctx) + (pconstant ()) + +-- | Add new lock the the existing list of locked. +paddNewLock :: + forall (s :: S). + Term + s + ( PProposalLock + :--> PBuiltinList (PAsData PProposalLock) + :--> PBuiltinList (PAsData PProposalLock) + ) +paddNewLock = phoistAcyclic $ + plam $ + -- Prepend the lock. + \newLock -> pcons # pdata newLock + +{- | Default implementation of 'Agora.Stake.PermitVote'. + + @since 1.0.0 +-} +ppermitVote :: forall (s :: S). Term s PStakeRedeemerHandler +ppermitVote = pvoteHelper #$ phoistAcyclic $ + plam $ \ctx -> unTermCont $ do + ctxF <- pmatchC ctx + + withOnlyOneStakeInput <- pletC $ + plam $ \lock -> unTermCont $ do + pguardC "Only one stake input allowed" $ + pisSingleton # ctxF.stakeInputDatums + + pguardC "Owner signs this transaction" $ + pisSignedBy # pconstant False # ctx + + pure lock + + pure $ + paddNewLock #$ pmatch ctxF.proposalContext $ \case + PSpendProposal proposal redeemer currentTime -> unTermCont $ do + mkLock <- pletC $ + plam $ \action -> + mkRecordConstr + PProposalLock + ( #proposalId + .= pfield @"proposalId" + # proposal + .& #action + .= pdata action + ) + + pure $ + pmatch redeemer $ \case + PVote ((pfromData . (pfield @"resultTag" #)) -> voteFor) -> + unTermCont $ do + pguardC "Owner or delegatee signs the transaction" $ + pisSignedBy # pconstant True # ctx + + PFullyBoundedTimeRange _ upperBound <- pmatchC currentTime + + let action = + mkRecordConstr + PVoted + ( #votedFor + .= pdata voteFor + .& #createdAt + .= pdata upperBound + ) + + pure $ mkLock # action + PCosign _ -> + let action = pcon $ PCosigned pdnil + in withOnlyOneStakeInput #$ mkLock # action + _ -> ptraceError "Expected Vote or Cosign" + PNewProposal proposalId -> + let action = pcon $ PCreated pdnil + lock = + mkRecordConstr + PProposalLock + ( #proposalId + .= pdata proposalId + .& #action + .= pdata action + ) + in withOnlyOneStakeInput # lock + _ -> ptraceError "Expected a proposal to be spent or created" + +data PRemoveLocksMode (s :: S) = PRemoveVoterLockOnly | PRemoveAllLocks + deriving stock (Generic) + deriving anyclass (PlutusType, PEq) + +instance DerivePlutusType PRemoveLocksMode where + type DPTStrat _ = PlutusTypeScott + +{- | Remove stake locks with the proposal id given the list of existing locks. + The first parameter controls whether to remove creator locks or not. If + one of the locks performed voting action, the unlock cooldown will be + checked. +-} +premoveLocks :: + forall (s :: S). + Term + s + ( PProposalId + :--> PPOSIXTime + :--> PProposalTime + :--> PRemoveLocksMode + :--> PBuiltinList (PAsData PProposalLock) + :--> PBuiltinList (PAsData PProposalLock) + ) +premoveLocks = + phoistAcyclic $ + plam $ \proposalId unlockCooldown currentTime mode -> unTermCont $ do + shouldRemoveAllLocks <- pletC $ mode #== pcon PRemoveAllLocks + + PFullyBoundedTimeRange lowerBound _ <- pmatchC currentTime + + let handleVoter + ( (pfield @"createdAt" #) -> + createdAt + ) = + let notInCooldown = createdAt + unlockCooldown #<= lowerBound + in pif shouldRemoveAllLocks (pconstant True) $ + -- Fail the transaction if a voter lock is in cooldown. + passert + "Voter lock shouldn't be in cooldown" + notInCooldown + (pconstant True) + + shouldRemoveLock = + flip + pletAll + ( \lockF -> + foldl1 + (#&&) + [ proposalId #== lockF.proposalId + , pmatch lockF.action $ \case + PVoted r -> handleVoter r + _ -> shouldRemoveAllLocks + ] + ) + . pfromData + + -- Return true, given a lock that should be kept. + handleLock = plam $ (pnot #) . shouldRemoveLock + + pure $ pfilter # handleLock + +{- | Default implementation of 'Agora.Stake.RetractVotes'. + + @since 1.0.0 +-} +pretractVote :: forall (s :: S). Term s PStakeRedeemerHandler +pretractVote = pvoteHelper #$ phoistAcyclic $ + plam $ \ctx -> + pmatch ctx $ \ctxF -> + pmatch ctxF.proposalContext $ \case + PSpendProposal proposal redeemer currentTime -> pmatch redeemer $ \case + PUnlockStake _ -> unTermCont $ do + proposalF <- + pletFieldsC + @'[ "proposalId" + , "status" + , "timingConfig" + ] + proposal + + let unlockCooldown = + pfield @"minStakeVotingTime" + # proposalF.timingConfig + + mode = pmatch (proposalF.status #== pconstant Finished) $ \case + PTrue -> pcon PRemoveAllLocks + _ -> pcon PRemoveVoterLockOnly + + pguardC "Authorized by either opwner or delegatee" $ + pisSignedBy # pconstant True # ctx + + pure $ + premoveLocks + # proposalF.proposalId + # unlockCooldown + # currentTime + # mode + _ -> ptraceError "Expected unlock" + _ -> ptraceError "Expected spending proposal" + +-- | Validation logic shared by 'pdelegateTo' and 'pclearDelegate'. +pdelegateHelper :: + forall (s :: S). + Term + s + ( (PStakeRedeemerContext :--> PMaybeData (PAsData PCredential)) + :--> PStakeRedeemerHandler + ) +pdelegateHelper = phoistAcyclic $ + plam $ \f -> pwithoutProposal #$ plam $ \ctx -> unTermCont $ do + ctxF <- pmatchC ctx + sigCtxF <- pmatchC ctxF.sigContext + + pguardC "Owner signs this transaction" $ + pisSignedBy # pconstant False # ctx + + let newDelegate = f # ctxF.redeemerContext + + pguardC "Cannot delegate to the owner" $ + pmaybeData + # pcon PTrue + # plam (\pkh -> pnot #$ sigCtxF.owner #== pfromData pkh) + # newDelegate + + pguardC "Correct outputs" $ + pbatchUpdateInputs + # plam + ( \i o -> pletAll i $ \iF -> + mkRecordConstr + PStakeDatum + ( #stakedAmount + .= iF.stakedAmount + .& #owner + .= iF.owner + .& #delegatedTo + .= pdata newDelegate + .& #lockedBy + .= iF.lockedBy + ) + #== o + ) + # ctx + + pure $ pconstant () + +{- | Default implementation of 'Agora.Stake.DelegateTo'. + + @since 1.0.0 +-} +pdelegateTo :: forall (s :: S). Term s PStakeRedeemerHandler +pdelegateTo = pdelegateHelper #$ phoistAcyclic $ + plam $ + flip pmatch $ \case + PSetDelegateTo c -> pdjust # pdata c + _ -> perror + +{- | Default implementation of 'Agora.Stake.ClearDelegate'. + + @since 1.0.0 +-} +pclearDelegate :: forall (s :: S). Term s PStakeRedeemerHandler +pclearDelegate = pdelegateHelper #$ phoistAcyclic $ + plam $ + flip pmatch $ \case + PNoMetadata -> pdnothing + _ -> perror + +{- | Default implementation of 'Agora.Stake.Destroy'. + + @since 1.0.0 +-} +pdestroy :: forall (s :: S). Term s PStakeRedeemerHandler +pdestroy = phoistAcyclic $ + pwithoutProposal #$ plam $ \ctx -> unTermCont $ do + ctxF <- pmatchC ctx + + pguardC "Owner signs this transaction" $ + pisSignedBy # pconstant False # ctx + + pguardC "All stakes unlocked" $ + pnot #$ pany # pstakeLocked # ctxF.stakeInputDatums + + pguardC "All stakes burnt" $ + pnull # ctxF.stakeOutputDatums + + pure $ pconstant () + +{- | Default implementation of 'Agora.Stake.DepositWithdraw'. + + @since 1.0.0 +-} +pdepositWithdraw :: forall (s :: S). Term s PStakeRedeemerHandler +pdepositWithdraw = phoistAcyclic $ + pwithoutProposal #$ plam $ \ctx -> unTermCont $ do + ctxF <- pmatchC ctx + + pguardC "Owner signs this transaction" $ + pisSignedBy # pconstant False # ctx + + ---------------------------------------------------------------------------- + + stakeInputDatum <- + pletC $ + ptrace "Single stake input" $ + ptryFromSingleton # ctxF.stakeInputDatums + stakeInputDatumF <- pletAllC stakeInputDatum + + let stakeOutputDatum = + ptrace "Single stake output" $ + ptryFromSingleton # ctxF.stakeOutputDatums + + ---------------------------------------------------------------------------- + + pguardC "Stake unlocked" $ + pnot #$ pstakeLocked # stakeInputDatum + + ---------------------------------------------------------------------------- + + PDepositWithdrawDelta delta <- pmatchC ctxF.redeemerContext + + newStakedAmount <- pletC $ stakeInputDatumF.stakedAmount + delta + + pguardC "Non-negative staked amount" $ 0 #<= newStakedAmount + + let expectedDatum = + mkRecordConstr + PStakeDatum + ( #stakedAmount + .= pdata newStakedAmount + .& #owner + .= stakeInputDatumF.owner + .& #delegatedTo + .= stakeInputDatumF.delegatedTo + .& #lockedBy + .= stakeInputDatumF.lockedBy + ) + + pguardC "Valid output datum" $ expectedDatum #== stakeOutputDatum + + pure $ pconstant () diff --git a/agora/Agora/Stake/Scripts.hs b/agora/Agora/Stake/Scripts.hs index f76deb4..e549639 100644 --- a/agora/Agora/Stake/Scripts.hs +++ b/agora/Agora/Stake/Scripts.hs @@ -5,49 +5,113 @@ Description: Plutus Scripts for Stakes. Plutus Scripts for Stakes. -} -module Agora.Stake.Scripts (stakePolicy, stakeValidator) where +module Agora.Stake.Scripts ( + stakePolicy, + stakeValidator, + mkStakeValidator, +) where -import Agora.SafeMoney (GTTag) -import Agora.Scripts (AgoraScripts, proposalSTAssetClass, stakeSTSymbol) +import Agora.Credential (authorizationContext, pauthorizedBy) +import Agora.Proposal (PProposalDatum, PProposalRedeemer) +import Agora.Proposal.Time (pcurrentProposalTime) +import Agora.SafeMoney (GTTag, ProposalSTTag, StakeSTTag) import Agora.Stake ( - PStakeDatum (PStakeDatum), - PStakeRedeemer (..), - StakeRedeemer (WitnessStake), - pstakeLocked, + PProposalContext ( + PNewProposal, + PNoProposal, + PSpendProposal + ), + PSigContext (PSigContext), + PSignedBy ( + PSignedByDelegate, + PSignedByOwner, + PUnknownSig + ), + PStakeDatum, + PStakeRedeemer ( + PClearDelegate, + PDelegateTo, + PDepositWithdraw, + PDestroy, + PPermitVote, + PRetractVotes + ), + PStakeRedeemerContext ( + PDepositWithdrawDelta, + PNoMetadata, + PSetDelegateTo + ), + PStakeRedeemerHandlerContext ( + PStakeRedeemerHandlerContext + ), + StakeRedeemerImpl (..), ) -import Agora.Utils ( - mustFindDatum', +import Agora.Stake.Redeemers ( + pclearDelegate, + pdelegateTo, + pdepositWithdraw, + pdestroy, + ppermitVote, + pretractVote, ) -import Data.Function (on) -import Data.Tagged (Tagged (..), untag) +import Agora.Utils (pisDNothing, ptoScottEncodingT, puntag) import Plutarch.Api.V1 ( - AmountGuarantees (Positive), PCredential (PPubKeyCredential, PScriptCredential), - PDatumHash, + PCurrencySymbol, + PTokenName, + ) +import Plutarch.Api.V1.AssocMap (plookup) +import Plutarch.Api.V1.Value (pvalueOf) +import Plutarch.Api.V2 ( PMintingPolicy, PScriptPurpose (PMinting, PSpending), - PTokenName, PTxInfo, PTxOut, PValidator, - PValue, ) -import Plutarch.Api.V1.AssetClass (passetClass, passetClassValueOf, pvalueOf) -import Plutarch.Api.V1.ScriptContext (pfindTxInByTxOutRef, ptxSignedBy, pvalueSpent) -import "liqwid-plutarch-extra" Plutarch.Api.V1.Value (pgeqByClass', pgeqBySymbol, psymbolValueOf) -import Plutarch.Extra.Field (pletAllC) -import Plutarch.Extra.List (pmapMaybe, pmsortBy) -import Plutarch.Extra.Maybe (passertPJust, pdjust, pdnothing, pfromDJust, pmaybeData) -import Plutarch.Extra.Record (mkRecordConstr, (.&), (.=)) -import Plutarch.Extra.TermCont (pguardC, pletC, pletFieldsC, pmatchC, ptryFromC) -import Plutarch.Numeric.Additive (AdditiveMonoid (zero), AdditiveSemigroup ((+))) -import Plutarch.SafeMoney ( - pdiscreteValue', - pvalueDiscrete', +import Plutarch.Extra.AssetClass ( + PAssetClass, + PAssetClassData, + passetClass, ) +import Plutarch.Extra.Bool (passert) +import Plutarch.Extra.Field (pletAll, pletAllC) +import Plutarch.Extra.Functor (PFunctor (pfmap)) +import Plutarch.Extra.Maybe ( + passertPJust, + pdjust, + pfromJust, + pfromMaybe, + pjust, + pmaybeData, + pnothing, + ) +import Plutarch.Extra.Ord (POrdering (PEQ, PGT, PLT), pcompareBy, pfromOrd) +import Plutarch.Extra.ScriptContext ( + pfindTxInByTxOutRef, + pscriptHashFromAddress, + pscriptHashToTokenName, + ptryFromOutputDatum, + pvalueSpent, + ) +import Plutarch.Extra.Tagged (PTagged) +import Plutarch.Extra.Value ( + passetClassValueOf, + passetClassValueOfT, + psymbolValueOf, + psymbolValueOf', + ) +import Plutarch.Num (PNum (pnegate)) import Plutarch.Unsafe (punsafeCoerce) -import PlutusLedgerApi.V1.Value (AssetClass (AssetClass)) -import Prelude hiding (Num (..)) +import "liqwid-plutarch-extra" Plutarch.Extra.List (pfindJust, pmapMaybe) +import "liqwid-plutarch-extra" Plutarch.Extra.TermCont ( + pguardC, + pletC, + pletFieldsC, + pmatchC, + ptryFromC, + ) +import Prelude hiding (Num ((+))) {- | Policy for Stake state threads. @@ -58,7 +122,7 @@ import Prelude hiding (Num (..)) - Check that exactly one state thread is minted. - Check that an output exists with a state thread and a valid datum. - Check that no state thread is an input. - - assert @'PlutusLedgerApi.V1.TokenName' == 'PlutusLedgerApi.V1.ValidatorHash'@ + - assert @'PlutusLedgerApi.V1.TokenName' == 'PlutusLedgerApi.V1.ScriptHash'@ of the script that we pay to. === For burning: @@ -66,14 +130,17 @@ import Prelude hiding (Num (..)) - Check that exactly one state thread is burned. - Check that datum at state thread is valid and not locked. - @since 0.1.0 + == Arguments + + Following arguments should be provided(in this order): + 1. governance token assetclass + + @since 1.0.0 -} stakePolicy :: - -- | The (governance) token that a Stake can store. - Tagged GTTag AssetClass -> - ClosedTerm PMintingPolicy -stakePolicy gtClassRef = - plam $ \_redeemer ctx' -> unTermCont $ do + ClosedTerm (PAsData (PTagged GTTag PAssetClassData) :--> PMintingPolicy) +stakePolicy = + plam $ \gtClass _redeemer ctx' -> unTermCont $ do ctx <- pletFieldsC @'["txInfo", "purpose"] ctx' txInfo <- pletC $ ctx.txInfo let _a :: Term _ PTxInfo @@ -83,35 +150,19 @@ stakePolicy gtClassRef = PMinting ownSymbol' <- pmatchC $ pfromData ctx.purpose ownSymbol <- pletC $ pfield @"_0" # ownSymbol' spentST <- pletC $ psymbolValueOf # ownSymbol #$ pvalueSpent # txInfoF.inputs - mintedST <- pletC $ psymbolValueOf # ownSymbol # txInfoF.mint - let burning = unTermCont $ do - pguardC "ST at inputs must be 1" $ - spentST #== 1 + PPair mintedST burntST <- + pmatchC $ + pfromJust + #$ psymbolValueOf' + # ownSymbol + # txInfoF.mint - pguardC "ST burned" $ - mintedST #== -1 - - pguardC "An unlocked input existed containing an ST" $ - pany - # plam - ( \((pfield @"resolved" #) -> txOut) -> unTermCont $ do - txOutF <- pletFieldsC @'["value", "datumHash"] txOut - pure $ - pif - (psymbolValueOf # ownSymbol # txOutF.value #== 1) - ( let datum = - pfromData $ - mustFindDatum' @(PAsData PStakeDatum) - # txOutF.datumHash - # txInfoF.datums - in pnot # (pstakeLocked # datum) - ) - (pconstant False) - ) - # pfromData txInfoF.inputs - - pure $ popaque (pconstant ()) + let burning = + passert + "All ST burned" + (burntST #== pnegate # spentST) + (popaque $ pconstant ()) let minting = unTermCont $ do pguardC "ST at inputs must be 0" $ @@ -125,7 +176,7 @@ stakePolicy gtClassRef = let scriptOutputWithStakeST = passertPJust # "Output to script not found" - #$ pfind + #$ pfind # plam ( \output -> unTermCont $ do outputF <- pletFieldsC @'["value", "address"] output @@ -141,23 +192,33 @@ stakePolicy gtClassRef = # pfromData txInfoF.outputs outputF <- - pletFieldsC @'["value", "address", "datumHash"] scriptOutputWithStakeST + pletFieldsC @'["value", "datum"] + scriptOutputWithStakeST + datumF <- - pletFieldsC @'["owner", "stakedAmount"] $ - pto $ - pfromData $ - mustFindDatum' @(PAsData PStakeDatum) # outputF.datumHash # txInfoF.datums + pletAllC $ + pfromData $ + ptryFromOutputDatum @(PAsData PStakeDatum) + # outputF.datum + # txInfoF.datums - let hasExpectedStake = - ptraceIfFalse "Stake ouput has expected amount of stake token" $ - pvalueDiscrete' gtClassRef # outputF.value #== datumF.stakedAmount - let ownerSignsTransaction = - ptraceIfFalse "Stake Owner should sign the transaction" $ - ptxSignedBy - # txInfoF.signatories + pure $ + foldl1 + (#&&) + [ ptraceIfFalse "Stake ouput has expected amount of stake token" $ + passetClassValueOfT + # (ptoScottEncodingT # pfromData gtClass) + # outputF.value + #== pfromData datumF.stakedAmount + , ptraceIfFalse "Stake Owner should sign the transaction" $ + pauthorizedBy + # authorizationContext txInfoF # datumF.owner - - pure $ hasExpectedStake #&& ownerSignsTransaction + , ptraceIfFalse "Initial delegatee should set to nothing" $ + pisDNothing # datumF.delegatedTo + , ptraceIfFalse "Initial locks should be empty" $ + pnull # pfromData datumF.lockedBy + ] pure $ popaque (pconstant ()) @@ -165,6 +226,384 @@ stakePolicy gtClassRef = -------------------------------------------------------------------------------- +data PAuthCheckHelper (s :: S) = PAuthCheckHelper + { allHaveTheSameOwner :: Term s PBool + , allOwnByOrDelegatedToTheFirstOwner :: Term s PBool + , allOwnByOrDelegatedToTheFirstDelegatee :: Term s PBool + } + deriving stock + ( Generic + ) + deriving anyclass + ( PlutusType + ) + +instance DerivePlutusType PAuthCheckHelper where + type DPTStrat _ = PlutusTypeScott + +-------------------------------------------------------------------------------- + +{- | Create a stake validator, given the implementation of stake redeemers. + + == Arguments + + Following arguments should be provided(in this order): + 1. stake ST symbol + 2. proposal ST assetclass + 3. governance token assetclass + + @since 1.0.0 +-} +mkStakeValidator :: + StakeRedeemerImpl s -> + Term s (PTagged StakeSTTag PCurrencySymbol) -> + Term s (PTagged ProposalSTTag PAssetClass) -> + Term s (PTagged GTTag PAssetClass) -> + Term s PValidator +mkStakeValidator impl sstSymbol pstClass gtClass = + plam $ \_datum redeemer ctx -> unTermCont $ do + ctxF <- pletFieldsC @'["txInfo", "purpose"] ctx + txInfo <- pletC $ pfromData ctxF.txInfo + txInfoF <- + pletFieldsC + @'[ "inputs" + , "referenceInputs" + , "outputs" + , "mint" + , "validRange" + , "signatories" + , "redeemers" + , "datums" + , "validRange" + ] + txInfo + + -------------------------------------------------------------------------- + + PSpending stakeInputRef <- pmatchC $ pfromData ctxF.purpose + + let validatedInput = + pfield @"resolved" + #$ passertPJust + # "Malformed script context: validated input not found" + #$ pfindTxInByTxOutRef + # (pfield @"_0" # stakeInputRef) + # txInfoF.inputs + + stakeScriptHash <- + pletC $ + pfromJust + #$ pscriptHashFromAddress + #$ pfield @"address" + # validatedInput + + let sstName = pscriptHashToTokenName stakeScriptHash + + sstClass <- pletC $ passetClass # puntag sstSymbol # sstName + + -------------------------------------------------------------------------- + + -- Returns stake datum if the given UTxO is a stake UTxO. + getStakeDatum :: Term _ (PTxOut :--> PMaybe PStakeDatum) <- + pletC $ + plam $ + flip (pletFields @'["value", "datum", "address"]) $ \txOutF -> + pmatch + ( pcompareBy + # pfromOrd + # (passetClassValueOf # sstClass # txOutF.value) + # 1 + ) + $ \case + -- > 1 + PGT -> ptraceError "More than one SST in one UTxO" + -- 1 + PEQ -> + let ownerValidatoHash = + pfromJust + #$ pscriptHashFromAddress + # txOutF.address + + isOwnedByStakeValidator = + ownerValidatoHash #== stakeScriptHash + + datum = + ptrace "Resolve stake datum" $ + pfromData $ + ptryFromOutputDatum @(PAsData PStakeDatum) + # txOutF.datum + # txInfoF.datums + in passert + "Should owned by stake validator" + isOwnedByStakeValidator + (pjust # datum) + -- 0 + PLT -> pnothing + + -------------------------------------------------------------------------- + + -- Find all stake inputs. + + stakeInputDatums <- + pletC $ + pmapMaybe + # plam ((getStakeDatum #) . (pfield @"resolved" #)) + # pfromData txInfoF.inputs + + -------------------------------------------------------------------------- + + -- Assemble the signature context. + + firstStakeInputDatumF <- + pletFieldsC @'["owner", "delegatedTo"] $ + phead # stakeInputDatums + + restOfStakeInputDatums <- pletC $ ptail # stakeInputDatums + + authorizedBy <- pletC $ pauthorizedBy # authorizationContext txInfoF + + authCheckHelperF <- + pmatchC $ + pfoldr + # plam + ( \stake helper -> unTermCont $ do + stakeF <- pletFieldsC @'["owner", "delegatedTo"] stake + helperF <- pmatchC helper + + haveTheSameOwnerAsTheFirstStake <- + pletC $ + stakeF.owner #== firstStakeInputDatumF.owner + + let ownerOfTheFirstStakeIsTheDelegatee = + haveTheSameOwnerAsTheFirstStake + #|| stakeF.delegatedTo + #== pdata (pdjust # firstStakeInputDatumF.owner) + + delegateeOfTheFirstStakeIsTheDelegatee = + pdata (pdjust # stakeF.owner) + #== firstStakeInputDatumF.delegatedTo + #|| stakeF.delegatedTo + #== firstStakeInputDatumF.delegatedTo + + helper' = + pcon $ + PAuthCheckHelper + ( helperF.allHaveTheSameOwner + #&& haveTheSameOwnerAsTheFirstStake + ) + ( helperF.allOwnByOrDelegatedToTheFirstOwner + #&& ownerOfTheFirstStakeIsTheDelegatee + ) + ( helperF.allOwnByOrDelegatedToTheFirstDelegatee + #&& delegateeOfTheFirstStakeIsTheDelegatee + ) + + pure helper' + ) + # pcon + ( PAuthCheckHelper + (pconstant True) + (pconstant True) + (pconstant True) + ) + # restOfStakeInputDatums + + let ownerSignsTransaction = + authCheckHelperF.allHaveTheSameOwner + #&& authorizedBy + # firstStakeInputDatumF.owner + + delegateSignsTransaction = + ( authCheckHelperF.allOwnByOrDelegatedToTheFirstDelegatee + #&& pmaybeData + # pconstant False + # plam ((authorizedBy #) . pfromData) + # pfromData firstStakeInputDatumF.delegatedTo + ) + #|| ( authCheckHelperF.allOwnByOrDelegatedToTheFirstOwner + #&& authorizedBy + # firstStakeInputDatumF.owner + ) + + signedBy = + pif + ownerSignsTransaction + (pcon PSignedByOwner) + $ pif + delegateSignsTransaction + (pcon PSignedByDelegate) + $ pcon PUnknownSig + + sigContext <- + pletC $ + pcon $ + PSigContext + firstStakeInputDatumF.owner + firstStakeInputDatumF.delegatedTo + signedBy + + -------------------------------------------------------------------------- + + -- Find all stake outputs. + -- First step of validating stake outputs. We make sure that every stake + -- output UTxO carries correct amount of GTs specified by its datum. + -- + -- Note that non-GT assets are treated transparently. + stakeOutputDatums <- + pletC $ + pmapMaybe + # plam + ( \output -> + let validateGT = plam $ \stakeDatum -> + let expected = + pfromData $ + pfield @"stakedAmount" # stakeDatum + + actual = + passetClassValueOfT + # gtClass + # (pfield @"value" # output) + in pif + (expected #== actual) + stakeDatum + (ptraceError "Unmatched GT value") + in pfmap + # validateGT + # (getStakeDatum # output) + ) + # pfromData txInfoF.outputs + + -------------------------------------------------------------------------- + + -- Assemble the proposal context. + + getProposalDatum <- pletC $ + plam $ + flip pletAll $ \txOutF -> + let isProposalUTxO = + passetClassValueOfT + # pstClass + # txOutF.value + #== 1 + + proposalDatum = + pfromData $ + ptryFromOutputDatum @(PAsData PProposalDatum) + # txOutF.datum + # txInfoF.datums + in pif isProposalUTxO (pjust # proposalDatum) pnothing + + let pstMinted = + passetClassValueOfT # pstClass # txInfoF.mint #== 1 + + newProposalContext = + pcon $ + PNewProposal $ + pfield @"proposalId" + #$ passertPJust + # "Proposal output should present" + #$ pfindJust + # getProposalDatum + # pfromData txInfoF.outputs + + spendProposalContext = + let getProposalRedeemer = plam $ \ref -> + flip (ptryFrom @PProposalRedeemer) fst $ + pto $ + passertPJust + # "Malformed script context: propsoal input not found in redeemer map" + #$ plookup + # pcon + ( PSpending $ + pdcons @_0 + # pdata ref + # pdnil + ) + # txInfoF.redeemers + + getContext = plam $ + flip pletAll $ \inInfoF -> + pfmap + # plam + ( \proposalDatum -> + let redeemer = getProposalRedeemer # inInfoF.outRef + currentTime = + passertPJust + # "Should resolve proposal time" + #$ pcurrentProposalTime + # txInfoF.validRange + in pcon $ PSpendProposal proposalDatum redeemer currentTime + ) + #$ getProposalDatum + # pfromData inInfoF.resolved + + contexts = + pmapMaybe @PList # getContext # pfromData txInfoF.inputs + in -- Can only handle one proposal at a time. + precList + ( \_ h t -> + pif + (pnull # t) + (pjust # h) + (ptraceError "Ambiguous proposal") + ) + (const pnothing) + # contexts + + noProposalContext = pcon PNoProposal + + proposalContext <- + pletC $ + pif + pstMinted + newProposalContext + (pfromMaybe # noProposalContext # spendProposalContext) + + -------------------------------------------------------------------------- + + -- Assemeble the redeemer handler context. + + mkRedeemerhandlerContext <- pletC $ + plam $ \redeemerContext -> + pcon $ + PStakeRedeemerHandlerContext + stakeInputDatums + stakeOutputDatums + redeemerContext + sigContext + proposalContext + txInfo + + noMetadataContext <- + pletC + $ mkRedeemerhandlerContext + #$ pcon + $ PNoMetadata + + -------------------------------------------------------------------------- + + -- Call the redeemer handler. + + stakeRedeemer <- fst <$> ptryFromC redeemer + + pure $ + popaque $ + pmatch stakeRedeemer $ \case + PDestroy _ -> impl.onDestroy # noMetadataContext + PPermitVote _ -> impl.onPermitVote # noMetadataContext + PRetractVotes _ -> impl.onRetractVote # noMetadataContext + PClearDelegate _ -> impl.onClearDelegate # noMetadataContext + PDelegateTo ((pfield @"pkh" #) -> pkh) -> + impl.onDelegateTo + #$ mkRedeemerhandlerContext + #$ pcon + $ PSetDelegateTo pkh + PDepositWithdraw ((pfield @"delta" #) -> delta) -> + impl.onDepositWithdraw + #$ mkRedeemerhandlerContext + #$ pcon + $ PDepositWithdrawDelta delta + {- | Validator intended for Stake UTXOs to be locked by. == What this Validator does: @@ -173,6 +612,7 @@ stakePolicy gtClassRef = Deposit or withdraw some GT to the stake. + - Only one stake per tx is supported. - Tx must be signed by the owner. - The 'stakedAmount' field must be updated. - The stake must not be locked. @@ -184,9 +624,9 @@ stakePolicy gtClassRef = Allow a 'ProposalLock' to be put on the stake in order to vote on a proposal. - - A proposal token must be spent alongside the stake. + - A proposal token must be spent alongside the staked. - * Its total votes must be correctly updated to include this stake's + * Its total votes must be correctly updated to include all stakes' contribution. - Tx must be signed by the owner. @@ -195,347 +635,44 @@ stakePolicy gtClassRef = Remove a 'ProposalLock' set when voting on a proposal. - - A proposal token must be spent alongside the stake. + - A proposal token must be spent or minted alongside the stakes. - Tx must be signed by the owner. === 'Destroy' - Destroy the stake in order to reclaim the min ADA. + Destroy stakes in order to reclaim the GTs. - - The stake must not be locked. + - The stakes must not be locked. - Tx must be signed by the owner. - === 'WitnessStake' + == Arguments - Allow this Stake to be included in a transaction without making - any changes to it. In the future, - this could use [CIP-31](https://cips.cardano.org/cips/cip31/) instead. + Following arguments should be provided(in this order): + 1. stake ST symbol + 2. proposal ST assetclass + 3. governance token assetclass - - Tx must be signed by the owner __or__ a proposal ST token must be spent - alongside the stake. - - The datum and value must remain unchanged. - - @since 0.1.0 + @since 1.0.0 -} stakeValidator :: - -- | Lazy precompiled scripts. - AgoraScripts -> - -- | See 'Agora.Governor.Governor.gtClassRef'. - Tagged GTTag AssetClass -> - ClosedTerm PValidator -stakeValidator as gtClassRef = - plam $ \datum redeemer ctx' -> unTermCont $ do - ctx <- pletFieldsC @'["txInfo", "purpose"] ctx' - txInfo <- pletC $ pfromData ctx.txInfo - txInfoF <- - pletFieldsC - @'[ "mint" - , "inputs" - , "outputs" - , "signatories" - , "datums" - ] - txInfo - - stakeRedeemer <- fst <$> ptryFromC redeemer - - stakeDatum' <- pfromData . fst <$> ptryFromC datum - stakeDatum <- pletAllC $ pto stakeDatum' - - PSpending txOutRef <- pmatchC $ pfromData ctx.purpose - - PJust ((pfield @"resolved" #) -> resolved) <- - pmatchC $ - pfindTxInByTxOutRef - # (pfield @"_0" # txOutRef) - # txInfoF.inputs - resolvedF <- pletFieldsC @'["address", "value", "datumHash"] resolved - - -- Whether the owner signs this transaction or not. - signedBy <- pletC $ ptxSignedBy # txInfoF.signatories - - ownerSignsTransaction <- pletC $ signedBy # stakeDatum.owner - - delegateSignsTransaction <- - pletC $ - pmaybeData # pconstant False - # signedBy - # stakeDatum.delegatedTo - - stCurrencySymbol <- pletC $ pconstant $ stakeSTSymbol as - mintedST <- pletC $ psymbolValueOf # stCurrencySymbol # txInfoF.mint - valueSpent <- pletC $ pvalueSpent # txInfoF.inputs - spentST <- pletC $ psymbolValueOf # stCurrencySymbol #$ valueSpent - - -- Is the stake currently locked? - stakeIsLocked <- pletC $ pstakeLocked # stakeDatum' - - pure $ - pmatch stakeRedeemer $ \case - PDestroy _ -> unTermCont $ do - pguardC "ST at inputs must be 1" $ - spentST #== 1 - - pguardC "Should burn ST" $ - mintedST #== -1 - - pguardC "Stake unlocked" $ pnot # stakeIsLocked - - pguardC "Owner signs this transaction" ownerSignsTransaction - - pure $ popaque (pconstant ()) - ------------------------------------------------------------------------ - -- Handle redeemers that require own stake output. - - _ -> unTermCont $ do - let AssetClass (propCs, propTn) = proposalSTAssetClass as - proposalSTClass = passetClass # pconstant propCs # pconstant propTn - spentProposalST = passetClassValueOf # valueSpent # proposalSTClass - - proposalTokenMoved <- pletC $ 1 #<= spentProposalST - - -- Filter out own outputs using own address and ST. - ownOutputs <- - pletC $ - pfilter - # plam - ( \output -> unTermCont $ do - outputF <- pletFieldsC @'["address", "value"] output - - pure $ - outputF.address #== resolvedF.address - #&& psymbolValueOf # stCurrencySymbol # outputF.value #== 1 - ) - # pfromData txInfoF.outputs - - let witnessStake = unTermCont $ do - pguardC "Either owner signs the transaction or proposal token moved" $ - ownerSignsTransaction #|| proposalTokenMoved - - -- FIXME: remove this once we have reference input. - -- - -- Our goal here is to allow multiple input stakes, and also ensure that every the input stakes has a - -- corresponding output stake, which carries the same value and the same datum as the input stake. - -- - -- Validation strategy I have tried/considered so far: - -- 1. Check that the number of input stakes equals to the number of output stakes, and verify - -- that there's an output stake with the exact same value and datum hash as the stake being - -- validated , However this approach has a fatal vulnerability: let's say we have two totally - -- identical stakes, a malicious user can comsume these two stakes and remove GTs from one of them. - -- 2. Perform the same checks as the last approch does, while also checking that every output stake is - -- valid(stakedAmount == actual value). However this requires that all the output stake datum are - -- included in the transaction, and we have to find and go through them one by one to access the - -- 'stakedAmount' fields, meaning that computationally this approach is *very* expensive. - -- 3. The one implemented below. Find all the continuous input/output, sort them by 'datumHash', and - -- ensure that the two sorted lists are equal. - let ownInputs = - pmapMaybe - # plam - ( \input -> plet (pfield @"resolved" # input) $ \resolvedInput -> - let value = pfield @"value" # resolvedInput - in pif - (psymbolValueOf # stCurrencySymbol # value #== 1) - (pcon $ PJust resolvedInput) - (pcon PNothing) - ) - # pfromData txInfoF.inputs - - sortTxOuts :: Term _ (PBuiltinList PTxOut :--> PBuiltinList PTxOut) - sortTxOuts = phoistAcyclic $ plam (pmsortBy # plam ((#<) `on` (getDatumHash #)) #) - where - getDatumHash :: Term _ (PTxOut :--> PDatumHash) - getDatumHash = phoistAcyclic $ plam ((pfromDJust #) . pfromData . (pfield @"datumHash" #)) - - sortedOwnInputs = sortTxOuts # ownInputs - sortedOwnOutputs = sortTxOuts # ownOutputs - - pguardC "Every stake inputs has a corresponding unchanged output" $ - plistEquals # sortedOwnInputs # sortedOwnOutputs - - pure $ popaque $ pconstant () - - ---------------------------------------------------------------------- - - let onlyAcceptOneStake = unTermCont $ do - pguardC "ST at inputs must be 1" $ - spentST #== 1 - - ownOutput <- pletC $ phead # ownOutputs - - stakeOut <- - pletC $ - pfromData $ - mustFindDatum' @(PAsData PStakeDatum) - # (pfield @"datumHash" # ownOutput) - # txInfoF.datums - - ownOutputValue <- - pletC $ - pfield @"value" # ownOutput - - ownOutputValueUnchanged <- - pletC $ - pdata resolvedF.value #== pdata ownOutputValue - - onlyLocksUpdated <- - pletC $ - let templateStakeDatum = - mkRecordConstr - PStakeDatum - ( #stakedAmount .= stakeDatum.stakedAmount - .& #owner .= stakeDatum.owner - .& #delegatedTo .= stakeDatum.delegatedTo - .& #lockedBy .= pfield @"lockedBy" # pto stakeOut - ) - in stakeOut #== templateStakeDatum - - setDelegate <- pletC $ - plam $ \maybePkh -> unTermCont $ do - pguardC - "Owner signs this transaction" - ownerSignsTransaction - - pguardC "A UTXO must exist with the correct output" $ - let correctOutputDatum = - stakeOut - #== mkRecordConstr - PStakeDatum - ( #stakedAmount .= stakeDatum.stakedAmount - .& #owner .= stakeDatum.owner - .& #delegatedTo .= pdata maybePkh - .& #lockedBy .= stakeDatum.lockedBy - ) - valueCorrect = ownOutputValueUnchanged - in foldl1 - (#&&) - [ ptraceIfFalse "valueCorrect" valueCorrect - , ptraceIfFalse "datumCorrect" correctOutputDatum - ] - - pure $ popaque (pconstant ()) - - pure $ - pmatch stakeRedeemer $ \case - PRetractVotes _ -> unTermCont $ do - pguardC - "Owner or delegate signs this transaction" - $ ownerSignsTransaction #|| delegateSignsTransaction - - -- This puts trust into the Proposal. The Proposal must necessarily check - -- that this is not abused. - pguardC "Proposal ST spent" proposalTokenMoved - - pguardC "A UTXO must exist with the correct output" $ - let valueCorrect = ownOutputValueUnchanged - outputDatumCorrect = onlyLocksUpdated - in foldl1 - (#&&) - [ ptraceIfFalse "valueCorrect" valueCorrect - , ptraceIfFalse "datumCorrect" outputDatumCorrect - ] - - pure $ popaque (pconstant ()) - - ------------------------------------------------------------ - - PPermitVote _ -> unTermCont $ do - pguardC - "Owner or delegate signs this transaction" - $ ownerSignsTransaction #|| delegateSignsTransaction - - let proposalTokenMinted = - passetClassValueOf # txInfoF.mint # proposalSTClass #== 1 - - -- This puts trust into the Proposal. The Proposal must necessarily check - -- that this is not abused. - pguardC "Proposal ST spent or minted" $ - proposalTokenMoved #|| proposalTokenMinted - pguardC "A UTXO must exist with the correct output" $ - let correctOutputDatum = onlyLocksUpdated - valueCorrect = ownOutputValueUnchanged - in foldl1 - (#&&) - [ ptraceIfFalse "valueCorrect" valueCorrect - , ptraceIfFalse "datumCorrect" correctOutputDatum - ] - - pure $ popaque (pconstant ()) - - ------------------------------------------------------------ - - PDepositWithdraw r -> unTermCont $ do - pguardC "Stake unlocked" $ - pnot #$ stakeIsLocked - pguardC - "Owner signs this transaction" - ownerSignsTransaction - pguardC "A UTXO must exist with the correct output" $ - unTermCont $ do - let oldStakedAmount = pfromData $ stakeDatum.stakedAmount - delta = pfromData $ pfield @"delta" # r - - newStakedAmount <- pletC $ oldStakedAmount + delta - - pguardC "New staked amount should be greater than or equal to 0" $ - zero #<= newStakedAmount - - let expectedDatum = - mkRecordConstr - PStakeDatum - ( #stakedAmount .= pdata newStakedAmount - .& #owner .= stakeDatum.owner - .& #delegatedTo .= stakeDatum.delegatedTo - .& #lockedBy .= stakeDatum.lockedBy - ) - datumCorrect = stakeOut #== expectedDatum - - let valueDelta :: Term _ (PValue _ 'Positive) - valueDelta = pdiscreteValue' gtClassRef # delta - - expectedValue = - resolvedF.value <> valueDelta - - valueCorrect = - foldr1 - (#&&) - [ pgeqByClass' (AssetClass ("", "")) - # ownOutputValue - # expectedValue - , pgeqByClass' (untag gtClassRef) - # ownOutputValue - # expectedValue - , pgeqBySymbol - # stCurrencySymbol - # ownOutputValue - # expectedValue - ] - -- - pure $ - foldl1 - (#&&) - [ ptraceIfFalse "valueCorrect" valueCorrect - , ptraceIfFalse "datumCorrect" datumCorrect - ] - -- - pure $ popaque (pconstant ()) - - ------------------------------------------------------------ - - PDelegateTo ((pfromData . (pfield @"pkh" #)) -> pkh) -> unTermCont $ do - pguardC "Cannot delegate to the owner" $ - pnot #$ stakeDatum.owner #== pkh - - pure $ setDelegate #$ pdjust # pdata pkh - ------------------------------------------------------------ - - PClearDelegate _ -> - setDelegate # pdnothing - ------------------------------------------------------------ - - _ -> popaque (pconstant ()) - - pure $ - pif - (pdata stakeRedeemer #== pconstantData WitnessStake) - witnessStake - onlyAcceptOneStake + ClosedTerm + ( PAsData (PTagged StakeSTTag PCurrencySymbol) + :--> PAsData (PTagged ProposalSTTag PAssetClassData) + :--> PAsData (PTagged GTTag PAssetClassData) + :--> PValidator + ) +stakeValidator = + plam $ \sstSymbol pstClass gstClass -> + mkStakeValidator + ( StakeRedeemerImpl + { onDepositWithdraw = pdepositWithdraw + , onDestroy = pdestroy + , onPermitVote = ppermitVote + , onRetractVote = pretractVote + , onDelegateTo = pdelegateTo + , onClearDelegate = pclearDelegate + } + ) + (pfromData sstSymbol) + (ptoScottEncodingT # pfromData pstClass) + (ptoScottEncodingT # pfromData gstClass) diff --git a/agora/Agora/Treasury.hs b/agora/Agora/Treasury.hs index e5b3733..808e83b 100644 --- a/agora/Agora/Treasury.hs +++ b/agora/Agora/Treasury.hs @@ -8,123 +8,42 @@ Description: Treasury scripts. Contains the datum, redeemer and validator for a template DAO treasury. -} -module Agora.Treasury (module Agora.Treasury) where +module Agora.Treasury ( + treasuryValidator, +) where import Agora.AuthorityToken (singleAuthorityTokenBurned) -import Generics.SOP qualified as SOP -import Plutarch.Api.V1 (PValidator) -import Plutarch.Api.V1.Contexts (PScriptPurpose (PMinting)) -import "plutarch" Plutarch.Api.V1.Value (PValue) -import Plutarch.Builtin (pforgetData) -import Plutarch.Extra.IsData ( - DerivePConstantViaEnum (..), - EnumIsData (..), - PlutusTypeEnumData, - ) -import Plutarch.Extra.TermCont (pguardC, pletC, pletFieldsC, pmatchC) -import Plutarch.Lift (PConstantDecl (..), PLifted (..), PUnsafeLiftDecl) -import Plutarch.TryFrom () -import PlutusLedgerApi.V1.Value (CurrencySymbol) -import PlutusTx qualified - -{- | Redeemer for Treasury actions. - - @since 0.1.0 --} -data TreasuryRedeemer - = -- | Allow transaction to pass by delegating to GAT burn. - SpendTreasuryGAT - deriving stock - ( -- | @since 0.1.0 - Eq - , -- | @since 0.1.0 - Show - , -- | @since 0.1.0 - Generic - , -- | @since 0.2.0 - Enum - , -- | @since 0.2.0 - Bounded - ) - deriving anyclass - ( -- | @since 0.2.0 - SOP.Generic - ) - deriving - ( -- | @since 0.1.0 - PlutusTx.ToData - , -- | @since 0.1.0 - PlutusTx.FromData - ) - via (EnumIsData TreasuryRedeemer) - --------------------------------------------------------------------------------- - -{- | Plutarch level type representing valid redeemers of the - treasury. - - @since 0.1.0 --} -data PTreasuryRedeemer (s :: S) - = PSpendTreasuryGAT - deriving stock - ( -- | @since 0.1.0 - Generic - , -- | @since 0.2.0 - Bounded - , -- | @since 0.2.0 - Enum - ) - deriving anyclass - ( -- | @since 0.1.0 - PlutusType - , -- | @since 0.1.0 - PIsData - ) - -instance DerivePlutusType PTreasuryRedeemer where - type DPTStrat _ = PlutusTypeEnumData - --- | @since 0.1.0 -instance PUnsafeLiftDecl PTreasuryRedeemer where - type PLifted PTreasuryRedeemer = TreasuryRedeemer - --- | @since 0.1.0 -deriving via - (DerivePConstantViaEnum TreasuryRedeemer PTreasuryRedeemer) - instance - (PConstantDecl TreasuryRedeemer) - --------------------------------------------------------------------------------- +import Agora.SafeMoney (AuthorityTokenTag) +import Plutarch.Api.V1.Value (PCurrencySymbol, PValue) +import Plutarch.Api.V2 (PScriptPurpose (PSpending), PValidator) +import Plutarch.Extra.Tagged (PTagged) +import "liqwid-plutarch-extra" Plutarch.Extra.TermCont (pguardC, pletFieldsC, pmatchC) {- | Validator ensuring that transactions consuming the treasury do so in a valid manner. - @since 0.1.0 + == Arguments + + Following arguments should be provided(in this order): + 1. authority token symbol + + @since 1.0.0 -} treasuryValidator :: - -- | Governance Authority Token that can unlock this validator. - CurrencySymbol -> - ClosedTerm PValidator -treasuryValidator gatCs' = plam $ \_datum redeemer ctx' -> unTermCont $ do + ClosedTerm (PAsData (PTagged AuthorityTokenTag PCurrencySymbol) :--> PValidator) +treasuryValidator = plam $ \atSymbol _ _ ctx' -> unTermCont $ do -- plet required fields from script context. ctx <- pletFieldsC @["txInfo", "purpose"] ctx' - -- Ensure that script is for burning i.e. minting a negative amount. - PMinting _ <- pmatchC ctx.purpose - - -- Ensure redeemer type is valid. - pguardC "Redeemer should be SpendTreasuryGAT" $ - redeemer #== pforgetData (pconstantData SpendTreasuryGAT) + -- Ensure that script is for spending. + PSpending _ <- pmatchC ctx.purpose -- Get the minted value from txInfo. txInfo <- pletFieldsC @'["mint", "inputs"] ctx.txInfo let mint :: Term _ (PValue _ _) mint = txInfo.mint - gatCs <- pletC $ pconstant gatCs' - pguardC "A single authority token has been burned" $ - singleAuthorityTokenBurned gatCs txInfo.inputs mint + singleAuthorityTokenBurned (pfromData atSymbol) txInfo.inputs mint pure . popaque $ pconstant () diff --git a/agora/Agora/Utils.hs b/agora/Agora/Utils.hs index 97a7cd0..f41672e 100644 --- a/agora/Agora/Utils.hs +++ b/agora/Agora/Utils.hs @@ -1,5 +1,4 @@ {-# LANGUAGE QuantifiedConstraints #-} -{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} {- | Module : Agora.Utils @@ -9,124 +8,240 @@ Description: Plutarch utility functions that should be upstreamed or don't belon Plutarch utility functions that should be upstreamed or don't belong anywhere else. -} module Agora.Utils ( - validatorHashToTokenName, - mustFindDatum', - validatorHashToAddress, - pltAsData, - withBuiltinPairAsData, - CompiledValidator (..), - CompiledMintingPolicy (..), - CompiledEffect (..), + scriptHashToAddress, + pstringIntercalate, + punwords, + pisNothing, + pisDNothing, + ptoScottEncodingT, + ptaggedSymbolValueOf, + ptag, + puntag, + phashDatum, + puncurryTuple, + psubtractSortedValue, + pfindInputWithStateThreadToken, + pfindOutputWithStateThreadToken, + pisSubValueOf, ) where -import Plutarch.Api.V1 ( - PDatum, - PDatumHash, - PMaybeData, +import Plutarch.Api.V1 (AmountGuarantees (Positive), KeyGuarantees (Sorted)) +import Plutarch.Api.V1.AssocMap (punionWith) +import Plutarch.Api.V1.AssocMap qualified as AssocMap +import Plutarch.Api.V1.Scripts (PDatumHash (PDatumHash)) +import Plutarch.Api.V2 ( + AmountGuarantees (NoGuarantees), + PCurrencySymbol, + PMaybeData (PDNothing), PTuple, + PTxInInfo, + PTxOut, + PValue, ) -import Plutarch.Builtin (pforgetData) -import Plutarch.Extra.List (plookupTuple) -import Plutarch.Extra.Maybe (passertPDJust, passertPJust) -import Plutarch.Extra.TermCont (ptryFromC) -import PlutusLedgerApi.V1 ( - Address (..), - Credential (..), - MintingPolicy, - TokenName (..), - Validator, - ValidatorHash (..), +import Plutarch.Builtin (pforgetData, pserialiseData) +import Plutarch.Crypto (pblake2b_256) +import Plutarch.DataRepr (punDataSum) +import Plutarch.Extra.AssetClass (PAssetClass, PAssetClassData, ptoScottEncoding) +import Plutarch.Extra.Field (pletAll) +import Plutarch.Extra.Functor (PFunctor (pfmap)) +import Plutarch.Extra.Tagged (PTagged) +import Plutarch.Extra.Value (psymbolValueOf) +import Plutarch.Num (PNum (pnegate, (#+))) +import Plutarch.Unsafe (punsafeCoerce, punsafeDowncast) +import PlutusLedgerApi.V2 ( + Address (Address), + Credential (ScriptCredential), + ScriptHash, ) -{- Functions which should (probably) not be upstreamed - All of these functions are quite inefficient. +{- | Create an 'Address' from a given 'ScriptHash' with no 'PlutusLedgerApi.V1.Credential.StakingCredential'. + + @since 1.0.0 -} +scriptHashToAddress :: ScriptHash -> Address +scriptHashToAddress vh = Address (ScriptCredential vh) Nothing -{- | Safely convert a 'PValidatorHash' into a 'PTokenName'. This can be useful for tagging - tokens for extra safety. +-- | @since 1.0.0 +pstringIntercalate :: + forall (s :: S). + Term s PString -> + [Term s PString] -> + Term s PString +pstringIntercalate _ [x] = x +pstringIntercalate i (x : xs) = x <> i <> pstringIntercalate i xs +pstringIntercalate _ _ = "" - @since 0.1.0 --} -validatorHashToTokenName :: ValidatorHash -> TokenName -validatorHashToTokenName (ValidatorHash hash) = TokenName hash +-- | @since 1.0.0 +punwords :: + forall (s :: S). + [Term s PString] -> + Term s PString +punwords = pstringIntercalate " " -{- | Find datum given a maybe datum hash - - @since 0.1.0 --} -mustFindDatum' :: - forall (datum :: PType). - (PIsData datum, PTryFrom PData datum) => - forall s. - Term - s - ( PMaybeData PDatumHash - :--> PBuiltinList (PAsData (PTuple PDatumHash PDatum)) - :--> datum - ) -mustFindDatum' = phoistAcyclic $ - plam $ \mdh datums -> unTermCont $ do - let dh = passertPDJust # "Given TxOut dones't have a datum" # mdh - dt = passertPJust # "Datum not found in the transaction" #$ plookupTuple # dh # datums - (d, _) <- ptryFromC $ pforgetData $ pdata dt - pure d - -{- | Create an 'Address' from a given 'ValidatorHash' with no 'PlutusLedgerApi.V1.Credential.StakingCredential'. - - @since 0.1.0 --} -validatorHashToAddress :: ValidatorHash -> Address -validatorHashToAddress vh = Address (ScriptCredential vh) Nothing - -{- | Compare two 'PAsData' value, return true if the first one is less than the second one. - - @since 0.2.0 --} -pltAsData :: +-- | @since 1.0.0 +pisNothing :: forall (a :: PType) (s :: S). - (POrd a, PIsData a) => - Term s (PAsData a :--> PAsData a :--> PBool) -pltAsData = phoistAcyclic $ + Term s (PMaybe a :--> PBool) +pisNothing = phoistAcyclic $ plam $ - \(pfromData -> l) (pfromData -> r) -> l #< r + flip pmatch $ \case + PNothing -> pconstant True + _ -> pconstant False -{- | Extract data stored in a 'PBuiltinPair' and call a function to process it. +-- | @since 1.0.0 +pisDNothing :: + forall (a :: PType) (s :: S). + Term s (PMaybeData a :--> PBool) +pisDNothing = phoistAcyclic $ + plam $ + flip pmatch $ \case + PDNothing _ -> pconstant True + _ -> pconstant False - @since 0.2.0 +-- | @since 1.0.0 +ptoScottEncodingT :: + forall {k :: Type} (unit :: k) (s :: S). + Term s (PTagged unit PAssetClassData :--> PTagged unit PAssetClass) +ptoScottEncodingT = phoistAcyclic $ + plam $ \d -> + punsafeDowncast $ ptoScottEncoding #$ pto d + +{- | Get the sum of all values belonging to a particular tagged 'CurrencySymbol'. + + @since 1.0.0 -} -withBuiltinPairAsData :: - forall (a :: PType) (b :: PType) (c :: PType) (s :: S). +ptaggedSymbolValueOf :: + forall + {k :: Type} + (unit :: k) + (keys :: KeyGuarantees) + (amounts :: AmountGuarantees) + (s :: S). + Term s (PTagged unit PCurrencySymbol :--> (PValue keys amounts :--> PInteger)) +ptaggedSymbolValueOf = phoistAcyclic $ plam $ \tcs -> psymbolValueOf # pto tcs + +-- | @since 1.0.0 +ptag :: + forall {k :: Type} (tag :: k) (a :: PType) (s :: S). + Term s a -> + Term s (PTagged tag a) +ptag = punsafeDowncast + +-- | @since 1.0.0 +puntag :: + forall {k :: Type} (tag :: k) (a :: PType) (s :: S). + Term s (PTagged tag a) -> + Term s a +puntag = pto + +{- | Hash the given datum using the correct algorithm(blake2b_256). + + Note: check the discussion here: https://github.com/input-output-hk/cardano-ledger/issues/2941. + + @since 1.0.0 +-} +phashDatum :: + forall (a :: PType) (s :: S). + PIsData a => + Term s (a :--> PDatumHash) +phashDatum = + phoistAcyclic $ + plam $ + pcon + . PDatumHash + . (pblake2b_256 #) + . (pserialiseData #) + . pforgetData + . pdata + +puncurryTuple :: + forall (c :: PType) (a :: PType) (b :: PType) (s :: S). (PIsData a, PIsData b) => - (Term s a -> Term s b -> Term s c) -> + Term s ((a :--> b :--> c) :--> PTuple a b :--> c) +puncurryTuple = phoistAcyclic $ + plam $ + \f ((punDataSum #) -> r) -> + pletAll r $ \rF -> f # rF._0 # rF._1 + +psubtractSortedValue :: + forall (ag :: AmountGuarantees) (s :: S). Term s - (PBuiltinPair (PAsData a) (PAsData b)) -> - Term s c -withBuiltinPairAsData f p = - let a = pfromData $ pfstBuiltin # p - b = pfromData $ psndBuiltin # p - in f a b + ( PValue 'Sorted ag + :--> PValue 'Sorted ag + :--> PValue 'Sorted 'NoGuarantees + ) +psubtractSortedValue = phoistAcyclic $ plam $ \a b -> + punsafeCoerce $ + punionWith + # (punionWith # plam (#+)) + # pto a + #$ pfmap + # (pfmap # pnegate) + # pto b -{- | Type-safe wrapper for compiled plutus validator. +{- | Find an input containing exactly one token with the given currency symbol - @since 0.2.0 + @since 1.0.0 -} -newtype CompiledValidator (datum :: Type) (redeemer :: Type) = CompiledValidator - { getCompiledValidator :: Validator - } +pfindInputWithStateThreadToken :: + forall tag. + ClosedTerm + ( PTagged tag PCurrencySymbol + :--> PBuiltinList PTxInInfo + :--> PMaybe PTxInInfo + ) +pfindInputWithStateThreadToken = plam $ \tokenSymbol inputs -> + pfind + # ( plam $ \input -> + ptaggedSymbolValueOf + # tokenSymbol + # (pfield @"value" # (pfield @"resolved" # input)) + #== 1 + ) + # inputs -{- | Type-safe wrapper for compiled plutus miting policy. +{- | Find an output containing exactly one token with the given currency symbol, - @since 0.2.0 + @since 1.0.0 -} -newtype CompiledMintingPolicy (redeemer :: Type) = CompiledMintingPolicy - { getCompiledMintingPolicy :: MintingPolicy - } +pfindOutputWithStateThreadToken :: + forall tag. + ClosedTerm + ( PTagged tag PCurrencySymbol + :--> PBuiltinList PTxOut + :--> PMaybe PTxOut + ) +pfindOutputWithStateThreadToken = plam $ \tokenSymbol outputs -> + pfind + # ( plam $ \output -> + ( ptaggedSymbolValueOf + # tokenSymbol + # (pfield @"value" # output) + #== 1 + ) + ) + # outputs -{- | Type-safe wrapper for compiled plutus effect. +pisNonNegativeValue :: + forall (kg :: KeyGuarantees) (am :: AmountGuarantees) (s :: S). + Term s (PValue kg am :--> PBool) +pisNonNegativeValue = + phoistAcyclic $ + plam $ + (AssocMap.pall # (AssocMap.pall # plam (0 #<=)) #) + . pto - @since 0.2.0 --} -newtype CompiledEffect (datum :: Type) = CompiledEffect - { getCompiledEffect :: Validator - } +pisSubValueOf :: + forall (s :: S). + Term + s + ( PValue 'Sorted 'Positive + :--> PValue 'Sorted 'Positive + :--> PBool + ) +pisSubValueOf = phoistAcyclic $ plam $ \vl vr -> + pisNonNegativeValue + #$ psubtractSortedValue + # vl + # vr diff --git a/bench.csv b/bench.csv index bc75af4..5d16ef3 100644 --- a/bench.csv +++ b/bench.csv @@ -1,582 +1,555 @@ name,cpu,mem,size -Agora/Effects/Treasury Withdrawal Effect/effect/Simple,380214695,980182,4275 -Agora/Effects/Treasury Withdrawal Effect/effect/Simple with multiple treasuries ,544143721,1366494,4691 -Agora/Effects/Treasury Withdrawal Effect/effect/Mixed Assets,545045362,1387355,4636 -Agora/Effects/Governor Mutation Effect/validator/valid new governor datum/governor validator should pass,112721874,312363,9413 -Agora/Effects/Governor Mutation Effect/validator/valid new governor datum/effect validator should pass,152563857,422397,4692 -Agora/Stake/policy/stakeCreation,54323406,159125,2646 -Agora/Stake/validator/stakeDepositWithdraw deposit,194804304,538628,5315 -Agora/Stake/validator/stakeDepositWithdraw withdraw,194804304,538628,5303 -Agora/Stake/validator/set delegate/override existing delegate,117949415,309090,5367 -Agora/Stake/validator/set delegate/remove existing delegate,115539973,301757,5304 -Agora/Stake/validator/set delegate/set delegate to something,114218077,301022,5304 -Agora/Proposal/policy (proposal creation)/legal/proposal,33965644,101486,1971 -Agora/Proposal/policy (proposal creation)/legal/governor,369498544,984529,9918 -Agora/Proposal/policy (proposal creation)/legal/stake,168978875,446628,5969 -Agora/Proposal/policy (proposal creation)/illegal/invalid next proposal id/proposal,33965644,101486,1971 -Agora/Proposal/policy (proposal creation)/illegal/invalid next proposal id/stake,168978875,446628,5969 -Agora/Proposal/policy (proposal creation)/illegal/use other's stake/proposal,33965644,101486,1940 -Agora/Proposal/policy (proposal creation)/illegal/use other's stake/governor,369498544,984529,9887 -Agora/Proposal/policy (proposal creation)/illegal/altered stake/proposal,33965644,101486,1971 -Agora/Proposal/policy (proposal creation)/illegal/invalid stake locks/proposal,33965644,101486,1979 -Agora/Proposal/policy (proposal creation)/illegal/invalid stake locks/stake,174412535,461278,5977 -Agora/Proposal/policy (proposal creation)/illegal/has reached maximum proposals limit/proposal,33965644,101486,1991 -Agora/Proposal/policy (proposal creation)/illegal/has reached maximum proposals limit/stake,181677311,482844,5999 -Agora/Proposal/policy (proposal creation)/illegal/loose time range/proposal,33965644,101486,1971 -Agora/Proposal/policy (proposal creation)/illegal/loose time range/stake,168978875,446628,5969 -Agora/Proposal/policy (proposal creation)/illegal/open time range/proposal,33965644,101486,1967 -Agora/Proposal/policy (proposal creation)/illegal/open time range/stake,168978875,446628,5965 -Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/VotingReady/proposal,33965644,101486,1971 -Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/VotingReady/stake,168978875,446628,5969 -Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/Locked/proposal,33965644,101486,1971 -Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/Locked/stake,168978875,446628,5969 -Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/Finished/proposal,33965644,101486,1971 -Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/Finished/stake,168978875,446628,5969 -Agora/Proposal/validator/cosignature/legal/with 1 cosigners/proposal,278329834,780402,9534 -Agora/Proposal/validator/cosignature/legal/with 1 cosigners/stake,132939473,344002,5780 -Agora/Proposal/validator/cosignature/legal/with 5 cosigners/proposal,733369909,2047977,12188 -Agora/Proposal/validator/cosignature/legal/with 5 cosigners/stake,584246489,1537942,8314 -Agora/Proposal/validator/cosignature/legal/with 10 cosigners/proposal,1453961927,4008580,15507 -Agora/Proposal/validator/cosignature/legal/with 10 cosigners/stake,1244034344,3305773,11482 -Agora/Proposal/validator/cosignature/illegal/duplicate cosigners/stake,132939473,344002,5780 -Agora/Proposal/validator/cosignature/illegal/proposal status not Draft/with 1 cosigners/status: VotingReady/stake,132939473,344002,5780 -Agora/Proposal/validator/cosignature/illegal/proposal status not Draft/with 1 cosigners/status: Locked/stake,132939473,344002,5780 -Agora/Proposal/validator/cosignature/illegal/proposal status not Draft/with 1 cosigners/status: Finished/stake,132939473,344002,5780 -Agora/Proposal/validator/cosignature/illegal/proposal status not Draft/with 5 cosigners/status: VotingReady/stake,584246489,1537942,8314 -Agora/Proposal/validator/cosignature/illegal/proposal status not Draft/with 5 cosigners/status: Locked/stake,584246489,1537942,8314 -Agora/Proposal/validator/cosignature/illegal/proposal status not Draft/with 5 cosigners/status: Finished/stake,584246489,1537942,8314 -Agora/Proposal/validator/cosignature/illegal/proposal status not Draft/with 10 cosigners/status: VotingReady/stake,1244034344,3305773,11482 -Agora/Proposal/validator/cosignature/illegal/proposal status not Draft/with 10 cosigners/status: Locked/stake,1244034344,3305773,11482 -Agora/Proposal/validator/cosignature/illegal/proposal status not Draft/with 10 cosigners/status: Finished/stake,1244034344,3305773,11482 -Agora/Proposal/validator/voting/legal/ordinary/proposal,300100170,843476,9516 -Agora/Proposal/validator/voting/legal/ordinary/stake,157219895,416300,5803 -Agora/Proposal/validator/voting/legal/delegate/proposal,301216160,847088,9579 -Agora/Proposal/validator/voting/legal/delegate/stake,161458884,426174,5897 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Draft to VotingReady/proposal,293553258,818566,10029 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Draft to VotingReady/stake,144038574,373470,6116 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from VotingReady to Locked/proposal,339788223,934150,10038 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from VotingReady to Locked/stake,144761110,375734,6123 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Locked to Finished/proposal,389689216,1074147,11190 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Locked to Finished/stake,201040711,510637,7275 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Locked to Finished/governor,494243991,1258194,11233 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Locked to Finished/authority,15875303,48540,3625 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to failed state/from Draft to Finished/proposal,290760522,812653,10031 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to failed state/from Draft to Finished/stake,144761110,375734,6118 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to failed state/from VotingReady to Finished/proposal,327404759,899415,10032 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to failed state/from VotingReady to Finished/stake,144761110,375734,6119 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to failed state/from Locked to Finished/proposal,329666715,904223,10032 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to failed state/from Locked to Finished/stake,144761110,375734,6119 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/stake,144038574,373470,6116 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/stake,144761110,375734,6123 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/stake,201040711,510637,7275 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/authority,15875303,48540,3625 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/insufficient cosigns/stake,144038574,373470,6116 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/insufficient votes/stake,144761110,375734,6119 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/ambiguous winning effect/stake,144761110,375734,6127 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/to next state too late/from Draft/stake,144038574,373470,6118 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/to next state too late/from VotingReady/stake,144761110,375734,6123 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/to next state too late/from Locked/stake,201040711,510637,7275 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/to next state too late/from Locked/governor,494243991,1258194,11233 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/to next state too late/from Locked/authority,15875303,48540,3625 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/altered output stake datum/from Locked/governor,494243991,1258194,11234 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/altered output stake datum/from Locked/authority,15875303,48540,3626 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/forget to mint GATs/proposal,365438170,1001538,10479 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/forget to mint GATs/stake,187940552,485026,6564 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/mint GATs for wrong validators/proposal,397772898,1098350,11417 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/mint GATs for wrong validators/stake,204588820,517864,7502 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/mint GATs for wrong validators/authority,17699300,53602,3852 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/mint GATs with bad token name/proposal,389689216,1074147,11012 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/mint GATs with bad token name/stake,201040711,510637,7097 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/wrong GAT datum/proposal,389689216,1074147,11184 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/wrong GAT datum/stake,201040711,510637,7269 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/wrong GAT datum/authority,15875303,48540,3619 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/invalid governor output datum/proposal,389689216,1074147,11190 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/invalid governor output datum/stake,201040711,510637,7275 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/invalid governor output datum/authority,15875303,48540,3625 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Draft to VotingReady/proposal,340836965,940834,10618 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Draft to VotingReady/stake,144038574,373470,6509 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from VotingReady to Locked/proposal,390766816,1066406,10627 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from VotingReady to Locked/stake,144761110,375734,6516 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Locked to Finished/proposal,436972923,1196415,11780 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Locked to Finished/stake,201040711,510637,7669 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Locked to Finished/governor,514789615,1314031,11627 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Locked to Finished/authority,15875303,48540,4019 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to failed state/from Draft to Finished/proposal,338044229,934921,10620 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to failed state/from Draft to Finished/stake,144761110,375734,6511 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to failed state/from VotingReady to Finished/proposal,374688466,1021683,10621 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to failed state/from VotingReady to Finished/stake,144761110,375734,6512 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to failed state/from Locked to Finished/proposal,376950422,1026491,10621 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to failed state/from Locked to Finished/stake,144761110,375734,6512 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/stake,144038574,373470,6509 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/stake,144761110,375734,6516 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/stake,201040711,510637,7669 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/authority,15875303,48540,4019 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/insufficient cosigns/stake,144038574,373470,6509 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/insufficient votes/stake,144761110,375734,6512 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/ambiguous winning effect/stake,144761110,375734,6524 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/to next state too late/from Draft/stake,144038574,373470,6511 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/to next state too late/from VotingReady/stake,144761110,375734,6516 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/to next state too late/from Locked/stake,201040711,510637,7669 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/to next state too late/from Locked/governor,514789615,1314031,11627 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/to next state too late/from Locked/authority,15875303,48540,4019 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/altered output stake datum/from Locked/governor,514789615,1314031,11628 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/altered output stake datum/from Locked/authority,15875303,48540,4020 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/forget to mint GATs/proposal,412721877,1123806,11068 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/forget to mint GATs/stake,187940552,485026,6957 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/mint GATs for wrong validators/proposal,445056605,1220618,12007 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/mint GATs for wrong validators/stake,204588820,517864,7896 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/mint GATs for wrong validators/authority,17699300,53602,4246 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/mint GATs with bad token name/proposal,436972923,1196415,11601 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/mint GATs with bad token name/stake,201040711,510637,7490 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/wrong GAT datum/proposal,436972923,1196415,11774 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/wrong GAT datum/stake,201040711,510637,7663 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/wrong GAT datum/authority,15875303,48540,4013 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/invalid governor output datum/proposal,436972923,1196415,11780 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/invalid governor output datum/stake,201040711,510637,7669 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/invalid governor output datum/authority,15875303,48540,4019 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Draft to VotingReady/proposal,482688086,1307638,12390 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Draft to VotingReady/stake,144038574,373470,7690 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from VotingReady to Locked/proposal,543702595,1463174,12399 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from VotingReady to Locked/stake,144761110,375734,7697 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Locked to Finished/proposal,578824044,1563219,13551 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Locked to Finished/stake,201040711,510637,8849 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Locked to Finished/governor,576426487,1481542,12807 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Locked to Finished/authority,15875303,48540,5199 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to failed state/from Draft to Finished/proposal,479895350,1301725,12392 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to failed state/from Draft to Finished/stake,144761110,375734,7692 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to failed state/from VotingReady to Finished/proposal,516539587,1388487,12393 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to failed state/from VotingReady to Finished/stake,144761110,375734,7693 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to failed state/from Locked to Finished/proposal,518801543,1393295,12393 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to failed state/from Locked to Finished/stake,144761110,375734,7693 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/stake,144038574,373470,7690 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/stake,144761110,375734,7697 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/stake,201040711,510637,8849 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/authority,15875303,48540,5199 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/insufficient cosigns/stake,144038574,373470,7690 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/insufficient votes/stake,144761110,375734,7693 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/ambiguous winning effect/stake,144761110,375734,7717 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/to next state too late/from Draft/stake,144038574,373470,7692 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/to next state too late/from VotingReady/stake,144761110,375734,7697 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/to next state too late/from Locked/stake,201040711,510637,8849 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/to next state too late/from Locked/governor,576426487,1481542,12807 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/to next state too late/from Locked/authority,15875303,48540,5199 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/altered output stake datum/from Locked/governor,576426487,1481542,12808 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/altered output stake datum/from Locked/authority,15875303,48540,5200 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/forget to mint GATs/proposal,554572998,1490610,12840 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/forget to mint GATs/stake,187940552,485026,8138 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/mint GATs for wrong validators/proposal,586907726,1587422,13778 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/mint GATs for wrong validators/stake,204588820,517864,9076 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/mint GATs for wrong validators/authority,17699300,53602,5426 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/mint GATs with bad token name/proposal,578824044,1563219,13373 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/mint GATs with bad token name/stake,201040711,510637,8671 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/wrong GAT datum/proposal,578824044,1563219,13545 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/wrong GAT datum/stake,201040711,510637,8843 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/wrong GAT datum/authority,15875303,48540,5193 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/invalid governor output datum/proposal,578824044,1563219,13551 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/invalid governor output datum/stake,201040711,510637,8849 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/invalid governor output datum/authority,15875303,48540,5199 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Draft to VotingReady/proposal,677995493,1927471,12799 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Draft to VotingReady/stake,582713892,1530532,8765 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from VotingReady to Locked/proposal,362157571,996214,10395 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from VotingReady to Locked/stake,144761110,375734,6359 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Locked to Finished/proposal,412058564,1136211,11547 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Locked to Finished/stake,201040711,510637,7511 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Locked to Finished/governor,501431939,1278882,11470 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Locked to Finished/authority,15875303,48540,3862 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to failed state/from Draft to Finished/proposal,313129870,874717,10388 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to failed state/from Draft to Finished/stake,144761110,375734,6354 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to failed state/from VotingReady to Finished/proposal,349774107,961479,10389 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to failed state/from VotingReady to Finished/stake,144761110,375734,6355 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to failed state/from Locked to Finished/proposal,352036063,966287,10389 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to failed state/from Locked to Finished/stake,144761110,375734,6355 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/stake,582713892,1530532,8765 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/stake,144761110,375734,6359 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/stake,201040711,510637,7511 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/authority,15875303,48540,3862 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/insufficient cosigns/stake,568599606,1489522,8765 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/insufficient votes/stake,144761110,375734,6355 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/ambiguous winning effect/stake,144761110,375734,6363 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/to next state too late/from Draft/stake,582713892,1530532,8767 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/to next state too late/from VotingReady/stake,144761110,375734,6359 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/to next state too late/from Locked/stake,201040711,510637,7511 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/to next state too late/from Locked/governor,501431939,1278882,11470 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/to next state too late/from Locked/authority,15875303,48540,3862 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/altered output stake datum/from Locked/governor,501431939,1278882,11471 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/altered output stake datum/from Locked/authority,15875303,48540,3863 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/forget to mint GATs/proposal,387807518,1063602,10835 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/forget to mint GATs/stake,187940552,485026,6799 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/mint GATs for wrong validators/proposal,420142246,1160414,11774 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/mint GATs for wrong validators/stake,204588820,517864,7738 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/mint GATs for wrong validators/authority,17699300,53602,4089 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/mint GATs with bad token name/proposal,412058564,1136211,11369 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/mint GATs with bad token name/stake,201040711,510637,7333 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/wrong GAT datum/proposal,412058564,1136211,11541 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/wrong GAT datum/stake,201040711,510637,7505 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/wrong GAT datum/authority,15875303,48540,3856 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/invalid governor output datum/proposal,412058564,1136211,11547 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/invalid governor output datum/stake,201040711,510637,7511 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/invalid governor output datum/authority,15875303,48540,3862 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Draft to VotingReady/proposal,725279200,2049739,13390 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Draft to VotingReady/stake,582713892,1530532,9159 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from VotingReady to Locked/proposal,413136164,1128470,10985 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from VotingReady to Locked/stake,144761110,375734,6752 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Locked to Finished/proposal,459342271,1258479,12138 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Locked to Finished/stake,201040711,510637,7905 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Locked to Finished/governor,521977563,1334719,11864 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Locked to Finished/authority,15875303,48540,4256 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to failed state/from Draft to Finished/proposal,360413577,996985,10978 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to failed state/from Draft to Finished/stake,144761110,375734,6747 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to failed state/from VotingReady to Finished/proposal,397057814,1083747,10979 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to failed state/from VotingReady to Finished/stake,144761110,375734,6748 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to failed state/from Locked to Finished/proposal,399319770,1088555,10979 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to failed state/from Locked to Finished/stake,144761110,375734,6748 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/stake,582713892,1530532,9159 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/stake,144761110,375734,6752 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/stake,201040711,510637,7905 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/authority,15875303,48540,4256 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/insufficient cosigns/stake,568599606,1489522,9159 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/insufficient votes/stake,144761110,375734,6748 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/ambiguous winning effect/stake,144761110,375734,6760 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/to next state too late/from Draft/stake,582713892,1530532,9161 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/to next state too late/from VotingReady/stake,144761110,375734,6752 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/to next state too late/from Locked/stake,201040711,510637,7905 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/to next state too late/from Locked/governor,521977563,1334719,11864 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/to next state too late/from Locked/authority,15875303,48540,4256 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/altered output stake datum/from Locked/governor,521977563,1334719,11865 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/altered output stake datum/from Locked/authority,15875303,48540,4257 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/forget to mint GATs/proposal,435091225,1185870,11426 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/forget to mint GATs/stake,187940552,485026,7193 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/mint GATs for wrong validators/proposal,467425953,1282682,12365 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/mint GATs for wrong validators/stake,204588820,517864,8132 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/mint GATs for wrong validators/authority,17699300,53602,4483 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/mint GATs with bad token name/proposal,459342271,1258479,11959 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/mint GATs with bad token name/stake,201040711,510637,7726 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/wrong GAT datum/proposal,459342271,1258479,12132 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/wrong GAT datum/stake,201040711,510637,7899 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/wrong GAT datum/authority,15875303,48540,4250 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/invalid governor output datum/proposal,459342271,1258479,12138 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/invalid governor output datum/stake,201040711,510637,7905 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/invalid governor output datum/authority,15875303,48540,4256 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Draft to VotingReady/proposal,867130321,2416543,15160 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Draft to VotingReady/stake,582713892,1530532,10339 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from VotingReady to Locked/proposal,566071943,1525238,12756 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from VotingReady to Locked/stake,144761110,375734,7933 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Locked to Finished/proposal,601193392,1625283,13908 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Locked to Finished/stake,201040711,510637,9085 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Locked to Finished/governor,583614435,1502230,13044 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Locked to Finished/authority,15875303,48540,5436 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to failed state/from Draft to Finished/proposal,502264698,1363789,12749 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to failed state/from Draft to Finished/stake,144761110,375734,7928 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to failed state/from VotingReady to Finished/proposal,538908935,1450551,12750 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to failed state/from VotingReady to Finished/stake,144761110,375734,7929 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to failed state/from Locked to Finished/proposal,541170891,1455359,12750 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to failed state/from Locked to Finished/stake,144761110,375734,7929 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/stake,582713892,1530532,10339 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/stake,144761110,375734,7933 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/stake,201040711,510637,9085 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/authority,15875303,48540,5436 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/insufficient cosigns/stake,568599606,1489522,10339 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/insufficient votes/stake,144761110,375734,7929 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/ambiguous winning effect/stake,144761110,375734,7953 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/to next state too late/from Draft/stake,582713892,1530532,10341 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/to next state too late/from VotingReady/stake,144761110,375734,7933 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/to next state too late/from Locked/stake,201040711,510637,9085 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/to next state too late/from Locked/governor,583614435,1502230,13044 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/to next state too late/from Locked/authority,15875303,48540,5436 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/altered output stake datum/from Locked/governor,583614435,1502230,13045 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/altered output stake datum/from Locked/authority,15875303,48540,5437 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/forget to mint GATs/proposal,576942346,1552674,13197 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/forget to mint GATs/stake,187940552,485026,8374 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/mint GATs for wrong validators/proposal,609277074,1649486,14135 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/mint GATs for wrong validators/stake,204588820,517864,9312 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/mint GATs for wrong validators/authority,17699300,53602,5663 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/mint GATs with bad token name/proposal,601193392,1625283,13730 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/mint GATs with bad token name/stake,201040711,510637,8907 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/wrong GAT datum/proposal,601193392,1625283,13902 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/wrong GAT datum/stake,201040711,510637,9079 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/wrong GAT datum/authority,15875303,48540,5430 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/invalid governor output datum/proposal,601193392,1625283,13908 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/invalid governor output datum/stake,201040711,510637,9085 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/invalid governor output datum/authority,15875303,48540,5436 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Draft to VotingReady/proposal,1245892718,3569074,16268 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Draft to VotingReady/stake,1243243041,3300429,12083 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from VotingReady to Locked/proposal,390119256,1073794,10847 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from VotingReady to Locked/stake,144761110,375734,6660 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Locked to Finished/proposal,440020249,1213791,11999 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Locked to Finished/stake,201040711,510637,7812 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Locked to Finished/governor,510416874,1304742,11771 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Locked to Finished/authority,15875303,48540,4163 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to failed state/from Draft to Finished/proposal,341091555,952297,10840 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to failed state/from Draft to Finished/stake,144761110,375734,6655 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to failed state/from VotingReady to Finished/proposal,377735792,1039059,10841 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to failed state/from VotingReady to Finished/stake,144761110,375734,6656 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to failed state/from Locked to Finished/proposal,379997748,1043867,10841 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to failed state/from Locked to Finished/stake,144761110,375734,6656 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/stake,1243243041,3300429,12083 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/stake,144761110,375734,6660 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/stake,201040711,510637,7812 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/authority,15875303,48540,4163 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/insufficient cosigns/stake,1257357327,3341439,12083 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/insufficient votes/stake,144761110,375734,6656 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/ambiguous winning effect/stake,144761110,375734,6664 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/to next state too late/from Draft/stake,1243243041,3300429,12085 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/to next state too late/from VotingReady/stake,144761110,375734,6660 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/to next state too late/from Locked/stake,201040711,510637,7812 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/to next state too late/from Locked/governor,510416874,1304742,11771 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/to next state too late/from Locked/authority,15875303,48540,4163 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/altered output stake datum/from Locked/governor,510416874,1304742,11772 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/altered output stake datum/from Locked/authority,15875303,48540,4164 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/forget to mint GATs/proposal,415769203,1141182,11288 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/forget to mint GATs/stake,187940552,485026,7101 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/mint GATs for wrong validators/proposal,448103931,1237994,12226 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/mint GATs for wrong validators/stake,204588820,517864,8039 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/mint GATs for wrong validators/authority,17699300,53602,4390 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/mint GATs with bad token name/proposal,440020249,1213791,11821 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/mint GATs with bad token name/stake,201040711,510637,7634 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/wrong GAT datum/proposal,440020249,1213791,11993 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/wrong GAT datum/stake,201040711,510637,7806 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/wrong GAT datum/authority,15875303,48540,4157 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/invalid governor output datum/proposal,440020249,1213791,11999 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/invalid governor output datum/stake,201040711,510637,7812 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/invalid governor output datum/authority,15875303,48540,4163 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Draft to VotingReady/proposal,1293176425,3691342,16858 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Draft to VotingReady/stake,1243243041,3300429,12477 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from VotingReady to Locked/proposal,441097849,1206050,11436 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from VotingReady to Locked/stake,144761110,375734,7053 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Locked to Finished/proposal,487303956,1336059,12589 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Locked to Finished/stake,201040711,510637,8206 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Locked to Finished/governor,530962498,1360579,12165 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Locked to Finished/authority,15875303,48540,4557 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to failed state/from Draft to Finished/proposal,388375262,1074565,11429 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to failed state/from Draft to Finished/stake,144761110,375734,7048 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to failed state/from VotingReady to Finished/proposal,425019499,1161327,11430 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to failed state/from VotingReady to Finished/stake,144761110,375734,7049 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to failed state/from Locked to Finished/proposal,427281455,1166135,11430 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to failed state/from Locked to Finished/stake,144761110,375734,7049 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/stake,1243243041,3300429,12477 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/stake,144761110,375734,7053 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/stake,201040711,510637,8206 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/authority,15875303,48540,4557 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/insufficient cosigns/stake,1257357327,3341439,12477 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/insufficient votes/stake,144761110,375734,7049 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/ambiguous winning effect/stake,144761110,375734,7061 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/to next state too late/from Draft/stake,1243243041,3300429,12479 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/to next state too late/from VotingReady/stake,144761110,375734,7053 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/to next state too late/from Locked/stake,201040711,510637,8206 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/to next state too late/from Locked/governor,530962498,1360579,12165 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/to next state too late/from Locked/authority,15875303,48540,4557 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/altered output stake datum/from Locked/governor,530962498,1360579,12166 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/altered output stake datum/from Locked/authority,15875303,48540,4558 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/forget to mint GATs/proposal,463052910,1263450,11877 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/forget to mint GATs/stake,187940552,485026,7494 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/mint GATs for wrong validators/proposal,495387638,1360262,12816 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/mint GATs for wrong validators/stake,204588820,517864,8433 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/mint GATs for wrong validators/authority,17699300,53602,4784 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/mint GATs with bad token name/proposal,487303956,1336059,12410 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/mint GATs with bad token name/stake,201040711,510637,8027 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/wrong GAT datum/proposal,487303956,1336059,12583 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/wrong GAT datum/stake,201040711,510637,8200 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/wrong GAT datum/authority,15875303,48540,4551 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/invalid governor output datum/proposal,487303956,1336059,12589 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/invalid governor output datum/stake,201040711,510637,8206 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/invalid governor output datum/authority,15875303,48540,4557 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Draft to VotingReady/proposal,1435027546,4058146,18629 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Draft to VotingReady/stake,1243243041,3300429,13657 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from VotingReady to Locked/proposal,594033628,1602818,13208 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from VotingReady to Locked/stake,144761110,375734,8234 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Locked to Finished/proposal,629155077,1702863,14361 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Locked to Finished/stake,201040711,510637,9387 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Locked to Finished/governor,592599370,1528090,13346 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Locked to Finished/authority,15875303,48540,5738 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to failed state/from Draft to Finished/proposal,530226383,1441369,13201 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to failed state/from Draft to Finished/stake,144761110,375734,8229 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to failed state/from VotingReady to Finished/proposal,566870620,1528131,13202 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to failed state/from VotingReady to Finished/stake,144761110,375734,8230 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to failed state/from Locked to Finished/proposal,569132576,1532939,13202 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to failed state/from Locked to Finished/stake,144761110,375734,8230 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/stake,1243243041,3300429,13657 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/stake,144761110,375734,8234 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/stake,201040711,510637,9387 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/authority,15875303,48540,5738 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/insufficient cosigns/stake,1257357327,3341439,13657 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/insufficient votes/stake,144761110,375734,8230 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/ambiguous winning effect/stake,144761110,375734,8254 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/to next state too late/from Draft/stake,1243243041,3300429,13659 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/to next state too late/from VotingReady/stake,144761110,375734,8234 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/to next state too late/from Locked/stake,201040711,510637,9387 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/to next state too late/from Locked/governor,592599370,1528090,13346 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/to next state too late/from Locked/authority,15875303,48540,5738 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/altered output stake datum/from Locked/governor,592599370,1528090,13347 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/altered output stake datum/from Locked/authority,15875303,48540,5739 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/forget to mint GATs/proposal,604904031,1630254,13649 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/forget to mint GATs/stake,187940552,485026,8675 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/mint GATs for wrong validators/proposal,637238759,1727066,14587 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/mint GATs for wrong validators/stake,204588820,517864,9613 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/mint GATs for wrong validators/authority,17699300,53602,5964 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/mint GATs with bad token name/proposal,629155077,1702863,14182 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/mint GATs with bad token name/stake,201040711,510637,9208 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/wrong GAT datum/proposal,629155077,1702863,14355 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/wrong GAT datum/stake,201040711,510637,9381 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/wrong GAT datum/authority,15875303,48540,5731 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/invalid governor output datum/proposal,629155077,1702863,14361 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/invalid governor output datum/stake,201040711,510637,9387 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/invalid governor output datum/authority,15875303,48540,5738 -Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter: retract votes while voting/stake,140863709,370195,5783 -Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter: retract votes while voting/proposal,282615841,794299,9497 -Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter/creator: retract votes while voting/stake,147212927,388303,5799 -Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter/creator: retract votes while voting/proposal,300115413,843740,9508 -Agora/Proposal/validator/unlocking/legal/with 1 proposals/creator: remove creator locks when finished/stake,139825432,367397,5781 -Agora/Proposal/validator/unlocking/legal/with 1 proposals/creator: remove creator locks when finished/proposal,256687085,727957,9494 -Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter/creator: remove all locks when finished/stake,143981681,379249,5797 -Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter/creator: remove all locks when finished/proposal,264924554,752465,9506 -Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter: unlock after voting/Locked/stake,140863709,370195,5787 -Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter: unlock after voting/Locked/proposal,252614193,719732,9501 -Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter: unlock after voting/Finished/stake,140863709,370195,5787 -Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter: unlock after voting/Finished/proposal,253179682,720934,9501 -Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter/creator: remove vote locks when locked/stake,147212927,388303,5803 -Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter/creator: remove vote locks when locked/proposal,270679254,770375,9512 -Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter: retract votes while voting/stake,297243845,781199,7876 -Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter: retract votes while voting/proposal,425257089,1206963,11566 -Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter/creator: retract votes while voting/stake,328989935,871739,7952 -Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter/creator: retract votes while voting/proposal,494812989,1407716,11617 -Agora/Proposal/validator/unlocking/legal/with 5 proposals/creator: remove creator locks when finished/stake,292052460,767209,7865 -Agora/Proposal/validator/unlocking/legal/with 5 proposals/creator: remove creator locks when finished/proposal,364767897,1045813,11558 -Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter/creator: remove all locks when finished/stake,312833705,826469,7946 -Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter/creator: remove all locks when finished/proposal,402960090,1157169,11611 -Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter: unlock after voting/Locked/stake,297243845,781199,7896 -Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter: unlock after voting/Locked/proposal,364848113,1048780,11586 -Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter: unlock after voting/Finished/stake,297243845,781199,7896 -Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter: unlock after voting/Finished/proposal,365413602,1049982,11586 -Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter/creator: remove vote locks when locked/stake,328989935,871739,7972 -Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter/creator: remove vote locks when locked/proposal,434969502,1250735,11637 -Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter: retract votes while voting/stake,492719015,1294954,10491 -Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter: retract votes while voting/proposal,603558649,1722793,14151 -Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter/creator: retract votes while voting/stake,556211195,1476034,10642 -Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter/creator: retract votes while voting/proposal,738184959,2112686,14252 -Agora/Proposal/validator/unlocking/legal/with 10 proposals/creator: remove creator locks when finished/stake,482336245,1266974,10471 -Agora/Proposal/validator/unlocking/legal/with 10 proposals/creator: remove creator locks when finished/proposal,499868912,1443133,14139 -Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter/creator: remove all locks when finished/stake,523898735,1385494,10631 -Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter/creator: remove all locks when finished/proposal,575504510,1663049,14241 -Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter: unlock after voting/Locked/stake,492719015,1294954,10531 -Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter: unlock after voting/Locked/proposal,505140513,1460090,14191 -Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter: unlock after voting/Finished/stake,492719015,1294954,10531 -Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter: unlock after voting/Finished/proposal,505706002,1461292,14191 -Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter/creator: remove vote locks when locked/stake,556211195,1476034,10682 -Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter/creator: remove vote locks when locked/proposal,640332312,1851185,14292 -Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter: retract votes while voting/stake,1743760103,4582986,27321 -Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter: retract votes while voting/proposal,1744688633,5024105,30770 -Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter/creator: retract votes while voting/stake,2010427259,5343522,28008 -Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter/creator: retract votes while voting/proposal,2295765567,6624494,31228 -Agora/Proposal/validator/unlocking/legal/with 42 proposals/creator: remove creator locks when finished/stake,1700152469,4465470,27236 -Agora/Proposal/validator/unlocking/legal/with 42 proposals/creator: remove creator locks when finished/proposal,1364515408,3985981,30725 -Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter/creator: remove all locks when finished/stake,1874714927,4963254,27947 -Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter/creator: remove all locks when finished/proposal,1679788798,4900681,31167 -Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter: unlock after voting/Locked/stake,1743760103,4582986,27489 -Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter: unlock after voting/Locked/proposal,1403011873,4092474,30938 -Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter: unlock after voting/Finished/stake,1743760103,4582986,27489 -Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter: unlock after voting/Finished/proposal,1403577362,4093676,30938 -Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter/creator: remove vote locks when locked/stake,2010427259,5343522,28177 -Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter/creator: remove vote locks when locked/proposal,1954654296,5694065,31397 -"Agora/Proposal/validator/unlocking/illegal/with 1 proposals/retract votes while not voting/role: Voter , status: Draft/stake",140863709,370195,5783 -"Agora/Proposal/validator/unlocking/illegal/with 1 proposals/retract votes while not voting/role: Voter , status: Locked/stake",140863709,370195,5783 -"Agora/Proposal/validator/unlocking/illegal/with 1 proposals/retract votes while not voting/role: Voter , status: Finished/stake",140863709,370195,5783 -"Agora/Proposal/validator/unlocking/illegal/with 1 proposals/retract votes while not voting/role: Creator , status: Draft/stake",135454846,355547,5785 -"Agora/Proposal/validator/unlocking/illegal/with 1 proposals/retract votes while not voting/role: Creator , status: Locked/stake",135454846,355547,5785 -"Agora/Proposal/validator/unlocking/illegal/with 1 proposals/retract votes while not voting/role: Creator , status: Finished/stake",135454846,355547,5785 -"Agora/Proposal/validator/unlocking/illegal/with 1 proposals/retract votes while not voting/role: Both , status: Draft/stake",147212927,388303,5799 -"Agora/Proposal/validator/unlocking/illegal/with 1 proposals/retract votes while not voting/role: Both , status: Locked/stake",147212927,388303,5799 -"Agora/Proposal/validator/unlocking/illegal/with 1 proposals/retract votes while not voting/role: Both , status: Finished/stake",147212927,388303,5799 -"Agora/Proposal/validator/unlocking/illegal/with 1 proposals/retract votes while not voting/role: Irrelevant , status: Draft/stake",129105628,337439,5765 -"Agora/Proposal/validator/unlocking/illegal/with 1 proposals/retract votes while not voting/role: Irrelevant , status: Locked/stake",129105628,337439,5765 -"Agora/Proposal/validator/unlocking/illegal/with 1 proposals/retract votes while not voting/role: Irrelevant , status: Finished/stake",129105628,337439,5765 -Agora/Proposal/validator/unlocking/illegal/with 1 proposals/unlock an irrelevant stake/status: Draft retract votes: True/stake,129105628,337439,5765 -Agora/Proposal/validator/unlocking/illegal/with 1 proposals/unlock an irrelevant stake/status: Draft retract votes: False/stake,129105628,337439,5765 -Agora/Proposal/validator/unlocking/illegal/with 1 proposals/unlock an irrelevant stake/status: VotingReady retract votes: True/stake,129105628,337439,5765 -Agora/Proposal/validator/unlocking/illegal/with 1 proposals/unlock an irrelevant stake/status: VotingReady retract votes: False/stake,129105628,337439,5765 -Agora/Proposal/validator/unlocking/illegal/with 1 proposals/unlock an irrelevant stake/status: Locked retract votes: True/stake,129105628,337439,5765 -Agora/Proposal/validator/unlocking/illegal/with 1 proposals/unlock an irrelevant stake/status: Locked retract votes: False/stake,129105628,337439,5765 -Agora/Proposal/validator/unlocking/illegal/with 1 proposals/unlock an irrelevant stake/status: Finished retract votes: True/stake,129105628,337439,5765 -Agora/Proposal/validator/unlocking/illegal/with 1 proposals/unlock an irrelevant stake/status: Finished retract votes: False/stake,129105628,337439,5765 -Agora/Proposal/validator/unlocking/illegal/with 1 proposals/remove creator too early/status: Draft/stake,139825432,367397,5781 -Agora/Proposal/validator/unlocking/illegal/with 1 proposals/remove creator too early/status: VotingReady/stake,139825432,367397,5781 -Agora/Proposal/validator/unlocking/illegal/with 1 proposals/remove creator too early/status: Locked/stake,139825432,367397,5781 -Agora/Proposal/validator/unlocking/illegal/with 1 proposals/creator: retract votes/stake,139825432,367397,5779 -"Agora/Proposal/validator/unlocking/illegal/with 5 proposals/retract votes while not voting/role: Voter , status: Draft/stake",297243845,781199,7876 -"Agora/Proposal/validator/unlocking/illegal/with 5 proposals/retract votes while not voting/role: Voter , status: Locked/stake",297243845,781199,7876 -"Agora/Proposal/validator/unlocking/illegal/with 5 proposals/retract votes while not voting/role: Voter , status: Finished/stake",297243845,781199,7876 -"Agora/Proposal/validator/unlocking/illegal/with 5 proposals/retract votes while not voting/role: Creator , status: Draft/stake",285403194,749767,7882 -"Agora/Proposal/validator/unlocking/illegal/with 5 proposals/retract votes while not voting/role: Creator , status: Locked/stake",285403194,749767,7882 -"Agora/Proposal/validator/unlocking/illegal/with 5 proposals/retract votes while not voting/role: Creator , status: Finished/stake",285403194,749767,7882 -"Agora/Proposal/validator/unlocking/illegal/with 5 proposals/retract votes while not voting/role: Both , status: Draft/stake",328989935,871739,7952 -"Agora/Proposal/validator/unlocking/illegal/with 5 proposals/retract votes while not voting/role: Both , status: Locked/stake",328989935,871739,7952 -"Agora/Proposal/validator/unlocking/illegal/with 5 proposals/retract votes while not voting/role: Both , status: Finished/stake",328989935,871739,7952 -"Agora/Proposal/validator/unlocking/illegal/with 5 proposals/retract votes while not voting/role: Irrelevant , status: Draft/stake",253657104,659227,7793 -"Agora/Proposal/validator/unlocking/illegal/with 5 proposals/retract votes while not voting/role: Irrelevant , status: Locked/stake",253657104,659227,7793 -"Agora/Proposal/validator/unlocking/illegal/with 5 proposals/retract votes while not voting/role: Irrelevant , status: Finished/stake",253657104,659227,7793 -Agora/Proposal/validator/unlocking/illegal/with 5 proposals/unlock an irrelevant stake/status: Draft retract votes: True/stake,253657104,659227,7793 -Agora/Proposal/validator/unlocking/illegal/with 5 proposals/unlock an irrelevant stake/status: Draft retract votes: False/stake,253657104,659227,7793 -Agora/Proposal/validator/unlocking/illegal/with 5 proposals/unlock an irrelevant stake/status: VotingReady retract votes: True/stake,253657104,659227,7793 -Agora/Proposal/validator/unlocking/illegal/with 5 proposals/unlock an irrelevant stake/status: VotingReady retract votes: False/stake,253657104,659227,7793 -Agora/Proposal/validator/unlocking/illegal/with 5 proposals/unlock an irrelevant stake/status: Locked retract votes: True/stake,253657104,659227,7793 -Agora/Proposal/validator/unlocking/illegal/with 5 proposals/unlock an irrelevant stake/status: Locked retract votes: False/stake,253657104,659227,7793 -Agora/Proposal/validator/unlocking/illegal/with 5 proposals/unlock an irrelevant stake/status: Finished retract votes: True/stake,253657104,659227,7793 -Agora/Proposal/validator/unlocking/illegal/with 5 proposals/unlock an irrelevant stake/status: Finished retract votes: False/stake,253657104,659227,7793 -Agora/Proposal/validator/unlocking/illegal/with 5 proposals/remove creator too early/status: Draft/stake,292052460,767209,7865 -Agora/Proposal/validator/unlocking/illegal/with 5 proposals/remove creator too early/status: VotingReady/stake,292052460,767209,7865 -Agora/Proposal/validator/unlocking/illegal/with 5 proposals/remove creator too early/status: Locked/stake,292052460,767209,7865 -Agora/Proposal/validator/unlocking/illegal/with 5 proposals/creator: retract votes/stake,292052460,767209,7855 -"Agora/Proposal/validator/unlocking/illegal/with 10 proposals/retract votes while not voting/role: Voter , status: Draft/stake",492719015,1294954,10491 -"Agora/Proposal/validator/unlocking/illegal/with 10 proposals/retract votes while not voting/role: Voter , status: Locked/stake",492719015,1294954,10491 -"Agora/Proposal/validator/unlocking/illegal/with 10 proposals/retract votes while not voting/role: Voter , status: Finished/stake",492719015,1294954,10491 -"Agora/Proposal/validator/unlocking/illegal/with 10 proposals/retract votes while not voting/role: Creator , status: Draft/stake",472838629,1242542,10502 -"Agora/Proposal/validator/unlocking/illegal/with 10 proposals/retract votes while not voting/role: Creator , status: Locked/stake",472838629,1242542,10502 -"Agora/Proposal/validator/unlocking/illegal/with 10 proposals/retract votes while not voting/role: Creator , status: Finished/stake",472838629,1242542,10502 -"Agora/Proposal/validator/unlocking/illegal/with 10 proposals/retract votes while not voting/role: Both , status: Draft/stake",556211195,1476034,10642 -"Agora/Proposal/validator/unlocking/illegal/with 10 proposals/retract votes while not voting/role: Both , status: Locked/stake",556211195,1476034,10642 -"Agora/Proposal/validator/unlocking/illegal/with 10 proposals/retract votes while not voting/role: Both , status: Finished/stake",556211195,1476034,10642 -"Agora/Proposal/validator/unlocking/illegal/with 10 proposals/retract votes while not voting/role: Irrelevant , status: Draft/stake",409346449,1061462,10328 -"Agora/Proposal/validator/unlocking/illegal/with 10 proposals/retract votes while not voting/role: Irrelevant , status: Locked/stake",409346449,1061462,10328 -"Agora/Proposal/validator/unlocking/illegal/with 10 proposals/retract votes while not voting/role: Irrelevant , status: Finished/stake",409346449,1061462,10328 -Agora/Proposal/validator/unlocking/illegal/with 10 proposals/unlock an irrelevant stake/status: Draft retract votes: True/stake,409346449,1061462,10328 -Agora/Proposal/validator/unlocking/illegal/with 10 proposals/unlock an irrelevant stake/status: Draft retract votes: False/stake,409346449,1061462,10328 -Agora/Proposal/validator/unlocking/illegal/with 10 proposals/unlock an irrelevant stake/status: VotingReady retract votes: True/stake,409346449,1061462,10328 -Agora/Proposal/validator/unlocking/illegal/with 10 proposals/unlock an irrelevant stake/status: VotingReady retract votes: False/stake,409346449,1061462,10328 -Agora/Proposal/validator/unlocking/illegal/with 10 proposals/unlock an irrelevant stake/status: Locked retract votes: True/stake,409346449,1061462,10328 -Agora/Proposal/validator/unlocking/illegal/with 10 proposals/unlock an irrelevant stake/status: Locked retract votes: False/stake,409346449,1061462,10328 -Agora/Proposal/validator/unlocking/illegal/with 10 proposals/unlock an irrelevant stake/status: Finished retract votes: True/stake,409346449,1061462,10328 -Agora/Proposal/validator/unlocking/illegal/with 10 proposals/unlock an irrelevant stake/status: Finished retract votes: False/stake,409346449,1061462,10328 -Agora/Proposal/validator/unlocking/illegal/with 10 proposals/remove creator too early/status: Draft/stake,482336245,1266974,10471 -Agora/Proposal/validator/unlocking/illegal/with 10 proposals/remove creator too early/status: VotingReady/stake,482336245,1266974,10471 -Agora/Proposal/validator/unlocking/illegal/with 10 proposals/remove creator too early/status: Locked/stake,482336245,1266974,10471 -Agora/Proposal/validator/unlocking/illegal/with 10 proposals/creator: retract votes/stake,482336245,1266974,10450 -"Agora/Proposal/validator/unlocking/illegal/with 42 proposals/retract votes while not voting/role: Voter , status: Draft/stake",1743760103,4582986,27321 -"Agora/Proposal/validator/unlocking/illegal/with 42 proposals/retract votes while not voting/role: Voter , status: Locked/stake",1743760103,4582986,27321 -"Agora/Proposal/validator/unlocking/illegal/with 42 proposals/retract votes while not voting/role: Voter , status: Finished/stake",1743760103,4582986,27321 -"Agora/Proposal/validator/unlocking/illegal/with 42 proposals/retract votes while not voting/role: Creator , status: Draft/stake",1672425413,4396302,27382 -"Agora/Proposal/validator/unlocking/illegal/with 42 proposals/retract votes while not voting/role: Creator , status: Locked/stake",1672425413,4396302,27382 -"Agora/Proposal/validator/unlocking/illegal/with 42 proposals/retract votes while not voting/role: Creator , status: Finished/stake",1672425413,4396302,27382 -"Agora/Proposal/validator/unlocking/illegal/with 42 proposals/retract votes while not voting/role: Both , status: Draft/stake",2010427259,5343522,28008 -"Agora/Proposal/validator/unlocking/illegal/with 42 proposals/retract votes while not voting/role: Both , status: Locked/stake",2010427259,5343522,28008 -"Agora/Proposal/validator/unlocking/illegal/with 42 proposals/retract votes while not voting/role: Both , status: Finished/stake",2010427259,5343522,28008 -"Agora/Proposal/validator/unlocking/illegal/with 42 proposals/retract votes while not voting/role: Irrelevant , status: Draft/stake",1405758257,3635766,26608 -"Agora/Proposal/validator/unlocking/illegal/with 42 proposals/retract votes while not voting/role: Irrelevant , status: Locked/stake",1405758257,3635766,26608 -"Agora/Proposal/validator/unlocking/illegal/with 42 proposals/retract votes while not voting/role: Irrelevant , status: Finished/stake",1405758257,3635766,26608 -Agora/Proposal/validator/unlocking/illegal/with 42 proposals/unlock an irrelevant stake/status: Draft retract votes: True/stake,1405758257,3635766,26608 -Agora/Proposal/validator/unlocking/illegal/with 42 proposals/unlock an irrelevant stake/status: Draft retract votes: False/stake,1405758257,3635766,26608 -Agora/Proposal/validator/unlocking/illegal/with 42 proposals/unlock an irrelevant stake/status: VotingReady retract votes: True/stake,1405758257,3635766,26608 -Agora/Proposal/validator/unlocking/illegal/with 42 proposals/unlock an irrelevant stake/status: VotingReady retract votes: False/stake,1405758257,3635766,26608 -Agora/Proposal/validator/unlocking/illegal/with 42 proposals/unlock an irrelevant stake/status: Locked retract votes: True/stake,1405758257,3635766,26608 -Agora/Proposal/validator/unlocking/illegal/with 42 proposals/unlock an irrelevant stake/status: Locked retract votes: False/stake,1405758257,3635766,26608 -Agora/Proposal/validator/unlocking/illegal/with 42 proposals/unlock an irrelevant stake/status: Finished retract votes: True/stake,1405758257,3635766,26608 -Agora/Proposal/validator/unlocking/illegal/with 42 proposals/unlock an irrelevant stake/status: Finished retract votes: False/stake,1405758257,3635766,26608 -Agora/Proposal/validator/unlocking/illegal/with 42 proposals/remove creator too early/status: Draft/stake,1700152469,4465470,27236 -Agora/Proposal/validator/unlocking/illegal/with 42 proposals/remove creator too early/status: VotingReady/stake,1700152469,4465470,27236 -Agora/Proposal/validator/unlocking/illegal/with 42 proposals/remove creator too early/status: Locked/stake,1700152469,4465470,27236 -Agora/Proposal/validator/unlocking/illegal/with 42 proposals/creator: retract votes/stake,1700152469,4465470,27152 -Agora/AuthorityToken/singleAuthorityTokenBurned/Correct simple,19822997,52452,427 -Agora/AuthorityToken/singleAuthorityTokenBurned/Correct many inputs,32009395,84810,527 -Agora/Treasury/Validator/Positive/Allows for effect changes,31553082,81982,1423 -Agora/AuthorityToken/singleAuthorityTokenBurned/Correct simple,19822997,52452,427 -Agora/AuthorityToken/singleAuthorityTokenBurned/Correct many inputs,32009395,84810,527 -Agora/Governor/policy/totally legal,70301827,197578,2576 -Agora/Governor/validator/mutate/legal,119848510,323653,9297 +Agora/Effects/Treasury Withdrawal Effect/totally valid/effect,404221466,1186248,4516 +Agora/Effects/Treasury Withdrawal Effect/totally valid/treasury,55756262,158723,1778 +Agora/Effects/Treasury Withdrawal Effect/totally valid/authority,12933097,37168,2361 +Agora/Effects/Treasury Withdrawal Effect/bad received value/treasury,55756262,158723,1796 +Agora/Effects/Treasury Withdrawal Effect/bad received value/authority,12933097,37168,2379 +Agora/Effects/Treasury Withdrawal Effect/bad receiver order/treasury,55756262,158723,1778 +Agora/Effects/Treasury Withdrawal Effect/bad receiver order/authority,12933097,37168,2361 +Agora/Effects/Governor Mutation Effect/validator/valid new governor datum/governor validator should pass,127096099,363203,11972 +Agora/Effects/Governor Mutation Effect/validator/valid new governor datum/effect validator should pass,141642226,381311,4691 +Agora/Stake/policy/create/valid/stake owner: pub key,77615577,199376,3624 +Agora/Stake/policy/create/valid/stake owner: script,90754833,237955,3659 +Agora/Stake/validator/destroy/legal/One stake/stake validator,100840334,274931,8023 +Agora/Stake/validator/destroy/legal/One stake/stake policy,29665872,85956,3611 +Agora/Stake/validator/destroy/legal/Multiple stake/stake validator,667043159,1618397,11276 +Agora/Stake/validator/destroy/legal/Multiple stake/stake policy,292337523,820464,6863 +Agora/Stake/validator/destroy/illegal/Destroy locked stakes/stake policy,292337523,820464,6934 +Agora/Stake/validator/destroy/illegal/not authorized by owner/stake policy,292337523,820464,6832 +Agora/Stake/validator/destroy/illegal/not authorized by owner/stake policy,292337523,820464,6863 +Agora/Stake/validator/stakeDepositWithdraw deposit,139816438,368808,8138 +Agora/Stake/validator/stakeDepositWithdraw withdraw,139816438,368808,8130 +Agora/Stake/validator/set delegate/override existing delegate,171344186,438637,8269 +Agora/Stake/validator/set delegate/remove existing delegate,162009190,415249,8199 +Agora/Stake/validator/set delegate/set delegate to something,168915198,431537,8199 +Agora/Proposal/policy (proposal creation)/legal/proposal,34112747,89817,2780 +Agora/Proposal/policy (proposal creation)/legal/governor,288774078,753024,12477 +Agora/Proposal/policy (proposal creation)/legal/stake,298765565,751514,8975 +Agora/Proposal/policy (proposal creation)/illegal/invalid next proposal id/proposal,34112747,89817,2780 +Agora/Proposal/policy (proposal creation)/illegal/invalid next proposal id/stake,298765565,751514,8975 +Agora/Proposal/policy (proposal creation)/illegal/use other's stake/proposal,34112747,89817,2749 +Agora/Proposal/policy (proposal creation)/illegal/use other's stake/governor,288774078,753024,12446 +Agora/Proposal/policy (proposal creation)/illegal/altered stake/proposal,34112747,89817,2780 +Agora/Proposal/policy (proposal creation)/illegal/invalid stake locks/proposal,34112747,89817,2795 +Agora/Proposal/policy (proposal creation)/illegal/invalid stake locks/governor,288774078,753024,12492 +Agora/Proposal/policy (proposal creation)/illegal/has reached maximum proposals limit/proposal,34112747,89817,2804 +Agora/Proposal/policy (proposal creation)/illegal/has reached maximum proposals limit/stake,315124817,798642,9011 +Agora/Proposal/policy (proposal creation)/illegal/loose time range/proposal,34112747,89817,2780 +Agora/Proposal/policy (proposal creation)/illegal/loose time range/stake,298765565,751514,8975 +Agora/Proposal/policy (proposal creation)/illegal/open time range/proposal,34112747,89817,2776 +Agora/Proposal/policy (proposal creation)/illegal/open time range/stake,298765565,751514,8971 +Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/VotingReady/proposal,34112747,89817,2780 +Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/VotingReady/stake,298765565,751514,8975 +Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/Locked/proposal,34112747,89817,2780 +Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/Locked/stake,298765565,751514,8975 +Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/Finished/proposal,34112747,89817,2780 +Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/Finished/stake,298765565,751514,8975 +Agora/Proposal/policy (proposal creation)/illegal/fake SST/proposal,34112747,89817,2687 +Agora/Proposal/policy (proposal creation)/illegal/wrong governor redeemer/stake,298765565,751514,8975 +Agora/Proposal/policy (proposal creation)/illegal/wrong governor redeemer/stake,298765565,751514,8975 +Agora/Proposal/validator/cosignature/legal/proposal,207214929,576996,12455 +Agora/Proposal/validator/cosignature/legal/stake,260705694,683894,8772 +Agora/Proposal/validator/cosignature/illegal/insufficient staked amount/stake,260705694,683894,8772 +Agora/Proposal/validator/cosignature/illegal/proposal locks not updated/proposal,207214929,576996,12448 +Agora/Proposal/validator/cosignature/illegal/duplicate cosigners/stake,268885320,707458,8792 +Agora/Proposal/validator/cosignature/illegal/cosigners not updated/stake,260705694,683894,8738 +Agora/Proposal/validator/cosignature/illegal/cosign after draft/(negative test)/stake,260705694,683894,8772 +Agora/Proposal/validator/cosignature/illegal/cosign after draft/(negative test)/stake,260705694,683894,8772 +Agora/Proposal/validator/cosignature/illegal/cosign after draft/(negative test)/stake,260705694,683894,8772 +Agora/Proposal/validator/voting/legal/different number of stakes/1 stakes/by owner/proposal,232103182,655396,12312 +Agora/Proposal/validator/voting/legal/different number of stakes/1 stakes/by owner/stake,284909132,750121,8645 +Agora/Proposal/validator/voting/legal/different number of stakes/1 stakes/by delegatee/proposal,232103182,655396,12312 +Agora/Proposal/validator/voting/legal/different number of stakes/1 stakes/by delegatee/stake,292069583,768378,8645 +Agora/Proposal/validator/voting/legal/different number of stakes/3 stakes/by owner/proposal,353368568,983342,13546 +Agora/Proposal/validator/voting/legal/different number of stakes/3 stakes/by owner/stake,594284390,1487279,9879 +Agora/Proposal/validator/voting/legal/different number of stakes/3 stakes/by delegatee/proposal,353368568,983342,13546 +Agora/Proposal/validator/voting/legal/different number of stakes/3 stakes/by delegatee/stake,601444841,1505536,9879 +Agora/Proposal/validator/voting/legal/different number of stakes/5 stakes/by owner/proposal,474633954,1311288,14779 +Agora/Proposal/validator/voting/legal/different number of stakes/5 stakes/by owner/stake,903659648,2224437,11112 +Agora/Proposal/validator/voting/legal/different number of stakes/5 stakes/by delegatee/proposal,474633954,1311288,14779 +Agora/Proposal/validator/voting/legal/different number of stakes/5 stakes/by delegatee/stake,910820099,2242694,11112 +Agora/Proposal/validator/voting/legal/different number of stakes/7 stakes/by owner/proposal,595899340,1639234,16012 +Agora/Proposal/validator/voting/legal/different number of stakes/7 stakes/by owner/stake,1213034906,2961595,12345 +Agora/Proposal/validator/voting/legal/different number of stakes/7 stakes/by delegatee/proposal,595899340,1639234,16012 +Agora/Proposal/validator/voting/legal/different number of stakes/7 stakes/by delegatee/stake,1220195357,2979852,12345 +Agora/Proposal/validator/voting/legal/different number of stakes/9 stakes/by owner/proposal,717164726,1967180,17244 +Agora/Proposal/validator/voting/legal/different number of stakes/9 stakes/by owner/stake,1522410164,3698753,13577 +Agora/Proposal/validator/voting/legal/different number of stakes/9 stakes/by delegatee/proposal,717164726,1967180,17244 +Agora/Proposal/validator/voting/legal/different number of stakes/9 stakes/by delegatee/stake,1529570615,3717010,13577 +Agora/Proposal/validator/voting/legal/transparent non-GT tokens/proposal,232103182,655396,12312 +Agora/Proposal/validator/voting/legal/transparent non-GT tokens/stake,284909132,750121,8645 +Agora/Proposal/validator/voting/legal/Delegatee vote with own and delegated stakes in one tx/proposal,472204966,1304188,14709 +Agora/Proposal/validator/voting/legal/Delegatee vote with own and delegated stakes in one tx/stake,912220723,2239362,11042 +Agora/Proposal/validator/voting/illegal/vote for nonexistent outcome/stake,284909132,750121,8653 +Agora/Proposal/validator/voting/illegal/unauthorized tx/proposal,232103182,655396,12312 +Agora/Proposal/validator/voting/illegal/more than one proposals/stake,284909132,750121,8653 +Agora/Proposal/validator/voting/illegal/locks not added/proposal,474633954,1311288,14724 +Agora/Proposal/validator/voting/illegal/attempt to burn stakes/proposal,436453459,1199088,13686 +Agora/Proposal/validator/voting/illegal/insufficient staked amount/stake,284909132,750121,8640 +Agora/Proposal/validator/voting/illegal/insufficient staked amount/stake,903659648,2224437,11090 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Draft to VotingReady/proposal,245633362,688711,12924 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from VotingReady to Locked/proposal,225020464,631696,12686 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Locked to Finished/proposal,238582537,659308,14008 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Locked to Finished/governor,443068460,1180768,13498 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Locked to Finished/authority,96904041,243358,4008 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Draft to VotingReady/proposal,242285392,677875,12645 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from VotingReady to Locked/proposal,221672494,620860,12407 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Locked to Finished/proposal,235234567,648472,13549 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Locked to Finished/governor,440932826,1173958,13132 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Locked to Finished/authority,91838439,229702,3642 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to failed state/from Draft to Finished/proposal,216079711,610357,12679 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to failed state/from VotingReady to Finished/proposal,214351328,600067,12680 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to failed state/from Locked to Finished/proposal,226615452,631111,12680 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to failed state/from Draft to Finished/proposal,212731741,599521,12400 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to failed state/from VotingReady to Finished/proposal,211003358,589231,12401 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to failed state/from Locked to Finished/proposal,223267482,620275,12401 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to finished state with inline datum/from Locked to Finished/proposal,238582537,659308,13803 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to finished state with inline datum/from Locked to Finished/governor,453591002,1185814,13293 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to finished state with inline datum/from Locked to Finished/authority,96904041,243358,3803 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to finished state with inline datum/from Locked to Finished/proposal,235234567,648472,13344 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to finished state with inline datum/from Locked to Finished/governor,451455368,1179004,12927 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to finished state with inline datum/from Locked to Finished/authority,91838439,229702,3437 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/authority,96904041,243358,4008 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/authority,91838439,229702,3642 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/to next state too late/from Locked/governor,443068460,1180768,13498 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/to next state too late/from Locked/authority,96904041,243358,4008 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/to next state too late/from Locked/governor,440932826,1173958,13132 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/to next state too late/from Locked/authority,91838439,229702,3642 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/forget to mint GATs/proposal,235234567,648472,12904 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/mint GATs for wrong validators/proposal,235234567,648472,13549 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/mint GATs for wrong validators/authority,91838439,229702,3642 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/mint GATs with bad token name/proposal,235234567,648472,13581 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/mint GATs with bad token name/authority,91838439,229702,3674 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/wrong GAT datum/proposal,235234567,648472,13543 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/wrong GAT datum/authority,91838439,229702,3636 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/invalid governor output datum/proposal,235234567,648472,13549 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/invalid governor output datum/authority,91838439,229702,3642 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/wrong governor redeemer/proposal,235234567,648472,13549 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Draft to VotingReady/proposal,319394762,891621,13840 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from VotingReady to Locked/proposal,302476750,844594,13602 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Locked to Finished/proposal,312343937,862218,14923 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Locked to Finished/governor,484572028,1297304,14108 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Locked to Finished/authority,96904041,243358,4618 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Draft to VotingReady/proposal,312698822,869949,13279 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from VotingReady to Locked/proposal,295780810,822922,13041 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Locked to Finished/proposal,305647997,840546,14184 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Locked to Finished/governor,480913441,1285076,13556 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Locked to Finished/authority,91838439,229702,4066 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to failed state/from Draft to Finished/proposal,289841111,813267,13595 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to failed state/from VotingReady to Finished/proposal,288112728,802977,13596 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to failed state/from Locked to Finished/proposal,300376852,834021,13596 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to failed state/from Draft to Finished/proposal,283145171,791595,13034 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to failed state/from VotingReady to Finished/proposal,281416788,781305,13035 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to failed state/from Locked to Finished/proposal,293680912,812349,13035 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to finished state with inline datum/from Locked to Finished/proposal,312343937,862218,14718 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to finished state with inline datum/from Locked to Finished/governor,495094570,1302350,13903 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to finished state with inline datum/from Locked to Finished/authority,96904041,243358,4413 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to finished state with inline datum/from Locked to Finished/proposal,305647997,840546,13979 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to finished state with inline datum/from Locked to Finished/governor,491435983,1290122,13351 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to finished state with inline datum/from Locked to Finished/authority,91838439,229702,3861 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/authority,96904041,243358,4618 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/authority,91838439,229702,4066 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/to next state too late/from Locked/governor,484572028,1297304,14108 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/to next state too late/from Locked/authority,96904041,243358,4618 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/to next state too late/from Locked/governor,480913441,1285076,13556 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/to next state too late/from Locked/authority,91838439,229702,4066 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/forget to mint GATs/proposal,305647997,840546,13538 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/mint GATs for wrong validators/proposal,305647997,840546,14184 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/mint GATs for wrong validators/authority,91838439,229702,4066 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/mint GATs with bad token name/proposal,305647997,840546,14216 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/mint GATs with bad token name/authority,91838439,229702,4098 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/wrong GAT datum/proposal,305647997,840546,14178 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/wrong GAT datum/authority,91838439,229702,4060 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/invalid governor output datum/proposal,305647997,840546,14184 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/invalid governor output datum/authority,91838439,229702,4066 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/wrong governor redeemer/proposal,305647997,840546,14184 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Draft to VotingReady/proposal,540678962,1500351,16587 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from VotingReady to Locked/proposal,534845608,1483288,16349 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Locked to Finished/proposal,533628137,1470948,17670 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Locked to Finished/governor,609082732,1646912,15939 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Locked to Finished/authority,96904041,243358,6449 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Draft to VotingReady/proposal,523939112,1446171,15186 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from VotingReady to Locked/proposal,518105758,1429108,14948 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Locked to Finished/proposal,516888287,1416768,16091 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Locked to Finished/governor,600855286,1618430,14827 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Locked to Finished/authority,91838439,229702,5337 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to failed state/from Draft to Finished/proposal,511125311,1421997,16342 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to failed state/from VotingReady to Finished/proposal,509396928,1411707,16343 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to failed state/from Locked to Finished/proposal,521661052,1442751,16343 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to failed state/from Draft to Finished/proposal,494385461,1367817,14941 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to failed state/from VotingReady to Finished/proposal,492657078,1357527,14942 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to failed state/from Locked to Finished/proposal,504921202,1388571,14942 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to finished state with inline datum/from Locked to Finished/proposal,533628137,1470948,17465 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to finished state with inline datum/from Locked to Finished/governor,619605274,1651958,15734 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to finished state with inline datum/from Locked to Finished/authority,96904041,243358,6244 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to finished state with inline datum/from Locked to Finished/proposal,516888287,1416768,15886 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to finished state with inline datum/from Locked to Finished/governor,611377828,1623476,14622 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to finished state with inline datum/from Locked to Finished/authority,91838439,229702,5132 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/authority,96904041,243358,6449 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/authority,91838439,229702,5337 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/to next state too late/from Locked/governor,609082732,1646912,15939 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/to next state too late/from Locked/authority,96904041,243358,6449 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/to next state too late/from Locked/governor,600855286,1618430,14827 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/to next state too late/from Locked/authority,91838439,229702,5337 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/forget to mint GATs/proposal,516888287,1416768,15445 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/mint GATs for wrong validators/proposal,516888287,1416768,16091 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/mint GATs for wrong validators/authority,91838439,229702,5337 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/mint GATs with bad token name/proposal,516888287,1416768,16123 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/mint GATs with bad token name/authority,91838439,229702,5369 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/wrong GAT datum/proposal,516888287,1416768,16085 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/wrong GAT datum/authority,91838439,229702,5331 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/invalid governor output datum/proposal,516888287,1416768,16091 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/invalid governor output datum/authority,91838439,229702,5337 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/wrong governor redeemer/proposal,516888287,1416768,16091 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Draft to VotingReady/proposal,425760556,1167807,14425 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from VotingReady to Locked/proposal,255371184,715424,13097 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Locked to Finished/proposal,268933257,743036,14418 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Locked to Finished/governor,457941756,1222632,13771 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Locked to Finished/authority,96904041,243358,4281 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Draft to VotingReady/proposal,422412586,1156971,14144 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from VotingReady to Locked/proposal,252023214,704588,12816 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Locked to Finished/proposal,265585287,732200,13958 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Locked to Finished/governor,455806122,1215822,13405 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Locked to Finished/authority,91838439,229702,3915 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to failed state/from Draft to Finished/proposal,246430431,694085,13090 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to failed state/from VotingReady to Finished/proposal,244702048,683795,13091 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to failed state/from Locked to Finished/proposal,256966172,714839,13091 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to failed state/from Draft to Finished/proposal,243082461,683249,12809 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to failed state/from VotingReady to Finished/proposal,241354078,672959,12810 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to failed state/from Locked to Finished/proposal,253618202,704003,12810 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to finished state with inline datum/from Locked to Finished/proposal,268933257,743036,14213 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to finished state with inline datum/from Locked to Finished/governor,468464298,1227678,13566 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to finished state with inline datum/from Locked to Finished/authority,96904041,243358,4076 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to finished state with inline datum/from Locked to Finished/proposal,265585287,732200,13753 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to finished state with inline datum/from Locked to Finished/governor,466328664,1220868,13200 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to finished state with inline datum/from Locked to Finished/authority,91838439,229702,3710 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/authority,96904041,243358,4281 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/authority,91838439,229702,3915 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/to next state too late/from Locked/governor,457941756,1222632,13771 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/to next state too late/from Locked/authority,96904041,243358,4281 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/to next state too late/from Locked/governor,455806122,1215822,13405 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/to next state too late/from Locked/authority,91838439,229702,3915 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/forget to mint GATs/proposal,265585287,732200,13313 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/mint GATs for wrong validators/proposal,265585287,732200,13958 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/mint GATs for wrong validators/authority,91838439,229702,3915 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/mint GATs with bad token name/proposal,265585287,732200,13990 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/mint GATs with bad token name/authority,91838439,229702,3947 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/wrong GAT datum/proposal,265585287,732200,13952 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/wrong GAT datum/authority,91838439,229702,3909 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/invalid governor output datum/proposal,265585287,732200,13958 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/invalid governor output datum/authority,91838439,229702,3915 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/wrong governor redeemer/proposal,265585287,732200,13958 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Draft to VotingReady/proposal,499521956,1370717,15340 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from VotingReady to Locked/proposal,332827470,928322,14012 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Locked to Finished/proposal,342694657,945946,15333 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Locked to Finished/governor,499445324,1339168,14381 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Locked to Finished/authority,96904041,243358,4891 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Draft to VotingReady/proposal,492826016,1349045,14780 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from VotingReady to Locked/proposal,326131530,906650,13451 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Locked to Finished/proposal,335998717,924274,14594 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Locked to Finished/governor,495786737,1326940,13829 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Locked to Finished/authority,91838439,229702,4339 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to failed state/from Draft to Finished/proposal,320191831,896995,14005 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to failed state/from VotingReady to Finished/proposal,318463448,886705,14006 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to failed state/from Locked to Finished/proposal,330727572,917749,14006 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to failed state/from Draft to Finished/proposal,313495891,875323,13444 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to failed state/from VotingReady to Finished/proposal,311767508,865033,13445 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to failed state/from Locked to Finished/proposal,324031632,896077,13445 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to finished state with inline datum/from Locked to Finished/proposal,342694657,945946,15128 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to finished state with inline datum/from Locked to Finished/governor,509967866,1344214,14176 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to finished state with inline datum/from Locked to Finished/authority,96904041,243358,4686 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to finished state with inline datum/from Locked to Finished/proposal,335998717,924274,14389 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to finished state with inline datum/from Locked to Finished/governor,506309279,1331986,13624 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to finished state with inline datum/from Locked to Finished/authority,91838439,229702,4134 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/authority,96904041,243358,4891 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/authority,91838439,229702,4339 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/to next state too late/from Locked/governor,499445324,1339168,14381 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/to next state too late/from Locked/authority,96904041,243358,4891 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/to next state too late/from Locked/governor,495786737,1326940,13829 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/to next state too late/from Locked/authority,91838439,229702,4339 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/forget to mint GATs/proposal,335998717,924274,13948 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/mint GATs for wrong validators/proposal,335998717,924274,14594 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/mint GATs for wrong validators/authority,91838439,229702,4339 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/mint GATs with bad token name/proposal,335998717,924274,14626 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/mint GATs with bad token name/authority,91838439,229702,4371 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/wrong GAT datum/proposal,335998717,924274,14588 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/wrong GAT datum/authority,91838439,229702,4333 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/invalid governor output datum/proposal,335998717,924274,14594 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/invalid governor output datum/authority,91838439,229702,4339 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/wrong governor redeemer/proposal,335998717,924274,14594 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Draft to VotingReady/proposal,720806156,1979447,18086 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from VotingReady to Locked/proposal,565196328,1567016,16758 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Locked to Finished/proposal,563978857,1554676,18079 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Locked to Finished/governor,623956028,1688776,16212 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Locked to Finished/authority,96904041,243358,6722 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Draft to VotingReady/proposal,704066306,1925267,16686 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from VotingReady to Locked/proposal,548456478,1512836,15357 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Locked to Finished/proposal,547239007,1500496,16500 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Locked to Finished/governor,615728582,1660294,15100 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Locked to Finished/authority,91838439,229702,5610 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to failed state/from Draft to Finished/proposal,541476031,1505725,16751 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to failed state/from VotingReady to Finished/proposal,539747648,1495435,16752 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to failed state/from Locked to Finished/proposal,552011772,1526479,16752 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to failed state/from Draft to Finished/proposal,524736181,1451545,15350 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to failed state/from VotingReady to Finished/proposal,523007798,1441255,15351 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to failed state/from Locked to Finished/proposal,535271922,1472299,15351 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to finished state with inline datum/from Locked to Finished/proposal,563978857,1554676,17874 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to finished state with inline datum/from Locked to Finished/governor,634478570,1693822,16007 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to finished state with inline datum/from Locked to Finished/authority,96904041,243358,6517 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to finished state with inline datum/from Locked to Finished/proposal,547239007,1500496,16295 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to finished state with inline datum/from Locked to Finished/governor,626251124,1665340,14895 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to finished state with inline datum/from Locked to Finished/authority,91838439,229702,5405 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/authority,96904041,243358,6722 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/authority,91838439,229702,5610 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/to next state too late/from Locked/governor,623956028,1688776,16212 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/to next state too late/from Locked/authority,96904041,243358,6722 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/to next state too late/from Locked/governor,615728582,1660294,15100 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/to next state too late/from Locked/authority,91838439,229702,5610 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/forget to mint GATs/proposal,547239007,1500496,15854 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/mint GATs for wrong validators/proposal,547239007,1500496,16500 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/mint GATs for wrong validators/authority,91838439,229702,5610 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/mint GATs with bad token name/proposal,547239007,1500496,16532 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/mint GATs with bad token name/authority,91838439,229702,5642 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/wrong GAT datum/proposal,547239007,1500496,16494 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/wrong GAT datum/authority,91838439,229702,5604 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/invalid governor output datum/proposal,547239007,1500496,16500 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/invalid governor output datum/authority,91838439,229702,5610 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/wrong governor redeemer/proposal,547239007,1500496,16500 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Draft to VotingReady/proposal,666082992,1812368,16301 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from VotingReady to Locked/proposal,293309584,820084,13608 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Locked to Finished/proposal,306871657,847696,14929 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Locked to Finished/governor,476533376,1274962,14112 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Locked to Finished/authority,96904041,243358,4622 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Draft to VotingReady/proposal,662735022,1801532,16022 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from VotingReady to Locked/proposal,289961614,809248,13328 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Locked to Finished/proposal,303523687,836860,14471 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Locked to Finished/governor,474397742,1268152,13747 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Locked to Finished/authority,91838439,229702,4257 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to failed state/from Draft to Finished/proposal,284368831,798745,13601 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to failed state/from VotingReady to Finished/proposal,282640448,788455,13602 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to failed state/from Locked to Finished/proposal,294904572,819499,13602 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to failed state/from Draft to Finished/proposal,281020861,787909,13321 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to failed state/from VotingReady to Finished/proposal,279292478,777619,13322 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to failed state/from Locked to Finished/proposal,291556602,808663,13322 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to finished state with inline datum/from Locked to Finished/proposal,306871657,847696,14724 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to finished state with inline datum/from Locked to Finished/governor,487055918,1280008,13907 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to finished state with inline datum/from Locked to Finished/authority,96904041,243358,4417 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to finished state with inline datum/from Locked to Finished/proposal,303523687,836860,14266 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to finished state with inline datum/from Locked to Finished/governor,484920284,1273198,13542 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to finished state with inline datum/from Locked to Finished/authority,91838439,229702,4052 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/authority,96904041,243358,4622 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/authority,91838439,229702,4257 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/to next state too late/from Locked/governor,476533376,1274962,14112 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/to next state too late/from Locked/authority,96904041,243358,4622 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/to next state too late/from Locked/governor,474397742,1268152,13747 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/to next state too late/from Locked/authority,91838439,229702,4257 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/forget to mint GATs/proposal,303523687,836860,13825 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/mint GATs for wrong validators/proposal,303523687,836860,14471 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/mint GATs for wrong validators/authority,91838439,229702,4257 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/mint GATs with bad token name/proposal,303523687,836860,14503 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/mint GATs with bad token name/authority,91838439,229702,4289 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/wrong GAT datum/proposal,303523687,836860,14465 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/wrong GAT datum/authority,91838439,229702,4251 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/invalid governor output datum/proposal,303523687,836860,14471 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/invalid governor output datum/authority,91838439,229702,4257 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/wrong governor redeemer/proposal,303523687,836860,14471 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Draft to VotingReady/proposal,739844392,2015278,17217 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from VotingReady to Locked/proposal,370765870,1032982,14523 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Locked to Finished/proposal,380633057,1050606,15844 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Locked to Finished/governor,518036944,1391498,14722 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Locked to Finished/authority,96904041,243358,5232 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Draft to VotingReady/proposal,733148452,1993606,16657 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from VotingReady to Locked/proposal,364069930,1011310,13964 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Locked to Finished/proposal,373937117,1028934,15106 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Locked to Finished/governor,514378357,1379270,14170 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Locked to Finished/authority,91838439,229702,4680 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to failed state/from Draft to Finished/proposal,358130231,1001655,14516 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to failed state/from VotingReady to Finished/proposal,356401848,991365,14517 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to failed state/from Locked to Finished/proposal,368665972,1022409,14517 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to failed state/from Draft to Finished/proposal,351434291,979983,13957 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to failed state/from VotingReady to Finished/proposal,349705908,969693,13958 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to failed state/from Locked to Finished/proposal,361970032,1000737,13958 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to finished state with inline datum/from Locked to Finished/proposal,380633057,1050606,15640 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to finished state with inline datum/from Locked to Finished/governor,528559486,1396544,14518 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to finished state with inline datum/from Locked to Finished/authority,96904041,243358,5028 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to finished state with inline datum/from Locked to Finished/proposal,373937117,1028934,14901 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to finished state with inline datum/from Locked to Finished/governor,524900899,1384316,13965 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to finished state with inline datum/from Locked to Finished/authority,91838439,229702,4475 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/authority,96904041,243358,5232 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/authority,91838439,229702,4680 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/to next state too late/from Locked/governor,518036944,1391498,14722 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/to next state too late/from Locked/authority,96904041,243358,5232 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/to next state too late/from Locked/governor,514378357,1379270,14170 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/to next state too late/from Locked/authority,91838439,229702,4680 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/forget to mint GATs/proposal,373937117,1028934,14461 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/mint GATs for wrong validators/proposal,373937117,1028934,15106 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/mint GATs for wrong validators/authority,91838439,229702,4680 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/mint GATs with bad token name/proposal,373937117,1028934,15138 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/mint GATs with bad token name/authority,91838439,229702,4712 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/wrong GAT datum/proposal,373937117,1028934,15100 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/wrong GAT datum/authority,91838439,229702,4674 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/invalid governor output datum/proposal,373937117,1028934,15106 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/invalid governor output datum/authority,91838439,229702,4680 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/wrong governor redeemer/proposal,373937117,1028934,15106 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Draft to VotingReady/proposal,961128592,2624008,19964 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from VotingReady to Locked/proposal,603134728,1671676,17270 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Locked to Finished/proposal,601917257,1659336,18592 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Locked to Finished/governor,642547648,1741106,16554 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Locked to Finished/authority,96904041,243358,7064 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Draft to VotingReady/proposal,944388742,2569828,18563 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from VotingReady to Locked/proposal,586394878,1617496,15870 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Locked to Finished/proposal,585177407,1605156,17012 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Locked to Finished/governor,634320202,1712624,15441 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Locked to Finished/authority,91838439,229702,5951 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to failed state/from Draft to Finished/proposal,579414431,1610385,17263 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to failed state/from VotingReady to Finished/proposal,577686048,1600095,17264 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to failed state/from Locked to Finished/proposal,589950172,1631139,17264 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to failed state/from Draft to Finished/proposal,562674581,1556205,15863 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to failed state/from VotingReady to Finished/proposal,560946198,1545915,15864 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to failed state/from Locked to Finished/proposal,573210322,1576959,15864 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to finished state with inline datum/from Locked to Finished/proposal,601917257,1659336,18387 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to finished state with inline datum/from Locked to Finished/governor,653070190,1746152,16349 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to finished state with inline datum/from Locked to Finished/authority,96904041,243358,6859 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to finished state with inline datum/from Locked to Finished/proposal,585177407,1605156,16807 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to finished state with inline datum/from Locked to Finished/governor,644842744,1717670,15236 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to finished state with inline datum/from Locked to Finished/authority,91838439,229702,5746 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/authority,96904041,243358,7064 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/authority,91838439,229702,5951 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/to next state too late/from Locked/governor,642547648,1741106,16554 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/to next state too late/from Locked/authority,96904041,243358,7064 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/to next state too late/from Locked/governor,634320202,1712624,15441 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/to next state too late/from Locked/authority,91838439,229702,5951 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/forget to mint GATs/proposal,585177407,1605156,16367 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/mint GATs for wrong validators/proposal,585177407,1605156,17012 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/mint GATs for wrong validators/authority,91838439,229702,5951 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/mint GATs with bad token name/proposal,585177407,1605156,17044 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/mint GATs with bad token name/authority,91838439,229702,5983 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/wrong GAT datum/proposal,585177407,1605156,17006 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/wrong GAT datum/authority,91838439,229702,5945 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/invalid governor output datum/proposal,585177407,1605156,17012 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/invalid governor output datum/authority,91838439,229702,5951 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/wrong governor redeemer/proposal,585177407,1605156,17012 +Agora/Proposal/validator/unlocking/legal/with 1 stakes/voter: retract votes while voting/stake,289124604,745249,8864 +Agora/Proposal/validator/unlocking/legal/with 1 stakes/voter: retract votes while voting/proposal,246288485,689010,12537 +Agora/Proposal/validator/unlocking/legal/with 1 stakes/voter: retract votes while voting by delegatee/stake,296285055,763506,8864 +Agora/Proposal/validator/unlocking/legal/with 1 stakes/voter: retract votes while voting by delegatee/proposal,246288485,689010,12537 +Agora/Proposal/validator/unlocking/legal/with 1 stakes/voter/creator: retract votes while voting/stake,301278945,780103,8883 +Agora/Proposal/validator/unlocking/legal/with 1 stakes/voter/creator: retract votes while voting/proposal,257516709,722104,12550 +Agora/Proposal/validator/unlocking/legal/with 1 stakes/creator: remove creator lock after voting/stake,286791790,738956,8861 +Agora/Proposal/validator/unlocking/legal/with 1 stakes/creator: remove creator lock after voting/proposal,190534728,531612,12538 +Agora/Proposal/validator/unlocking/legal/with 1 stakes/Voter: remove lock after voting/stake,289129364,745353,8869 +Agora/Proposal/validator/unlocking/legal/with 1 stakes/Voter: remove lock after voting/proposal,192607746,537208,12542 +Agora/Proposal/validator/unlocking/legal/with 3 stakes/voter: retract votes while voting/stake,595103204,1436905,10217 +Agora/Proposal/validator/unlocking/legal/with 3 stakes/voter: retract votes while voting/proposal,400095783,1110840,13890 +Agora/Proposal/validator/unlocking/legal/with 3 stakes/voter: retract votes while voting by delegatee/stake,602263655,1455162,10217 +Agora/Proposal/validator/unlocking/legal/with 3 stakes/voter: retract votes while voting by delegatee/proposal,400095783,1110840,13890 +Agora/Proposal/validator/unlocking/legal/with 3 stakes/voter/creator: retract votes while voting/stake,631566227,1541467,10263 +Agora/Proposal/validator/unlocking/legal/with 3 stakes/voter/creator: retract votes while voting/proposal,433780455,1210122,13930 +Agora/Proposal/validator/unlocking/legal/with 3 stakes/creator: remove creator lock after voting/stake,585842806,1413218,10206 +Agora/Proposal/validator/unlocking/legal/with 3 stakes/creator: remove creator lock after voting/proposal,260160606,702918,13883 +Agora/Proposal/validator/unlocking/legal/with 3 stakes/Voter: remove lock after voting/stake,592855528,1432409,10222 +Agora/Proposal/validator/unlocking/legal/with 3 stakes/Voter: remove lock after voting/proposal,266379660,719706,13895 +Agora/Proposal/validator/unlocking/legal/with 5 stakes/voter: retract votes while voting/stake,920728460,2160001,11571 +Agora/Proposal/validator/unlocking/legal/with 5 stakes/voter: retract votes while voting/proposal,553903081,1532670,15244 +Agora/Proposal/validator/unlocking/legal/with 5 stakes/voter: retract votes while voting by delegatee/stake,927888911,2178258,11571 +Agora/Proposal/validator/unlocking/legal/with 5 stakes/voter: retract votes while voting by delegatee/proposal,553903081,1532670,15244 +Agora/Proposal/validator/unlocking/legal/with 5 stakes/voter/creator: retract votes while voting/stake,981500165,2334271,11642 +Agora/Proposal/validator/unlocking/legal/with 5 stakes/voter/creator: retract votes while voting/proposal,610044201,1698140,15309 +Agora/Proposal/validator/unlocking/legal/with 5 stakes/creator: remove creator lock after voting/stake,904540478,2118920,11552 +Agora/Proposal/validator/unlocking/legal/with 5 stakes/creator: remove creator lock after voting/proposal,329786484,874224,15229 +Agora/Proposal/validator/unlocking/legal/with 5 stakes/Voter: remove lock after voting/stake,916228348,2150905,11576 +Agora/Proposal/validator/unlocking/legal/with 5 stakes/Voter: remove lock after voting/proposal,340151574,902204,15249 +Agora/Proposal/validator/unlocking/legal/with 7 stakes/voter: retract votes while voting/stake,1266000372,2914537,12924 +Agora/Proposal/validator/unlocking/legal/with 7 stakes/voter: retract votes while voting/proposal,707710379,1954500,16597 +Agora/Proposal/validator/unlocking/legal/with 7 stakes/voter: retract votes while voting by delegatee/stake,1273160823,2932794,12924 +Agora/Proposal/validator/unlocking/legal/with 7 stakes/voter: retract votes while voting by delegatee/proposal,707710379,1954500,16597 +Agora/Proposal/validator/unlocking/legal/with 7 stakes/voter/creator: retract votes while voting/stake,1351080759,3158515,13021 +Agora/Proposal/validator/unlocking/legal/with 7 stakes/voter/creator: retract votes while voting/proposal,786307947,2186158,16688 +Agora/Proposal/validator/unlocking/legal/with 7 stakes/creator: remove creator lock after voting/stake,1242884806,2856062,12897 +Agora/Proposal/validator/unlocking/legal/with 7 stakes/creator: remove creator lock after voting/proposal,399412362,1045530,16574 +Agora/Proposal/validator/unlocking/legal/with 7 stakes/Voter: remove lock after voting/stake,1259247824,2900841,12929 +Agora/Proposal/validator/unlocking/legal/with 7 stakes/Voter: remove lock after voting/proposal,413923488,1084702,16602 +Agora/Proposal/validator/unlocking/legal/with 9 stakes/voter: retract votes while voting/stake,1630918940,3700513,14277 +Agora/Proposal/validator/unlocking/legal/with 9 stakes/voter: retract votes while voting/proposal,861517677,2376330,17950 +Agora/Proposal/validator/unlocking/legal/with 9 stakes/voter: retract votes while voting by delegatee/stake,1638079391,3718770,14277 +Agora/Proposal/validator/unlocking/legal/with 9 stakes/voter: retract votes while voting by delegatee/proposal,861517677,2376330,17950 +Agora/Proposal/validator/unlocking/legal/with 9 stakes/voter/creator: retract votes while voting/stake,1740308009,4014199,14401 +Agora/Proposal/validator/unlocking/legal/with 9 stakes/voter/creator: retract votes while voting/proposal,962571693,2674176,18068 +Agora/Proposal/validator/unlocking/legal/with 9 stakes/creator: remove creator lock after voting/stake,1600875790,3624644,14242 +Agora/Proposal/validator/unlocking/legal/with 9 stakes/creator: remove creator lock after voting/proposal,469038240,1216836,17919 +Agora/Proposal/validator/unlocking/legal/with 9 stakes/Voter: remove lock after voting/stake,1621913956,3682217,14282 +Agora/Proposal/validator/unlocking/legal/with 9 stakes/Voter: remove lock after voting/proposal,487695402,1267200,17955 +Agora/Proposal/validator/unlocking/legal/with 11 stakes/voter: retract votes while voting/stake,2015484164,4517929,15632 +Agora/Proposal/validator/unlocking/legal/with 11 stakes/voter: retract votes while voting/proposal,1015324975,2798160,19305 +Agora/Proposal/validator/unlocking/legal/with 11 stakes/voter: retract votes while voting by delegatee/stake,2022644615,4536186,15632 +Agora/Proposal/validator/unlocking/legal/with 11 stakes/voter: retract votes while voting by delegatee/proposal,1015324975,2798160,19305 +Agora/Proposal/validator/unlocking/legal/with 11 stakes/voter/creator: retract votes while voting/stake,2149181915,4901323,15781 +Agora/Proposal/validator/unlocking/legal/with 11 stakes/voter/creator: retract votes while voting/proposal,1138835439,3162194,19448 +Agora/Proposal/validator/unlocking/legal/with 11 stakes/creator: remove creator lock after voting/stake,1978513430,4424666,15588 +Agora/Proposal/validator/unlocking/legal/with 11 stakes/creator: remove creator lock after voting/proposal,538664118,1388142,19265 +Agora/Proposal/validator/unlocking/legal/with 11 stakes/Voter: remove lock after voting/stake,2004226744,4495033,15637 +Agora/Proposal/validator/unlocking/legal/with 11 stakes/Voter: remove lock after voting/proposal,561467316,1449698,19310 +Agora/Proposal/validator/unlocking/illegal/with 1 stakes/retract votes while not voting/(negative test)/stake,288559115,744047,8864 +Agora/Proposal/validator/unlocking/illegal/with 1 stakes/retract votes while not voting/(negative test)/stake,289690093,746451,8864 +Agora/Proposal/validator/unlocking/illegal/with 1 stakes/retract votes while not voting/(negative test)/stake,289129364,745353,8864 +Agora/Proposal/validator/unlocking/illegal/with 1 stakes/remove creator too early/(negative test)/proposal,188838261,528006,12538 +Agora/Proposal/validator/unlocking/illegal/with 1 stakes/remove creator too early/(negative test)/proposal,196647635,546514,12538 +Agora/Proposal/validator/unlocking/illegal/with 1 stakes/remove creator too early/(negative test)/proposal,189969239,530410,12538 +Agora/Proposal/validator/unlocking/illegal/with 1 stakes/creator: retract votes/stake,285078263,740906,8863 +Agora/Proposal/validator/unlocking/illegal/with 1 stakes/change output stake value/proposal,246288485,689010,12534 +Agora/Proposal/validator/unlocking/illegal/with 1 stakes/retract votes in cooldown/proposal,257516709,722104,12550 +Agora/Proposal/validator/unlocking/illegal/with 3 stakes/retract votes while not voting/(negative test)/stake,594537715,1435703,10217 +Agora/Proposal/validator/unlocking/illegal/with 3 stakes/retract votes while not voting/(negative test)/stake,595668693,1438107,10217 +Agora/Proposal/validator/unlocking/illegal/with 3 stakes/retract votes while not voting/(negative test)/stake,592855528,1432409,10217 +Agora/Proposal/validator/unlocking/illegal/with 3 stakes/remove creator too early/(negative test)/proposal,258464139,699312,13883 +Agora/Proposal/validator/unlocking/illegal/with 3 stakes/remove creator too early/(negative test)/proposal,266273513,717820,13883 +Agora/Proposal/validator/unlocking/illegal/with 3 stakes/remove creator too early/(negative test)/proposal,259595117,701716,13883 +Agora/Proposal/validator/unlocking/illegal/with 3 stakes/creator: retract votes/stake,568229189,1400296,10222 +Agora/Proposal/validator/unlocking/illegal/with 3 stakes/change output stake value/proposal,400095783,1110840,13881 +Agora/Proposal/validator/unlocking/illegal/with 3 stakes/retract votes in cooldown/proposal,433780455,1210122,13930 +Agora/Proposal/validator/unlocking/illegal/with 5 stakes/retract votes while not voting/(negative test)/stake,920162971,2158799,11571 +Agora/Proposal/validator/unlocking/illegal/with 5 stakes/retract votes while not voting/(negative test)/stake,921293949,2161203,11571 +Agora/Proposal/validator/unlocking/illegal/with 5 stakes/retract votes while not voting/(negative test)/stake,916228348,2150905,11571 +Agora/Proposal/validator/unlocking/illegal/with 5 stakes/remove creator too early/(negative test)/proposal,328090017,870618,15229 +Agora/Proposal/validator/unlocking/illegal/with 5 stakes/remove creator too early/(negative test)/proposal,335899391,889126,15229 +Agora/Proposal/validator/unlocking/illegal/with 5 stakes/remove creator too early/(negative test)/proposal,329220995,873022,15229 +Agora/Proposal/validator/unlocking/illegal/with 5 stakes/creator: retract votes/stake,851380115,2059686,11582 +Agora/Proposal/validator/unlocking/illegal/with 5 stakes/change output stake value/proposal,553903081,1532670,15229 +Agora/Proposal/validator/unlocking/illegal/with 5 stakes/retract votes in cooldown/proposal,610044201,1698140,15309 +Agora/Proposal/validator/unlocking/illegal/with 7 stakes/retract votes while not voting/(negative test)/stake,1265434883,2913335,12924 +Agora/Proposal/validator/unlocking/illegal/with 7 stakes/retract votes while not voting/(negative test)/stake,1266565861,2915739,12924 +Agora/Proposal/validator/unlocking/illegal/with 7 stakes/retract votes while not voting/(negative test)/stake,1259247824,2900841,12924 +Agora/Proposal/validator/unlocking/illegal/with 7 stakes/remove creator too early/(negative test)/proposal,397715895,1041924,16574 +Agora/Proposal/validator/unlocking/illegal/with 7 stakes/remove creator too early/(negative test)/proposal,405525269,1060432,16574 +Agora/Proposal/validator/unlocking/illegal/with 7 stakes/remove creator too early/(negative test)/proposal,398846873,1044328,16574 +Agora/Proposal/validator/unlocking/illegal/with 7 stakes/creator: retract votes/stake,1134531041,2719076,12941 +Agora/Proposal/validator/unlocking/illegal/with 7 stakes/change output stake value/proposal,707710379,1954500,16576 +Agora/Proposal/validator/unlocking/illegal/with 7 stakes/retract votes in cooldown/proposal,786307947,2186158,16688 +Agora/Proposal/validator/unlocking/illegal/with 9 stakes/retract votes while not voting/(negative test)/stake,1630353451,3699311,14277 +Agora/Proposal/validator/unlocking/illegal/with 9 stakes/retract votes while not voting/(negative test)/stake,1631484429,3701715,14277 +Agora/Proposal/validator/unlocking/illegal/with 9 stakes/retract votes while not voting/(negative test)/stake,1621913956,3682217,14277 +Agora/Proposal/validator/unlocking/illegal/with 9 stakes/remove creator too early/(negative test)/proposal,467341773,1213230,17919 +Agora/Proposal/validator/unlocking/illegal/with 9 stakes/remove creator too early/(negative test)/proposal,475151147,1231738,17919 +Agora/Proposal/validator/unlocking/illegal/with 9 stakes/remove creator too early/(negative test)/proposal,468472751,1215634,17919 +Agora/Proposal/validator/unlocking/illegal/with 9 stakes/creator: retract votes/stake,1417681967,3378466,14300 +Agora/Proposal/validator/unlocking/illegal/with 9 stakes/change output stake value/proposal,861517677,2376330,17923 +Agora/Proposal/validator/unlocking/illegal/with 9 stakes/retract votes in cooldown/proposal,962571693,2674176,18068 +Agora/Proposal/validator/unlocking/illegal/with 11 stakes/retract votes while not voting/(negative test)/stake,2014918675,4516727,15632 +Agora/Proposal/validator/unlocking/illegal/with 11 stakes/retract votes while not voting/(negative test)/stake,2016049653,4519131,15632 +Agora/Proposal/validator/unlocking/illegal/with 11 stakes/retract votes while not voting/(negative test)/stake,2004226744,4495033,15632 +Agora/Proposal/validator/unlocking/illegal/with 11 stakes/remove creator too early/(negative test)/proposal,536967651,1384536,19265 +Agora/Proposal/validator/unlocking/illegal/with 11 stakes/remove creator too early/(negative test)/proposal,544777025,1403044,19265 +Agora/Proposal/validator/unlocking/illegal/with 11 stakes/remove creator too early/(negative test)/proposal,538098629,1386940,19265 +Agora/Proposal/validator/unlocking/illegal/with 11 stakes/creator: retract votes/stake,1700832893,4037856,15661 +Agora/Proposal/validator/unlocking/illegal/with 11 stakes/change output stake value/proposal,1015324975,2798160,19271 +Agora/Proposal/validator/unlocking/illegal/with 11 stakes/retract votes in cooldown/proposal,1138835439,3162194,19448 +Agora/AuthorityToken/singleAuthorityTokenBurned/Correct simple,26525223,76151,758 +Agora/AuthorityToken/singleAuthorityTokenBurned/Correct many inputs,51650175,146621,858 +Agora/AuthorityToken/singleAuthorityTokenBurned/Correct even though scripts don't match,26525223,76151,757 +Agora/Treasury/Validator/Positive/Allows for effect changes,42901346,122424,1459 +Agora/Treasury/Validator/Positive/Fails when GAT token name is not script address,42901346,122424,1463 +Agora/AuthorityToken/singleAuthorityTokenBurned/Correct simple,26525223,76151,758 +Agora/AuthorityToken/singleAuthorityTokenBurned/Correct many inputs,51650175,146621,858 +Agora/AuthorityToken/singleAuthorityTokenBurned/Correct even though scripts don't match,26525223,76151,757 +Agora/Governor/policy/totally legal,63484709,171628,2706 +Agora/Governor/validator/mutate/legal,131994431,372499,11786 diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index f14ce0f..0000000 --- a/docs/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# Agora specification and documentation - -This folder contains documents explaining the conceptual background and technical implementation of Agora components. - -## Technical design - -The `tech-design/` subdirectory contains high level descriptions of the architecture of Agora's governance solution. - -## Plutarch - -Agora makes extensive use of [Plutarch](https://github.com/plutonomicon/plutarch). One unfamiliar with the library will be unable to suitably understand the technical parts of this documentation. The maintainers provide an extensive [guide](https://github.com/Plutonomicon/plutarch/blob/master/docs/GUIDE.md) that will familiarise the developer with the language and thereby this set of documentation. - -## Glossary - -The following is a list of terms that are used frequently throughout the documentation: - -- **DAO**: decentralised autonomous organisation. -- **Proposal**: a set of changes to a Cardano protocol, suggested by a community member. Will be enacted, if passed by the community. -- **Governance token (GT)**: the token that confers the right to vote on proposals within the protocol. May affect the user's eligibility for rewards. Examples include Liqwid's LQ. -- **Governance authority token (GAT)**: A token that grants the effects of a proposal the authority to alter the system. More information can be read [here](https://liqwid.notion.site/Authority-Tokens-b25d2011c8114e04ac9e73514e6b9421). -- **Effect**: A script for implementing changes suggested by a proposal. An effect can make numerous changes and a proposal may have multiple effects. diff --git a/docs/diagrams/GovernanceAuthorityToken.dot b/docs/diagrams/GovernanceAuthorityToken.dot deleted file mode 100644 index a4be5c4..0000000 --- a/docs/diagrams/GovernanceAuthorityToken.dot +++ /dev/null @@ -1,238 +0,0 @@ -digraph GovernanceAuthorityToken { - - rankdir = LR; - // Inputs: - - ////////////////////////////////////////////////////////////////////////////// - // governance in - governance_datum - [ shape = record - , label = - "{{ GovernanceState - }}" - ]; - - governance_addr - [ shape = record - , label = "{{ Script | Governance }}" - , style = "bold" - ]; - - ////////////////////////////////////////////////////////////////////////////// - // proposal in - proposal_datum - [ shape = record - , label = "{{ ProposalState }}" - ]; - - proposal_addr - -> proposal_redeemer - [style = "dashed", dir="none"]; - - proposal_addr - [ shape = record - , label = "{{ Script | Proposal }}" - , style = "bold" - ]; - - governance_datum - -> governance_addr [style = "dashed"]; - - governance_redeemer - [ shape = record - , label = "{{ GovernanceAction | MintAuthorityTokens }}" - ]; - - governance_addr - -> governance_redeemer - [style = "dashed", dir="none"]; - - proposal_datum -> proposal_addr [style = "dashed"]; - - ////////////////////////////////////////////////////////////////////////////// - // user wallet in - user_wallet_min_ada_in - [ shape = ellipse - , label = min utxo> - ]; - - user_wallet_in - [ shape = box - , label = "User Inputs" - , style = "bold" - , peripheries = 2 - ]; - - user_wallet_min_ada_in - -> user_wallet_in - [ style = "dashed" - ]; - - - tx1 - [ shape = diamond - , label = "Tx1" - , style = "bold" - ]; - - user_wallet_in -> tx1; - governance_addr -> tx1; - proposal_addr -> tx1; - - ////////////////////////////////////////////////////////////////////////////// - // governance out - governance_datum_out - [ shape = record - , label = - "{{ GovernanceState - }}" - ]; - - governance_addr_out - [ shape = record - , label = "{{ Script | Governance }}" - , style = "bold" - ]; - - - governance_datum_out - -> governance_addr_out - [ style = "dashed" - ]; - - ////////////////////////////////////////////////////////////////////////////// - // proposal out - proposal_datum_out - -> proposal_addr_out - [ style = "dashed" - ]; - - proposal_redeemer - [ shape = record - , label = - "{{ ProposalAction | FinishVoting }}" - ]; - - - proposal_datum_out - [ shape = record - , label = - "{{ ProposalState }}" - ]; - - proposal_addr_out - [ shape = record - , label = "{{ Script | Proposal }}" - , style = "bold" - ]; - - - ////////////////////////////////////////////////////////////////////////////// - // effect out - effect_governance_token_out - [ shape = ellipse - , label = - ]; - - effect_addr_out - [ shape = record - , label = "{{ Script | Effect }}" - , style = "bold" - ]; - - effect_governance_token_out - -> effect_addr_out - [ style = "dashed" - ]; - - effect_min_ada_out - -> effect_addr_out - [ style = "dashed" - ]; - - effect_min_ada_out - [ shape = ellipse - , label = min utxo> - ]; - - tx1 -> governance_addr_out; - tx1 -> proposal_addr_out; - tx1 -> effect_addr_out; - - ////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////// - - ////////////////////////////////////////////////////////////////////////////// - // effect in - effect_addr_out2 - [ shape = record - , label = "{{ Script | Effect }}" - , style = "bold" - ]; - - ////////////////////////////////////////////////////////////////////////////// - // market in - market_addr_in - [ shape = record - , label = "{{ Script | Market }}" - , style = "bold" - ]; - - market_datum_in - [ shape = record - , label = "{{ MarketState | params: A }}" - ]; - - market_datum_in - -> market_addr_in - [ style = "dashed" - ]; - - ////////////////////////////////////////////////////////////////////////////// - // market out - market_addr_out - [ shape = record - , label = "{{ Script | Market }}" - , style = "bold" - ]; - - market_datum_out - [ shape = record - , label = "{{ MarketState | params: f(A) }}" - ]; - - market_datum_out - -> market_addr_out - [ style = "dashed" - ]; - - tx2 - [ shape = diamond - , label = "Tx2" - , style = "bold" - ]; - - user_wallet_min_ada_out - [ shape = ellipse - , label = min utxo> - ]; - - user_wallet_out - [ shape = box - , label = "User Outputs" - , style = "bold" - , peripheries = 2 - ]; - - user_wallet_min_ada_out - -> user_wallet_out - [ style = "dashed" - ]; - - effect_addr_out -> tx2; - market_addr_in -> tx2; - tx2 -> user_wallet_out; - tx2 -> effect_addr_out2; - tx2 -> market_addr_out; - -} diff --git a/docs/diagrams/GovernanceAuthorityToken.png b/docs/diagrams/GovernanceAuthorityToken.png deleted file mode 100644 index 60878f1..0000000 Binary files a/docs/diagrams/GovernanceAuthorityToken.png and /dev/null differ diff --git a/docs/diagrams/GovernanceAuthorityToken.svg b/docs/diagrams/GovernanceAuthorityToken.svg deleted file mode 100644 index fcaee17..0000000 --- a/docs/diagrams/GovernanceAuthorityToken.svg +++ /dev/null @@ -1,322 +0,0 @@ - - - - - - -GovernanceAuthorityToken - - - -governance_datum - -GovernanceState - - - -governance_addr - -Script - -Governance - - - -governance_datum->governance_addr - - - - - -governance_redeemer - -GovernanceAction - -MintAuthorityTokens - - - -governance_addr->governance_redeemer - - - - -tx1 - -Tx1 - - - -governance_addr->tx1 - - - - - -proposal_datum - -ProposalState - - - -proposal_addr - -Script - -Proposal - - - -proposal_datum->proposal_addr - - - - - -proposal_redeemer - -ProposalAction - -FinishVoting - - - -proposal_addr->proposal_redeemer - - - - -proposal_addr->tx1 - - - - - -user_wallet_min_ada_in - -ADA: -min utxo - - - -user_wallet_in - - -User Inputs - - - -user_wallet_min_ada_in->user_wallet_in - - - - - -user_wallet_in->tx1 - - - - - -governance_addr_out - -Script - -Governance - - - -tx1->governance_addr_out - - - - - -proposal_addr_out - -Script - -Proposal - - - -tx1->proposal_addr_out - - - - - -effect_addr_out - -Script - -Effect - - - -tx1->effect_addr_out - - - - - -governance_datum_out - -GovernanceState - - - -governance_datum_out->governance_addr_out - - - - - -proposal_datum_out - -ProposalState - - - -proposal_datum_out->proposal_addr_out - - - - - -effect_governance_token_out - -GovernanceAuthorityToken: 1 - - - -effect_governance_token_out->effect_addr_out - - - - - -tx2 - -Tx2 - - - -effect_addr_out->tx2 - - - - - -effect_min_ada_out - -ADA: -min utxo - - - -effect_min_ada_out->effect_addr_out - - - - - -effect_addr_out2 - -Script - -Effect - - - -market_addr_in - -Script - -Market - - - -market_addr_in->tx2 - - - - - -market_datum_in - -MarketState - -params: A - - - -market_datum_in->market_addr_in - - - - - -market_addr_out - -Script - -Market - - - -market_datum_out - -MarketState - -params: f(A) - - - -market_datum_out->market_addr_out - - - - - -tx2->effect_addr_out2 - - - - - -tx2->market_addr_out - - - - - -user_wallet_out - - -User Outputs - - - -tx2->user_wallet_out - - - - - -user_wallet_min_ada_out - -ADA: -min utxo - - - -user_wallet_min_ada_out->user_wallet_out - - - - - diff --git a/docs/diagrams/ProposalStateMachine.png b/docs/diagrams/ProposalStateMachine.png new file mode 100644 index 0000000..0c0f915 Binary files /dev/null and b/docs/diagrams/ProposalStateMachine.png differ diff --git a/docs/diagrams/UsingAgora.dot b/docs/diagrams/UsingAgora.dot deleted file mode 100644 index 29bc58b..0000000 --- a/docs/diagrams/UsingAgora.dot +++ /dev/null @@ -1,6 +0,0 @@ -digraph { - rankdir=LR - Users -> Proposals [label="vote on"] - Proposals -> Effects [label="have one or many"] - Effects -> Components [label="alter"] -} diff --git a/docs/diagrams/UsingAgora.svg b/docs/diagrams/UsingAgora.svg deleted file mode 100644 index 7ed833d..0000000 --- a/docs/diagrams/UsingAgora.svg +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - -Users - -Users - - - -Proposals - -Proposals - - - -Users->Proposals - - -vote on - - - -Effects - -Effects - - - -Proposals->Effects - - -have one or many - - - -Components - -Components - - - -Effects->Components - - -alter - - - diff --git a/docs/diagrams/gov-overview.dot b/docs/diagrams/gov-overview.dot index 0ee05d6..2b78923 100644 --- a/docs/diagrams/gov-overview.dot +++ b/docs/diagrams/gov-overview.dot @@ -1,7 +1,9 @@ digraph { - Stakes -> Proposals [label="vote on"] + Stakes -> Proposals [label="create and vote on"] Proposals -> Effects [label="have"] + Admin-> Governor [label="initializes"] Governor -> Effects [label="issues GATs to"] Users -> Stakes [label="lock GT in"] Effects -> Treasury [label="release GT from"] + Effects -> Components [label="alter"] } diff --git a/docs/diagrams/gov-overview.png b/docs/diagrams/gov-overview.png new file mode 100644 index 0000000..1125d5c Binary files /dev/null and b/docs/diagrams/gov-overview.png differ diff --git a/docs/diagrams/gov-overview.svg b/docs/diagrams/gov-overview.svg index b52362d..94175ed 100644 --- a/docs/diagrams/gov-overview.svg +++ b/docs/diagrams/gov-overview.svg @@ -4,80 +4,106 @@ - + - + Stakes - -Stakes + +Stakes Proposals - -Proposals + +Proposals Stakes->Proposals - - -vote on + + +create and vote on Effects - -Effects + +Effects Proposals->Effects - - -have + + +have - + Treasury - -Treasury + +Treasury - + Effects->Treasury - - -release GT from + + +release GT from + + + +Components + +Components + + + +Effects->Components + + +alter + + + +Admin + +Admin - + Governor - -Governor + +Governor + + + +Admin->Governor + + +initializes - + Governor->Effects - - -issues GATs to + + +issues GATs to - + Users - -Users + +Users - + Users->Stakes - - -lock GT in + + +lock GT in diff --git a/docs/meta/README.md b/docs/meta/README.md deleted file mode 100644 index c762e15..0000000 --- a/docs/meta/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Docs meta - -This folder includes notes to assist in the writing of documentation. Those not involved with spec writing have no need for these files. diff --git a/docs/meta/status-format.md b/docs/meta/status-format.md deleted file mode 100644 index c10e71a..0000000 --- a/docs/meta/status-format.md +++ /dev/null @@ -1,119 +0,0 @@ -# Spec status format - -This document specifies a format used to denote the 'status' of a spec document. - -## Overview - -Each specification document should be headed by a simple table outlining aspects of its status in relation to: - -- Authorship: who has contributed to it? -- Ownership: who is responsible for it? -- Implementation(s): where is it used? -- Completeness: is it done yet? - -This format should be used at the start of any documentation that may be considered a _technical specification_, with a related implementation. - -## Format - -The format is as follows, with {substitutions} in curly braces. - -| Specification | Implementation | Last revision | -|:-------------:|:--------------:|:-------------:| -| {status} | {status} | {version} {date} | - --------------------- - -**Specification ownership:** {[Spec owner]} - -**Authors**: - - {[Spec owner]} - - {[Author]} - -**Implementation ownership:** {[Impl owner]} - -**Current status**: - -{Short description of status regarding __both__ specification and implementation}. - -[Spec owner]: https://genrandom.com/cats/ -[Author]: https://genrandom.com/cats/ -[Impl owner]: https://genrandom.com/cats/ - -```markdown -| Specification | Implementation | Last Revision | -|:-------------:|:--------------:|:-------------:| -| {status} | {status} | {version}, {date} | - --------------------- - -**Specification ownership:** [{owner name}] - -**Authors**: - - [{owner name}] - - [{author name}] - - -**Implementation ownership:** [{impl owner name}] - -**Current status**: - -{Short description of status} - -[{owner name}]: {github url} -[{author name}]: {github url} -[{impl owner name}]: {github url} - --------------------- -``` - -### Specification/Implementation status - -The 'Specification' and 'Implementation' status should be one of the following: - -- `WIP`: Work In Progress, currently incomplete, pending current or future work by the current owner or a future owner. -- `Draft`: Complete but pending further evaluation or changes to be accounted for in the future. -- `Final`: Complete and finalised to some degree of certainty. - -### Last revision - -- version - An optional version/revision number for the spec document. -- date - date the document was last updated in [ISO 8601 format](https://www.wikiwand.com/en/ISO_8601#/Calendar_dates) (YYYY-MM-DD). - -### Authors - -The authors and contributors of the spec document. - -### Specification ownership - -The person currently, or most recently tasked with writing and maintaining the spec document. - -### Implementation ownership - -The person currently or most recently tasked with the implementation of the features described in the document. - -- For individual features, this will be the person most recently assigned to related GitHub issues. -- For broader sections, this will be a person leading the implementation efforts for the particular system. - -## Example - -| Specification | Implementation | Last Revision | -|:-------------:|:--------------:|:-------------:| -| WIP | Draft | 0.1 2022-01-31 | - --------------------- - -**Specification ownership:** [Jack Hodgkinson] - -**Authors**: - - [Jack Hodgkinson] - - [Emily Martins] - -**Implementation ownership:** [Emily Martins] - -**Current status**: - -Draft completed in project repo. Spec needs revisiting to address issues outlined in #42. Section on staking pool behaviour is out-dated. - -[Jack Hodgkinson]: https://github.com/jhodgdev -[Emily Martins]: https://github.com/emiflake -*** diff --git a/docs/meta/style-guide.md b/docs/meta/style-guide.md deleted file mode 100644 index 664549c..0000000 --- a/docs/meta/style-guide.md +++ /dev/null @@ -1,52 +0,0 @@ -# Agora docs style guide - -This document includes a couple of notes on how Agora documentation should be written and formatted. - -## British/American spelling and grammatical differences - -The difference between British and American English is wider than a lot of people presume. Authors are permitted to use whichever of the two they learned and therefore feel more comfortable with. The only exception to this is when writing changes that would result in a 'mixing' of styles e.g. having 'color' in a sentence and 'colour' in the next. In this instance please alter your use of the language to maintain consistency. - -## Capitalised words - -The following words should always in the forms below: - -- Agora -- Liqwid -- LiqwidX -- Nix -- NixOS -- Plutus -- Plutarch - -Sensible exceptions naturally exist, including referencing shell commands (`nix-shell`) or code: - -```haskell -plutarchTerm :: Term s a -plutarchTerm = ... -``` - -## Upper-case terms - -The following terms should always be rendered in all capital letters: - -- UTXO -- EUTXO - -## Lower-case words - -The following words should always be rendered lower-case (unless used at the beginning of a sentence): - -- governance - -## ADA, Ada, ada - -Cardano's native token suffers from a frustrating variety of acceptable forms. Reputable sources can be found using all three variants listed in the header. As such, no usage shall be mandated with two caveats: - -1. Whilst the name of the currency is subject to variance, its 'symbol' is unambiguously 'ADA'. Therefore when talking about amounts e.g. 'Trillian deposits 100ADA', use 'ADA'. -2. Exercise _reasonable consistency_. The use of an 'Ada' at the beginning of the document and an 'ada' 3000 words later is not something worth losing sleep over. Inconsistency within paragraphs or (gasp!) _sentences_ should always be avoided. - -## Avoid - -The following practices should be avoided: - -- The use of '&' apart from in proper nouns such as AT\&T. diff --git a/flake.lock b/flake.lock index 0537e79..33d8aa4 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,56 @@ { "nodes": { + "CHaP": { + "flake": false, + "locked": { + "lastModified": 1666576849, + "narHash": "sha256-FDFmN3TzQsUjNxGlKKTFpLOUOnvsQMNI4o3MahJw9zA=", + "owner": "input-output-hk", + "repo": "cardano-haskell-packages", + "rev": "97aab5bc3f59108d97a6bb0c4d07ae1b79b005ca", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "ref": "repo", + "repo": "cardano-haskell-packages", + "type": "github" + } + }, + "CHaP_2": { + "flake": false, + "locked": { + "lastModified": 1668433977, + "narHash": "sha256-JcfyzvIJeeXFu4nCJdR/uI9G5pmjcIZ79YxONKVy8GU=", + "owner": "input-output-hk", + "repo": "cardano-haskell-packages", + "rev": "7ba66a729344ced7636a419c99ddaba35d3f0b8f", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "ref": "repo", + "repo": "cardano-haskell-packages", + "type": "github" + } + }, + "CHaP_3": { + "flake": false, + "locked": { + "lastModified": 1666576849, + "narHash": "sha256-FDFmN3TzQsUjNxGlKKTFpLOUOnvsQMNI4o3MahJw9zA=", + "owner": "input-output-hk", + "repo": "cardano-haskell-packages", + "rev": "97aab5bc3f59108d97a6bb0c4d07ae1b79b005ca", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "ref": "repo", + "repo": "cardano-haskell-packages", + "type": "github" + } + }, "HTTP": { "flake": false, "locked": { @@ -16,102 +67,6 @@ "type": "github" } }, - "HTTP_10": { - "flake": false, - "locked": { - "lastModified": 1451647621, - "narHash": "sha256-oHIyw3x0iKBexEo49YeUDV1k74ZtyYKGR2gNJXXRxts=", - "owner": "phadej", - "repo": "HTTP", - "rev": "9bc0996d412fef1787449d841277ef663ad9a915", - "type": "github" - }, - "original": { - "owner": "phadej", - "repo": "HTTP", - "type": "github" - } - }, - "HTTP_11": { - "flake": false, - "locked": { - "lastModified": 1451647621, - "narHash": "sha256-oHIyw3x0iKBexEo49YeUDV1k74ZtyYKGR2gNJXXRxts=", - "owner": "phadej", - "repo": "HTTP", - "rev": "9bc0996d412fef1787449d841277ef663ad9a915", - "type": "github" - }, - "original": { - "owner": "phadej", - "repo": "HTTP", - "type": "github" - } - }, - "HTTP_12": { - "flake": false, - "locked": { - "lastModified": 1451647621, - "narHash": "sha256-oHIyw3x0iKBexEo49YeUDV1k74ZtyYKGR2gNJXXRxts=", - "owner": "phadej", - "repo": "HTTP", - "rev": "9bc0996d412fef1787449d841277ef663ad9a915", - "type": "github" - }, - "original": { - "owner": "phadej", - "repo": "HTTP", - "type": "github" - } - }, - "HTTP_13": { - "flake": false, - "locked": { - "lastModified": 1451647621, - "narHash": "sha256-oHIyw3x0iKBexEo49YeUDV1k74ZtyYKGR2gNJXXRxts=", - "owner": "phadej", - "repo": "HTTP", - "rev": "9bc0996d412fef1787449d841277ef663ad9a915", - "type": "github" - }, - "original": { - "owner": "phadej", - "repo": "HTTP", - "type": "github" - } - }, - "HTTP_14": { - "flake": false, - "locked": { - "lastModified": 1451647621, - "narHash": "sha256-oHIyw3x0iKBexEo49YeUDV1k74ZtyYKGR2gNJXXRxts=", - "owner": "phadej", - "repo": "HTTP", - "rev": "9bc0996d412fef1787449d841277ef663ad9a915", - "type": "github" - }, - "original": { - "owner": "phadej", - "repo": "HTTP", - "type": "github" - } - }, - "HTTP_15": { - "flake": false, - "locked": { - "lastModified": 1451647621, - "narHash": "sha256-oHIyw3x0iKBexEo49YeUDV1k74ZtyYKGR2gNJXXRxts=", - "owner": "phadej", - "repo": "HTTP", - "rev": "9bc0996d412fef1787449d841277ef663ad9a915", - "type": "github" - }, - "original": { - "owner": "phadej", - "repo": "HTTP", - "type": "github" - } - }, "HTTP_2": { "flake": false, "locked": { @@ -208,35 +163,138 @@ "type": "github" } }, - "HTTP_8": { - "flake": false, + "blank": { "locked": { - "lastModified": 1451647621, - "narHash": "sha256-oHIyw3x0iKBexEo49YeUDV1k74ZtyYKGR2gNJXXRxts=", - "owner": "phadej", - "repo": "HTTP", - "rev": "9bc0996d412fef1787449d841277ef663ad9a915", + "lastModified": 1625557891, + "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", + "owner": "divnix", + "repo": "blank", + "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", "type": "github" }, "original": { - "owner": "phadej", - "repo": "HTTP", + "owner": "divnix", + "repo": "blank", "type": "github" } }, - "HTTP_9": { - "flake": false, + "blank_2": { "locked": { - "lastModified": 1451647621, - "narHash": "sha256-oHIyw3x0iKBexEo49YeUDV1k74ZtyYKGR2gNJXXRxts=", - "owner": "phadej", - "repo": "HTTP", - "rev": "9bc0996d412fef1787449d841277ef663ad9a915", + "lastModified": 1625557891, + "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", + "owner": "divnix", + "repo": "blank", + "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", "type": "github" }, "original": { - "owner": "phadej", - "repo": "HTTP", + "owner": "divnix", + "repo": "blank", + "type": "github" + } + }, + "blank_3": { + "locked": { + "lastModified": 1625557891, + "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", + "owner": "divnix", + "repo": "blank", + "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "blank", + "type": "github" + } + }, + "blank_4": { + "locked": { + "lastModified": 1625557891, + "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", + "owner": "divnix", + "repo": "blank", + "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "blank", + "type": "github" + } + }, + "blank_5": { + "locked": { + "lastModified": 1625557891, + "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", + "owner": "divnix", + "repo": "blank", + "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "blank", + "type": "github" + } + }, + "blank_6": { + "locked": { + "lastModified": 1625557891, + "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", + "owner": "divnix", + "repo": "blank", + "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "blank", + "type": "github" + } + }, + "blank_7": { + "locked": { + "lastModified": 1625557891, + "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", + "owner": "divnix", + "repo": "blank", + "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "blank", + "type": "github" + } + }, + "blank_8": { + "locked": { + "lastModified": 1625557891, + "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", + "owner": "divnix", + "repo": "blank", + "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "blank", + "type": "github" + } + }, + "blank_9": { + "locked": { + "lastModified": 1625557891, + "narHash": "sha256-O8/MWsPBGhhyPoPLHZAuoZiiHo9q6FLlEeIDEXuj6T4=", + "owner": "divnix", + "repo": "blank", + "rev": "5a5d2684073d9f563072ed07c871d577a6c614a8", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "blank", "type": "github" } }, @@ -257,108 +315,6 @@ "type": "github" } }, - "cabal-32_10": { - "flake": false, - "locked": { - "lastModified": 1603716527, - "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", - "owner": "haskell", - "repo": "cabal", - "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", - "type": "github" - } - }, - "cabal-32_11": { - "flake": false, - "locked": { - "lastModified": 1603716527, - "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", - "owner": "haskell", - "repo": "cabal", - "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", - "type": "github" - } - }, - "cabal-32_12": { - "flake": false, - "locked": { - "lastModified": 1603716527, - "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", - "owner": "haskell", - "repo": "cabal", - "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", - "type": "github" - } - }, - "cabal-32_13": { - "flake": false, - "locked": { - "lastModified": 1603716527, - "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", - "owner": "haskell", - "repo": "cabal", - "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", - "type": "github" - } - }, - "cabal-32_14": { - "flake": false, - "locked": { - "lastModified": 1603716527, - "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", - "owner": "haskell", - "repo": "cabal", - "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", - "type": "github" - } - }, - "cabal-32_15": { - "flake": false, - "locked": { - "lastModified": 1603716527, - "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", - "owner": "haskell", - "repo": "cabal", - "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", - "type": "github" - } - }, "cabal-32_2": { "flake": false, "locked": { @@ -461,40 +417,6 @@ "type": "github" } }, - "cabal-32_8": { - "flake": false, - "locked": { - "lastModified": 1603716527, - "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", - "owner": "haskell", - "repo": "cabal", - "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", - "type": "github" - } - }, - "cabal-32_9": { - "flake": false, - "locked": { - "lastModified": 1603716527, - "narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=", - "owner": "haskell", - "repo": "cabal", - "rev": "48bf10787e27364730dd37a42b603cee8d6af7ee", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "3.2", - "repo": "cabal", - "type": "github" - } - }, "cabal-34": { "flake": false, "locked": { @@ -512,108 +434,6 @@ "type": "github" } }, - "cabal-34_10": { - "flake": false, - "locked": { - "lastModified": 1640353650, - "narHash": "sha256-N1t6M3/wqj90AEdRkeC8i923gQYUpzSr8b40qVOZ1Rk=", - "owner": "haskell", - "repo": "cabal", - "rev": "942639c18c0cd8ec53e0a6f8d120091af35312cd", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "3.4", - "repo": "cabal", - "type": "github" - } - }, - "cabal-34_11": { - "flake": false, - "locked": { - "lastModified": 1640353650, - "narHash": "sha256-N1t6M3/wqj90AEdRkeC8i923gQYUpzSr8b40qVOZ1Rk=", - "owner": "haskell", - "repo": "cabal", - "rev": "942639c18c0cd8ec53e0a6f8d120091af35312cd", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "3.4", - "repo": "cabal", - "type": "github" - } - }, - "cabal-34_12": { - "flake": false, - "locked": { - "lastModified": 1640353650, - "narHash": "sha256-N1t6M3/wqj90AEdRkeC8i923gQYUpzSr8b40qVOZ1Rk=", - "owner": "haskell", - "repo": "cabal", - "rev": "942639c18c0cd8ec53e0a6f8d120091af35312cd", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "3.4", - "repo": "cabal", - "type": "github" - } - }, - "cabal-34_13": { - "flake": false, - "locked": { - "lastModified": 1640353650, - "narHash": "sha256-N1t6M3/wqj90AEdRkeC8i923gQYUpzSr8b40qVOZ1Rk=", - "owner": "haskell", - "repo": "cabal", - "rev": "942639c18c0cd8ec53e0a6f8d120091af35312cd", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "3.4", - "repo": "cabal", - "type": "github" - } - }, - "cabal-34_14": { - "flake": false, - "locked": { - "lastModified": 1640353650, - "narHash": "sha256-N1t6M3/wqj90AEdRkeC8i923gQYUpzSr8b40qVOZ1Rk=", - "owner": "haskell", - "repo": "cabal", - "rev": "942639c18c0cd8ec53e0a6f8d120091af35312cd", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "3.4", - "repo": "cabal", - "type": "github" - } - }, - "cabal-34_15": { - "flake": false, - "locked": { - "lastModified": 1640353650, - "narHash": "sha256-N1t6M3/wqj90AEdRkeC8i923gQYUpzSr8b40qVOZ1Rk=", - "owner": "haskell", - "repo": "cabal", - "rev": "942639c18c0cd8ec53e0a6f8d120091af35312cd", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "3.4", - "repo": "cabal", - "type": "github" - } - }, "cabal-34_2": { "flake": false, "locked": { @@ -716,40 +536,6 @@ "type": "github" } }, - "cabal-34_8": { - "flake": false, - "locked": { - "lastModified": 1640353650, - "narHash": "sha256-N1t6M3/wqj90AEdRkeC8i923gQYUpzSr8b40qVOZ1Rk=", - "owner": "haskell", - "repo": "cabal", - "rev": "942639c18c0cd8ec53e0a6f8d120091af35312cd", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "3.4", - "repo": "cabal", - "type": "github" - } - }, - "cabal-34_9": { - "flake": false, - "locked": { - "lastModified": 1640353650, - "narHash": "sha256-N1t6M3/wqj90AEdRkeC8i923gQYUpzSr8b40qVOZ1Rk=", - "owner": "haskell", - "repo": "cabal", - "rev": "942639c18c0cd8ec53e0a6f8d120091af35312cd", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "3.4", - "repo": "cabal", - "type": "github" - } - }, "cabal-36": { "flake": false, "locked": { @@ -767,108 +553,6 @@ "type": "github" } }, - "cabal-36_10": { - "flake": false, - "locked": { - "lastModified": 1641652457, - "narHash": "sha256-BlFPKP4C4HRUJeAbdembX1Rms1LD380q9s0qVDeoAak=", - "owner": "haskell", - "repo": "cabal", - "rev": "f27667f8ec360c475027dcaee0138c937477b070", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "3.6", - "repo": "cabal", - "type": "github" - } - }, - "cabal-36_11": { - "flake": false, - "locked": { - "lastModified": 1641652457, - "narHash": "sha256-BlFPKP4C4HRUJeAbdembX1Rms1LD380q9s0qVDeoAak=", - "owner": "haskell", - "repo": "cabal", - "rev": "f27667f8ec360c475027dcaee0138c937477b070", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "3.6", - "repo": "cabal", - "type": "github" - } - }, - "cabal-36_12": { - "flake": false, - "locked": { - "lastModified": 1641652457, - "narHash": "sha256-BlFPKP4C4HRUJeAbdembX1Rms1LD380q9s0qVDeoAak=", - "owner": "haskell", - "repo": "cabal", - "rev": "f27667f8ec360c475027dcaee0138c937477b070", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "3.6", - "repo": "cabal", - "type": "github" - } - }, - "cabal-36_13": { - "flake": false, - "locked": { - "lastModified": 1641652457, - "narHash": "sha256-BlFPKP4C4HRUJeAbdembX1Rms1LD380q9s0qVDeoAak=", - "owner": "haskell", - "repo": "cabal", - "rev": "f27667f8ec360c475027dcaee0138c937477b070", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "3.6", - "repo": "cabal", - "type": "github" - } - }, - "cabal-36_14": { - "flake": false, - "locked": { - "lastModified": 1641652457, - "narHash": "sha256-BlFPKP4C4HRUJeAbdembX1Rms1LD380q9s0qVDeoAak=", - "owner": "haskell", - "repo": "cabal", - "rev": "f27667f8ec360c475027dcaee0138c937477b070", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "3.6", - "repo": "cabal", - "type": "github" - } - }, - "cabal-36_15": { - "flake": false, - "locked": { - "lastModified": 1641652457, - "narHash": "sha256-BlFPKP4C4HRUJeAbdembX1Rms1LD380q9s0qVDeoAak=", - "owner": "haskell", - "repo": "cabal", - "rev": "f27667f8ec360c475027dcaee0138c937477b070", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "3.6", - "repo": "cabal", - "type": "github" - } - }, "cabal-36_2": { "flake": false, "locked": { @@ -971,1027 +655,37 @@ "type": "github" } }, - "cabal-36_8": { + "cardano-haskell-packages": { "flake": false, "locked": { - "lastModified": 1641652457, - "narHash": "sha256-BlFPKP4C4HRUJeAbdembX1Rms1LD380q9s0qVDeoAak=", - "owner": "haskell", - "repo": "cabal", - "rev": "f27667f8ec360c475027dcaee0138c937477b070", + "lastModified": 1670900592, + "narHash": "sha256-SZlQp3W0WdxB00gO5A0krgDw7CLESm5jWZ6S+GPxCxA=", + "owner": "input-output-hk", + "repo": "cardano-haskell-packages", + "rev": "052db7f6a2d5d24cfce829868d1a54e339dea229", "type": "github" }, "original": { - "owner": "haskell", - "ref": "3.6", - "repo": "cabal", + "owner": "input-output-hk", + "ref": "repo", + "repo": "cardano-haskell-packages", "type": "github" } }, - "cabal-36_9": { + "cardano-haskell-packages_2": { "flake": false, "locked": { - "lastModified": 1641652457, - "narHash": "sha256-BlFPKP4C4HRUJeAbdembX1Rms1LD380q9s0qVDeoAak=", - "owner": "haskell", - "repo": "cabal", - "rev": "f27667f8ec360c475027dcaee0138c937477b070", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "3.6", - "repo": "cabal", - "type": "github" - } - }, - "cardano-base": { - "flake": false, - "locked": { - "lastModified": 1652788515, - "narHash": "sha256-l0KgomRi6YhEoOlFnBYEXhnZO2+PW68rhfUrbMXjhCQ=", + "lastModified": 1670900592, + "narHash": "sha256-SZlQp3W0WdxB00gO5A0krgDw7CLESm5jWZ6S+GPxCxA=", "owner": "input-output-hk", - "repo": "cardano-base", - "rev": "631cb6cf1fa01ab346233b610a38b3b4cba6e6ab", + "repo": "cardano-haskell-packages", + "rev": "052db7f6a2d5d24cfce829868d1a54e339dea229", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "cardano-base", - "type": "github" - } - }, - "cardano-base_10": { - "flake": false, - "locked": { - "lastModified": 1652788515, - "narHash": "sha256-l0KgomRi6YhEoOlFnBYEXhnZO2+PW68rhfUrbMXjhCQ=", - "owner": "input-output-hk", - "repo": "cardano-base", - "rev": "631cb6cf1fa01ab346233b610a38b3b4cba6e6ab", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-base", - "type": "github" - } - }, - "cardano-base_11": { - "flake": false, - "locked": { - "lastModified": 1652788515, - "narHash": "sha256-l0KgomRi6YhEoOlFnBYEXhnZO2+PW68rhfUrbMXjhCQ=", - "owner": "input-output-hk", - "repo": "cardano-base", - "rev": "631cb6cf1fa01ab346233b610a38b3b4cba6e6ab", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-base", - "type": "github" - } - }, - "cardano-base_12": { - "flake": false, - "locked": { - "lastModified": 1652788515, - "narHash": "sha256-l0KgomRi6YhEoOlFnBYEXhnZO2+PW68rhfUrbMXjhCQ=", - "owner": "input-output-hk", - "repo": "cardano-base", - "rev": "631cb6cf1fa01ab346233b610a38b3b4cba6e6ab", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-base", - "type": "github" - } - }, - "cardano-base_13": { - "flake": false, - "locked": { - "lastModified": 1652788515, - "narHash": "sha256-l0KgomRi6YhEoOlFnBYEXhnZO2+PW68rhfUrbMXjhCQ=", - "owner": "input-output-hk", - "repo": "cardano-base", - "rev": "631cb6cf1fa01ab346233b610a38b3b4cba6e6ab", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-base", - "type": "github" - } - }, - "cardano-base_14": { - "flake": false, - "locked": { - "lastModified": 1652788515, - "narHash": "sha256-l0KgomRi6YhEoOlFnBYEXhnZO2+PW68rhfUrbMXjhCQ=", - "owner": "input-output-hk", - "repo": "cardano-base", - "rev": "631cb6cf1fa01ab346233b610a38b3b4cba6e6ab", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-base", - "type": "github" - } - }, - "cardano-base_15": { - "flake": false, - "locked": { - "lastModified": 1652788515, - "narHash": "sha256-l0KgomRi6YhEoOlFnBYEXhnZO2+PW68rhfUrbMXjhCQ=", - "owner": "input-output-hk", - "repo": "cardano-base", - "rev": "631cb6cf1fa01ab346233b610a38b3b4cba6e6ab", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-base", - "type": "github" - } - }, - "cardano-base_2": { - "flake": false, - "locked": { - "lastModified": 1652788515, - "narHash": "sha256-l0KgomRi6YhEoOlFnBYEXhnZO2+PW68rhfUrbMXjhCQ=", - "owner": "input-output-hk", - "repo": "cardano-base", - "rev": "631cb6cf1fa01ab346233b610a38b3b4cba6e6ab", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-base", - "type": "github" - } - }, - "cardano-base_3": { - "flake": false, - "locked": { - "lastModified": 1652788515, - "narHash": "sha256-l0KgomRi6YhEoOlFnBYEXhnZO2+PW68rhfUrbMXjhCQ=", - "owner": "input-output-hk", - "repo": "cardano-base", - "rev": "631cb6cf1fa01ab346233b610a38b3b4cba6e6ab", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-base", - "type": "github" - } - }, - "cardano-base_4": { - "flake": false, - "locked": { - "lastModified": 1652788515, - "narHash": "sha256-l0KgomRi6YhEoOlFnBYEXhnZO2+PW68rhfUrbMXjhCQ=", - "owner": "input-output-hk", - "repo": "cardano-base", - "rev": "631cb6cf1fa01ab346233b610a38b3b4cba6e6ab", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-base", - "type": "github" - } - }, - "cardano-base_5": { - "flake": false, - "locked": { - "lastModified": 1652788515, - "narHash": "sha256-l0KgomRi6YhEoOlFnBYEXhnZO2+PW68rhfUrbMXjhCQ=", - "owner": "input-output-hk", - "repo": "cardano-base", - "rev": "631cb6cf1fa01ab346233b610a38b3b4cba6e6ab", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-base", - "type": "github" - } - }, - "cardano-base_6": { - "flake": false, - "locked": { - "lastModified": 1652788515, - "narHash": "sha256-l0KgomRi6YhEoOlFnBYEXhnZO2+PW68rhfUrbMXjhCQ=", - "owner": "input-output-hk", - "repo": "cardano-base", - "rev": "631cb6cf1fa01ab346233b610a38b3b4cba6e6ab", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-base", - "type": "github" - } - }, - "cardano-base_7": { - "flake": false, - "locked": { - "lastModified": 1652788515, - "narHash": "sha256-l0KgomRi6YhEoOlFnBYEXhnZO2+PW68rhfUrbMXjhCQ=", - "owner": "input-output-hk", - "repo": "cardano-base", - "rev": "631cb6cf1fa01ab346233b610a38b3b4cba6e6ab", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-base", - "type": "github" - } - }, - "cardano-base_8": { - "flake": false, - "locked": { - "lastModified": 1652788515, - "narHash": "sha256-l0KgomRi6YhEoOlFnBYEXhnZO2+PW68rhfUrbMXjhCQ=", - "owner": "input-output-hk", - "repo": "cardano-base", - "rev": "631cb6cf1fa01ab346233b610a38b3b4cba6e6ab", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-base", - "type": "github" - } - }, - "cardano-base_9": { - "flake": false, - "locked": { - "lastModified": 1652788515, - "narHash": "sha256-l0KgomRi6YhEoOlFnBYEXhnZO2+PW68rhfUrbMXjhCQ=", - "owner": "input-output-hk", - "repo": "cardano-base", - "rev": "631cb6cf1fa01ab346233b610a38b3b4cba6e6ab", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-base", - "type": "github" - } - }, - "cardano-crypto": { - "flake": false, - "locked": { - "lastModified": 1621376239, - "narHash": "sha256-oxIOVlgm07FAEmgGRF1C2me9TXqVxQulEOcJ22zpTRs=", - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - } - }, - "cardano-crypto_10": { - "flake": false, - "locked": { - "lastModified": 1621376239, - "narHash": "sha256-oxIOVlgm07FAEmgGRF1C2me9TXqVxQulEOcJ22zpTRs=", - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - } - }, - "cardano-crypto_11": { - "flake": false, - "locked": { - "lastModified": 1621376239, - "narHash": "sha256-oxIOVlgm07FAEmgGRF1C2me9TXqVxQulEOcJ22zpTRs=", - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - } - }, - "cardano-crypto_12": { - "flake": false, - "locked": { - "lastModified": 1621376239, - "narHash": "sha256-oxIOVlgm07FAEmgGRF1C2me9TXqVxQulEOcJ22zpTRs=", - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - } - }, - "cardano-crypto_13": { - "flake": false, - "locked": { - "lastModified": 1621376239, - "narHash": "sha256-oxIOVlgm07FAEmgGRF1C2me9TXqVxQulEOcJ22zpTRs=", - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - } - }, - "cardano-crypto_14": { - "flake": false, - "locked": { - "lastModified": 1621376239, - "narHash": "sha256-oxIOVlgm07FAEmgGRF1C2me9TXqVxQulEOcJ22zpTRs=", - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - } - }, - "cardano-crypto_15": { - "flake": false, - "locked": { - "lastModified": 1621376239, - "narHash": "sha256-oxIOVlgm07FAEmgGRF1C2me9TXqVxQulEOcJ22zpTRs=", - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - } - }, - "cardano-crypto_2": { - "flake": false, - "locked": { - "lastModified": 1621376239, - "narHash": "sha256-oxIOVlgm07FAEmgGRF1C2me9TXqVxQulEOcJ22zpTRs=", - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - } - }, - "cardano-crypto_3": { - "flake": false, - "locked": { - "lastModified": 1621376239, - "narHash": "sha256-oxIOVlgm07FAEmgGRF1C2me9TXqVxQulEOcJ22zpTRs=", - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - } - }, - "cardano-crypto_4": { - "flake": false, - "locked": { - "lastModified": 1621376239, - "narHash": "sha256-oxIOVlgm07FAEmgGRF1C2me9TXqVxQulEOcJ22zpTRs=", - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - } - }, - "cardano-crypto_5": { - "flake": false, - "locked": { - "lastModified": 1621376239, - "narHash": "sha256-oxIOVlgm07FAEmgGRF1C2me9TXqVxQulEOcJ22zpTRs=", - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - } - }, - "cardano-crypto_6": { - "flake": false, - "locked": { - "lastModified": 1621376239, - "narHash": "sha256-oxIOVlgm07FAEmgGRF1C2me9TXqVxQulEOcJ22zpTRs=", - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - } - }, - "cardano-crypto_7": { - "flake": false, - "locked": { - "lastModified": 1621376239, - "narHash": "sha256-oxIOVlgm07FAEmgGRF1C2me9TXqVxQulEOcJ22zpTRs=", - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - } - }, - "cardano-crypto_8": { - "flake": false, - "locked": { - "lastModified": 1621376239, - "narHash": "sha256-oxIOVlgm07FAEmgGRF1C2me9TXqVxQulEOcJ22zpTRs=", - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - } - }, - "cardano-crypto_9": { - "flake": false, - "locked": { - "lastModified": 1621376239, - "narHash": "sha256-oxIOVlgm07FAEmgGRF1C2me9TXqVxQulEOcJ22zpTRs=", - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-crypto", - "rev": "07397f0e50da97eaa0575d93bee7ac4b2b2576ec", - "type": "github" - } - }, - "cardano-prelude": { - "flake": false, - "locked": { - "lastModified": 1653997332, - "narHash": "sha256-E+YSfUsvxdoOr7n7fz4xd7zb4z8XBRGNYOKipc2A1pw=", - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - } - }, - "cardano-prelude_10": { - "flake": false, - "locked": { - "lastModified": 1653997332, - "narHash": "sha256-E+YSfUsvxdoOr7n7fz4xd7zb4z8XBRGNYOKipc2A1pw=", - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - } - }, - "cardano-prelude_11": { - "flake": false, - "locked": { - "lastModified": 1653997332, - "narHash": "sha256-E+YSfUsvxdoOr7n7fz4xd7zb4z8XBRGNYOKipc2A1pw=", - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - } - }, - "cardano-prelude_12": { - "flake": false, - "locked": { - "lastModified": 1653997332, - "narHash": "sha256-E+YSfUsvxdoOr7n7fz4xd7zb4z8XBRGNYOKipc2A1pw=", - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - } - }, - "cardano-prelude_13": { - "flake": false, - "locked": { - "lastModified": 1653997332, - "narHash": "sha256-E+YSfUsvxdoOr7n7fz4xd7zb4z8XBRGNYOKipc2A1pw=", - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - } - }, - "cardano-prelude_14": { - "flake": false, - "locked": { - "lastModified": 1653997332, - "narHash": "sha256-E+YSfUsvxdoOr7n7fz4xd7zb4z8XBRGNYOKipc2A1pw=", - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - } - }, - "cardano-prelude_15": { - "flake": false, - "locked": { - "lastModified": 1653997332, - "narHash": "sha256-E+YSfUsvxdoOr7n7fz4xd7zb4z8XBRGNYOKipc2A1pw=", - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - } - }, - "cardano-prelude_2": { - "flake": false, - "locked": { - "lastModified": 1653997332, - "narHash": "sha256-E+YSfUsvxdoOr7n7fz4xd7zb4z8XBRGNYOKipc2A1pw=", - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - } - }, - "cardano-prelude_3": { - "flake": false, - "locked": { - "lastModified": 1653997332, - "narHash": "sha256-E+YSfUsvxdoOr7n7fz4xd7zb4z8XBRGNYOKipc2A1pw=", - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - } - }, - "cardano-prelude_4": { - "flake": false, - "locked": { - "lastModified": 1653997332, - "narHash": "sha256-E+YSfUsvxdoOr7n7fz4xd7zb4z8XBRGNYOKipc2A1pw=", - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - } - }, - "cardano-prelude_5": { - "flake": false, - "locked": { - "lastModified": 1653997332, - "narHash": "sha256-E+YSfUsvxdoOr7n7fz4xd7zb4z8XBRGNYOKipc2A1pw=", - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - } - }, - "cardano-prelude_6": { - "flake": false, - "locked": { - "lastModified": 1653997332, - "narHash": "sha256-E+YSfUsvxdoOr7n7fz4xd7zb4z8XBRGNYOKipc2A1pw=", - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - } - }, - "cardano-prelude_7": { - "flake": false, - "locked": { - "lastModified": 1653997332, - "narHash": "sha256-E+YSfUsvxdoOr7n7fz4xd7zb4z8XBRGNYOKipc2A1pw=", - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - } - }, - "cardano-prelude_8": { - "flake": false, - "locked": { - "lastModified": 1653997332, - "narHash": "sha256-E+YSfUsvxdoOr7n7fz4xd7zb4z8XBRGNYOKipc2A1pw=", - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - } - }, - "cardano-prelude_9": { - "flake": false, - "locked": { - "lastModified": 1653997332, - "narHash": "sha256-E+YSfUsvxdoOr7n7fz4xd7zb4z8XBRGNYOKipc2A1pw=", - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "repo": "cardano-prelude", - "rev": "713c7ae79a4d538fcd653c976a652913df1567b9", - "type": "github" - } - }, - "cardano-repo-tool": { - "flake": false, - "locked": { - "lastModified": 1624584417, - "narHash": "sha256-YSepT97PagR/1jTYV/Yer8a2GjFe9+tTwaTCHxuK50M=", - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "rev": "30e826ed8f00e3e154453b122a6f3d779b2f73ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "type": "github" - } - }, - "cardano-repo-tool_10": { - "flake": false, - "locked": { - "lastModified": 1624584417, - "narHash": "sha256-YSepT97PagR/1jTYV/Yer8a2GjFe9+tTwaTCHxuK50M=", - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "rev": "30e826ed8f00e3e154453b122a6f3d779b2f73ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "type": "github" - } - }, - "cardano-repo-tool_11": { - "flake": false, - "locked": { - "lastModified": 1624584417, - "narHash": "sha256-YSepT97PagR/1jTYV/Yer8a2GjFe9+tTwaTCHxuK50M=", - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "rev": "30e826ed8f00e3e154453b122a6f3d779b2f73ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "type": "github" - } - }, - "cardano-repo-tool_12": { - "flake": false, - "locked": { - "lastModified": 1624584417, - "narHash": "sha256-YSepT97PagR/1jTYV/Yer8a2GjFe9+tTwaTCHxuK50M=", - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "rev": "30e826ed8f00e3e154453b122a6f3d779b2f73ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "type": "github" - } - }, - "cardano-repo-tool_13": { - "flake": false, - "locked": { - "lastModified": 1624584417, - "narHash": "sha256-YSepT97PagR/1jTYV/Yer8a2GjFe9+tTwaTCHxuK50M=", - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "rev": "30e826ed8f00e3e154453b122a6f3d779b2f73ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "type": "github" - } - }, - "cardano-repo-tool_14": { - "flake": false, - "locked": { - "lastModified": 1624584417, - "narHash": "sha256-YSepT97PagR/1jTYV/Yer8a2GjFe9+tTwaTCHxuK50M=", - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "rev": "30e826ed8f00e3e154453b122a6f3d779b2f73ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "type": "github" - } - }, - "cardano-repo-tool_15": { - "flake": false, - "locked": { - "lastModified": 1624584417, - "narHash": "sha256-YSepT97PagR/1jTYV/Yer8a2GjFe9+tTwaTCHxuK50M=", - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "rev": "30e826ed8f00e3e154453b122a6f3d779b2f73ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "type": "github" - } - }, - "cardano-repo-tool_2": { - "flake": false, - "locked": { - "lastModified": 1624584417, - "narHash": "sha256-YSepT97PagR/1jTYV/Yer8a2GjFe9+tTwaTCHxuK50M=", - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "rev": "30e826ed8f00e3e154453b122a6f3d779b2f73ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "type": "github" - } - }, - "cardano-repo-tool_3": { - "flake": false, - "locked": { - "lastModified": 1624584417, - "narHash": "sha256-YSepT97PagR/1jTYV/Yer8a2GjFe9+tTwaTCHxuK50M=", - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "rev": "30e826ed8f00e3e154453b122a6f3d779b2f73ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "type": "github" - } - }, - "cardano-repo-tool_4": { - "flake": false, - "locked": { - "lastModified": 1624584417, - "narHash": "sha256-YSepT97PagR/1jTYV/Yer8a2GjFe9+tTwaTCHxuK50M=", - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "rev": "30e826ed8f00e3e154453b122a6f3d779b2f73ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "type": "github" - } - }, - "cardano-repo-tool_5": { - "flake": false, - "locked": { - "lastModified": 1624584417, - "narHash": "sha256-YSepT97PagR/1jTYV/Yer8a2GjFe9+tTwaTCHxuK50M=", - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "rev": "30e826ed8f00e3e154453b122a6f3d779b2f73ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "type": "github" - } - }, - "cardano-repo-tool_6": { - "flake": false, - "locked": { - "lastModified": 1624584417, - "narHash": "sha256-YSepT97PagR/1jTYV/Yer8a2GjFe9+tTwaTCHxuK50M=", - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "rev": "30e826ed8f00e3e154453b122a6f3d779b2f73ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "type": "github" - } - }, - "cardano-repo-tool_7": { - "flake": false, - "locked": { - "lastModified": 1624584417, - "narHash": "sha256-YSepT97PagR/1jTYV/Yer8a2GjFe9+tTwaTCHxuK50M=", - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "rev": "30e826ed8f00e3e154453b122a6f3d779b2f73ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "type": "github" - } - }, - "cardano-repo-tool_8": { - "flake": false, - "locked": { - "lastModified": 1624584417, - "narHash": "sha256-YSepT97PagR/1jTYV/Yer8a2GjFe9+tTwaTCHxuK50M=", - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "rev": "30e826ed8f00e3e154453b122a6f3d779b2f73ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "type": "github" - } - }, - "cardano-repo-tool_9": { - "flake": false, - "locked": { - "lastModified": 1624584417, - "narHash": "sha256-YSepT97PagR/1jTYV/Yer8a2GjFe9+tTwaTCHxuK50M=", - "owner": "input-output-hk", - "repo": "cardano-repo-tool", - "rev": "30e826ed8f00e3e154453b122a6f3d779b2f73ec", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-repo-tool", + "ref": "repo", + "repo": "cardano-haskell-packages", "type": "github" } }, @@ -2011,102 +705,6 @@ "type": "github" } }, - "cardano-shell_10": { - "flake": false, - "locked": { - "lastModified": 1608537748, - "narHash": "sha256-PulY1GfiMgKVnBci3ex4ptk2UNYMXqGjJOxcPy2KYT4=", - "owner": "input-output-hk", - "repo": "cardano-shell", - "rev": "9392c75087cb9a3d453998f4230930dea3a95725", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-shell", - "type": "github" - } - }, - "cardano-shell_11": { - "flake": false, - "locked": { - "lastModified": 1608537748, - "narHash": "sha256-PulY1GfiMgKVnBci3ex4ptk2UNYMXqGjJOxcPy2KYT4=", - "owner": "input-output-hk", - "repo": "cardano-shell", - "rev": "9392c75087cb9a3d453998f4230930dea3a95725", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-shell", - "type": "github" - } - }, - "cardano-shell_12": { - "flake": false, - "locked": { - "lastModified": 1608537748, - "narHash": "sha256-PulY1GfiMgKVnBci3ex4ptk2UNYMXqGjJOxcPy2KYT4=", - "owner": "input-output-hk", - "repo": "cardano-shell", - "rev": "9392c75087cb9a3d453998f4230930dea3a95725", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-shell", - "type": "github" - } - }, - "cardano-shell_13": { - "flake": false, - "locked": { - "lastModified": 1608537748, - "narHash": "sha256-PulY1GfiMgKVnBci3ex4ptk2UNYMXqGjJOxcPy2KYT4=", - "owner": "input-output-hk", - "repo": "cardano-shell", - "rev": "9392c75087cb9a3d453998f4230930dea3a95725", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-shell", - "type": "github" - } - }, - "cardano-shell_14": { - "flake": false, - "locked": { - "lastModified": 1608537748, - "narHash": "sha256-PulY1GfiMgKVnBci3ex4ptk2UNYMXqGjJOxcPy2KYT4=", - "owner": "input-output-hk", - "repo": "cardano-shell", - "rev": "9392c75087cb9a3d453998f4230930dea3a95725", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-shell", - "type": "github" - } - }, - "cardano-shell_15": { - "flake": false, - "locked": { - "lastModified": 1608537748, - "narHash": "sha256-PulY1GfiMgKVnBci3ex4ptk2UNYMXqGjJOxcPy2KYT4=", - "owner": "input-output-hk", - "repo": "cardano-shell", - "rev": "9392c75087cb9a3d453998f4230930dea3a95725", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "cardano-shell", - "type": "github" - } - }, "cardano-shell_2": { "flake": false, "locked": { @@ -2203,35 +801,1197 @@ "type": "github" } }, - "cardano-shell_8": { - "flake": false, + "devshell": { + "inputs": { + "flake-utils": [ + "liqwid-libs", + "liqwid-nix", + "haskell-nix", + "tullia", + "std", + "flake-utils" + ], + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "haskell-nix", + "tullia", + "std", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1608537748, - "narHash": "sha256-PulY1GfiMgKVnBci3ex4ptk2UNYMXqGjJOxcPy2KYT4=", - "owner": "input-output-hk", - "repo": "cardano-shell", - "rev": "9392c75087cb9a3d453998f4230930dea3a95725", + "lastModified": 1663445644, + "narHash": "sha256-+xVlcK60x7VY1vRJbNUEAHi17ZuoQxAIH4S4iUFUGBA=", + "owner": "numtide", + "repo": "devshell", + "rev": "e3dc3e21594fe07bdb24bdf1c8657acaa4cb8f66", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "cardano-shell", + "owner": "numtide", + "repo": "devshell", "type": "github" } }, - "cardano-shell_9": { + "devshell_2": { + "inputs": { + "flake-utils": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "std", + "flake-utils" + ], + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1663445644, + "narHash": "sha256-+xVlcK60x7VY1vRJbNUEAHi17ZuoQxAIH4S4iUFUGBA=", + "owner": "numtide", + "repo": "devshell", + "rev": "e3dc3e21594fe07bdb24bdf1c8657acaa4cb8f66", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "devshell_3": { + "inputs": { + "flake-utils": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "std", + "flake-utils" + ], + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1663445644, + "narHash": "sha256-+xVlcK60x7VY1vRJbNUEAHi17ZuoQxAIH4S4iUFUGBA=", + "owner": "numtide", + "repo": "devshell", + "rev": "e3dc3e21594fe07bdb24bdf1c8657acaa4cb8f66", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "devshell_4": { + "inputs": { + "flake-utils": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "std", + "flake-utils" + ], + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1663445644, + "narHash": "sha256-+xVlcK60x7VY1vRJbNUEAHi17ZuoQxAIH4S4iUFUGBA=", + "owner": "numtide", + "repo": "devshell", + "rev": "e3dc3e21594fe07bdb24bdf1c8657acaa4cb8f66", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "devshell_5": { + "inputs": { + "flake-utils": [ + "liqwid-libs", + "ply", + "haskellNix", + "tullia", + "std", + "flake-utils" + ], + "nixpkgs": [ + "liqwid-libs", + "ply", + "haskellNix", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1663445644, + "narHash": "sha256-+xVlcK60x7VY1vRJbNUEAHi17ZuoQxAIH4S4iUFUGBA=", + "owner": "numtide", + "repo": "devshell", + "rev": "e3dc3e21594fe07bdb24bdf1c8657acaa4cb8f66", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "devshell_6": { + "inputs": { + "flake-utils": [ + "liqwid-nix", + "haskell-nix", + "tullia", + "std", + "flake-utils" + ], + "nixpkgs": [ + "liqwid-nix", + "haskell-nix", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1663445644, + "narHash": "sha256-+xVlcK60x7VY1vRJbNUEAHi17ZuoQxAIH4S4iUFUGBA=", + "owner": "numtide", + "repo": "devshell", + "rev": "e3dc3e21594fe07bdb24bdf1c8657acaa4cb8f66", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "devshell_7": { + "inputs": { + "flake-utils": [ + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "std", + "flake-utils" + ], + "nixpkgs": [ + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1663445644, + "narHash": "sha256-+xVlcK60x7VY1vRJbNUEAHi17ZuoQxAIH4S4iUFUGBA=", + "owner": "numtide", + "repo": "devshell", + "rev": "e3dc3e21594fe07bdb24bdf1c8657acaa4cb8f66", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "devshell_8": { + "inputs": { + "flake-utils": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "std", + "flake-utils" + ], + "nixpkgs": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1663445644, + "narHash": "sha256-+xVlcK60x7VY1vRJbNUEAHi17ZuoQxAIH4S4iUFUGBA=", + "owner": "numtide", + "repo": "devshell", + "rev": "e3dc3e21594fe07bdb24bdf1c8657acaa4cb8f66", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "devshell_9": { + "inputs": { + "flake-utils": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "std", + "flake-utils" + ], + "nixpkgs": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1663445644, + "narHash": "sha256-+xVlcK60x7VY1vRJbNUEAHi17ZuoQxAIH4S4iUFUGBA=", + "owner": "numtide", + "repo": "devshell", + "rev": "e3dc3e21594fe07bdb24bdf1c8657acaa4cb8f66", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "dmerge": { + "inputs": { + "nixlib": [ + "liqwid-libs", + "liqwid-nix", + "haskell-nix", + "tullia", + "std", + "nixpkgs" + ], + "yants": [ + "liqwid-libs", + "liqwid-nix", + "haskell-nix", + "tullia", + "std", + "yants" + ] + }, + "locked": { + "lastModified": 1659548052, + "narHash": "sha256-fzI2gp1skGA8mQo/FBFrUAtY0GQkAIAaV/V127TJPyY=", + "owner": "divnix", + "repo": "data-merge", + "rev": "d160d18ce7b1a45b88344aa3f13ed1163954b497", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "data-merge", + "type": "github" + } + }, + "dmerge_2": { + "inputs": { + "nixlib": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "std", + "nixpkgs" + ], + "yants": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "std", + "yants" + ] + }, + "locked": { + "lastModified": 1659548052, + "narHash": "sha256-fzI2gp1skGA8mQo/FBFrUAtY0GQkAIAaV/V127TJPyY=", + "owner": "divnix", + "repo": "data-merge", + "rev": "d160d18ce7b1a45b88344aa3f13ed1163954b497", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "data-merge", + "type": "github" + } + }, + "dmerge_3": { + "inputs": { + "nixlib": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "std", + "nixpkgs" + ], + "yants": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "std", + "yants" + ] + }, + "locked": { + "lastModified": 1659548052, + "narHash": "sha256-fzI2gp1skGA8mQo/FBFrUAtY0GQkAIAaV/V127TJPyY=", + "owner": "divnix", + "repo": "data-merge", + "rev": "d160d18ce7b1a45b88344aa3f13ed1163954b497", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "data-merge", + "type": "github" + } + }, + "dmerge_4": { + "inputs": { + "nixlib": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "std", + "nixpkgs" + ], + "yants": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "std", + "yants" + ] + }, + "locked": { + "lastModified": 1659548052, + "narHash": "sha256-fzI2gp1skGA8mQo/FBFrUAtY0GQkAIAaV/V127TJPyY=", + "owner": "divnix", + "repo": "data-merge", + "rev": "d160d18ce7b1a45b88344aa3f13ed1163954b497", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "data-merge", + "type": "github" + } + }, + "dmerge_5": { + "inputs": { + "nixlib": [ + "liqwid-libs", + "ply", + "haskellNix", + "tullia", + "std", + "nixpkgs" + ], + "yants": [ + "liqwid-libs", + "ply", + "haskellNix", + "tullia", + "std", + "yants" + ] + }, + "locked": { + "lastModified": 1659548052, + "narHash": "sha256-fzI2gp1skGA8mQo/FBFrUAtY0GQkAIAaV/V127TJPyY=", + "owner": "divnix", + "repo": "data-merge", + "rev": "d160d18ce7b1a45b88344aa3f13ed1163954b497", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "data-merge", + "type": "github" + } + }, + "dmerge_6": { + "inputs": { + "nixlib": [ + "liqwid-nix", + "haskell-nix", + "tullia", + "std", + "nixpkgs" + ], + "yants": [ + "liqwid-nix", + "haskell-nix", + "tullia", + "std", + "yants" + ] + }, + "locked": { + "lastModified": 1659548052, + "narHash": "sha256-fzI2gp1skGA8mQo/FBFrUAtY0GQkAIAaV/V127TJPyY=", + "owner": "divnix", + "repo": "data-merge", + "rev": "d160d18ce7b1a45b88344aa3f13ed1163954b497", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "data-merge", + "type": "github" + } + }, + "dmerge_7": { + "inputs": { + "nixlib": [ + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "std", + "nixpkgs" + ], + "yants": [ + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "std", + "yants" + ] + }, + "locked": { + "lastModified": 1659548052, + "narHash": "sha256-fzI2gp1skGA8mQo/FBFrUAtY0GQkAIAaV/V127TJPyY=", + "owner": "divnix", + "repo": "data-merge", + "rev": "d160d18ce7b1a45b88344aa3f13ed1163954b497", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "data-merge", + "type": "github" + } + }, + "dmerge_8": { + "inputs": { + "nixlib": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "std", + "nixpkgs" + ], + "yants": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "std", + "yants" + ] + }, + "locked": { + "lastModified": 1659548052, + "narHash": "sha256-fzI2gp1skGA8mQo/FBFrUAtY0GQkAIAaV/V127TJPyY=", + "owner": "divnix", + "repo": "data-merge", + "rev": "d160d18ce7b1a45b88344aa3f13ed1163954b497", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "data-merge", + "type": "github" + } + }, + "dmerge_9": { + "inputs": { + "nixlib": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "std", + "nixpkgs" + ], + "yants": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "std", + "yants" + ] + }, + "locked": { + "lastModified": 1659548052, + "narHash": "sha256-fzI2gp1skGA8mQo/FBFrUAtY0GQkAIAaV/V127TJPyY=", + "owner": "divnix", + "repo": "data-merge", + "rev": "d160d18ce7b1a45b88344aa3f13ed1163954b497", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "data-merge", + "type": "github" + } + }, + "easy-purescript-nix": { "flake": false, "locked": { - "lastModified": 1608537748, - "narHash": "sha256-PulY1GfiMgKVnBci3ex4ptk2UNYMXqGjJOxcPy2KYT4=", + "lastModified": 1666686938, + "narHash": "sha256-/UOLRdnEhIOcxcm5ouOipOiSgHRzJde0ccAx4xB1dnU=", + "owner": "justinwoo", + "repo": "easy-purescript-nix", + "rev": "da7acb2662961fd355f0a01a25bd32bf33577fa8", + "type": "github" + }, + "original": { + "owner": "justinwoo", + "repo": "easy-purescript-nix", + "rev": "da7acb2662961fd355f0a01a25bd32bf33577fa8", + "type": "github" + } + }, + "ema": { + "flake": false, + "locked": { + "lastModified": 1668972953, + "narHash": "sha256-WyTqCQg9xPqB2wC16PdjocaIL81MBLtjgC3eCzhN5hE=", + "owner": "EmaApps", + "repo": "ema", + "rev": "61faae56aa0f3c6ca815f344684cc566f6341662", + "type": "github" + }, + "original": { + "owner": "EmaApps", + "repo": "ema", + "type": "github" + } + }, + "ema_2": { + "flake": false, + "locked": { + "lastModified": 1668972953, + "narHash": "sha256-WyTqCQg9xPqB2wC16PdjocaIL81MBLtjgC3eCzhN5hE=", + "owner": "EmaApps", + "repo": "ema", + "rev": "61faae56aa0f3c6ca815f344684cc566f6341662", + "type": "github" + }, + "original": { + "owner": "EmaApps", + "repo": "ema", + "type": "github" + } + }, + "emanote": { + "inputs": { + "ema": "ema", + "flake-parts": "flake-parts_6", + "haskell-flake": "haskell-flake_2", + "heist": "heist", + "heist-extra": "heist-extra", + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1670780484, + "narHash": "sha256-U/TqZ69T0owzlPbNlaLo8FkUdA6ifHT6wTk01VisaS0=", + "owner": "srid", + "repo": "emanote", + "rev": "465a22b13bc3c608bce28725b7de59089bb03683", + "type": "github" + }, + "original": { + "owner": "srid", + "ref": "master", + "repo": "emanote", + "type": "github" + } + }, + "emanote_2": { + "inputs": { + "ema": "ema_2", + "flake-parts": "flake-parts_9", + "haskell-flake": "haskell-flake_3", + "heist": "heist_2", + "heist-extra": "heist-extra_2", + "nixpkgs": [ + "liqwid-nix", + "plutarch", + "tooling", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1670780484, + "narHash": "sha256-U/TqZ69T0owzlPbNlaLo8FkUdA6ifHT6wTk01VisaS0=", + "owner": "srid", + "repo": "emanote", + "rev": "465a22b13bc3c608bce28725b7de59089bb03683", + "type": "github" + }, + "original": { + "owner": "srid", + "ref": "master", + "repo": "emanote", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1635892615, + "narHash": "sha256-harGbMZr4hzat2BWBU+Y5OYXlu+fVz7E4WeQzHi5o8A=", "owner": "input-output-hk", - "repo": "cardano-shell", - "rev": "9392c75087cb9a3d453998f4230930dea3a95725", + "repo": "flake-compat", + "rev": "eca47d3377946315596da653862d341ee5341318", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "cardano-shell", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_10": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_11": { + "flake": false, + "locked": { + "lastModified": 1635892615, + "narHash": "sha256-harGbMZr4hzat2BWBU+Y5OYXlu+fVz7E4WeQzHi5o8A=", + "owner": "input-output-hk", + "repo": "flake-compat", + "rev": "eca47d3377946315596da653862d341ee5341318", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_12": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_13": { + "flake": false, + "locked": { + "lastModified": 1635892615, + "narHash": "sha256-harGbMZr4hzat2BWBU+Y5OYXlu+fVz7E4WeQzHi5o8A=", + "owner": "input-output-hk", + "repo": "flake-compat", + "rev": "eca47d3377946315596da653862d341ee5341318", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_14": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_15": { + "flake": false, + "locked": { + "lastModified": 1635892615, + "narHash": "sha256-harGbMZr4hzat2BWBU+Y5OYXlu+fVz7E4WeQzHi5o8A=", + "owner": "input-output-hk", + "repo": "flake-compat", + "rev": "eca47d3377946315596da653862d341ee5341318", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_16": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_17": { + "flake": false, + "locked": { + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_3": { + "flake": false, + "locked": { + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_4": { + "flake": false, + "locked": { + "lastModified": 1635892615, + "narHash": "sha256-harGbMZr4hzat2BWBU+Y5OYXlu+fVz7E4WeQzHi5o8A=", + "owner": "input-output-hk", + "repo": "flake-compat", + "rev": "eca47d3377946315596da653862d341ee5341318", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_5": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_6": { + "flake": false, + "locked": { + "lastModified": 1635892615, + "narHash": "sha256-harGbMZr4hzat2BWBU+Y5OYXlu+fVz7E4WeQzHi5o8A=", + "owner": "input-output-hk", + "repo": "flake-compat", + "rev": "eca47d3377946315596da653862d341ee5341318", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_7": { + "flake": false, + "locked": { + "lastModified": 1650374568, + "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b4a34015c698c7793d592d66adbab377907a2be8", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_8": { + "flake": false, + "locked": { + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_9": { + "flake": false, + "locked": { + "lastModified": 1635892615, + "narHash": "sha256-harGbMZr4hzat2BWBU+Y5OYXlu+fVz7E4WeQzHi5o8A=", + "owner": "input-output-hk", + "repo": "flake-compat", + "rev": "eca47d3377946315596da653862d341ee5341318", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1672616755, + "narHash": "sha256-dvwU2ORLpiP6ZMXL3CJ/qrqmtLBLF6VAc+Fois7Qfew=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "87673d7c13a799d95ce25ff5dc7b9e15f01af2ea", + "type": "github" + }, + "original": { + "id": "flake-parts", + "type": "indirect" + } + }, + "flake-parts_10": { + "inputs": { + "nixpkgs": [ + "liqwid-nix", + "plutarch", + "tooling", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1664391900, + "narHash": "sha256-hQWV36ptF8pQY9J+finEOYUxhfSjbB6aDHXw/4go+44=", + "owner": "mlabs-haskell", + "repo": "flake-parts", + "rev": "a8a2d7085a2ffbf06c7b11767018dd7a4c5d4e1b", + "type": "github" + }, + "original": { + "owner": "mlabs-haskell", + "ref": "fix-for-ifd", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_2" + }, + "locked": { + "lastModified": 1672616755, + "narHash": "sha256-dvwU2ORLpiP6ZMXL3CJ/qrqmtLBLF6VAc+Fois7Qfew=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "87673d7c13a799d95ce25ff5dc7b9e15f01af2ea", + "type": "github" + }, + "original": { + "id": "flake-parts", + "type": "indirect" + } + }, + "flake-parts_3": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_3" + }, + "locked": { + "lastModified": 1678379998, + "narHash": "sha256-TZdfNqftHhDuIFwBcN9MUThx5sQXCTeZk9je5byPKRw=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "c13d60b89adea3dc20704c045ec4d50dd964d447", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_4": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_4" + }, + "locked": { + "lastModified": 1678379998, + "narHash": "sha256-TZdfNqftHhDuIFwBcN9MUThx5sQXCTeZk9je5byPKRw=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "c13d60b89adea3dc20704c045ec4d50dd964d447", + "type": "github" + }, + "original": { + "id": "flake-parts", + "type": "indirect" + } + }, + "flake-parts_5": { + "inputs": { + "nixpkgs-lib": [ + "liqwid-libs", + "liqwid-nix", + "hercules-ci-effects", + "hercules-ci-agent", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1678379998, + "narHash": "sha256-TZdfNqftHhDuIFwBcN9MUThx5sQXCTeZk9je5byPKRw=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "c13d60b89adea3dc20704c045ec4d50dd964d447", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_6": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_5" + }, + "locked": { + "lastModified": 1668450977, + "narHash": "sha256-cfLhMhnvXn6x1vPm+Jow3RiFAUSCw/l1utktCw5rVA4=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "d591857e9d7dd9ddbfba0ea02b43b927c3c0f1fa", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_7": { + "inputs": { + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1664391900, + "narHash": "sha256-hQWV36ptF8pQY9J+finEOYUxhfSjbB6aDHXw/4go+44=", + "owner": "mlabs-haskell", + "repo": "flake-parts", + "rev": "a8a2d7085a2ffbf06c7b11767018dd7a4c5d4e1b", + "type": "github" + }, + "original": { + "owner": "mlabs-haskell", + "ref": "fix-for-ifd", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_8": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_6" + }, + "locked": { + "lastModified": 1678379998, + "narHash": "sha256-TZdfNqftHhDuIFwBcN9MUThx5sQXCTeZk9je5byPKRw=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "c13d60b89adea3dc20704c045ec4d50dd964d447", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_9": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_7" + }, + "locked": { + "lastModified": 1668450977, + "narHash": "sha256-cfLhMhnvXn6x1vPm+Jow3RiFAUSCw/l1utktCw5rVA4=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "d591857e9d7dd9ddbfba0ea02b43b927c3c0f1fa", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", "type": "github" } }, @@ -2282,11 +2042,11 @@ }, "flake-utils_12": { "locked": { - "lastModified": 1644229661, - "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", "owner": "numtide", "repo": "flake-utils", - "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", "type": "github" }, "original": { @@ -2297,11 +2057,11 @@ }, "flake-utils_13": { "locked": { - "lastModified": 1644229661, - "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", "owner": "numtide", "repo": "flake-utils", - "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", "type": "github" }, "original": { @@ -2312,11 +2072,11 @@ }, "flake-utils_14": { "locked": { - "lastModified": 1644229661, - "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", "owner": "numtide", "repo": "flake-utils", - "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", "type": "github" }, "original": { @@ -2326,6 +2086,66 @@ } }, "flake-utils_15": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_16": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_17": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_18": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_19": { "locked": { "lastModified": 1644229661, "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", @@ -2341,6 +2161,81 @@ } }, "flake-utils_2": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_20": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_21": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_22": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_23": { + "locked": { + "lastModified": 1667077288, + "narHash": "sha256-bdC8sFNDpT0HK74u9fUkpbf1MEzVYJ+ka7NXCdgBoaA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "6ee9ebb6b1ee695d2cacc4faa053a7b9baa76817", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_24": { "locked": { "lastModified": 1644229661, "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", @@ -2355,7 +2250,127 @@ "type": "github" } }, + "flake-utils_25": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_26": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_27": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_28": { + "locked": { + "lastModified": 1644229661, + "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_29": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, "flake-utils_3": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_30": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_31": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_32": { "locked": { "lastModified": 1644229661, "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", @@ -2370,13 +2385,118 @@ "type": "github" } }, + "flake-utils_33": { + "locked": { + "lastModified": 1644229661, + "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_34": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_35": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_36": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_37": { + "locked": { + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_38": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_39": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, "flake-utils_4": { "locked": { - "lastModified": 1644229661, - "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", "owner": "numtide", "repo": "flake-utils", - "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", "type": "github" }, "original": { @@ -2387,11 +2507,11 @@ }, "flake-utils_5": { "locked": { - "lastModified": 1644229661, - "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", "owner": "numtide", "repo": "flake-utils", - "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", "type": "github" }, "original": { @@ -2417,11 +2537,11 @@ }, "flake-utils_7": { "locked": { - "lastModified": 1644229661, - "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", "owner": "numtide", "repo": "flake-utils", - "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", "type": "github" }, "original": { @@ -2432,11 +2552,11 @@ }, "flake-utils_8": { "locked": { - "lastModified": 1644229661, - "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "lastModified": 1659877975, + "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", "owner": "numtide", "repo": "flake-utils", - "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", "type": "github" }, "original": { @@ -2447,11 +2567,11 @@ }, "flake-utils_9": { "locked": { - "lastModified": 1644229661, - "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", "owner": "numtide", "repo": "flake-utils", - "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", "type": "github" }, "original": { @@ -2460,246 +2580,6 @@ "type": "github" } }, - "flat": { - "flake": false, - "locked": { - "lastModified": 1651403785, - "narHash": "sha256-g+jGep1IXdw4q01W67J6f6OODY91QzIlW1+Eu8pR+u0=", - "owner": "Quid2", - "repo": "flat", - "rev": "559617e058098b776b431e2a67346ad3adea2440", - "type": "github" - }, - "original": { - "owner": "Quid2", - "repo": "flat", - "type": "github" - } - }, - "flat_10": { - "flake": false, - "locked": { - "lastModified": 1651403785, - "narHash": "sha256-g+jGep1IXdw4q01W67J6f6OODY91QzIlW1+Eu8pR+u0=", - "owner": "Quid2", - "repo": "flat", - "rev": "559617e058098b776b431e2a67346ad3adea2440", - "type": "github" - }, - "original": { - "owner": "Quid2", - "repo": "flat", - "type": "github" - } - }, - "flat_11": { - "flake": false, - "locked": { - "lastModified": 1651403785, - "narHash": "sha256-g+jGep1IXdw4q01W67J6f6OODY91QzIlW1+Eu8pR+u0=", - "owner": "Quid2", - "repo": "flat", - "rev": "559617e058098b776b431e2a67346ad3adea2440", - "type": "github" - }, - "original": { - "owner": "Quid2", - "repo": "flat", - "type": "github" - } - }, - "flat_12": { - "flake": false, - "locked": { - "lastModified": 1651403785, - "narHash": "sha256-g+jGep1IXdw4q01W67J6f6OODY91QzIlW1+Eu8pR+u0=", - "owner": "Quid2", - "repo": "flat", - "rev": "559617e058098b776b431e2a67346ad3adea2440", - "type": "github" - }, - "original": { - "owner": "Quid2", - "repo": "flat", - "type": "github" - } - }, - "flat_13": { - "flake": false, - "locked": { - "lastModified": 1651403785, - "narHash": "sha256-g+jGep1IXdw4q01W67J6f6OODY91QzIlW1+Eu8pR+u0=", - "owner": "Quid2", - "repo": "flat", - "rev": "559617e058098b776b431e2a67346ad3adea2440", - "type": "github" - }, - "original": { - "owner": "Quid2", - "repo": "flat", - "type": "github" - } - }, - "flat_14": { - "flake": false, - "locked": { - "lastModified": 1651403785, - "narHash": "sha256-g+jGep1IXdw4q01W67J6f6OODY91QzIlW1+Eu8pR+u0=", - "owner": "Quid2", - "repo": "flat", - "rev": "559617e058098b776b431e2a67346ad3adea2440", - "type": "github" - }, - "original": { - "owner": "Quid2", - "repo": "flat", - "type": "github" - } - }, - "flat_15": { - "flake": false, - "locked": { - "lastModified": 1651403785, - "narHash": "sha256-g+jGep1IXdw4q01W67J6f6OODY91QzIlW1+Eu8pR+u0=", - "owner": "Quid2", - "repo": "flat", - "rev": "559617e058098b776b431e2a67346ad3adea2440", - "type": "github" - }, - "original": { - "owner": "Quid2", - "repo": "flat", - "type": "github" - } - }, - "flat_2": { - "flake": false, - "locked": { - "lastModified": 1651403785, - "narHash": "sha256-g+jGep1IXdw4q01W67J6f6OODY91QzIlW1+Eu8pR+u0=", - "owner": "Quid2", - "repo": "flat", - "rev": "559617e058098b776b431e2a67346ad3adea2440", - "type": "github" - }, - "original": { - "owner": "Quid2", - "repo": "flat", - "type": "github" - } - }, - "flat_3": { - "flake": false, - "locked": { - "lastModified": 1651403785, - "narHash": "sha256-g+jGep1IXdw4q01W67J6f6OODY91QzIlW1+Eu8pR+u0=", - "owner": "Quid2", - "repo": "flat", - "rev": "559617e058098b776b431e2a67346ad3adea2440", - "type": "github" - }, - "original": { - "owner": "Quid2", - "repo": "flat", - "type": "github" - } - }, - "flat_4": { - "flake": false, - "locked": { - "lastModified": 1651403785, - "narHash": "sha256-g+jGep1IXdw4q01W67J6f6OODY91QzIlW1+Eu8pR+u0=", - "owner": "Quid2", - "repo": "flat", - "rev": "559617e058098b776b431e2a67346ad3adea2440", - "type": "github" - }, - "original": { - "owner": "Quid2", - "repo": "flat", - "type": "github" - } - }, - "flat_5": { - "flake": false, - "locked": { - "lastModified": 1651403785, - "narHash": "sha256-g+jGep1IXdw4q01W67J6f6OODY91QzIlW1+Eu8pR+u0=", - "owner": "Quid2", - "repo": "flat", - "rev": "559617e058098b776b431e2a67346ad3adea2440", - "type": "github" - }, - "original": { - "owner": "Quid2", - "repo": "flat", - "type": "github" - } - }, - "flat_6": { - "flake": false, - "locked": { - "lastModified": 1651403785, - "narHash": "sha256-g+jGep1IXdw4q01W67J6f6OODY91QzIlW1+Eu8pR+u0=", - "owner": "Quid2", - "repo": "flat", - "rev": "559617e058098b776b431e2a67346ad3adea2440", - "type": "github" - }, - "original": { - "owner": "Quid2", - "repo": "flat", - "type": "github" - } - }, - "flat_7": { - "flake": false, - "locked": { - "lastModified": 1651403785, - "narHash": "sha256-g+jGep1IXdw4q01W67J6f6OODY91QzIlW1+Eu8pR+u0=", - "owner": "Quid2", - "repo": "flat", - "rev": "559617e058098b776b431e2a67346ad3adea2440", - "type": "github" - }, - "original": { - "owner": "Quid2", - "repo": "flat", - "type": "github" - } - }, - "flat_8": { - "flake": false, - "locked": { - "lastModified": 1651403785, - "narHash": "sha256-g+jGep1IXdw4q01W67J6f6OODY91QzIlW1+Eu8pR+u0=", - "owner": "Quid2", - "repo": "flat", - "rev": "559617e058098b776b431e2a67346ad3adea2440", - "type": "github" - }, - "original": { - "owner": "Quid2", - "repo": "flat", - "type": "github" - } - }, - "flat_9": { - "flake": false, - "locked": { - "lastModified": 1651403785, - "narHash": "sha256-g+jGep1IXdw4q01W67J6f6OODY91QzIlW1+Eu8pR+u0=", - "owner": "Quid2", - "repo": "flat", - "rev": "559617e058098b776b431e2a67346ad3adea2440", - "type": "github" - }, - "original": { - "owner": "Quid2", - "repo": "flat", - "type": "github" - } - }, "ghc-8.6.5-iohk": { "flake": false, "locked": { @@ -2717,108 +2597,6 @@ "type": "github" } }, - "ghc-8.6.5-iohk_10": { - "flake": false, - "locked": { - "lastModified": 1600920045, - "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", - "owner": "input-output-hk", - "repo": "ghc", - "rev": "95713a6ecce4551240da7c96b6176f980af75cae", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "ref": "release/8.6.5-iohk", - "repo": "ghc", - "type": "github" - } - }, - "ghc-8.6.5-iohk_11": { - "flake": false, - "locked": { - "lastModified": 1600920045, - "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", - "owner": "input-output-hk", - "repo": "ghc", - "rev": "95713a6ecce4551240da7c96b6176f980af75cae", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "ref": "release/8.6.5-iohk", - "repo": "ghc", - "type": "github" - } - }, - "ghc-8.6.5-iohk_12": { - "flake": false, - "locked": { - "lastModified": 1600920045, - "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", - "owner": "input-output-hk", - "repo": "ghc", - "rev": "95713a6ecce4551240da7c96b6176f980af75cae", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "ref": "release/8.6.5-iohk", - "repo": "ghc", - "type": "github" - } - }, - "ghc-8.6.5-iohk_13": { - "flake": false, - "locked": { - "lastModified": 1600920045, - "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", - "owner": "input-output-hk", - "repo": "ghc", - "rev": "95713a6ecce4551240da7c96b6176f980af75cae", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "ref": "release/8.6.5-iohk", - "repo": "ghc", - "type": "github" - } - }, - "ghc-8.6.5-iohk_14": { - "flake": false, - "locked": { - "lastModified": 1600920045, - "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", - "owner": "input-output-hk", - "repo": "ghc", - "rev": "95713a6ecce4551240da7c96b6176f980af75cae", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "ref": "release/8.6.5-iohk", - "repo": "ghc", - "type": "github" - } - }, - "ghc-8.6.5-iohk_15": { - "flake": false, - "locked": { - "lastModified": 1600920045, - "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", - "owner": "input-output-hk", - "repo": "ghc", - "rev": "95713a6ecce4551240da7c96b6176f980af75cae", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "ref": "release/8.6.5-iohk", - "repo": "ghc", - "type": "github" - } - }, "ghc-8.6.5-iohk_2": { "flake": false, "locked": { @@ -2921,144 +2699,82 @@ "type": "github" } }, - "ghc-8.6.5-iohk_8": { + "ghc-next-packages": { "flake": false, "locked": { - "lastModified": 1600920045, - "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", + "lastModified": 1664165793, + "narHash": "sha256-J1MRJGY//HbLTqseX3v50KOwMJSb/86irn4gPWSuWjI=", "owner": "input-output-hk", - "repo": "ghc", - "rev": "95713a6ecce4551240da7c96b6176f980af75cae", + "repo": "ghc-next-packages", + "rev": "62b7db48b3325d6d585ac079576733d3a76bae72", "type": "github" }, "original": { "owner": "input-output-hk", - "ref": "release/8.6.5-iohk", - "repo": "ghc", + "ref": "repo", + "repo": "ghc-next-packages", "type": "github" } }, - "ghc-8.6.5-iohk_9": { + "ghc-next-packages_2": { "flake": false, "locked": { - "lastModified": 1600920045, - "narHash": "sha256-DO6kxJz248djebZLpSzTGD6s8WRpNI9BTwUeOf5RwY8=", + "lastModified": 1664165793, + "narHash": "sha256-J1MRJGY//HbLTqseX3v50KOwMJSb/86irn4gPWSuWjI=", "owner": "input-output-hk", - "repo": "ghc", - "rev": "95713a6ecce4551240da7c96b6176f980af75cae", + "repo": "ghc-next-packages", + "rev": "62b7db48b3325d6d585ac079576733d3a76bae72", "type": "github" }, "original": { "owner": "input-output-hk", - "ref": "release/8.6.5-iohk", - "repo": "ghc", + "ref": "repo", + "repo": "ghc-next-packages", + "type": "github" + } + }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "hercules-ci-effects", + "hercules-ci-agent", + "pre-commit-hooks-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1660459072, + "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", "type": "github" } }, "gitignore-nix": { - "flake": false, - "locked": { - "lastModified": 1611672876, - "narHash": "sha256-qHu3uZ/o9jBHiA3MEKHJ06k7w4heOhA+4HCSIvflRxo=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "211907489e9f198594c0eb0ca9256a1949c9d412", - "type": "github" + "inputs": { + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "nixpkgs" + ] }, - "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", - "type": "github" - } - }, - "gitignore-nix_10": { - "flake": false, "locked": { - "lastModified": 1611672876, - "narHash": "sha256-qHu3uZ/o9jBHiA3MEKHJ06k7w4heOhA+4HCSIvflRxo=", + "lastModified": 1660459072, + "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=", "owner": "hercules-ci", "repo": "gitignore.nix", - "rev": "211907489e9f198594c0eb0ca9256a1949c9d412", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", - "type": "github" - } - }, - "gitignore-nix_11": { - "flake": false, - "locked": { - "lastModified": 1611672876, - "narHash": "sha256-qHu3uZ/o9jBHiA3MEKHJ06k7w4heOhA+4HCSIvflRxo=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "211907489e9f198594c0eb0ca9256a1949c9d412", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", - "type": "github" - } - }, - "gitignore-nix_12": { - "flake": false, - "locked": { - "lastModified": 1611672876, - "narHash": "sha256-qHu3uZ/o9jBHiA3MEKHJ06k7w4heOhA+4HCSIvflRxo=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "211907489e9f198594c0eb0ca9256a1949c9d412", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", - "type": "github" - } - }, - "gitignore-nix_13": { - "flake": false, - "locked": { - "lastModified": 1611672876, - "narHash": "sha256-qHu3uZ/o9jBHiA3MEKHJ06k7w4heOhA+4HCSIvflRxo=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "211907489e9f198594c0eb0ca9256a1949c9d412", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", - "type": "github" - } - }, - "gitignore-nix_14": { - "flake": false, - "locked": { - "lastModified": 1611672876, - "narHash": "sha256-qHu3uZ/o9jBHiA3MEKHJ06k7w4heOhA+4HCSIvflRxo=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "211907489e9f198594c0eb0ca9256a1949c9d412", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", - "type": "github" - } - }, - "gitignore-nix_15": { - "flake": false, - "locked": { - "lastModified": 1611672876, - "narHash": "sha256-qHu3uZ/o9jBHiA3MEKHJ06k7w4heOhA+4HCSIvflRxo=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "211907489e9f198594c0eb0ca9256a1949c9d412", + "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73", "type": "github" }, "original": { @@ -3068,13 +2784,21 @@ } }, "gitignore-nix_2": { - "flake": false, + "inputs": { + "nixpkgs": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1611672876, - "narHash": "sha256-qHu3uZ/o9jBHiA3MEKHJ06k7w4heOhA+4HCSIvflRxo=", + "lastModified": 1660459072, + "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=", "owner": "hercules-ci", "repo": "gitignore.nix", - "rev": "211907489e9f198594c0eb0ca9256a1949c9d412", + "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73", "type": "github" }, "original": { @@ -3083,14 +2807,21 @@ "type": "github" } }, - "gitignore-nix_3": { - "flake": false, + "gitignore_2": { + "inputs": { + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "pre-commit-hooks", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1611672876, - "narHash": "sha256-qHu3uZ/o9jBHiA3MEKHJ06k7w4heOhA+4HCSIvflRxo=", + "lastModified": 1660459072, + "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=", "owner": "hercules-ci", "repo": "gitignore.nix", - "rev": "211907489e9f198594c0eb0ca9256a1949c9d412", + "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73", "type": "github" }, "original": { @@ -3099,14 +2830,20 @@ "type": "github" } }, - "gitignore-nix_4": { - "flake": false, + "gitignore_3": { + "inputs": { + "nixpkgs": [ + "liqwid-nix", + "pre-commit-hooks", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1611672876, - "narHash": "sha256-qHu3uZ/o9jBHiA3MEKHJ06k7w4heOhA+4HCSIvflRxo=", + "lastModified": 1660459072, + "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=", "owner": "hercules-ci", "repo": "gitignore.nix", - "rev": "211907489e9f198594c0eb0ca9256a1949c9d412", + "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73", "type": "github" }, "original": { @@ -3115,94 +2852,147 @@ "type": "github" } }, - "gitignore-nix_5": { - "flake": false, + "gomod2nix": { + "inputs": { + "nixpkgs": "nixpkgs_2", + "utils": "utils" + }, "locked": { - "lastModified": 1611672876, - "narHash": "sha256-qHu3uZ/o9jBHiA3MEKHJ06k7w4heOhA+4HCSIvflRxo=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "211907489e9f198594c0eb0ca9256a1949c9d412", + "lastModified": 1655245309, + "narHash": "sha256-d/YPoQ/vFn1+GTmSdvbSBSTOai61FONxB4+Lt6w/IVI=", + "owner": "tweag", + "repo": "gomod2nix", + "rev": "40d32f82fc60d66402eb0972e6e368aeab3faf58", "type": "github" }, "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", + "owner": "tweag", + "repo": "gomod2nix", "type": "github" } }, - "gitignore-nix_6": { - "flake": false, + "gomod2nix_2": { + "inputs": { + "nixpkgs": "nixpkgs_8", + "utils": "utils_2" + }, "locked": { - "lastModified": 1611672876, - "narHash": "sha256-qHu3uZ/o9jBHiA3MEKHJ06k7w4heOhA+4HCSIvflRxo=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "211907489e9f198594c0eb0ca9256a1949c9d412", + "lastModified": 1655245309, + "narHash": "sha256-d/YPoQ/vFn1+GTmSdvbSBSTOai61FONxB4+Lt6w/IVI=", + "owner": "tweag", + "repo": "gomod2nix", + "rev": "40d32f82fc60d66402eb0972e6e368aeab3faf58", "type": "github" }, "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", + "owner": "tweag", + "repo": "gomod2nix", "type": "github" } }, - "gitignore-nix_7": { - "flake": false, + "gomod2nix_3": { + "inputs": { + "nixpkgs": "nixpkgs_14", + "utils": "utils_3" + }, "locked": { - "lastModified": 1611672876, - "narHash": "sha256-qHu3uZ/o9jBHiA3MEKHJ06k7w4heOhA+4HCSIvflRxo=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "211907489e9f198594c0eb0ca9256a1949c9d412", + "lastModified": 1655245309, + "narHash": "sha256-d/YPoQ/vFn1+GTmSdvbSBSTOai61FONxB4+Lt6w/IVI=", + "owner": "tweag", + "repo": "gomod2nix", + "rev": "40d32f82fc60d66402eb0972e6e368aeab3faf58", "type": "github" }, "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", + "owner": "tweag", + "repo": "gomod2nix", "type": "github" } }, - "gitignore-nix_8": { - "flake": false, + "gomod2nix_4": { + "inputs": { + "nixpkgs": "nixpkgs_19", + "utils": "utils_4" + }, "locked": { - "lastModified": 1611672876, - "narHash": "sha256-qHu3uZ/o9jBHiA3MEKHJ06k7w4heOhA+4HCSIvflRxo=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "211907489e9f198594c0eb0ca9256a1949c9d412", + "lastModified": 1655245309, + "narHash": "sha256-d/YPoQ/vFn1+GTmSdvbSBSTOai61FONxB4+Lt6w/IVI=", + "owner": "tweag", + "repo": "gomod2nix", + "rev": "40d32f82fc60d66402eb0972e6e368aeab3faf58", "type": "github" }, "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", + "owner": "tweag", + "repo": "gomod2nix", "type": "github" } }, - "gitignore-nix_9": { - "flake": false, + "gomod2nix_5": { + "inputs": { + "nixpkgs": "nixpkgs_24", + "utils": "utils_5" + }, "locked": { - "lastModified": 1611672876, - "narHash": "sha256-qHu3uZ/o9jBHiA3MEKHJ06k7w4heOhA+4HCSIvflRxo=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "211907489e9f198594c0eb0ca9256a1949c9d412", + "lastModified": 1655245309, + "narHash": "sha256-d/YPoQ/vFn1+GTmSdvbSBSTOai61FONxB4+Lt6w/IVI=", + "owner": "tweag", + "repo": "gomod2nix", + "rev": "40d32f82fc60d66402eb0972e6e368aeab3faf58", "type": "github" }, "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", + "owner": "tweag", + "repo": "gomod2nix", + "type": "github" + } + }, + "gomod2nix_6": { + "inputs": { + "nixpkgs": "nixpkgs_28", + "utils": "utils_6" + }, + "locked": { + "lastModified": 1655245309, + "narHash": "sha256-d/YPoQ/vFn1+GTmSdvbSBSTOai61FONxB4+Lt6w/IVI=", + "owner": "tweag", + "repo": "gomod2nix", + "rev": "40d32f82fc60d66402eb0972e6e368aeab3faf58", + "type": "github" + }, + "original": { + "owner": "tweag", + "repo": "gomod2nix", + "type": "github" + } + }, + "gomod2nix_7": { + "inputs": { + "nixpkgs": "nixpkgs_34", + "utils": "utils_7" + }, + "locked": { + "lastModified": 1655245309, + "narHash": "sha256-d/YPoQ/vFn1+GTmSdvbSBSTOai61FONxB4+Lt6w/IVI=", + "owner": "tweag", + "repo": "gomod2nix", + "rev": "40d32f82fc60d66402eb0972e6e368aeab3faf58", + "type": "github" + }, + "original": { + "owner": "tweag", + "repo": "gomod2nix", "type": "github" } }, "hackage": { "flake": false, "locked": { - "lastModified": 1654046237, - "narHash": "sha256-FpM9zE+Q+WrvCiaZBCg5U1g0bYpiZOCxY8V3R5ydBu8=", + "lastModified": 1668388507, + "narHash": "sha256-NrZF+AvPCgGwqIkFmq3VZBHDHHxWXRyE6A3VSWJtRr8=", "owner": "input-output-hk", "repo": "hackage.nix", - "rev": "eeae1790b9c6a880d96e4a7214fdf0a73bdd6fc0", + "rev": "b585a1d4005e8aa2c2d3958be88c960dec58540e", "type": "github" }, "original": { @@ -3214,107 +3004,11 @@ "hackage-nix": { "flake": false, "locked": { - "lastModified": 1651108473, - "narHash": "sha256-zHGCnBdwKvrcYanjf3GARTWF8V2pyJl1QNONUNZSoc0=", + "lastModified": 1667178734, + "narHash": "sha256-0GwFFm9S+2ulW3nFFEONPu7QlM8igY6dwdxhrsjZURM=", "owner": "input-output-hk", "repo": "hackage.nix", - "rev": "dbab3b292c3400d028a2257e3acd2ac0249da774", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", - "type": "github" - } - }, - "hackage-nix_10": { - "flake": false, - "locked": { - "lastModified": 1651108473, - "narHash": "sha256-zHGCnBdwKvrcYanjf3GARTWF8V2pyJl1QNONUNZSoc0=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "dbab3b292c3400d028a2257e3acd2ac0249da774", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", - "type": "github" - } - }, - "hackage-nix_11": { - "flake": false, - "locked": { - "lastModified": 1651108473, - "narHash": "sha256-zHGCnBdwKvrcYanjf3GARTWF8V2pyJl1QNONUNZSoc0=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "dbab3b292c3400d028a2257e3acd2ac0249da774", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", - "type": "github" - } - }, - "hackage-nix_12": { - "flake": false, - "locked": { - "lastModified": 1651108473, - "narHash": "sha256-zHGCnBdwKvrcYanjf3GARTWF8V2pyJl1QNONUNZSoc0=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "dbab3b292c3400d028a2257e3acd2ac0249da774", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", - "type": "github" - } - }, - "hackage-nix_13": { - "flake": false, - "locked": { - "lastModified": 1651108473, - "narHash": "sha256-zHGCnBdwKvrcYanjf3GARTWF8V2pyJl1QNONUNZSoc0=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "dbab3b292c3400d028a2257e3acd2ac0249da774", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", - "type": "github" - } - }, - "hackage-nix_14": { - "flake": false, - "locked": { - "lastModified": 1651108473, - "narHash": "sha256-zHGCnBdwKvrcYanjf3GARTWF8V2pyJl1QNONUNZSoc0=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "dbab3b292c3400d028a2257e3acd2ac0249da774", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", - "type": "github" - } - }, - "hackage-nix_15": { - "flake": false, - "locked": { - "lastModified": 1651108473, - "narHash": "sha256-zHGCnBdwKvrcYanjf3GARTWF8V2pyJl1QNONUNZSoc0=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "dbab3b292c3400d028a2257e3acd2ac0249da774", + "rev": "e24596503629164425c339135fd19a0edbcd6d2f", "type": "github" }, "original": { @@ -3326,219 +3020,11 @@ "hackage-nix_2": { "flake": false, "locked": { - "lastModified": 1651108473, - "narHash": "sha256-zHGCnBdwKvrcYanjf3GARTWF8V2pyJl1QNONUNZSoc0=", + "lastModified": 1667178734, + "narHash": "sha256-0GwFFm9S+2ulW3nFFEONPu7QlM8igY6dwdxhrsjZURM=", "owner": "input-output-hk", "repo": "hackage.nix", - "rev": "dbab3b292c3400d028a2257e3acd2ac0249da774", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", - "type": "github" - } - }, - "hackage-nix_3": { - "flake": false, - "locked": { - "lastModified": 1651108473, - "narHash": "sha256-zHGCnBdwKvrcYanjf3GARTWF8V2pyJl1QNONUNZSoc0=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "dbab3b292c3400d028a2257e3acd2ac0249da774", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", - "type": "github" - } - }, - "hackage-nix_4": { - "flake": false, - "locked": { - "lastModified": 1651108473, - "narHash": "sha256-zHGCnBdwKvrcYanjf3GARTWF8V2pyJl1QNONUNZSoc0=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "dbab3b292c3400d028a2257e3acd2ac0249da774", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", - "type": "github" - } - }, - "hackage-nix_5": { - "flake": false, - "locked": { - "lastModified": 1651108473, - "narHash": "sha256-zHGCnBdwKvrcYanjf3GARTWF8V2pyJl1QNONUNZSoc0=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "dbab3b292c3400d028a2257e3acd2ac0249da774", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", - "type": "github" - } - }, - "hackage-nix_6": { - "flake": false, - "locked": { - "lastModified": 1651108473, - "narHash": "sha256-zHGCnBdwKvrcYanjf3GARTWF8V2pyJl1QNONUNZSoc0=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "dbab3b292c3400d028a2257e3acd2ac0249da774", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", - "type": "github" - } - }, - "hackage-nix_7": { - "flake": false, - "locked": { - "lastModified": 1651108473, - "narHash": "sha256-zHGCnBdwKvrcYanjf3GARTWF8V2pyJl1QNONUNZSoc0=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "dbab3b292c3400d028a2257e3acd2ac0249da774", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", - "type": "github" - } - }, - "hackage-nix_8": { - "flake": false, - "locked": { - "lastModified": 1651108473, - "narHash": "sha256-zHGCnBdwKvrcYanjf3GARTWF8V2pyJl1QNONUNZSoc0=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "dbab3b292c3400d028a2257e3acd2ac0249da774", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", - "type": "github" - } - }, - "hackage-nix_9": { - "flake": false, - "locked": { - "lastModified": 1651108473, - "narHash": "sha256-zHGCnBdwKvrcYanjf3GARTWF8V2pyJl1QNONUNZSoc0=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "dbab3b292c3400d028a2257e3acd2ac0249da774", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", - "type": "github" - } - }, - "hackage_10": { - "flake": false, - "locked": { - "lastModified": 1654046237, - "narHash": "sha256-FpM9zE+Q+WrvCiaZBCg5U1g0bYpiZOCxY8V3R5ydBu8=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "eeae1790b9c6a880d96e4a7214fdf0a73bdd6fc0", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", - "type": "github" - } - }, - "hackage_11": { - "flake": false, - "locked": { - "lastModified": 1654046237, - "narHash": "sha256-FpM9zE+Q+WrvCiaZBCg5U1g0bYpiZOCxY8V3R5ydBu8=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "eeae1790b9c6a880d96e4a7214fdf0a73bdd6fc0", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", - "type": "github" - } - }, - "hackage_12": { - "flake": false, - "locked": { - "lastModified": 1654046237, - "narHash": "sha256-FpM9zE+Q+WrvCiaZBCg5U1g0bYpiZOCxY8V3R5ydBu8=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "eeae1790b9c6a880d96e4a7214fdf0a73bdd6fc0", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", - "type": "github" - } - }, - "hackage_13": { - "flake": false, - "locked": { - "lastModified": 1654046237, - "narHash": "sha256-FpM9zE+Q+WrvCiaZBCg5U1g0bYpiZOCxY8V3R5ydBu8=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "eeae1790b9c6a880d96e4a7214fdf0a73bdd6fc0", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", - "type": "github" - } - }, - "hackage_14": { - "flake": false, - "locked": { - "lastModified": 1654046237, - "narHash": "sha256-FpM9zE+Q+WrvCiaZBCg5U1g0bYpiZOCxY8V3R5ydBu8=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "eeae1790b9c6a880d96e4a7214fdf0a73bdd6fc0", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", - "type": "github" - } - }, - "hackage_15": { - "flake": false, - "locked": { - "lastModified": 1654046237, - "narHash": "sha256-FpM9zE+Q+WrvCiaZBCg5U1g0bYpiZOCxY8V3R5ydBu8=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "eeae1790b9c6a880d96e4a7214fdf0a73bdd6fc0", + "rev": "e24596503629164425c339135fd19a0edbcd6d2f", "type": "github" }, "original": { @@ -3550,11 +3036,11 @@ "hackage_2": { "flake": false, "locked": { - "lastModified": 1654046237, - "narHash": "sha256-FpM9zE+Q+WrvCiaZBCg5U1g0bYpiZOCxY8V3R5ydBu8=", + "lastModified": 1670891293, + "narHash": "sha256-GeM+cYlkCAjLdOu+he9bmaL/hBj3XrVSrNUP4p4OQdg=", "owner": "input-output-hk", "repo": "hackage.nix", - "rev": "eeae1790b9c6a880d96e4a7214fdf0a73bdd6fc0", + "rev": "a63a92060aa872b284db85fb914a7732931a0132", "type": "github" }, "original": { @@ -3566,11 +3052,11 @@ "hackage_3": { "flake": false, "locked": { - "lastModified": 1654046237, - "narHash": "sha256-FpM9zE+Q+WrvCiaZBCg5U1g0bYpiZOCxY8V3R5ydBu8=", + "lastModified": 1668388507, + "narHash": "sha256-NrZF+AvPCgGwqIkFmq3VZBHDHHxWXRyE6A3VSWJtRr8=", "owner": "input-output-hk", "repo": "hackage.nix", - "rev": "eeae1790b9c6a880d96e4a7214fdf0a73bdd6fc0", + "rev": "b585a1d4005e8aa2c2d3958be88c960dec58540e", "type": "github" }, "original": { @@ -3582,11 +3068,11 @@ "hackage_4": { "flake": false, "locked": { - "lastModified": 1654046237, - "narHash": "sha256-FpM9zE+Q+WrvCiaZBCg5U1g0bYpiZOCxY8V3R5ydBu8=", + "lastModified": 1668388507, + "narHash": "sha256-NrZF+AvPCgGwqIkFmq3VZBHDHHxWXRyE6A3VSWJtRr8=", "owner": "input-output-hk", "repo": "hackage.nix", - "rev": "eeae1790b9c6a880d96e4a7214fdf0a73bdd6fc0", + "rev": "b585a1d4005e8aa2c2d3958be88c960dec58540e", "type": "github" }, "original": { @@ -3598,11 +3084,11 @@ "hackage_5": { "flake": false, "locked": { - "lastModified": 1654046237, - "narHash": "sha256-FpM9zE+Q+WrvCiaZBCg5U1g0bYpiZOCxY8V3R5ydBu8=", + "lastModified": 1670891293, + "narHash": "sha256-GeM+cYlkCAjLdOu+he9bmaL/hBj3XrVSrNUP4p4OQdg=", "owner": "input-output-hk", "repo": "hackage.nix", - "rev": "eeae1790b9c6a880d96e4a7214fdf0a73bdd6fc0", + "rev": "a63a92060aa872b284db85fb914a7732931a0132", "type": "github" }, "original": { @@ -3611,247 +3097,65 @@ "type": "github" } }, - "hackage_6": { - "flake": false, + "haskell-flake": { "locked": { - "lastModified": 1654046237, - "narHash": "sha256-FpM9zE+Q+WrvCiaZBCg5U1g0bYpiZOCxY8V3R5ydBu8=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "eeae1790b9c6a880d96e4a7214fdf0a73bdd6fc0", + "lastModified": 1678138103, + "narHash": "sha256-D0lao82bV3t2gEFjHiU6RN233t+1MnkQV+bq8MEu2ic=", + "owner": "hercules-ci", + "repo": "haskell-flake", + "rev": "1e1660e6dd00838ba73bc7952e6e73be67da18d1", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", + "owner": "hercules-ci", + "ref": "0.1-extraLibraries", + "repo": "haskell-flake", "type": "github" } }, - "hackage_7": { - "flake": false, + "haskell-flake_2": { "locked": { - "lastModified": 1654046237, - "narHash": "sha256-FpM9zE+Q+WrvCiaZBCg5U1g0bYpiZOCxY8V3R5ydBu8=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "eeae1790b9c6a880d96e4a7214fdf0a73bdd6fc0", + "lastModified": 1668167720, + "narHash": "sha256-5wDTR6xt9BB3BjgKR+YOjOkZgMyDXKaX79g42sStzDU=", + "owner": "srid", + "repo": "haskell-flake", + "rev": "4fc511d93a55fedf815c1647ad146c26d7a2054e", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", + "owner": "srid", + "repo": "haskell-flake", "type": "github" } }, - "hackage_8": { - "flake": false, + "haskell-flake_3": { "locked": { - "lastModified": 1654046237, - "narHash": "sha256-FpM9zE+Q+WrvCiaZBCg5U1g0bYpiZOCxY8V3R5ydBu8=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "eeae1790b9c6a880d96e4a7214fdf0a73bdd6fc0", + "lastModified": 1668167720, + "narHash": "sha256-5wDTR6xt9BB3BjgKR+YOjOkZgMyDXKaX79g42sStzDU=", + "owner": "srid", + "repo": "haskell-flake", + "rev": "4fc511d93a55fedf815c1647ad146c26d7a2054e", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", - "type": "github" - } - }, - "hackage_9": { - "flake": false, - "locked": { - "lastModified": 1654046237, - "narHash": "sha256-FpM9zE+Q+WrvCiaZBCg5U1g0bYpiZOCxY8V3R5ydBu8=", - "owner": "input-output-hk", - "repo": "hackage.nix", - "rev": "eeae1790b9c6a880d96e4a7214fdf0a73bdd6fc0", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "hackage.nix", + "owner": "srid", + "repo": "haskell-flake", "type": "github" } }, "haskell-language-server": { "flake": false, "locked": { - "lastModified": 1653778781, - "narHash": "sha256-oEVBaYRLjD4gC3vQuT0DCgmCSIeWSwGPVXXSKJDFUK0=", + "lastModified": 1663135728, + "narHash": "sha256-ghyyig0GZXRXS56FxH8unpDceU06i/uGBCBmRwneZPw=", "owner": "haskell", "repo": "haskell-language-server", - "rev": "8c47d6ce2a8409a285a3f4c3f0e10c25fb4dd848", - "type": "github" - }, - "original": { - "owner": "haskell", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_10": { - "flake": false, - "locked": { - "lastModified": 1650980856, - "narHash": "sha256-uiwsfh/K3IABZDYj7JUZNIAPRVqH6g/r8X6QKg8DrZE=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "b5a37f7fc360596899cb2945f363030f44156415", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "1.7.0.0", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_11": { - "flake": false, - "locked": { - "lastModified": 1653778781, - "narHash": "sha256-oEVBaYRLjD4gC3vQuT0DCgmCSIeWSwGPVXXSKJDFUK0=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "8c47d6ce2a8409a285a3f4c3f0e10c25fb4dd848", - "type": "github" - }, - "original": { - "owner": "haskell", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_12": { - "flake": false, - "locked": { - "lastModified": 1650980856, - "narHash": "sha256-uiwsfh/K3IABZDYj7JUZNIAPRVqH6g/r8X6QKg8DrZE=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "b5a37f7fc360596899cb2945f363030f44156415", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "1.7.0.0", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_13": { - "flake": false, - "locked": { - "lastModified": 1653778781, - "narHash": "sha256-oEVBaYRLjD4gC3vQuT0DCgmCSIeWSwGPVXXSKJDFUK0=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "8c47d6ce2a8409a285a3f4c3f0e10c25fb4dd848", - "type": "github" - }, - "original": { - "owner": "haskell", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_14": { - "flake": false, - "locked": { - "lastModified": 1650980856, - "narHash": "sha256-uiwsfh/K3IABZDYj7JUZNIAPRVqH6g/r8X6QKg8DrZE=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "b5a37f7fc360596899cb2945f363030f44156415", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "1.7.0.0", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_15": { - "flake": false, - "locked": { - "lastModified": 1653778781, - "narHash": "sha256-oEVBaYRLjD4gC3vQuT0DCgmCSIeWSwGPVXXSKJDFUK0=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "8c47d6ce2a8409a285a3f4c3f0e10c25fb4dd848", - "type": "github" - }, - "original": { - "owner": "haskell", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_16": { - "flake": false, - "locked": { - "lastModified": 1650980856, - "narHash": "sha256-uiwsfh/K3IABZDYj7JUZNIAPRVqH6g/r8X6QKg8DrZE=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "b5a37f7fc360596899cb2945f363030f44156415", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "1.7.0.0", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_17": { - "flake": false, - "locked": { - "lastModified": 1653778781, - "narHash": "sha256-oEVBaYRLjD4gC3vQuT0DCgmCSIeWSwGPVXXSKJDFUK0=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "8c47d6ce2a8409a285a3f4c3f0e10c25fb4dd848", - "type": "github" - }, - "original": { - "owner": "haskell", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_18": { - "flake": false, - "locked": { - "lastModified": 1650980856, - "narHash": "sha256-uiwsfh/K3IABZDYj7JUZNIAPRVqH6g/r8X6QKg8DrZE=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "b5a37f7fc360596899cb2945f363030f44156415", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "1.7.0.0", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_19": { - "flake": false, - "locked": { - "lastModified": 1653778781, - "narHash": "sha256-oEVBaYRLjD4gC3vQuT0DCgmCSIeWSwGPVXXSKJDFUK0=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "8c47d6ce2a8409a285a3f4c3f0e10c25fb4dd848", + "rev": "ddb21a0c8d4e657c4b81ce250239bccf28fc9524", "type": "github" }, "original": { "owner": "haskell", + "ref": "1.8.0.0", "repo": "haskell-language-server", "type": "github" } @@ -3859,313 +3163,16 @@ "haskell-language-server_2": { "flake": false, "locked": { - "lastModified": 1650980856, - "narHash": "sha256-uiwsfh/K3IABZDYj7JUZNIAPRVqH6g/r8X6QKg8DrZE=", + "lastModified": 1663135728, + "narHash": "sha256-ghyyig0GZXRXS56FxH8unpDceU06i/uGBCBmRwneZPw=", "owner": "haskell", "repo": "haskell-language-server", - "rev": "b5a37f7fc360596899cb2945f363030f44156415", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "1.7.0.0", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_20": { - "flake": false, - "locked": { - "lastModified": 1650980856, - "narHash": "sha256-uiwsfh/K3IABZDYj7JUZNIAPRVqH6g/r8X6QKg8DrZE=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "b5a37f7fc360596899cb2945f363030f44156415", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "1.7.0.0", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_21": { - "flake": false, - "locked": { - "lastModified": 1653778781, - "narHash": "sha256-oEVBaYRLjD4gC3vQuT0DCgmCSIeWSwGPVXXSKJDFUK0=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "8c47d6ce2a8409a285a3f4c3f0e10c25fb4dd848", - "type": "github" - }, - "original": { - "owner": "haskell", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_22": { - "flake": false, - "locked": { - "lastModified": 1650980856, - "narHash": "sha256-uiwsfh/K3IABZDYj7JUZNIAPRVqH6g/r8X6QKg8DrZE=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "b5a37f7fc360596899cb2945f363030f44156415", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "1.7.0.0", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_23": { - "flake": false, - "locked": { - "lastModified": 1653778781, - "narHash": "sha256-oEVBaYRLjD4gC3vQuT0DCgmCSIeWSwGPVXXSKJDFUK0=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "8c47d6ce2a8409a285a3f4c3f0e10c25fb4dd848", - "type": "github" - }, - "original": { - "owner": "haskell", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_24": { - "flake": false, - "locked": { - "lastModified": 1650980856, - "narHash": "sha256-uiwsfh/K3IABZDYj7JUZNIAPRVqH6g/r8X6QKg8DrZE=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "b5a37f7fc360596899cb2945f363030f44156415", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "1.7.0.0", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_25": { - "flake": false, - "locked": { - "lastModified": 1653778781, - "narHash": "sha256-oEVBaYRLjD4gC3vQuT0DCgmCSIeWSwGPVXXSKJDFUK0=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "8c47d6ce2a8409a285a3f4c3f0e10c25fb4dd848", - "type": "github" - }, - "original": { - "owner": "haskell", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_26": { - "flake": false, - "locked": { - "lastModified": 1650980856, - "narHash": "sha256-uiwsfh/K3IABZDYj7JUZNIAPRVqH6g/r8X6QKg8DrZE=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "b5a37f7fc360596899cb2945f363030f44156415", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "1.7.0.0", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_27": { - "flake": false, - "locked": { - "lastModified": 1653778781, - "narHash": "sha256-oEVBaYRLjD4gC3vQuT0DCgmCSIeWSwGPVXXSKJDFUK0=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "8c47d6ce2a8409a285a3f4c3f0e10c25fb4dd848", - "type": "github" - }, - "original": { - "owner": "haskell", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_28": { - "flake": false, - "locked": { - "lastModified": 1650980856, - "narHash": "sha256-uiwsfh/K3IABZDYj7JUZNIAPRVqH6g/r8X6QKg8DrZE=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "b5a37f7fc360596899cb2945f363030f44156415", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "1.7.0.0", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_29": { - "flake": false, - "locked": { - "lastModified": 1653778781, - "narHash": "sha256-oEVBaYRLjD4gC3vQuT0DCgmCSIeWSwGPVXXSKJDFUK0=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "8c47d6ce2a8409a285a3f4c3f0e10c25fb4dd848", - "type": "github" - }, - "original": { - "owner": "haskell", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_3": { - "flake": false, - "locked": { - "lastModified": 1653778781, - "narHash": "sha256-oEVBaYRLjD4gC3vQuT0DCgmCSIeWSwGPVXXSKJDFUK0=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "8c47d6ce2a8409a285a3f4c3f0e10c25fb4dd848", - "type": "github" - }, - "original": { - "owner": "haskell", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_30": { - "flake": false, - "locked": { - "lastModified": 1650980856, - "narHash": "sha256-uiwsfh/K3IABZDYj7JUZNIAPRVqH6g/r8X6QKg8DrZE=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "b5a37f7fc360596899cb2945f363030f44156415", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "1.7.0.0", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_4": { - "flake": false, - "locked": { - "lastModified": 1650980856, - "narHash": "sha256-uiwsfh/K3IABZDYj7JUZNIAPRVqH6g/r8X6QKg8DrZE=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "b5a37f7fc360596899cb2945f363030f44156415", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "1.7.0.0", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_5": { - "flake": false, - "locked": { - "lastModified": 1653778781, - "narHash": "sha256-oEVBaYRLjD4gC3vQuT0DCgmCSIeWSwGPVXXSKJDFUK0=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "8c47d6ce2a8409a285a3f4c3f0e10c25fb4dd848", - "type": "github" - }, - "original": { - "owner": "haskell", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_6": { - "flake": false, - "locked": { - "lastModified": 1650980856, - "narHash": "sha256-uiwsfh/K3IABZDYj7JUZNIAPRVqH6g/r8X6QKg8DrZE=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "b5a37f7fc360596899cb2945f363030f44156415", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "1.7.0.0", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_7": { - "flake": false, - "locked": { - "lastModified": 1653778781, - "narHash": "sha256-oEVBaYRLjD4gC3vQuT0DCgmCSIeWSwGPVXXSKJDFUK0=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "8c47d6ce2a8409a285a3f4c3f0e10c25fb4dd848", - "type": "github" - }, - "original": { - "owner": "haskell", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_8": { - "flake": false, - "locked": { - "lastModified": 1650980856, - "narHash": "sha256-uiwsfh/K3IABZDYj7JUZNIAPRVqH6g/r8X6QKg8DrZE=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "b5a37f7fc360596899cb2945f363030f44156415", - "type": "github" - }, - "original": { - "owner": "haskell", - "ref": "1.7.0.0", - "repo": "haskell-language-server", - "type": "github" - } - }, - "haskell-language-server_9": { - "flake": false, - "locked": { - "lastModified": 1653778781, - "narHash": "sha256-oEVBaYRLjD4gC3vQuT0DCgmCSIeWSwGPVXXSKJDFUK0=", - "owner": "haskell", - "repo": "haskell-language-server", - "rev": "8c47d6ce2a8409a285a3f4c3f0e10c25fb4dd848", + "rev": "ddb21a0c8d4e657c4b81ce250239bccf28fc9524", "type": "github" }, "original": { "owner": "haskell", + "ref": "1.8.0.0", "repo": "haskell-language-server", "type": "github" } @@ -4177,1055 +3184,80 @@ "cabal-34": "cabal-34", "cabal-36": "cabal-36", "cardano-shell": "cardano-shell", + "flake-compat": "flake-compat", "flake-utils": "flake-utils", "ghc-8.6.5-iohk": "ghc-8.6.5-iohk", "hackage": "hackage", "hpc-coveralls": "hpc-coveralls", "hydra": "hydra", - "nix-tools": "nix-tools", "nixpkgs": [ - "liqwid-plutarch-extra", - "plutarch", + "liqwid-libs", + "liqwid-nix", "haskell-nix", "nixpkgs-unstable" ], "nixpkgs-2003": "nixpkgs-2003", "nixpkgs-2105": "nixpkgs-2105", - "nixpkgs-2111": "nixpkgs-2111_2", + "nixpkgs-2111": "nixpkgs-2111", + "nixpkgs-2205": "nixpkgs-2205", "nixpkgs-unstable": "nixpkgs-unstable", "old-ghc-nix": "old-ghc-nix", - "stackage": "stackage" + "stackage": "stackage", + "tullia": "tullia" }, "locked": { - "lastModified": 1654068838, - "narHash": "sha256-GHSufC21DSg8Lz2AzIg3DA9DPxGvLqxGFa/4ADoXRhU=", + "lastModified": 1668485534, + "narHash": "sha256-F3vszm6uCaQz9qo3SMZPkXoabWjp3B+JzPPopkCAibU=", "owner": "input-output-hk", "repo": "haskell.nix", - "rev": "fa2fa131fe15e630c91ab4078d12eb32c41f934b", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", - "type": "github" - } - }, - "haskell-nix-extra-hackage": { - "inputs": { - "haskell-nix": [ - "liqwid-plutarch-extra", - "plutarch", - "haskell-nix" - ], - "nixpkgs": [ - "liqwid-plutarch-extra", - "plutarch", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1655143375, - "narHash": "sha256-yU+HPLwGPf5IeLj9IBQ1zrPBTYEwvYbuMnADs4T8RLQ=", - "owner": "mlabs-haskell", - "repo": "haskell-nix-extra-hackage", - "rev": "03ee7afdc1ad982e059e3941db80f7a5b30a2757", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "ref": "separate-hackages", - "repo": "haskell-nix-extra-hackage", - "type": "github" - } - }, - "haskell-nix-extra-hackage_10": { - "inputs": { - "haskell-nix": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-context-builder", - "plutarch", - "haskell-nix" - ], - "nixpkgs": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-context-builder", - "plutarch", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1655143375, - "narHash": "sha256-yU+HPLwGPf5IeLj9IBQ1zrPBTYEwvYbuMnADs4T8RLQ=", - "owner": "mlabs-haskell", - "repo": "haskell-nix-extra-hackage", - "rev": "03ee7afdc1ad982e059e3941db80f7a5b30a2757", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "ref": "separate-hackages", - "repo": "haskell-nix-extra-hackage", - "type": "github" - } - }, - "haskell-nix-extra-hackage_11": { - "inputs": { - "haskell-nix": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-numeric", - "plutarch", - "haskell-nix" - ], - "nixpkgs": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-numeric", - "plutarch", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1655143375, - "narHash": "sha256-yU+HPLwGPf5IeLj9IBQ1zrPBTYEwvYbuMnADs4T8RLQ=", - "owner": "mlabs-haskell", - "repo": "haskell-nix-extra-hackage", - "rev": "03ee7afdc1ad982e059e3941db80f7a5b30a2757", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "ref": "separate-hackages", - "repo": "haskell-nix-extra-hackage", - "type": "github" - } - }, - "haskell-nix-extra-hackage_12": { - "inputs": { - "haskell-nix": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-quickcheck", - "plutarch", - "haskell-nix" - ], - "nixpkgs": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-quickcheck", - "plutarch", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1655143375, - "narHash": "sha256-yU+HPLwGPf5IeLj9IBQ1zrPBTYEwvYbuMnADs4T8RLQ=", - "owner": "mlabs-haskell", - "repo": "haskell-nix-extra-hackage", - "rev": "03ee7afdc1ad982e059e3941db80f7a5b30a2757", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "ref": "separate-hackages", - "repo": "haskell-nix-extra-hackage", - "type": "github" - } - }, - "haskell-nix-extra-hackage_13": { - "inputs": { - "haskell-nix": [ - "plutarch-safe-money", - "plutarch", - "haskell-nix" - ], - "nixpkgs": [ - "plutarch-safe-money", - "plutarch", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1655143375, - "narHash": "sha256-yU+HPLwGPf5IeLj9IBQ1zrPBTYEwvYbuMnADs4T8RLQ=", - "owner": "mlabs-haskell", - "repo": "haskell-nix-extra-hackage", - "rev": "03ee7afdc1ad982e059e3941db80f7a5b30a2757", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "ref": "separate-hackages", - "repo": "haskell-nix-extra-hackage", - "type": "github" - } - }, - "haskell-nix-extra-hackage_14": { - "inputs": { - "haskell-nix": [ - "plutarch-safe-money", - "plutarch-numeric", - "plutarch", - "haskell-nix" - ], - "nixpkgs": [ - "plutarch-safe-money", - "plutarch-numeric", - "plutarch", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1655143375, - "narHash": "sha256-yU+HPLwGPf5IeLj9IBQ1zrPBTYEwvYbuMnADs4T8RLQ=", - "owner": "mlabs-haskell", - "repo": "haskell-nix-extra-hackage", - "rev": "03ee7afdc1ad982e059e3941db80f7a5b30a2757", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "ref": "separate-hackages", - "repo": "haskell-nix-extra-hackage", - "type": "github" - } - }, - "haskell-nix-extra-hackage_15": { - "inputs": { - "haskell-nix": [ - "plutarch-script-export", - "plutarch", - "haskell-nix" - ], - "nixpkgs": [ - "plutarch-script-export", - "plutarch", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1655143375, - "narHash": "sha256-yU+HPLwGPf5IeLj9IBQ1zrPBTYEwvYbuMnADs4T8RLQ=", - "owner": "mlabs-haskell", - "repo": "haskell-nix-extra-hackage", - "rev": "03ee7afdc1ad982e059e3941db80f7a5b30a2757", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "ref": "separate-hackages", - "repo": "haskell-nix-extra-hackage", - "type": "github" - } - }, - "haskell-nix-extra-hackage_2": { - "inputs": { - "haskell-nix": [ - "liqwid-plutarch-extra", - "plutarch-context-builder", - "plutarch", - "haskell-nix" - ], - "nixpkgs": [ - "liqwid-plutarch-extra", - "plutarch-context-builder", - "plutarch", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1655143375, - "narHash": "sha256-yU+HPLwGPf5IeLj9IBQ1zrPBTYEwvYbuMnADs4T8RLQ=", - "owner": "mlabs-haskell", - "repo": "haskell-nix-extra-hackage", - "rev": "03ee7afdc1ad982e059e3941db80f7a5b30a2757", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "ref": "separate-hackages", - "repo": "haskell-nix-extra-hackage", - "type": "github" - } - }, - "haskell-nix-extra-hackage_3": { - "inputs": { - "haskell-nix": [ - "liqwid-plutarch-extra", - "plutarch-numeric", - "plutarch", - "haskell-nix" - ], - "nixpkgs": [ - "liqwid-plutarch-extra", - "plutarch-numeric", - "plutarch", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1655143375, - "narHash": "sha256-yU+HPLwGPf5IeLj9IBQ1zrPBTYEwvYbuMnADs4T8RLQ=", - "owner": "mlabs-haskell", - "repo": "haskell-nix-extra-hackage", - "rev": "03ee7afdc1ad982e059e3941db80f7a5b30a2757", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "ref": "separate-hackages", - "repo": "haskell-nix-extra-hackage", - "type": "github" - } - }, - "haskell-nix-extra-hackage_4": { - "inputs": { - "haskell-nix": [ - "liqwid-plutarch-extra", - "plutarch-quickcheck", - "plutarch", - "haskell-nix" - ], - "nixpkgs": [ - "liqwid-plutarch-extra", - "plutarch-quickcheck", - "plutarch", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1655143375, - "narHash": "sha256-yU+HPLwGPf5IeLj9IBQ1zrPBTYEwvYbuMnADs4T8RLQ=", - "owner": "mlabs-haskell", - "repo": "haskell-nix-extra-hackage", - "rev": "03ee7afdc1ad982e059e3941db80f7a5b30a2757", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "ref": "separate-hackages", - "repo": "haskell-nix-extra-hackage", - "type": "github" - } - }, - "haskell-nix-extra-hackage_5": { - "inputs": { - "haskell-nix": [ - "plutarch", - "haskell-nix" - ], - "nixpkgs": [ - "plutarch", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1655143375, - "narHash": "sha256-yU+HPLwGPf5IeLj9IBQ1zrPBTYEwvYbuMnADs4T8RLQ=", - "owner": "mlabs-haskell", - "repo": "haskell-nix-extra-hackage", - "rev": "03ee7afdc1ad982e059e3941db80f7a5b30a2757", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "ref": "separate-hackages", - "repo": "haskell-nix-extra-hackage", - "type": "github" - } - }, - "haskell-nix-extra-hackage_6": { - "inputs": { - "haskell-nix": [ - "plutarch-context-builder", - "plutarch", - "haskell-nix" - ], - "nixpkgs": [ - "plutarch-context-builder", - "plutarch", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1655143375, - "narHash": "sha256-yU+HPLwGPf5IeLj9IBQ1zrPBTYEwvYbuMnADs4T8RLQ=", - "owner": "mlabs-haskell", - "repo": "haskell-nix-extra-hackage", - "rev": "03ee7afdc1ad982e059e3941db80f7a5b30a2757", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "ref": "separate-hackages", - "repo": "haskell-nix-extra-hackage", - "type": "github" - } - }, - "haskell-nix-extra-hackage_7": { - "inputs": { - "haskell-nix": [ - "plutarch-numeric", - "plutarch", - "haskell-nix" - ], - "nixpkgs": [ - "plutarch-numeric", - "plutarch", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1655143375, - "narHash": "sha256-yU+HPLwGPf5IeLj9IBQ1zrPBTYEwvYbuMnADs4T8RLQ=", - "owner": "mlabs-haskell", - "repo": "haskell-nix-extra-hackage", - "rev": "03ee7afdc1ad982e059e3941db80f7a5b30a2757", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "ref": "separate-hackages", - "repo": "haskell-nix-extra-hackage", - "type": "github" - } - }, - "haskell-nix-extra-hackage_8": { - "inputs": { - "haskell-nix": [ - "plutarch-quickcheck", - "plutarch", - "haskell-nix" - ], - "nixpkgs": [ - "plutarch-quickcheck", - "plutarch", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1655143375, - "narHash": "sha256-yU+HPLwGPf5IeLj9IBQ1zrPBTYEwvYbuMnADs4T8RLQ=", - "owner": "mlabs-haskell", - "repo": "haskell-nix-extra-hackage", - "rev": "03ee7afdc1ad982e059e3941db80f7a5b30a2757", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "ref": "separate-hackages", - "repo": "haskell-nix-extra-hackage", - "type": "github" - } - }, - "haskell-nix-extra-hackage_9": { - "inputs": { - "haskell-nix": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch", - "haskell-nix" - ], - "nixpkgs": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1655143375, - "narHash": "sha256-yU+HPLwGPf5IeLj9IBQ1zrPBTYEwvYbuMnADs4T8RLQ=", - "owner": "mlabs-haskell", - "repo": "haskell-nix-extra-hackage", - "rev": "03ee7afdc1ad982e059e3941db80f7a5b30a2757", - "type": "github" - }, - "original": { - "owner": "mlabs-haskell", - "ref": "separate-hackages", - "repo": "haskell-nix-extra-hackage", - "type": "github" - } - }, - "haskell-nix_10": { - "flake": false, - "locked": { - "lastModified": 1651151636, - "narHash": "sha256-WdMP9IMB5kByT0zimDuCYZF/dinRB104H8iDTG/c1Eo=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "f707aa2e75c0d33473166abc61c0b43ac6e107c0", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", - "type": "github" - } - }, - "haskell-nix_11": { - "inputs": { - "HTTP": "HTTP_6", - "cabal-32": "cabal-32_6", - "cabal-34": "cabal-34_6", - "cabal-36": "cabal-36_6", - "cardano-shell": "cardano-shell_6", - "flake-utils": "flake-utils_6", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_6", - "hackage": "hackage_6", - "hpc-coveralls": "hpc-coveralls_6", - "hydra": "hydra_6", - "nix-tools": "nix-tools_6", - "nixpkgs": [ - "plutarch-context-builder", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-2003": "nixpkgs-2003_6", - "nixpkgs-2105": "nixpkgs-2105_6", - "nixpkgs-2111": "nixpkgs-2111_12", - "nixpkgs-unstable": "nixpkgs-unstable_6", - "old-ghc-nix": "old-ghc-nix_6", - "stackage": "stackage_6" - }, - "locked": { - "lastModified": 1654068838, - "narHash": "sha256-GHSufC21DSg8Lz2AzIg3DA9DPxGvLqxGFa/4ADoXRhU=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "fa2fa131fe15e630c91ab4078d12eb32c41f934b", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", - "type": "github" - } - }, - "haskell-nix_12": { - "flake": false, - "locked": { - "lastModified": 1651151636, - "narHash": "sha256-WdMP9IMB5kByT0zimDuCYZF/dinRB104H8iDTG/c1Eo=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "f707aa2e75c0d33473166abc61c0b43ac6e107c0", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", - "type": "github" - } - }, - "haskell-nix_13": { - "inputs": { - "HTTP": "HTTP_7", - "cabal-32": "cabal-32_7", - "cabal-34": "cabal-34_7", - "cabal-36": "cabal-36_7", - "cardano-shell": "cardano-shell_7", - "flake-utils": "flake-utils_7", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_7", - "hackage": "hackage_7", - "hpc-coveralls": "hpc-coveralls_7", - "hydra": "hydra_7", - "nix-tools": "nix-tools_7", - "nixpkgs": [ - "plutarch-numeric", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-2003": "nixpkgs-2003_7", - "nixpkgs-2105": "nixpkgs-2105_7", - "nixpkgs-2111": "nixpkgs-2111_14", - "nixpkgs-unstable": "nixpkgs-unstable_7", - "old-ghc-nix": "old-ghc-nix_7", - "stackage": "stackage_7" - }, - "locked": { - "lastModified": 1654068838, - "narHash": "sha256-GHSufC21DSg8Lz2AzIg3DA9DPxGvLqxGFa/4ADoXRhU=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "fa2fa131fe15e630c91ab4078d12eb32c41f934b", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", - "type": "github" - } - }, - "haskell-nix_14": { - "flake": false, - "locked": { - "lastModified": 1651151636, - "narHash": "sha256-WdMP9IMB5kByT0zimDuCYZF/dinRB104H8iDTG/c1Eo=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "f707aa2e75c0d33473166abc61c0b43ac6e107c0", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", - "type": "github" - } - }, - "haskell-nix_15": { - "inputs": { - "HTTP": "HTTP_8", - "cabal-32": "cabal-32_8", - "cabal-34": "cabal-34_8", - "cabal-36": "cabal-36_8", - "cardano-shell": "cardano-shell_8", - "flake-utils": "flake-utils_8", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_8", - "hackage": "hackage_8", - "hpc-coveralls": "hpc-coveralls_8", - "hydra": "hydra_8", - "nix-tools": "nix-tools_8", - "nixpkgs": [ - "plutarch-quickcheck", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-2003": "nixpkgs-2003_8", - "nixpkgs-2105": "nixpkgs-2105_8", - "nixpkgs-2111": "nixpkgs-2111_16", - "nixpkgs-unstable": "nixpkgs-unstable_8", - "old-ghc-nix": "old-ghc-nix_8", - "stackage": "stackage_8" - }, - "locked": { - "lastModified": 1654068838, - "narHash": "sha256-GHSufC21DSg8Lz2AzIg3DA9DPxGvLqxGFa/4ADoXRhU=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "fa2fa131fe15e630c91ab4078d12eb32c41f934b", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", - "type": "github" - } - }, - "haskell-nix_16": { - "flake": false, - "locked": { - "lastModified": 1651151636, - "narHash": "sha256-WdMP9IMB5kByT0zimDuCYZF/dinRB104H8iDTG/c1Eo=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "f707aa2e75c0d33473166abc61c0b43ac6e107c0", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", - "type": "github" - } - }, - "haskell-nix_17": { - "inputs": { - "HTTP": "HTTP_9", - "cabal-32": "cabal-32_9", - "cabal-34": "cabal-34_9", - "cabal-36": "cabal-36_9", - "cardano-shell": "cardano-shell_9", - "flake-utils": "flake-utils_9", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_9", - "hackage": "hackage_9", - "hpc-coveralls": "hpc-coveralls_9", - "hydra": "hydra_9", - "nix-tools": "nix-tools_9", - "nixpkgs": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-2003": "nixpkgs-2003_9", - "nixpkgs-2105": "nixpkgs-2105_9", - "nixpkgs-2111": "nixpkgs-2111_18", - "nixpkgs-unstable": "nixpkgs-unstable_9", - "old-ghc-nix": "old-ghc-nix_9", - "stackage": "stackage_9" - }, - "locked": { - "lastModified": 1654068838, - "narHash": "sha256-GHSufC21DSg8Lz2AzIg3DA9DPxGvLqxGFa/4ADoXRhU=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "fa2fa131fe15e630c91ab4078d12eb32c41f934b", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", - "type": "github" - } - }, - "haskell-nix_18": { - "flake": false, - "locked": { - "lastModified": 1651151636, - "narHash": "sha256-WdMP9IMB5kByT0zimDuCYZF/dinRB104H8iDTG/c1Eo=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "f707aa2e75c0d33473166abc61c0b43ac6e107c0", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", - "type": "github" - } - }, - "haskell-nix_19": { - "inputs": { - "HTTP": "HTTP_10", - "cabal-32": "cabal-32_10", - "cabal-34": "cabal-34_10", - "cabal-36": "cabal-36_10", - "cardano-shell": "cardano-shell_10", - "flake-utils": "flake-utils_10", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_10", - "hackage": "hackage_10", - "hpc-coveralls": "hpc-coveralls_10", - "hydra": "hydra_10", - "nix-tools": "nix-tools_10", - "nixpkgs": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-context-builder", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-2003": "nixpkgs-2003_10", - "nixpkgs-2105": "nixpkgs-2105_10", - "nixpkgs-2111": "nixpkgs-2111_20", - "nixpkgs-unstable": "nixpkgs-unstable_10", - "old-ghc-nix": "old-ghc-nix_10", - "stackage": "stackage_10" - }, - "locked": { - "lastModified": 1654068838, - "narHash": "sha256-GHSufC21DSg8Lz2AzIg3DA9DPxGvLqxGFa/4ADoXRhU=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "fa2fa131fe15e630c91ab4078d12eb32c41f934b", + "rev": "cbf1e918b6e278a81c385155605b8504e498efef", "type": "github" }, "original": { "owner": "input-output-hk", "repo": "haskell.nix", + "rev": "cbf1e918b6e278a81c385155605b8504e498efef", "type": "github" } }, "haskell-nix_2": { - "flake": false, - "locked": { - "lastModified": 1651151636, - "narHash": "sha256-WdMP9IMB5kByT0zimDuCYZF/dinRB104H8iDTG/c1Eo=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "f707aa2e75c0d33473166abc61c0b43ac6e107c0", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", - "type": "github" - } - }, - "haskell-nix_20": { - "flake": false, - "locked": { - "lastModified": 1651151636, - "narHash": "sha256-WdMP9IMB5kByT0zimDuCYZF/dinRB104H8iDTG/c1Eo=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "f707aa2e75c0d33473166abc61c0b43ac6e107c0", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", - "type": "github" - } - }, - "haskell-nix_21": { "inputs": { - "HTTP": "HTTP_11", - "cabal-32": "cabal-32_11", - "cabal-34": "cabal-34_11", - "cabal-36": "cabal-36_11", - "cardano-shell": "cardano-shell_11", - "flake-utils": "flake-utils_11", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_11", - "hackage": "hackage_11", - "hpc-coveralls": "hpc-coveralls_11", - "hydra": "hydra_11", - "nix-tools": "nix-tools_11", + "HTTP": "HTTP_2", + "cabal-32": "cabal-32_2", + "cabal-34": "cabal-34_2", + "cabal-36": "cabal-36_2", + "cardano-shell": "cardano-shell_2", + "flake-compat": "flake-compat_4", + "flake-utils": "flake-utils_6", + "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_2", + "hackage": "hackage_2", + "hpc-coveralls": "hpc-coveralls_2", + "hydra": "hydra_2", + "iserv-proxy": "iserv-proxy", "nixpkgs": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-numeric", + "liqwid-libs", + "liqwid-nix", "plutarch", + "tooling", "haskell-nix", "nixpkgs-unstable" ], - "nixpkgs-2003": "nixpkgs-2003_11", - "nixpkgs-2105": "nixpkgs-2105_11", - "nixpkgs-2111": "nixpkgs-2111_22", - "nixpkgs-unstable": "nixpkgs-unstable_11", - "old-ghc-nix": "old-ghc-nix_11", - "stackage": "stackage_11" + "nixpkgs-2003": "nixpkgs-2003_2", + "nixpkgs-2105": "nixpkgs-2105_2", + "nixpkgs-2111": "nixpkgs-2111_2", + "nixpkgs-2205": "nixpkgs-2205_2", + "nixpkgs-2211": "nixpkgs-2211", + "nixpkgs-unstable": "nixpkgs-unstable_2", + "old-ghc-nix": "old-ghc-nix_2", + "stackage": "stackage_2", + "tullia": "tullia_2" }, "locked": { - "lastModified": 1654068838, - "narHash": "sha256-GHSufC21DSg8Lz2AzIg3DA9DPxGvLqxGFa/4ADoXRhU=", + "lastModified": 1670892685, + "narHash": "sha256-8wGGO9GsW9Fdyf84c4tm6E/QL3tJIGZGi/njO9pluAg=", "owner": "input-output-hk", "repo": "haskell.nix", - "rev": "fa2fa131fe15e630c91ab4078d12eb32c41f934b", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", - "type": "github" - } - }, - "haskell-nix_22": { - "flake": false, - "locked": { - "lastModified": 1651151636, - "narHash": "sha256-WdMP9IMB5kByT0zimDuCYZF/dinRB104H8iDTG/c1Eo=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "f707aa2e75c0d33473166abc61c0b43ac6e107c0", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", - "type": "github" - } - }, - "haskell-nix_23": { - "inputs": { - "HTTP": "HTTP_12", - "cabal-32": "cabal-32_12", - "cabal-34": "cabal-34_12", - "cabal-36": "cabal-36_12", - "cardano-shell": "cardano-shell_12", - "flake-utils": "flake-utils_12", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_12", - "hackage": "hackage_12", - "hpc-coveralls": "hpc-coveralls_12", - "hydra": "hydra_12", - "nix-tools": "nix-tools_12", - "nixpkgs": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-quickcheck", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-2003": "nixpkgs-2003_12", - "nixpkgs-2105": "nixpkgs-2105_12", - "nixpkgs-2111": "nixpkgs-2111_24", - "nixpkgs-unstable": "nixpkgs-unstable_12", - "old-ghc-nix": "old-ghc-nix_12", - "stackage": "stackage_12" - }, - "locked": { - "lastModified": 1654068838, - "narHash": "sha256-GHSufC21DSg8Lz2AzIg3DA9DPxGvLqxGFa/4ADoXRhU=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "fa2fa131fe15e630c91ab4078d12eb32c41f934b", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", - "type": "github" - } - }, - "haskell-nix_24": { - "flake": false, - "locked": { - "lastModified": 1651151636, - "narHash": "sha256-WdMP9IMB5kByT0zimDuCYZF/dinRB104H8iDTG/c1Eo=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "f707aa2e75c0d33473166abc61c0b43ac6e107c0", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", - "type": "github" - } - }, - "haskell-nix_25": { - "inputs": { - "HTTP": "HTTP_13", - "cabal-32": "cabal-32_13", - "cabal-34": "cabal-34_13", - "cabal-36": "cabal-36_13", - "cardano-shell": "cardano-shell_13", - "flake-utils": "flake-utils_13", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_13", - "hackage": "hackage_13", - "hpc-coveralls": "hpc-coveralls_13", - "hydra": "hydra_13", - "nix-tools": "nix-tools_13", - "nixpkgs": [ - "plutarch-safe-money", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-2003": "nixpkgs-2003_13", - "nixpkgs-2105": "nixpkgs-2105_13", - "nixpkgs-2111": "nixpkgs-2111_26", - "nixpkgs-unstable": "nixpkgs-unstable_13", - "old-ghc-nix": "old-ghc-nix_13", - "stackage": "stackage_13" - }, - "locked": { - "lastModified": 1654068838, - "narHash": "sha256-GHSufC21DSg8Lz2AzIg3DA9DPxGvLqxGFa/4ADoXRhU=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "fa2fa131fe15e630c91ab4078d12eb32c41f934b", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", - "type": "github" - } - }, - "haskell-nix_26": { - "flake": false, - "locked": { - "lastModified": 1651151636, - "narHash": "sha256-WdMP9IMB5kByT0zimDuCYZF/dinRB104H8iDTG/c1Eo=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "f707aa2e75c0d33473166abc61c0b43ac6e107c0", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", - "type": "github" - } - }, - "haskell-nix_27": { - "inputs": { - "HTTP": "HTTP_14", - "cabal-32": "cabal-32_14", - "cabal-34": "cabal-34_14", - "cabal-36": "cabal-36_14", - "cardano-shell": "cardano-shell_14", - "flake-utils": "flake-utils_14", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_14", - "hackage": "hackage_14", - "hpc-coveralls": "hpc-coveralls_14", - "hydra": "hydra_14", - "nix-tools": "nix-tools_14", - "nixpkgs": [ - "plutarch-safe-money", - "plutarch-numeric", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-2003": "nixpkgs-2003_14", - "nixpkgs-2105": "nixpkgs-2105_14", - "nixpkgs-2111": "nixpkgs-2111_28", - "nixpkgs-unstable": "nixpkgs-unstable_14", - "old-ghc-nix": "old-ghc-nix_14", - "stackage": "stackage_14" - }, - "locked": { - "lastModified": 1654068838, - "narHash": "sha256-GHSufC21DSg8Lz2AzIg3DA9DPxGvLqxGFa/4ADoXRhU=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "fa2fa131fe15e630c91ab4078d12eb32c41f934b", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", - "type": "github" - } - }, - "haskell-nix_28": { - "flake": false, - "locked": { - "lastModified": 1651151636, - "narHash": "sha256-WdMP9IMB5kByT0zimDuCYZF/dinRB104H8iDTG/c1Eo=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "f707aa2e75c0d33473166abc61c0b43ac6e107c0", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", - "type": "github" - } - }, - "haskell-nix_29": { - "inputs": { - "HTTP": "HTTP_15", - "cabal-32": "cabal-32_15", - "cabal-34": "cabal-34_15", - "cabal-36": "cabal-36_15", - "cardano-shell": "cardano-shell_15", - "flake-utils": "flake-utils_15", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_15", - "hackage": "hackage_15", - "hpc-coveralls": "hpc-coveralls_15", - "hydra": "hydra_15", - "nix-tools": "nix-tools_15", - "nixpkgs": [ - "plutarch-script-export", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-2003": "nixpkgs-2003_15", - "nixpkgs-2105": "nixpkgs-2105_15", - "nixpkgs-2111": "nixpkgs-2111_30", - "nixpkgs-unstable": "nixpkgs-unstable_15", - "old-ghc-nix": "old-ghc-nix_15", - "stackage": "stackage_15" - }, - "locked": { - "lastModified": 1654068838, - "narHash": "sha256-GHSufC21DSg8Lz2AzIg3DA9DPxGvLqxGFa/4ADoXRhU=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "fa2fa131fe15e630c91ab4078d12eb32c41f934b", + "rev": "bc1444ec292a42eb63b574412223837fe9aca57c", "type": "github" }, "original": { @@ -5236,53 +3268,46 @@ }, "haskell-nix_3": { "inputs": { - "HTTP": "HTTP_2", - "cabal-32": "cabal-32_2", - "cabal-34": "cabal-34_2", - "cabal-36": "cabal-36_2", - "cardano-shell": "cardano-shell_2", - "flake-utils": "flake-utils_2", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_2", - "hackage": "hackage_2", - "hpc-coveralls": "hpc-coveralls_2", - "hydra": "hydra_2", - "nix-tools": "nix-tools_2", - "nixpkgs": [ - "liqwid-plutarch-extra", - "plutarch-context-builder", + "HTTP": "HTTP_3", + "cabal-32": "cabal-32_3", + "cabal-34": "cabal-34_3", + "cabal-36": "cabal-36_3", + "cardano-shell": "cardano-shell_3", + "flake-compat": "flake-compat_6", + "flake-utils": "flake-utils_10", + "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_3", + "hackage": [ + "liqwid-libs", + "liqwid-nix", "plutarch", - "haskell-nix", - "nixpkgs-unstable" + "tooling", + "plutus", + "hackage-nix" ], - "nixpkgs-2003": "nixpkgs-2003_2", - "nixpkgs-2105": "nixpkgs-2105_2", - "nixpkgs-2111": "nixpkgs-2111_4", - "nixpkgs-unstable": "nixpkgs-unstable_2", - "old-ghc-nix": "old-ghc-nix_2", - "stackage": "stackage_2" + "hpc-coveralls": "hpc-coveralls_3", + "hydra": "hydra_3", + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "nixpkgs" + ], + "nixpkgs-2003": "nixpkgs-2003_3", + "nixpkgs-2105": "nixpkgs-2105_3", + "nixpkgs-2111": "nixpkgs-2111_3", + "nixpkgs-2205": "nixpkgs-2205_3", + "nixpkgs-unstable": "nixpkgs-unstable_3", + "old-ghc-nix": "old-ghc-nix_3", + "stackage": "stackage_3" }, "locked": { - "lastModified": 1654068838, - "narHash": "sha256-GHSufC21DSg8Lz2AzIg3DA9DPxGvLqxGFa/4ADoXRhU=", + "lastModified": 1667366313, + "narHash": "sha256-P12NMyexQDaSp5jyqOn4tWZ9XTzpdRTgwb7dZy1cTDc=", "owner": "input-output-hk", "repo": "haskell.nix", - "rev": "fa2fa131fe15e630c91ab4078d12eb32c41f934b", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", - "type": "github" - } - }, - "haskell-nix_30": { - "flake": false, - "locked": { - "lastModified": 1651151636, - "narHash": "sha256-WdMP9IMB5kByT0zimDuCYZF/dinRB104H8iDTG/c1Eo=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "f707aa2e75c0d33473166abc61c0b43ac6e107c0", + "rev": "69a42f86208cbe7dcbfc32bc7ddde76ed8eeb5ed", "type": "github" }, "original": { @@ -5292,54 +3317,84 @@ } }, "haskell-nix_4": { - "flake": false, + "inputs": { + "HTTP": "HTTP_5", + "cabal-32": "cabal-32_5", + "cabal-34": "cabal-34_5", + "cabal-36": "cabal-36_5", + "cardano-shell": "cardano-shell_5", + "flake-compat": "flake-compat_11", + "flake-utils": "flake-utils_24", + "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_5", + "hackage": "hackage_4", + "hpc-coveralls": "hpc-coveralls_5", + "hydra": "hydra_5", + "nixpkgs": [ + "liqwid-nix", + "haskell-nix", + "nixpkgs-unstable" + ], + "nixpkgs-2003": "nixpkgs-2003_5", + "nixpkgs-2105": "nixpkgs-2105_5", + "nixpkgs-2111": "nixpkgs-2111_5", + "nixpkgs-2205": "nixpkgs-2205_5", + "nixpkgs-unstable": "nixpkgs-unstable_5", + "old-ghc-nix": "old-ghc-nix_5", + "stackage": "stackage_5", + "tullia": "tullia_5" + }, "locked": { - "lastModified": 1651151636, - "narHash": "sha256-WdMP9IMB5kByT0zimDuCYZF/dinRB104H8iDTG/c1Eo=", + "lastModified": 1668485534, + "narHash": "sha256-F3vszm6uCaQz9qo3SMZPkXoabWjp3B+JzPPopkCAibU=", "owner": "input-output-hk", "repo": "haskell.nix", - "rev": "f707aa2e75c0d33473166abc61c0b43ac6e107c0", + "rev": "cbf1e918b6e278a81c385155605b8504e498efef", "type": "github" }, "original": { "owner": "input-output-hk", "repo": "haskell.nix", + "rev": "cbf1e918b6e278a81c385155605b8504e498efef", "type": "github" } }, "haskell-nix_5": { "inputs": { - "HTTP": "HTTP_3", - "cabal-32": "cabal-32_3", - "cabal-34": "cabal-34_3", - "cabal-36": "cabal-36_3", - "cardano-shell": "cardano-shell_3", - "flake-utils": "flake-utils_3", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_3", - "hackage": "hackage_3", - "hpc-coveralls": "hpc-coveralls_3", - "hydra": "hydra_3", - "nix-tools": "nix-tools_3", + "HTTP": "HTTP_6", + "cabal-32": "cabal-32_6", + "cabal-34": "cabal-34_6", + "cabal-36": "cabal-36_6", + "cardano-shell": "cardano-shell_6", + "flake-compat": "flake-compat_13", + "flake-utils": "flake-utils_28", + "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_6", + "hackage": "hackage_5", + "hpc-coveralls": "hpc-coveralls_6", + "hydra": "hydra_6", + "iserv-proxy": "iserv-proxy_2", "nixpkgs": [ - "liqwid-plutarch-extra", - "plutarch-numeric", + "liqwid-nix", "plutarch", + "tooling", "haskell-nix", "nixpkgs-unstable" ], - "nixpkgs-2003": "nixpkgs-2003_3", - "nixpkgs-2105": "nixpkgs-2105_3", + "nixpkgs-2003": "nixpkgs-2003_6", + "nixpkgs-2105": "nixpkgs-2105_6", "nixpkgs-2111": "nixpkgs-2111_6", - "nixpkgs-unstable": "nixpkgs-unstable_3", - "old-ghc-nix": "old-ghc-nix_3", - "stackage": "stackage_3" + "nixpkgs-2205": "nixpkgs-2205_6", + "nixpkgs-2211": "nixpkgs-2211_2", + "nixpkgs-unstable": "nixpkgs-unstable_6", + "old-ghc-nix": "old-ghc-nix_6", + "stackage": "stackage_6", + "tullia": "tullia_6" }, "locked": { - "lastModified": 1654068838, - "narHash": "sha256-GHSufC21DSg8Lz2AzIg3DA9DPxGvLqxGFa/4ADoXRhU=", + "lastModified": 1670892685, + "narHash": "sha256-8wGGO9GsW9Fdyf84c4tm6E/QL3tJIGZGi/njO9pluAg=", "owner": "input-output-hk", "repo": "haskell.nix", - "rev": "fa2fa131fe15e630c91ab4078d12eb32c41f934b", + "rev": "bc1444ec292a42eb63b574412223837fe9aca57c", "type": "github" }, "original": { @@ -5349,13 +3404,45 @@ } }, "haskell-nix_6": { - "flake": false, + "inputs": { + "HTTP": "HTTP_7", + "cabal-32": "cabal-32_7", + "cabal-34": "cabal-34_7", + "cabal-36": "cabal-36_7", + "cardano-shell": "cardano-shell_7", + "flake-compat": "flake-compat_15", + "flake-utils": "flake-utils_32", + "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_7", + "hackage": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "hackage-nix" + ], + "hpc-coveralls": "hpc-coveralls_7", + "hydra": "hydra_7", + "nixpkgs": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "nixpkgs" + ], + "nixpkgs-2003": "nixpkgs-2003_7", + "nixpkgs-2105": "nixpkgs-2105_7", + "nixpkgs-2111": "nixpkgs-2111_7", + "nixpkgs-2205": "nixpkgs-2205_7", + "nixpkgs-unstable": "nixpkgs-unstable_7", + "old-ghc-nix": "old-ghc-nix_7", + "stackage": "stackage_7" + }, "locked": { - "lastModified": 1651151636, - "narHash": "sha256-WdMP9IMB5kByT0zimDuCYZF/dinRB104H8iDTG/c1Eo=", + "lastModified": 1667366313, + "narHash": "sha256-P12NMyexQDaSp5jyqOn4tWZ9XTzpdRTgwb7dZy1cTDc=", "owner": "input-output-hk", "repo": "haskell.nix", - "rev": "f707aa2e75c0d33473166abc61c0b43ac6e107c0", + "rev": "69a42f86208cbe7dcbfc32bc7ddde76ed8eeb5ed", "type": "github" }, "original": { @@ -5364,39 +3451,40 @@ "type": "github" } }, - "haskell-nix_7": { + "haskellNix": { "inputs": { "HTTP": "HTTP_4", "cabal-32": "cabal-32_4", "cabal-34": "cabal-34_4", "cabal-36": "cabal-36_4", "cardano-shell": "cardano-shell_4", - "flake-utils": "flake-utils_4", + "flake-compat": "flake-compat_9", + "flake-utils": "flake-utils_19", "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_4", - "hackage": "hackage_4", + "hackage": "hackage_3", "hpc-coveralls": "hpc-coveralls_4", "hydra": "hydra_4", - "nix-tools": "nix-tools_4", "nixpkgs": [ - "liqwid-plutarch-extra", - "plutarch-quickcheck", - "plutarch", - "haskell-nix", + "liqwid-libs", + "ply", + "haskellNix", "nixpkgs-unstable" ], "nixpkgs-2003": "nixpkgs-2003_4", "nixpkgs-2105": "nixpkgs-2105_4", - "nixpkgs-2111": "nixpkgs-2111_8", + "nixpkgs-2111": "nixpkgs-2111_4", + "nixpkgs-2205": "nixpkgs-2205_4", "nixpkgs-unstable": "nixpkgs-unstable_4", "old-ghc-nix": "old-ghc-nix_4", - "stackage": "stackage_4" + "stackage": "stackage_4", + "tullia": "tullia_4" }, "locked": { - "lastModified": 1654068838, - "narHash": "sha256-GHSufC21DSg8Lz2AzIg3DA9DPxGvLqxGFa/4ADoXRhU=", + "lastModified": 1668485534, + "narHash": "sha256-F3vszm6uCaQz9qo3SMZPkXoabWjp3B+JzPPopkCAibU=", "owner": "input-output-hk", "repo": "haskell.nix", - "rev": "fa2fa131fe15e630c91ab4078d12eb32c41f934b", + "rev": "cbf1e918b6e278a81c385155605b8504e498efef", "type": "github" }, "original": { @@ -5405,323 +3493,103 @@ "type": "github" } }, - "haskell-nix_8": { + "heist": { "flake": false, "locked": { - "lastModified": 1651151636, - "narHash": "sha256-WdMP9IMB5kByT0zimDuCYZF/dinRB104H8iDTG/c1Eo=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "f707aa2e75c0d33473166abc61c0b43ac6e107c0", + "lastModified": 1668990382, + "narHash": "sha256-5GEnEdDmUBSxrF0IWwiu5eNvtublv0rY7OEpvaU1NG0=", + "owner": "snapframework", + "repo": "heist", + "rev": "88105c85996b8d621922b38e67b9460b36ccad51", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", + "owner": "snapframework", + "repo": "heist", "type": "github" } }, - "haskell-nix_9": { - "inputs": { - "HTTP": "HTTP_5", - "cabal-32": "cabal-32_5", - "cabal-34": "cabal-34_5", - "cabal-36": "cabal-36_5", - "cardano-shell": "cardano-shell_5", - "flake-utils": "flake-utils_5", - "ghc-8.6.5-iohk": "ghc-8.6.5-iohk_5", - "hackage": "hackage_5", - "hpc-coveralls": "hpc-coveralls_5", - "hydra": "hydra_5", - "nix-tools": "nix-tools_5", - "nixpkgs": [ - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-2003": "nixpkgs-2003_5", - "nixpkgs-2105": "nixpkgs-2105_5", - "nixpkgs-2111": "nixpkgs-2111_10", - "nixpkgs-unstable": "nixpkgs-unstable_5", - "old-ghc-nix": "old-ghc-nix_5", - "stackage": "stackage_5" - }, + "heist-extra": { + "flake": false, "locked": { - "lastModified": 1654068838, - "narHash": "sha256-GHSufC21DSg8Lz2AzIg3DA9DPxGvLqxGFa/4ADoXRhU=", - "owner": "input-output-hk", - "repo": "haskell.nix", - "rev": "fa2fa131fe15e630c91ab4078d12eb32c41f934b", + "lastModified": 1668486579, + "narHash": "sha256-VmyGntVH/tVosftplC4O0JhYA34kXeq1Wu/RbJr132Y=", + "owner": "srid", + "repo": "heist-extra", + "rev": "da94abfa68f67933baef9b529fe8d2a4edc572d5", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "haskell.nix", + "owner": "srid", + "repo": "heist-extra", "type": "github" } }, + "heist-extra_2": { + "flake": false, + "locked": { + "lastModified": 1668486579, + "narHash": "sha256-VmyGntVH/tVosftplC4O0JhYA34kXeq1Wu/RbJr132Y=", + "owner": "srid", + "repo": "heist-extra", + "rev": "da94abfa68f67933baef9b529fe8d2a4edc572d5", + "type": "github" + }, + "original": { + "owner": "srid", + "repo": "heist-extra", + "type": "github" + } + }, + "heist_2": { + "flake": false, + "locked": { + "lastModified": 1668990382, + "narHash": "sha256-5GEnEdDmUBSxrF0IWwiu5eNvtublv0rY7OEpvaU1NG0=", + "owner": "snapframework", + "repo": "heist", + "rev": "88105c85996b8d621922b38e67b9460b36ccad51", + "type": "github" + }, + "original": { + "owner": "snapframework", + "repo": "heist", + "type": "github" + } + }, + "hercules-ci-agent": { + "inputs": { + "flake-parts": "flake-parts_5", + "haskell-flake": "haskell-flake", + "nix-darwin": "nix-darwin", + "nixpkgs": "nixpkgs_5", + "pre-commit-hooks-nix": "pre-commit-hooks-nix" + }, + "locked": { + "lastModified": 1678446614, + "narHash": "sha256-Z6Gsba5ahn/N0QlF0vJfIEfnZgCs4qr1IZtXAqjbE7s=", + "owner": "hercules-ci", + "repo": "hercules-ci-agent", + "rev": "0b90d1a87c117a5861785cb85833dd1c9df0b6ef", + "type": "github" + }, + "original": { + "id": "hercules-ci-agent", + "type": "indirect" + } + }, "hercules-ci-effects": { "inputs": { - "nixpkgs": "nixpkgs_4" + "flake-parts": "flake-parts_4", + "hercules-ci-agent": "hercules-ci-agent", + "nixpkgs": "nixpkgs_6" }, "locked": { - "lastModified": 1653841712, - "narHash": "sha256-XBF4i1MuIRAEbFpj3Z3fVaYxzNEsYapyENtw3vG+q1I=", + "lastModified": 1681898675, + "narHash": "sha256-nIJ7CAdiHv4i1no/VgDoeTJLzbLYwu5+/Ycoyzn0S78=", "owner": "hercules-ci", "repo": "hercules-ci-effects", - "rev": "e14d2131b7c81acca3904b584ac45fb72da64dd2", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "type": "github" - } - }, - "hercules-ci-effects_10": { - "inputs": { - "nixpkgs": "nixpkgs_40" - }, - "locked": { - "lastModified": 1653841712, - "narHash": "sha256-XBF4i1MuIRAEbFpj3Z3fVaYxzNEsYapyENtw3vG+q1I=", - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "rev": "e14d2131b7c81acca3904b584ac45fb72da64dd2", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "type": "github" - } - }, - "hercules-ci-effects_11": { - "inputs": { - "nixpkgs": "nixpkgs_44" - }, - "locked": { - "lastModified": 1653841712, - "narHash": "sha256-XBF4i1MuIRAEbFpj3Z3fVaYxzNEsYapyENtw3vG+q1I=", - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "rev": "e14d2131b7c81acca3904b584ac45fb72da64dd2", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "type": "github" - } - }, - "hercules-ci-effects_12": { - "inputs": { - "nixpkgs": "nixpkgs_48" - }, - "locked": { - "lastModified": 1653841712, - "narHash": "sha256-XBF4i1MuIRAEbFpj3Z3fVaYxzNEsYapyENtw3vG+q1I=", - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "rev": "e14d2131b7c81acca3904b584ac45fb72da64dd2", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "type": "github" - } - }, - "hercules-ci-effects_13": { - "inputs": { - "nixpkgs": "nixpkgs_51" - }, - "locked": { - "lastModified": 1653841712, - "narHash": "sha256-XBF4i1MuIRAEbFpj3Z3fVaYxzNEsYapyENtw3vG+q1I=", - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "rev": "e14d2131b7c81acca3904b584ac45fb72da64dd2", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "type": "github" - } - }, - "hercules-ci-effects_14": { - "inputs": { - "nixpkgs": "nixpkgs_55" - }, - "locked": { - "lastModified": 1653841712, - "narHash": "sha256-XBF4i1MuIRAEbFpj3Z3fVaYxzNEsYapyENtw3vG+q1I=", - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "rev": "e14d2131b7c81acca3904b584ac45fb72da64dd2", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "type": "github" - } - }, - "hercules-ci-effects_15": { - "inputs": { - "nixpkgs": "nixpkgs_59" - }, - "locked": { - "lastModified": 1653841712, - "narHash": "sha256-XBF4i1MuIRAEbFpj3Z3fVaYxzNEsYapyENtw3vG+q1I=", - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "rev": "e14d2131b7c81acca3904b584ac45fb72da64dd2", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "type": "github" - } - }, - "hercules-ci-effects_2": { - "inputs": { - "nixpkgs": "nixpkgs_8" - }, - "locked": { - "lastModified": 1653841712, - "narHash": "sha256-XBF4i1MuIRAEbFpj3Z3fVaYxzNEsYapyENtw3vG+q1I=", - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "rev": "e14d2131b7c81acca3904b584ac45fb72da64dd2", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "type": "github" - } - }, - "hercules-ci-effects_3": { - "inputs": { - "nixpkgs": "nixpkgs_12" - }, - "locked": { - "lastModified": 1653841712, - "narHash": "sha256-XBF4i1MuIRAEbFpj3Z3fVaYxzNEsYapyENtw3vG+q1I=", - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "rev": "e14d2131b7c81acca3904b584ac45fb72da64dd2", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "type": "github" - } - }, - "hercules-ci-effects_4": { - "inputs": { - "nixpkgs": "nixpkgs_16" - }, - "locked": { - "lastModified": 1653841712, - "narHash": "sha256-XBF4i1MuIRAEbFpj3Z3fVaYxzNEsYapyENtw3vG+q1I=", - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "rev": "e14d2131b7c81acca3904b584ac45fb72da64dd2", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "type": "github" - } - }, - "hercules-ci-effects_5": { - "inputs": { - "nixpkgs": "nixpkgs_19" - }, - "locked": { - "lastModified": 1653841712, - "narHash": "sha256-XBF4i1MuIRAEbFpj3Z3fVaYxzNEsYapyENtw3vG+q1I=", - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "rev": "e14d2131b7c81acca3904b584ac45fb72da64dd2", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "type": "github" - } - }, - "hercules-ci-effects_6": { - "inputs": { - "nixpkgs": "nixpkgs_23" - }, - "locked": { - "lastModified": 1653841712, - "narHash": "sha256-XBF4i1MuIRAEbFpj3Z3fVaYxzNEsYapyENtw3vG+q1I=", - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "rev": "e14d2131b7c81acca3904b584ac45fb72da64dd2", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "type": "github" - } - }, - "hercules-ci-effects_7": { - "inputs": { - "nixpkgs": "nixpkgs_27" - }, - "locked": { - "lastModified": 1653841712, - "narHash": "sha256-XBF4i1MuIRAEbFpj3Z3fVaYxzNEsYapyENtw3vG+q1I=", - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "rev": "e14d2131b7c81acca3904b584ac45fb72da64dd2", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "type": "github" - } - }, - "hercules-ci-effects_8": { - "inputs": { - "nixpkgs": "nixpkgs_31" - }, - "locked": { - "lastModified": 1653841712, - "narHash": "sha256-XBF4i1MuIRAEbFpj3Z3fVaYxzNEsYapyENtw3vG+q1I=", - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "rev": "e14d2131b7c81acca3904b584ac45fb72da64dd2", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "type": "github" - } - }, - "hercules-ci-effects_9": { - "inputs": { - "nixpkgs": "nixpkgs_36" - }, - "locked": { - "lastModified": 1653841712, - "narHash": "sha256-XBF4i1MuIRAEbFpj3Z3fVaYxzNEsYapyENtw3vG+q1I=", - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "rev": "e14d2131b7c81acca3904b584ac45fb72da64dd2", + "rev": "15ff4f63e5f28070391a5b09a82f6d5c6cc5c9d0", "type": "github" }, "original": { @@ -5746,102 +3614,6 @@ "type": "github" } }, - "hpc-coveralls_10": { - "flake": false, - "locked": { - "lastModified": 1607498076, - "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", - "type": "github" - }, - "original": { - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "type": "github" - } - }, - "hpc-coveralls_11": { - "flake": false, - "locked": { - "lastModified": 1607498076, - "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", - "type": "github" - }, - "original": { - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "type": "github" - } - }, - "hpc-coveralls_12": { - "flake": false, - "locked": { - "lastModified": 1607498076, - "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", - "type": "github" - }, - "original": { - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "type": "github" - } - }, - "hpc-coveralls_13": { - "flake": false, - "locked": { - "lastModified": 1607498076, - "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", - "type": "github" - }, - "original": { - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "type": "github" - } - }, - "hpc-coveralls_14": { - "flake": false, - "locked": { - "lastModified": 1607498076, - "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", - "type": "github" - }, - "original": { - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "type": "github" - } - }, - "hpc-coveralls_15": { - "flake": false, - "locked": { - "lastModified": 1607498076, - "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", - "type": "github" - }, - "original": { - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "type": "github" - } - }, "hpc-coveralls_2": { "flake": false, "locked": { @@ -5938,201 +3710,12 @@ "type": "github" } }, - "hpc-coveralls_8": { - "flake": false, - "locked": { - "lastModified": 1607498076, - "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", - "type": "github" - }, - "original": { - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "type": "github" - } - }, - "hpc-coveralls_9": { - "flake": false, - "locked": { - "lastModified": 1607498076, - "narHash": "sha256-8uqsEtivphgZWYeUo5RDUhp6bO9j2vaaProQxHBltQk=", - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "rev": "14df0f7d229f4cd2e79f8eabb1a740097fdfa430", - "type": "github" - }, - "original": { - "owner": "sevanspowell", - "repo": "hpc-coveralls", - "type": "github" - } - }, "hydra": { "inputs": { "nix": "nix", "nixpkgs": [ - "liqwid-plutarch-extra", - "plutarch", - "haskell-nix", - "hydra", - "nix", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1646878427, - "narHash": "sha256-KtbrofMtN8GlM7D+n90kixr7QpSlVmdN+vK5CA/aRzc=", - "owner": "NixOS", - "repo": "hydra", - "rev": "28b682b85b7efc5cf7974065792a1f22203a5927", - "type": "github" - }, - "original": { - "id": "hydra", - "type": "indirect" - } - }, - "hydra_10": { - "inputs": { - "nix": "nix_10", - "nixpkgs": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-context-builder", - "plutarch", - "haskell-nix", - "hydra", - "nix", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1646878427, - "narHash": "sha256-KtbrofMtN8GlM7D+n90kixr7QpSlVmdN+vK5CA/aRzc=", - "owner": "NixOS", - "repo": "hydra", - "rev": "28b682b85b7efc5cf7974065792a1f22203a5927", - "type": "github" - }, - "original": { - "id": "hydra", - "type": "indirect" - } - }, - "hydra_11": { - "inputs": { - "nix": "nix_11", - "nixpkgs": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-numeric", - "plutarch", - "haskell-nix", - "hydra", - "nix", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1646878427, - "narHash": "sha256-KtbrofMtN8GlM7D+n90kixr7QpSlVmdN+vK5CA/aRzc=", - "owner": "NixOS", - "repo": "hydra", - "rev": "28b682b85b7efc5cf7974065792a1f22203a5927", - "type": "github" - }, - "original": { - "id": "hydra", - "type": "indirect" - } - }, - "hydra_12": { - "inputs": { - "nix": "nix_12", - "nixpkgs": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-quickcheck", - "plutarch", - "haskell-nix", - "hydra", - "nix", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1646878427, - "narHash": "sha256-KtbrofMtN8GlM7D+n90kixr7QpSlVmdN+vK5CA/aRzc=", - "owner": "NixOS", - "repo": "hydra", - "rev": "28b682b85b7efc5cf7974065792a1f22203a5927", - "type": "github" - }, - "original": { - "id": "hydra", - "type": "indirect" - } - }, - "hydra_13": { - "inputs": { - "nix": "nix_13", - "nixpkgs": [ - "plutarch-safe-money", - "plutarch", - "haskell-nix", - "hydra", - "nix", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1646878427, - "narHash": "sha256-KtbrofMtN8GlM7D+n90kixr7QpSlVmdN+vK5CA/aRzc=", - "owner": "NixOS", - "repo": "hydra", - "rev": "28b682b85b7efc5cf7974065792a1f22203a5927", - "type": "github" - }, - "original": { - "id": "hydra", - "type": "indirect" - } - }, - "hydra_14": { - "inputs": { - "nix": "nix_14", - "nixpkgs": [ - "plutarch-safe-money", - "plutarch-numeric", - "plutarch", - "haskell-nix", - "hydra", - "nix", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1646878427, - "narHash": "sha256-KtbrofMtN8GlM7D+n90kixr7QpSlVmdN+vK5CA/aRzc=", - "owner": "NixOS", - "repo": "hydra", - "rev": "28b682b85b7efc5cf7974065792a1f22203a5927", - "type": "github" - }, - "original": { - "id": "hydra", - "type": "indirect" - } - }, - "hydra_15": { - "inputs": { - "nix": "nix_15", - "nixpkgs": [ - "plutarch-script-export", - "plutarch", + "liqwid-libs", + "liqwid-nix", "haskell-nix", "hydra", "nix", @@ -6156,9 +3739,10 @@ "inputs": { "nix": "nix_2", "nixpkgs": [ - "liqwid-plutarch-extra", - "plutarch-context-builder", + "liqwid-libs", + "liqwid-nix", "plutarch", + "tooling", "haskell-nix", "hydra", "nix", @@ -6182,9 +3766,11 @@ "inputs": { "nix": "nix_3", "nixpkgs": [ - "liqwid-plutarch-extra", - "plutarch-numeric", + "liqwid-libs", + "liqwid-nix", "plutarch", + "tooling", + "plutus", "haskell-nix", "hydra", "nix", @@ -6208,10 +3794,9 @@ "inputs": { "nix": "nix_4", "nixpkgs": [ - "liqwid-plutarch-extra", - "plutarch-quickcheck", - "plutarch", - "haskell-nix", + "liqwid-libs", + "ply", + "haskellNix", "hydra", "nix", "nixpkgs" @@ -6234,7 +3819,7 @@ "inputs": { "nix": "nix_5", "nixpkgs": [ - "plutarch", + "liqwid-nix", "haskell-nix", "hydra", "nix", @@ -6258,8 +3843,9 @@ "inputs": { "nix": "nix_6", "nixpkgs": [ - "plutarch-context-builder", + "liqwid-nix", "plutarch", + "tooling", "haskell-nix", "hydra", "nix", @@ -6283,59 +3869,10 @@ "inputs": { "nix": "nix_7", "nixpkgs": [ - "plutarch-numeric", - "plutarch", - "haskell-nix", - "hydra", - "nix", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1646878427, - "narHash": "sha256-KtbrofMtN8GlM7D+n90kixr7QpSlVmdN+vK5CA/aRzc=", - "owner": "NixOS", - "repo": "hydra", - "rev": "28b682b85b7efc5cf7974065792a1f22203a5927", - "type": "github" - }, - "original": { - "id": "hydra", - "type": "indirect" - } - }, - "hydra_8": { - "inputs": { - "nix": "nix_8", - "nixpkgs": [ - "plutarch-quickcheck", - "plutarch", - "haskell-nix", - "hydra", - "nix", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1646878427, - "narHash": "sha256-KtbrofMtN8GlM7D+n90kixr7QpSlVmdN+vK5CA/aRzc=", - "owner": "NixOS", - "repo": "hydra", - "rev": "28b682b85b7efc5cf7974065792a1f22203a5927", - "type": "github" - }, - "original": { - "id": "hydra", - "type": "indirect" - } - }, - "hydra_9": { - "inputs": { - "nix": "nix_9", - "nixpkgs": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", + "liqwid-nix", "plutarch", + "tooling", + "plutus", "haskell-nix", "hydra", "nix", @@ -6358,347 +3895,28 @@ "iohk-nix": { "flake": false, "locked": { - "lastModified": 1653579289, - "narHash": "sha256-wveDdPsgB/3nAGAdFaxrcgLEpdi0aJ5kEVNtI+YqVfo=", + "lastModified": 1666358508, + "narHash": "sha256-ediFkDOBP7yVquw1XtHiYfuXKoEnvKGjTIAk9mC6qxo=", "owner": "input-output-hk", "repo": "iohk-nix", - "rev": "edb2d2df2ebe42bbdf03a0711115cf6213c9d366", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", - "type": "github" - } - }, - "iohk-nix_10": { - "flake": false, - "locked": { - "lastModified": 1626953580, - "narHash": "sha256-iEI9aTOaZMGsjWzcrctrC0usmiagwKT2v1LSDe9/tMU=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "cbd497f5844249ef8fe617166337d59f2a6ebe90", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", - "type": "github" - } - }, - "iohk-nix_11": { - "flake": false, - "locked": { - "lastModified": 1653579289, - "narHash": "sha256-wveDdPsgB/3nAGAdFaxrcgLEpdi0aJ5kEVNtI+YqVfo=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "edb2d2df2ebe42bbdf03a0711115cf6213c9d366", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", - "type": "github" - } - }, - "iohk-nix_12": { - "flake": false, - "locked": { - "lastModified": 1626953580, - "narHash": "sha256-iEI9aTOaZMGsjWzcrctrC0usmiagwKT2v1LSDe9/tMU=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "cbd497f5844249ef8fe617166337d59f2a6ebe90", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", - "type": "github" - } - }, - "iohk-nix_13": { - "flake": false, - "locked": { - "lastModified": 1653579289, - "narHash": "sha256-wveDdPsgB/3nAGAdFaxrcgLEpdi0aJ5kEVNtI+YqVfo=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "edb2d2df2ebe42bbdf03a0711115cf6213c9d366", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", - "type": "github" - } - }, - "iohk-nix_14": { - "flake": false, - "locked": { - "lastModified": 1626953580, - "narHash": "sha256-iEI9aTOaZMGsjWzcrctrC0usmiagwKT2v1LSDe9/tMU=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "cbd497f5844249ef8fe617166337d59f2a6ebe90", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", - "type": "github" - } - }, - "iohk-nix_15": { - "flake": false, - "locked": { - "lastModified": 1653579289, - "narHash": "sha256-wveDdPsgB/3nAGAdFaxrcgLEpdi0aJ5kEVNtI+YqVfo=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "edb2d2df2ebe42bbdf03a0711115cf6213c9d366", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", - "type": "github" - } - }, - "iohk-nix_16": { - "flake": false, - "locked": { - "lastModified": 1626953580, - "narHash": "sha256-iEI9aTOaZMGsjWzcrctrC0usmiagwKT2v1LSDe9/tMU=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "cbd497f5844249ef8fe617166337d59f2a6ebe90", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", - "type": "github" - } - }, - "iohk-nix_17": { - "flake": false, - "locked": { - "lastModified": 1653579289, - "narHash": "sha256-wveDdPsgB/3nAGAdFaxrcgLEpdi0aJ5kEVNtI+YqVfo=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "edb2d2df2ebe42bbdf03a0711115cf6213c9d366", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", - "type": "github" - } - }, - "iohk-nix_18": { - "flake": false, - "locked": { - "lastModified": 1626953580, - "narHash": "sha256-iEI9aTOaZMGsjWzcrctrC0usmiagwKT2v1LSDe9/tMU=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "cbd497f5844249ef8fe617166337d59f2a6ebe90", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", - "type": "github" - } - }, - "iohk-nix_19": { - "flake": false, - "locked": { - "lastModified": 1653579289, - "narHash": "sha256-wveDdPsgB/3nAGAdFaxrcgLEpdi0aJ5kEVNtI+YqVfo=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "edb2d2df2ebe42bbdf03a0711115cf6213c9d366", + "rev": "4848df60660e21fbb3fe157d996a8bac0a9cf2d6", "type": "github" }, "original": { "owner": "input-output-hk", "repo": "iohk-nix", + "rev": "4848df60660e21fbb3fe157d996a8bac0a9cf2d6", "type": "github" } }, "iohk-nix_2": { "flake": false, "locked": { - "lastModified": 1626953580, - "narHash": "sha256-iEI9aTOaZMGsjWzcrctrC0usmiagwKT2v1LSDe9/tMU=", + "lastModified": 1670489000, + "narHash": "sha256-JewWjqVJSt+7eZQT9bGdhlSsS9dmsSKsMzK9g11tcLU=", "owner": "input-output-hk", "repo": "iohk-nix", - "rev": "cbd497f5844249ef8fe617166337d59f2a6ebe90", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", - "type": "github" - } - }, - "iohk-nix_20": { - "flake": false, - "locked": { - "lastModified": 1626953580, - "narHash": "sha256-iEI9aTOaZMGsjWzcrctrC0usmiagwKT2v1LSDe9/tMU=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "cbd497f5844249ef8fe617166337d59f2a6ebe90", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", - "type": "github" - } - }, - "iohk-nix_21": { - "flake": false, - "locked": { - "lastModified": 1653579289, - "narHash": "sha256-wveDdPsgB/3nAGAdFaxrcgLEpdi0aJ5kEVNtI+YqVfo=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "edb2d2df2ebe42bbdf03a0711115cf6213c9d366", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", - "type": "github" - } - }, - "iohk-nix_22": { - "flake": false, - "locked": { - "lastModified": 1626953580, - "narHash": "sha256-iEI9aTOaZMGsjWzcrctrC0usmiagwKT2v1LSDe9/tMU=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "cbd497f5844249ef8fe617166337d59f2a6ebe90", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", - "type": "github" - } - }, - "iohk-nix_23": { - "flake": false, - "locked": { - "lastModified": 1653579289, - "narHash": "sha256-wveDdPsgB/3nAGAdFaxrcgLEpdi0aJ5kEVNtI+YqVfo=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "edb2d2df2ebe42bbdf03a0711115cf6213c9d366", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", - "type": "github" - } - }, - "iohk-nix_24": { - "flake": false, - "locked": { - "lastModified": 1626953580, - "narHash": "sha256-iEI9aTOaZMGsjWzcrctrC0usmiagwKT2v1LSDe9/tMU=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "cbd497f5844249ef8fe617166337d59f2a6ebe90", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", - "type": "github" - } - }, - "iohk-nix_25": { - "flake": false, - "locked": { - "lastModified": 1653579289, - "narHash": "sha256-wveDdPsgB/3nAGAdFaxrcgLEpdi0aJ5kEVNtI+YqVfo=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "edb2d2df2ebe42bbdf03a0711115cf6213c9d366", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", - "type": "github" - } - }, - "iohk-nix_26": { - "flake": false, - "locked": { - "lastModified": 1626953580, - "narHash": "sha256-iEI9aTOaZMGsjWzcrctrC0usmiagwKT2v1LSDe9/tMU=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "cbd497f5844249ef8fe617166337d59f2a6ebe90", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", - "type": "github" - } - }, - "iohk-nix_27": { - "flake": false, - "locked": { - "lastModified": 1653579289, - "narHash": "sha256-wveDdPsgB/3nAGAdFaxrcgLEpdi0aJ5kEVNtI+YqVfo=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "edb2d2df2ebe42bbdf03a0711115cf6213c9d366", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", - "type": "github" - } - }, - "iohk-nix_28": { - "flake": false, - "locked": { - "lastModified": 1626953580, - "narHash": "sha256-iEI9aTOaZMGsjWzcrctrC0usmiagwKT2v1LSDe9/tMU=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "cbd497f5844249ef8fe617166337d59f2a6ebe90", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", - "type": "github" - } - }, - "iohk-nix_29": { - "flake": false, - "locked": { - "lastModified": 1653579289, - "narHash": "sha256-wveDdPsgB/3nAGAdFaxrcgLEpdi0aJ5kEVNtI+YqVfo=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "edb2d2df2ebe42bbdf03a0711115cf6213c9d366", + "rev": "61510bb482eaca8cb7d61f40f5d375d95ea1fbf7", "type": "github" }, "original": { @@ -6708,29 +3926,22 @@ } }, "iohk-nix_3": { - "flake": false, - "locked": { - "lastModified": 1653579289, - "narHash": "sha256-wveDdPsgB/3nAGAdFaxrcgLEpdi0aJ5kEVNtI+YqVfo=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "edb2d2df2ebe42bbdf03a0711115cf6213c9d366", - "type": "github" + "inputs": { + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "nixpkgs" + ] }, - "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", - "type": "github" - } - }, - "iohk-nix_30": { - "flake": false, "locked": { - "lastModified": 1626953580, - "narHash": "sha256-iEI9aTOaZMGsjWzcrctrC0usmiagwKT2v1LSDe9/tMU=", + "lastModified": 1666358508, + "narHash": "sha256-ediFkDOBP7yVquw1XtHiYfuXKoEnvKGjTIAk9mC6qxo=", "owner": "input-output-hk", "repo": "iohk-nix", - "rev": "cbd497f5844249ef8fe617166337d59f2a6ebe90", + "rev": "4848df60660e21fbb3fe157d996a8bac0a9cf2d6", "type": "github" }, "original": { @@ -6742,27 +3953,28 @@ "iohk-nix_4": { "flake": false, "locked": { - "lastModified": 1626953580, - "narHash": "sha256-iEI9aTOaZMGsjWzcrctrC0usmiagwKT2v1LSDe9/tMU=", + "lastModified": 1666358508, + "narHash": "sha256-ediFkDOBP7yVquw1XtHiYfuXKoEnvKGjTIAk9mC6qxo=", "owner": "input-output-hk", "repo": "iohk-nix", - "rev": "cbd497f5844249ef8fe617166337d59f2a6ebe90", + "rev": "4848df60660e21fbb3fe157d996a8bac0a9cf2d6", "type": "github" }, "original": { "owner": "input-output-hk", "repo": "iohk-nix", + "rev": "4848df60660e21fbb3fe157d996a8bac0a9cf2d6", "type": "github" } }, "iohk-nix_5": { "flake": false, "locked": { - "lastModified": 1653579289, - "narHash": "sha256-wveDdPsgB/3nAGAdFaxrcgLEpdi0aJ5kEVNtI+YqVfo=", + "lastModified": 1670489000, + "narHash": "sha256-JewWjqVJSt+7eZQT9bGdhlSsS9dmsSKsMzK9g11tcLU=", "owner": "input-output-hk", "repo": "iohk-nix", - "rev": "edb2d2df2ebe42bbdf03a0711115cf6213c9d366", + "rev": "61510bb482eaca8cb7d61f40f5d375d95ea1fbf7", "type": "github" }, "original": { @@ -6772,13 +3984,21 @@ } }, "iohk-nix_6": { - "flake": false, + "inputs": { + "nixpkgs": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1626953580, - "narHash": "sha256-iEI9aTOaZMGsjWzcrctrC0usmiagwKT2v1LSDe9/tMU=", + "lastModified": 1666358508, + "narHash": "sha256-ediFkDOBP7yVquw1XtHiYfuXKoEnvKGjTIAk9mC6qxo=", "owner": "input-output-hk", "repo": "iohk-nix", - "rev": "cbd497f5844249ef8fe617166337d59f2a6ebe90", + "rev": "4848df60660e21fbb3fe157d996a8bac0a9cf2d6", "type": "github" }, "original": { @@ -6787,429 +4007,128 @@ "type": "github" } }, - "iohk-nix_7": { + "iserv-proxy": { "flake": false, "locked": { - "lastModified": 1653579289, - "narHash": "sha256-wveDdPsgB/3nAGAdFaxrcgLEpdi0aJ5kEVNtI+YqVfo=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "edb2d2df2ebe42bbdf03a0711115cf6213c9d366", - "type": "github" + "lastModified": 1639165170, + "narHash": "sha256-QsWL/sBDL5GM8IXd/dE/ORiL4RvteEN+aok23tXgAoc=", + "rev": "6e95df7be6dd29680f983db07a057fc2f34f81f6", + "revCount": 7, + "type": "git", + "url": "https://gitlab.haskell.org/ghc/iserv-proxy.git" }, "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", - "type": "github" + "rev": "6e95df7be6dd29680f983db07a057fc2f34f81f6", + "type": "git", + "url": "https://gitlab.haskell.org/ghc/iserv-proxy.git" } }, - "iohk-nix_8": { + "iserv-proxy_2": { "flake": false, "locked": { - "lastModified": 1626953580, - "narHash": "sha256-iEI9aTOaZMGsjWzcrctrC0usmiagwKT2v1LSDe9/tMU=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "cbd497f5844249ef8fe617166337d59f2a6ebe90", - "type": "github" + "lastModified": 1639165170, + "narHash": "sha256-QsWL/sBDL5GM8IXd/dE/ORiL4RvteEN+aok23tXgAoc=", + "rev": "6e95df7be6dd29680f983db07a057fc2f34f81f6", + "revCount": 7, + "type": "git", + "url": "https://gitlab.haskell.org/ghc/iserv-proxy.git" }, "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", - "type": "github" + "rev": "6e95df7be6dd29680f983db07a057fc2f34f81f6", + "type": "git", + "url": "https://gitlab.haskell.org/ghc/iserv-proxy.git" } }, - "iohk-nix_9": { - "flake": false, + "liqwid-libs": { + "inputs": { + "flake-parts": "flake-parts_2", + "liqwid-nix": "liqwid-nix", + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "nixpkgs" + ], + "nixpkgs-latest": "nixpkgs-latest", + "ply": "ply" + }, "locked": { - "lastModified": 1653579289, - "narHash": "sha256-wveDdPsgB/3nAGAdFaxrcgLEpdi0aJ5kEVNtI+YqVfo=", - "owner": "input-output-hk", - "repo": "iohk-nix", - "rev": "edb2d2df2ebe42bbdf03a0711115cf6213c9d366", + "lastModified": 1724420799, + "narHash": "sha256-aGTzsboK8SHmYMBbR/Bsgl14e4ClalhsRzGX3g2G7xY=", + "owner": "Liqwid-Labs", + "repo": "liqwid-libs", + "rev": "27c4b50edc39128a0506ed3ef0e065b270377def", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "iohk-nix", + "owner": "Liqwid-Labs", + "repo": "liqwid-libs", "type": "github" } }, "liqwid-nix": { "inputs": { - "nixpkgs": "nixpkgs", - "nixpkgs-2205": "nixpkgs-2205" + "flake-parts": "flake-parts_3", + "ghc-next-packages": "ghc-next-packages", + "haskell-nix": "haskell-nix", + "hercules-ci-effects": "hercules-ci-effects", + "iohk-nix": "iohk-nix", + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "haskell-nix", + "nixpkgs-unstable" + ], + "nixpkgs-latest": [ + "liqwid-libs", + "nixpkgs-latest" + ], + "plutarch": "plutarch", + "pre-commit-hooks": "pre-commit-hooks" }, "locked": { - "lastModified": 1660251224, - "narHash": "sha256-spBrASFpblmQFYuS4GHv9hI3cLRzh6OG5tNikRmUUZA=", - "owner": "Liqwid-Labs", + "lastModified": 1686744759, + "narHash": "sha256-1pq0mqLJm/7WlR82oTStvM/K+Gyei79fbYEiO9DWaDc=", + "owner": "liqwid-labs", "repo": "liqwid-nix", - "rev": "6bf26da0cbd1dea4ea275ffb5d05214a7d3e61be", + "rev": "6cb9454ebfe76b38b77491be88db5122b7065564", "type": "github" }, "original": { - "owner": "Liqwid-Labs", - "ref": "main", - "repo": "liqwid-nix", - "type": "github" - } - }, - "liqwid-nix_10": { - "inputs": { - "nixpkgs": "nixpkgs_34" - }, - "locked": { - "lastModified": 1659383708, - "narHash": "sha256-eenTO5t4ocK7VzorMUdUyKUoup976cCu5dJcVjebY8E=", - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "rev": "c261df76dc31b3dc5dfde7030420e0a6be73f615", - "type": "github" - }, - "original": { - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "type": "github" - } - }, - "liqwid-nix_11": { - "inputs": { - "nixpkgs": "nixpkgs_38" - }, - "locked": { - "lastModified": 1659383708, - "narHash": "sha256-eenTO5t4ocK7VzorMUdUyKUoup976cCu5dJcVjebY8E=", - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "rev": "c261df76dc31b3dc5dfde7030420e0a6be73f615", - "type": "github" - }, - "original": { - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "type": "github" - } - }, - "liqwid-nix_12": { - "inputs": { - "nixpkgs": "nixpkgs_42" - }, - "locked": { - "lastModified": 1659383708, - "narHash": "sha256-eenTO5t4ocK7VzorMUdUyKUoup976cCu5dJcVjebY8E=", - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "rev": "c261df76dc31b3dc5dfde7030420e0a6be73f615", - "type": "github" - }, - "original": { - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "type": "github" - } - }, - "liqwid-nix_13": { - "inputs": { - "nixpkgs": "nixpkgs_46" - }, - "locked": { - "lastModified": 1659383708, - "narHash": "sha256-eenTO5t4ocK7VzorMUdUyKUoup976cCu5dJcVjebY8E=", - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "rev": "c261df76dc31b3dc5dfde7030420e0a6be73f615", - "type": "github" - }, - "original": { - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "type": "github" - } - }, - "liqwid-nix_14": { - "inputs": { - "nixpkgs": "nixpkgs_53" - }, - "locked": { - "lastModified": 1659383708, - "narHash": "sha256-eenTO5t4ocK7VzorMUdUyKUoup976cCu5dJcVjebY8E=", - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "rev": "c261df76dc31b3dc5dfde7030420e0a6be73f615", - "type": "github" - }, - "original": { - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "type": "github" - } - }, - "liqwid-nix_15": { - "inputs": { - "nixpkgs": "nixpkgs_57", - "nixpkgs-2205": "nixpkgs-2205_2" - }, - "locked": { - "lastModified": 1660165784, - "narHash": "sha256-uSwB6jmiP0giQM9NwCkXloabfRnbDSsd1EAKXbTQpq4=", - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "rev": "07d35ade0f9a1bab07413d059ccec63982592552", - "type": "github" - }, - "original": { - "owner": "Liqwid-Labs", + "owner": "liqwid-labs", + "ref": "v2.9.2", "repo": "liqwid-nix", "type": "github" } }, "liqwid-nix_2": { "inputs": { - "nixpkgs": "nixpkgs_2" - }, - "locked": { - "lastModified": 1659383708, - "narHash": "sha256-eenTO5t4ocK7VzorMUdUyKUoup976cCu5dJcVjebY8E=", - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "rev": "c261df76dc31b3dc5dfde7030420e0a6be73f615", - "type": "github" - }, - "original": { - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "type": "github" - } - }, - "liqwid-nix_3": { - "inputs": { - "nixpkgs": "nixpkgs_6" - }, - "locked": { - "lastModified": 1659383708, - "narHash": "sha256-eenTO5t4ocK7VzorMUdUyKUoup976cCu5dJcVjebY8E=", - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "rev": "c261df76dc31b3dc5dfde7030420e0a6be73f615", - "type": "github" - }, - "original": { - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "type": "github" - } - }, - "liqwid-nix_4": { - "inputs": { - "nixpkgs": "nixpkgs_10" - }, - "locked": { - "lastModified": 1659383708, - "narHash": "sha256-eenTO5t4ocK7VzorMUdUyKUoup976cCu5dJcVjebY8E=", - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "rev": "c261df76dc31b3dc5dfde7030420e0a6be73f615", - "type": "github" - }, - "original": { - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "type": "github" - } - }, - "liqwid-nix_5": { - "inputs": { - "nixpkgs": "nixpkgs_14" - }, - "locked": { - "lastModified": 1659383708, - "narHash": "sha256-eenTO5t4ocK7VzorMUdUyKUoup976cCu5dJcVjebY8E=", - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "rev": "c261df76dc31b3dc5dfde7030420e0a6be73f615", - "type": "github" - }, - "original": { - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "type": "github" - } - }, - "liqwid-nix_6": { - "inputs": { - "nixpkgs": "nixpkgs_21" - }, - "locked": { - "lastModified": 1659383708, - "narHash": "sha256-eenTO5t4ocK7VzorMUdUyKUoup976cCu5dJcVjebY8E=", - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "rev": "c261df76dc31b3dc5dfde7030420e0a6be73f615", - "type": "github" - }, - "original": { - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "type": "github" - } - }, - "liqwid-nix_7": { - "inputs": { - "nixpkgs": "nixpkgs_25" - }, - "locked": { - "lastModified": 1659383708, - "narHash": "sha256-eenTO5t4ocK7VzorMUdUyKUoup976cCu5dJcVjebY8E=", - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "rev": "c261df76dc31b3dc5dfde7030420e0a6be73f615", - "type": "github" - }, - "original": { - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "type": "github" - } - }, - "liqwid-nix_8": { - "inputs": { - "nixpkgs": "nixpkgs_29" - }, - "locked": { - "lastModified": 1659383708, - "narHash": "sha256-eenTO5t4ocK7VzorMUdUyKUoup976cCu5dJcVjebY8E=", - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "rev": "c261df76dc31b3dc5dfde7030420e0a6be73f615", - "type": "github" - }, - "original": { - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "type": "github" - } - }, - "liqwid-nix_9": { - "inputs": { - "nixpkgs": "nixpkgs_33" - }, - "locked": { - "lastModified": 1659383708, - "narHash": "sha256-eenTO5t4ocK7VzorMUdUyKUoup976cCu5dJcVjebY8E=", - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "rev": "c261df76dc31b3dc5dfde7030420e0a6be73f615", - "type": "github" - }, - "original": { - "owner": "Liqwid-Labs", - "repo": "liqwid-nix", - "type": "github" - } - }, - "liqwid-plutarch-extra": { - "inputs": { - "haskell-language-server": [ - "liqwid-plutarch-extra", - "plutarch", - "haskell-language-server" - ], - "haskell-nix": [ - "liqwid-plutarch-extra", - "plutarch", - "haskell-nix" - ], - "haskell-nix-extra-hackage": [ - "liqwid-plutarch-extra", - "plutarch", - "haskell-nix-extra-hackage" - ], - "iohk-nix": [ - "liqwid-plutarch-extra", - "plutarch", - "iohk-nix" - ], - "liqwid-nix": "liqwid-nix_2", + "flake-parts": "flake-parts_8", + "ghc-next-packages": "ghc-next-packages_2", + "haskell-nix": "haskell-nix_4", + "iohk-nix": "iohk-nix_4", "nixpkgs": [ - "liqwid-plutarch-extra", - "plutarch", - "nixpkgs" + "liqwid-nix", + "haskell-nix", + "nixpkgs-unstable" ], - "nixpkgs-2111": "nixpkgs-2111", - "nixpkgs-latest": "nixpkgs-latest", - "plutarch": "plutarch", - "plutarch-context-builder": "plutarch-context-builder", - "plutarch-numeric": "plutarch-numeric", - "plutarch-quickcheck": "plutarch-quickcheck" + "nixpkgs-latest": [ + "nixpkgs-latest" + ], + "plutarch": "plutarch_2", + "pre-commit-hooks": "pre-commit-hooks_3" }, "locked": { - "lastModified": 1660162748, - "narHash": "sha256-TvDWZ3mbfQCKHgNDjRR2Ydjx9cgw48hDpN0t/wy7oCI=", + "lastModified": 1679506613, + "narHash": "sha256-Vwv85+Z4WPbodqsubMLgg4WiW+2z30Zt6Q8rPY9WT8o=", "owner": "Liqwid-Labs", - "repo": "liqwid-plutarch-extra", - "rev": "d8be5f8dc91ad00158727fdbccb6db849e9f3559", + "repo": "liqwid-nix", + "rev": "c763f911371def8c96a3191e5a1e549d4b501ee0", "type": "github" }, "original": { "owner": "Liqwid-Labs", - "ref": "plutus-v1", - "repo": "liqwid-plutarch-extra", - "type": "github" - } - }, - "liqwid-plutarch-extra_2": { - "inputs": { - "haskell-language-server": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch", - "haskell-language-server" - ], - "haskell-nix": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch", - "haskell-nix" - ], - "haskell-nix-extra-hackage": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch", - "haskell-nix-extra-hackage" - ], - "iohk-nix": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch", - "iohk-nix" - ], - "liqwid-nix": "liqwid-nix_10", - "nixpkgs": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch", - "nixpkgs" - ], - "nixpkgs-2111": "nixpkgs-2111_17", - "nixpkgs-latest": "nixpkgs-latest_17", - "plutarch": "plutarch_9", - "plutarch-context-builder": "plutarch-context-builder_3", - "plutarch-numeric": "plutarch-numeric_3", - "plutarch-quickcheck": "plutarch-quickcheck_3" - }, - "locked": { - "lastModified": 1659473759, - "narHash": "sha256-hHGEaISfdUyrQEh5OeBD4IEn0xwCdR1vfk3c+yfxeaw=", - "owner": "Liqwid-Labs", - "repo": "liqwid-plutarch-extra", - "rev": "6ddf927299f8f1681092253f0297df549b8a74b6", - "type": "github" - }, - "original": { - "owner": "Liqwid-Labs", - "ref": "main", - "repo": "liqwid-plutarch-extra", + "ref": "v2.7.2", + "repo": "liqwid-nix", "type": "github" } }, @@ -7229,102 +4148,6 @@ "type": "github" } }, - "lowdown-src_10": { - "flake": false, - "locked": { - "lastModified": 1633514407, - "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", - "owner": "kristapsdz", - "repo": "lowdown", - "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", - "type": "github" - }, - "original": { - "owner": "kristapsdz", - "repo": "lowdown", - "type": "github" - } - }, - "lowdown-src_11": { - "flake": false, - "locked": { - "lastModified": 1633514407, - "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", - "owner": "kristapsdz", - "repo": "lowdown", - "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", - "type": "github" - }, - "original": { - "owner": "kristapsdz", - "repo": "lowdown", - "type": "github" - } - }, - "lowdown-src_12": { - "flake": false, - "locked": { - "lastModified": 1633514407, - "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", - "owner": "kristapsdz", - "repo": "lowdown", - "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", - "type": "github" - }, - "original": { - "owner": "kristapsdz", - "repo": "lowdown", - "type": "github" - } - }, - "lowdown-src_13": { - "flake": false, - "locked": { - "lastModified": 1633514407, - "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", - "owner": "kristapsdz", - "repo": "lowdown", - "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", - "type": "github" - }, - "original": { - "owner": "kristapsdz", - "repo": "lowdown", - "type": "github" - } - }, - "lowdown-src_14": { - "flake": false, - "locked": { - "lastModified": 1633514407, - "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", - "owner": "kristapsdz", - "repo": "lowdown", - "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", - "type": "github" - }, - "original": { - "owner": "kristapsdz", - "repo": "lowdown", - "type": "github" - } - }, - "lowdown-src_15": { - "flake": false, - "locked": { - "lastModified": 1633514407, - "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", - "owner": "kristapsdz", - "repo": "lowdown", - "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", - "type": "github" - }, - "original": { - "owner": "kristapsdz", - "repo": "lowdown", - "type": "github" - } - }, "lowdown-src_2": { "flake": false, "locked": { @@ -7421,42 +4244,394 @@ "type": "github" } }, - "lowdown-src_8": { + "mdbook-kroki-preprocessor": { "flake": false, "locked": { - "lastModified": 1633514407, - "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", - "owner": "kristapsdz", - "repo": "lowdown", - "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "lastModified": 1661755005, + "narHash": "sha256-1TJuUzfyMycWlOQH67LR63/ll2GDZz25I3JfScy/Jnw=", + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "rev": "93adb5716d035829efed27f65f2f0833a7d3e76f", "type": "github" }, "original": { - "owner": "kristapsdz", - "repo": "lowdown", + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", "type": "github" } }, - "lowdown-src_9": { + "mdbook-kroki-preprocessor_2": { "flake": false, "locked": { - "lastModified": 1633514407, - "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", - "owner": "kristapsdz", - "repo": "lowdown", - "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "lastModified": 1661755005, + "narHash": "sha256-1TJuUzfyMycWlOQH67LR63/ll2GDZz25I3JfScy/Jnw=", + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "rev": "93adb5716d035829efed27f65f2f0833a7d3e76f", "type": "github" }, "original": { - "owner": "kristapsdz", - "repo": "lowdown", + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "type": "github" + } + }, + "mdbook-kroki-preprocessor_3": { + "flake": false, + "locked": { + "lastModified": 1661755005, + "narHash": "sha256-1TJuUzfyMycWlOQH67LR63/ll2GDZz25I3JfScy/Jnw=", + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "rev": "93adb5716d035829efed27f65f2f0833a7d3e76f", + "type": "github" + }, + "original": { + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "type": "github" + } + }, + "mdbook-kroki-preprocessor_4": { + "flake": false, + "locked": { + "lastModified": 1661755005, + "narHash": "sha256-1TJuUzfyMycWlOQH67LR63/ll2GDZz25I3JfScy/Jnw=", + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "rev": "93adb5716d035829efed27f65f2f0833a7d3e76f", + "type": "github" + }, + "original": { + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "type": "github" + } + }, + "mdbook-kroki-preprocessor_5": { + "flake": false, + "locked": { + "lastModified": 1661755005, + "narHash": "sha256-1TJuUzfyMycWlOQH67LR63/ll2GDZz25I3JfScy/Jnw=", + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "rev": "93adb5716d035829efed27f65f2f0833a7d3e76f", + "type": "github" + }, + "original": { + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "type": "github" + } + }, + "mdbook-kroki-preprocessor_6": { + "flake": false, + "locked": { + "lastModified": 1661755005, + "narHash": "sha256-1TJuUzfyMycWlOQH67LR63/ll2GDZz25I3JfScy/Jnw=", + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "rev": "93adb5716d035829efed27f65f2f0833a7d3e76f", + "type": "github" + }, + "original": { + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "type": "github" + } + }, + "mdbook-kroki-preprocessor_7": { + "flake": false, + "locked": { + "lastModified": 1661755005, + "narHash": "sha256-1TJuUzfyMycWlOQH67LR63/ll2GDZz25I3JfScy/Jnw=", + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "rev": "93adb5716d035829efed27f65f2f0833a7d3e76f", + "type": "github" + }, + "original": { + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "type": "github" + } + }, + "mdbook-kroki-preprocessor_8": { + "flake": false, + "locked": { + "lastModified": 1661755005, + "narHash": "sha256-1TJuUzfyMycWlOQH67LR63/ll2GDZz25I3JfScy/Jnw=", + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "rev": "93adb5716d035829efed27f65f2f0833a7d3e76f", + "type": "github" + }, + "original": { + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "type": "github" + } + }, + "mdbook-kroki-preprocessor_9": { + "flake": false, + "locked": { + "lastModified": 1661755005, + "narHash": "sha256-1TJuUzfyMycWlOQH67LR63/ll2GDZz25I3JfScy/Jnw=", + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "rev": "93adb5716d035829efed27f65f2f0833a7d3e76f", + "type": "github" + }, + "original": { + "owner": "JoelCourtney", + "repo": "mdbook-kroki-preprocessor", + "type": "github" + } + }, + "n2c": { + "inputs": { + "flake-utils": "flake-utils_4", + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "haskell-nix", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1665039323, + "narHash": "sha256-SAh3ZjFGsaCI8FRzXQyp56qcGdAqgKEfJWPCQ0Sr7tQ=", + "owner": "nlewo", + "repo": "nix2container", + "rev": "b008fe329ffb59b67bf9e7b08ede6ee792f2741a", + "type": "github" + }, + "original": { + "owner": "nlewo", + "repo": "nix2container", + "type": "github" + } + }, + "n2c_2": { + "inputs": { + "flake-utils": "flake-utils_9", + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1665039323, + "narHash": "sha256-SAh3ZjFGsaCI8FRzXQyp56qcGdAqgKEfJWPCQ0Sr7tQ=", + "owner": "nlewo", + "repo": "nix2container", + "rev": "b008fe329ffb59b67bf9e7b08ede6ee792f2741a", + "type": "github" + }, + "original": { + "owner": "nlewo", + "repo": "nix2container", + "type": "github" + } + }, + "n2c_3": { + "inputs": { + "flake-utils": "flake-utils_13", + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1665039323, + "narHash": "sha256-SAh3ZjFGsaCI8FRzXQyp56qcGdAqgKEfJWPCQ0Sr7tQ=", + "owner": "nlewo", + "repo": "nix2container", + "rev": "b008fe329ffb59b67bf9e7b08ede6ee792f2741a", + "type": "github" + }, + "original": { + "owner": "nlewo", + "repo": "nix2container", + "type": "github" + } + }, + "n2c_4": { + "inputs": { + "flake-utils": "flake-utils_16", + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1665039323, + "narHash": "sha256-SAh3ZjFGsaCI8FRzXQyp56qcGdAqgKEfJWPCQ0Sr7tQ=", + "owner": "nlewo", + "repo": "nix2container", + "rev": "b008fe329ffb59b67bf9e7b08ede6ee792f2741a", + "type": "github" + }, + "original": { + "owner": "nlewo", + "repo": "nix2container", + "type": "github" + } + }, + "n2c_5": { + "inputs": { + "flake-utils": "flake-utils_22", + "nixpkgs": [ + "liqwid-libs", + "ply", + "haskellNix", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1665039323, + "narHash": "sha256-SAh3ZjFGsaCI8FRzXQyp56qcGdAqgKEfJWPCQ0Sr7tQ=", + "owner": "nlewo", + "repo": "nix2container", + "rev": "b008fe329ffb59b67bf9e7b08ede6ee792f2741a", + "type": "github" + }, + "original": { + "owner": "nlewo", + "repo": "nix2container", + "type": "github" + } + }, + "n2c_6": { + "inputs": { + "flake-utils": "flake-utils_27", + "nixpkgs": [ + "liqwid-nix", + "haskell-nix", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1665039323, + "narHash": "sha256-SAh3ZjFGsaCI8FRzXQyp56qcGdAqgKEfJWPCQ0Sr7tQ=", + "owner": "nlewo", + "repo": "nix2container", + "rev": "b008fe329ffb59b67bf9e7b08ede6ee792f2741a", + "type": "github" + }, + "original": { + "owner": "nlewo", + "repo": "nix2container", + "type": "github" + } + }, + "n2c_7": { + "inputs": { + "flake-utils": "flake-utils_31", + "nixpkgs": [ + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1665039323, + "narHash": "sha256-SAh3ZjFGsaCI8FRzXQyp56qcGdAqgKEfJWPCQ0Sr7tQ=", + "owner": "nlewo", + "repo": "nix2container", + "rev": "b008fe329ffb59b67bf9e7b08ede6ee792f2741a", + "type": "github" + }, + "original": { + "owner": "nlewo", + "repo": "nix2container", + "type": "github" + } + }, + "n2c_8": { + "inputs": { + "flake-utils": "flake-utils_35", + "nixpkgs": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1665039323, + "narHash": "sha256-SAh3ZjFGsaCI8FRzXQyp56qcGdAqgKEfJWPCQ0Sr7tQ=", + "owner": "nlewo", + "repo": "nix2container", + "rev": "b008fe329ffb59b67bf9e7b08ede6ee792f2741a", + "type": "github" + }, + "original": { + "owner": "nlewo", + "repo": "nix2container", + "type": "github" + } + }, + "n2c_9": { + "inputs": { + "flake-utils": "flake-utils_38", + "nixpkgs": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1665039323, + "narHash": "sha256-SAh3ZjFGsaCI8FRzXQyp56qcGdAqgKEfJWPCQ0Sr7tQ=", + "owner": "nlewo", + "repo": "nix2container", + "rev": "b008fe329ffb59b67bf9e7b08ede6ee792f2741a", + "type": "github" + }, + "original": { + "owner": "nlewo", + "repo": "nix2container", "type": "github" } }, "nix": { "inputs": { "lowdown-src": "lowdown-src", - "nixpkgs": "nixpkgs_3", + "nixpkgs": "nixpkgs", "nixpkgs-regression": "nixpkgs-regression" }, "locked": { @@ -7474,369 +4649,462 @@ "type": "github" } }, - "nix-tools": { - "flake": false, - "locked": { - "lastModified": 1649424170, - "narHash": "sha256-XgKXWispvv5RCvZzPb+p7e6Hy3LMuRjafKMl7kXzxGw=", - "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "e109c94016e3b6e0db7ed413c793e2d4bdb24aa7", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "nix-tools", - "type": "github" - } - }, - "nix-tools_10": { - "flake": false, - "locked": { - "lastModified": 1649424170, - "narHash": "sha256-XgKXWispvv5RCvZzPb+p7e6Hy3LMuRjafKMl7kXzxGw=", - "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "e109c94016e3b6e0db7ed413c793e2d4bdb24aa7", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "nix-tools", - "type": "github" - } - }, - "nix-tools_11": { - "flake": false, - "locked": { - "lastModified": 1649424170, - "narHash": "sha256-XgKXWispvv5RCvZzPb+p7e6Hy3LMuRjafKMl7kXzxGw=", - "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "e109c94016e3b6e0db7ed413c793e2d4bdb24aa7", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "nix-tools", - "type": "github" - } - }, - "nix-tools_12": { - "flake": false, - "locked": { - "lastModified": 1649424170, - "narHash": "sha256-XgKXWispvv5RCvZzPb+p7e6Hy3LMuRjafKMl7kXzxGw=", - "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "e109c94016e3b6e0db7ed413c793e2d4bdb24aa7", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "nix-tools", - "type": "github" - } - }, - "nix-tools_13": { - "flake": false, - "locked": { - "lastModified": 1649424170, - "narHash": "sha256-XgKXWispvv5RCvZzPb+p7e6Hy3LMuRjafKMl7kXzxGw=", - "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "e109c94016e3b6e0db7ed413c793e2d4bdb24aa7", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "nix-tools", - "type": "github" - } - }, - "nix-tools_14": { - "flake": false, - "locked": { - "lastModified": 1649424170, - "narHash": "sha256-XgKXWispvv5RCvZzPb+p7e6Hy3LMuRjafKMl7kXzxGw=", - "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "e109c94016e3b6e0db7ed413c793e2d4bdb24aa7", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "nix-tools", - "type": "github" - } - }, - "nix-tools_15": { - "flake": false, - "locked": { - "lastModified": 1649424170, - "narHash": "sha256-XgKXWispvv5RCvZzPb+p7e6Hy3LMuRjafKMl7kXzxGw=", - "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "e109c94016e3b6e0db7ed413c793e2d4bdb24aa7", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "nix-tools", - "type": "github" - } - }, - "nix-tools_2": { - "flake": false, - "locked": { - "lastModified": 1649424170, - "narHash": "sha256-XgKXWispvv5RCvZzPb+p7e6Hy3LMuRjafKMl7kXzxGw=", - "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "e109c94016e3b6e0db7ed413c793e2d4bdb24aa7", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "nix-tools", - "type": "github" - } - }, - "nix-tools_3": { - "flake": false, - "locked": { - "lastModified": 1649424170, - "narHash": "sha256-XgKXWispvv5RCvZzPb+p7e6Hy3LMuRjafKMl7kXzxGw=", - "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "e109c94016e3b6e0db7ed413c793e2d4bdb24aa7", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "nix-tools", - "type": "github" - } - }, - "nix-tools_4": { - "flake": false, - "locked": { - "lastModified": 1649424170, - "narHash": "sha256-XgKXWispvv5RCvZzPb+p7e6Hy3LMuRjafKMl7kXzxGw=", - "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "e109c94016e3b6e0db7ed413c793e2d4bdb24aa7", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "nix-tools", - "type": "github" - } - }, - "nix-tools_5": { - "flake": false, - "locked": { - "lastModified": 1649424170, - "narHash": "sha256-XgKXWispvv5RCvZzPb+p7e6Hy3LMuRjafKMl7kXzxGw=", - "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "e109c94016e3b6e0db7ed413c793e2d4bdb24aa7", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "nix-tools", - "type": "github" - } - }, - "nix-tools_6": { - "flake": false, - "locked": { - "lastModified": 1649424170, - "narHash": "sha256-XgKXWispvv5RCvZzPb+p7e6Hy3LMuRjafKMl7kXzxGw=", - "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "e109c94016e3b6e0db7ed413c793e2d4bdb24aa7", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "nix-tools", - "type": "github" - } - }, - "nix-tools_7": { - "flake": false, - "locked": { - "lastModified": 1649424170, - "narHash": "sha256-XgKXWispvv5RCvZzPb+p7e6Hy3LMuRjafKMl7kXzxGw=", - "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "e109c94016e3b6e0db7ed413c793e2d4bdb24aa7", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "nix-tools", - "type": "github" - } - }, - "nix-tools_8": { - "flake": false, - "locked": { - "lastModified": 1649424170, - "narHash": "sha256-XgKXWispvv5RCvZzPb+p7e6Hy3LMuRjafKMl7kXzxGw=", - "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "e109c94016e3b6e0db7ed413c793e2d4bdb24aa7", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "nix-tools", - "type": "github" - } - }, - "nix-tools_9": { - "flake": false, - "locked": { - "lastModified": 1649424170, - "narHash": "sha256-XgKXWispvv5RCvZzPb+p7e6Hy3LMuRjafKMl7kXzxGw=", - "owner": "input-output-hk", - "repo": "nix-tools", - "rev": "e109c94016e3b6e0db7ed413c793e2d4bdb24aa7", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "nix-tools", - "type": "github" - } - }, - "nix_10": { + "nix-darwin": { "inputs": { - "lowdown-src": "lowdown-src_10", - "nixpkgs": "nixpkgs_39", - "nixpkgs-regression": "nixpkgs-regression_10" + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "hercules-ci-effects", + "hercules-ci-agent", + "nixpkgs" + ] }, "locked": { - "lastModified": 1643066034, - "narHash": "sha256-xEPeMcNJVOeZtoN+d+aRwolpW8mFSEQx76HTRdlhPhg=", - "owner": "NixOS", - "repo": "nix", - "rev": "a1cd7e58606a41fcf62bf8637804cf8306f17f62", + "lastModified": 1673295039, + "narHash": "sha256-AsdYgE8/GPwcelGgrntlijMg4t3hLFJFCRF3tL5WVjA=", + "owner": "LnL7", + "repo": "nix-darwin", + "rev": "87b9d090ad39b25b2400029c64825fc2a8868943", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "2.6.0", - "repo": "nix", + "owner": "LnL7", + "repo": "nix-darwin", "type": "github" } }, - "nix_11": { + "nix-nomad": { "inputs": { - "lowdown-src": "lowdown-src_11", - "nixpkgs": "nixpkgs_43", - "nixpkgs-regression": "nixpkgs-regression_11" + "flake-compat": "flake-compat_2", + "flake-utils": [ + "liqwid-libs", + "liqwid-nix", + "haskell-nix", + "tullia", + "nix2container", + "flake-utils" + ], + "gomod2nix": "gomod2nix", + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "haskell-nix", + "tullia", + "nixpkgs" + ], + "nixpkgs-lib": [ + "liqwid-libs", + "liqwid-nix", + "haskell-nix", + "tullia", + "nixpkgs" + ] }, "locked": { - "lastModified": 1643066034, - "narHash": "sha256-xEPeMcNJVOeZtoN+d+aRwolpW8mFSEQx76HTRdlhPhg=", - "owner": "NixOS", - "repo": "nix", - "rev": "a1cd7e58606a41fcf62bf8637804cf8306f17f62", + "lastModified": 1658277770, + "narHash": "sha256-T/PgG3wUn8Z2rnzfxf2VqlR1CBjInPE0l1yVzXxPnt0=", + "owner": "tristanpemble", + "repo": "nix-nomad", + "rev": "054adcbdd0a836ae1c20951b67ed549131fd2d70", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "2.6.0", - "repo": "nix", + "owner": "tristanpemble", + "repo": "nix-nomad", "type": "github" } }, - "nix_12": { + "nix-nomad_2": { "inputs": { - "lowdown-src": "lowdown-src_12", - "nixpkgs": "nixpkgs_47", - "nixpkgs-regression": "nixpkgs-regression_12" + "flake-compat": "flake-compat_5", + "flake-utils": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "nix2container", + "flake-utils" + ], + "gomod2nix": "gomod2nix_2", + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "nixpkgs" + ], + "nixpkgs-lib": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "nixpkgs" + ] }, "locked": { - "lastModified": 1643066034, - "narHash": "sha256-xEPeMcNJVOeZtoN+d+aRwolpW8mFSEQx76HTRdlhPhg=", - "owner": "NixOS", - "repo": "nix", - "rev": "a1cd7e58606a41fcf62bf8637804cf8306f17f62", + "lastModified": 1658277770, + "narHash": "sha256-T/PgG3wUn8Z2rnzfxf2VqlR1CBjInPE0l1yVzXxPnt0=", + "owner": "tristanpemble", + "repo": "nix-nomad", + "rev": "054adcbdd0a836ae1c20951b67ed549131fd2d70", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "2.6.0", - "repo": "nix", + "owner": "tristanpemble", + "repo": "nix-nomad", "type": "github" } }, - "nix_13": { + "nix-nomad_3": { "inputs": { - "lowdown-src": "lowdown-src_13", - "nixpkgs": "nixpkgs_50", - "nixpkgs-regression": "nixpkgs-regression_13" + "flake-compat": "flake-compat_7", + "flake-utils": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "nix2container", + "flake-utils" + ], + "gomod2nix": "gomod2nix_3", + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "nixpkgs" + ], + "nixpkgs-lib": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "nixpkgs" + ] }, "locked": { - "lastModified": 1643066034, - "narHash": "sha256-xEPeMcNJVOeZtoN+d+aRwolpW8mFSEQx76HTRdlhPhg=", - "owner": "NixOS", - "repo": "nix", - "rev": "a1cd7e58606a41fcf62bf8637804cf8306f17f62", + "lastModified": 1658277770, + "narHash": "sha256-T/PgG3wUn8Z2rnzfxf2VqlR1CBjInPE0l1yVzXxPnt0=", + "owner": "tristanpemble", + "repo": "nix-nomad", + "rev": "054adcbdd0a836ae1c20951b67ed549131fd2d70", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "2.6.0", - "repo": "nix", + "owner": "tristanpemble", + "repo": "nix-nomad", "type": "github" } }, - "nix_14": { + "nix-nomad_4": { "inputs": { - "lowdown-src": "lowdown-src_14", - "nixpkgs": "nixpkgs_54", - "nixpkgs-regression": "nixpkgs-regression_14" + "flake-compat": "flake-compat_10", + "flake-utils": [ + "liqwid-libs", + "ply", + "haskellNix", + "tullia", + "nix2container", + "flake-utils" + ], + "gomod2nix": "gomod2nix_4", + "nixpkgs": [ + "liqwid-libs", + "ply", + "haskellNix", + "tullia", + "nixpkgs" + ], + "nixpkgs-lib": [ + "liqwid-libs", + "ply", + "haskellNix", + "tullia", + "nixpkgs" + ] }, "locked": { - "lastModified": 1643066034, - "narHash": "sha256-xEPeMcNJVOeZtoN+d+aRwolpW8mFSEQx76HTRdlhPhg=", - "owner": "NixOS", - "repo": "nix", - "rev": "a1cd7e58606a41fcf62bf8637804cf8306f17f62", + "lastModified": 1658277770, + "narHash": "sha256-T/PgG3wUn8Z2rnzfxf2VqlR1CBjInPE0l1yVzXxPnt0=", + "owner": "tristanpemble", + "repo": "nix-nomad", + "rev": "054adcbdd0a836ae1c20951b67ed549131fd2d70", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "2.6.0", - "repo": "nix", + "owner": "tristanpemble", + "repo": "nix-nomad", "type": "github" } }, - "nix_15": { + "nix-nomad_5": { "inputs": { - "lowdown-src": "lowdown-src_15", - "nixpkgs": "nixpkgs_58", - "nixpkgs-regression": "nixpkgs-regression_15" + "flake-compat": "flake-compat_12", + "flake-utils": [ + "liqwid-nix", + "haskell-nix", + "tullia", + "nix2container", + "flake-utils" + ], + "gomod2nix": "gomod2nix_5", + "nixpkgs": [ + "liqwid-nix", + "haskell-nix", + "tullia", + "nixpkgs" + ], + "nixpkgs-lib": [ + "liqwid-nix", + "haskell-nix", + "tullia", + "nixpkgs" + ] }, "locked": { - "lastModified": 1643066034, - "narHash": "sha256-xEPeMcNJVOeZtoN+d+aRwolpW8mFSEQx76HTRdlhPhg=", - "owner": "NixOS", - "repo": "nix", - "rev": "a1cd7e58606a41fcf62bf8637804cf8306f17f62", + "lastModified": 1658277770, + "narHash": "sha256-T/PgG3wUn8Z2rnzfxf2VqlR1CBjInPE0l1yVzXxPnt0=", + "owner": "tristanpemble", + "repo": "nix-nomad", + "rev": "054adcbdd0a836ae1c20951b67ed549131fd2d70", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "2.6.0", - "repo": "nix", + "owner": "tristanpemble", + "repo": "nix-nomad", + "type": "github" + } + }, + "nix-nomad_6": { + "inputs": { + "flake-compat": "flake-compat_14", + "flake-utils": [ + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "nix2container", + "flake-utils" + ], + "gomod2nix": "gomod2nix_6", + "nixpkgs": [ + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "nixpkgs" + ], + "nixpkgs-lib": [ + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1658277770, + "narHash": "sha256-T/PgG3wUn8Z2rnzfxf2VqlR1CBjInPE0l1yVzXxPnt0=", + "owner": "tristanpemble", + "repo": "nix-nomad", + "rev": "054adcbdd0a836ae1c20951b67ed549131fd2d70", + "type": "github" + }, + "original": { + "owner": "tristanpemble", + "repo": "nix-nomad", + "type": "github" + } + }, + "nix-nomad_7": { + "inputs": { + "flake-compat": "flake-compat_16", + "flake-utils": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "nix2container", + "flake-utils" + ], + "gomod2nix": "gomod2nix_7", + "nixpkgs": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "nixpkgs" + ], + "nixpkgs-lib": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1658277770, + "narHash": "sha256-T/PgG3wUn8Z2rnzfxf2VqlR1CBjInPE0l1yVzXxPnt0=", + "owner": "tristanpemble", + "repo": "nix-nomad", + "rev": "054adcbdd0a836ae1c20951b67ed549131fd2d70", + "type": "github" + }, + "original": { + "owner": "tristanpemble", + "repo": "nix-nomad", + "type": "github" + } + }, + "nix2container": { + "inputs": { + "flake-utils": "flake-utils_2", + "nixpkgs": "nixpkgs_3" + }, + "locked": { + "lastModified": 1658567952, + "narHash": "sha256-XZ4ETYAMU7XcpEeAFP3NOl9yDXNuZAen/aIJ84G+VgA=", + "owner": "nlewo", + "repo": "nix2container", + "rev": "60bb43d405991c1378baf15a40b5811a53e32ffa", + "type": "github" + }, + "original": { + "owner": "nlewo", + "repo": "nix2container", + "type": "github" + } + }, + "nix2container_2": { + "inputs": { + "flake-utils": "flake-utils_7", + "nixpkgs": "nixpkgs_9" + }, + "locked": { + "lastModified": 1658567952, + "narHash": "sha256-XZ4ETYAMU7XcpEeAFP3NOl9yDXNuZAen/aIJ84G+VgA=", + "owner": "nlewo", + "repo": "nix2container", + "rev": "60bb43d405991c1378baf15a40b5811a53e32ffa", + "type": "github" + }, + "original": { + "owner": "nlewo", + "repo": "nix2container", + "type": "github" + } + }, + "nix2container_3": { + "inputs": { + "flake-utils": "flake-utils_14", + "nixpkgs": "nixpkgs_15" + }, + "locked": { + "lastModified": 1658567952, + "narHash": "sha256-XZ4ETYAMU7XcpEeAFP3NOl9yDXNuZAen/aIJ84G+VgA=", + "owner": "nlewo", + "repo": "nix2container", + "rev": "60bb43d405991c1378baf15a40b5811a53e32ffa", + "type": "github" + }, + "original": { + "owner": "nlewo", + "repo": "nix2container", + "type": "github" + } + }, + "nix2container_4": { + "inputs": { + "flake-utils": "flake-utils_20", + "nixpkgs": "nixpkgs_20" + }, + "locked": { + "lastModified": 1658567952, + "narHash": "sha256-XZ4ETYAMU7XcpEeAFP3NOl9yDXNuZAen/aIJ84G+VgA=", + "owner": "nlewo", + "repo": "nix2container", + "rev": "60bb43d405991c1378baf15a40b5811a53e32ffa", + "type": "github" + }, + "original": { + "owner": "nlewo", + "repo": "nix2container", + "type": "github" + } + }, + "nix2container_5": { + "inputs": { + "flake-utils": "flake-utils_25", + "nixpkgs": "nixpkgs_25" + }, + "locked": { + "lastModified": 1658567952, + "narHash": "sha256-XZ4ETYAMU7XcpEeAFP3NOl9yDXNuZAen/aIJ84G+VgA=", + "owner": "nlewo", + "repo": "nix2container", + "rev": "60bb43d405991c1378baf15a40b5811a53e32ffa", + "type": "github" + }, + "original": { + "owner": "nlewo", + "repo": "nix2container", + "type": "github" + } + }, + "nix2container_6": { + "inputs": { + "flake-utils": "flake-utils_29", + "nixpkgs": "nixpkgs_29" + }, + "locked": { + "lastModified": 1658567952, + "narHash": "sha256-XZ4ETYAMU7XcpEeAFP3NOl9yDXNuZAen/aIJ84G+VgA=", + "owner": "nlewo", + "repo": "nix2container", + "rev": "60bb43d405991c1378baf15a40b5811a53e32ffa", + "type": "github" + }, + "original": { + "owner": "nlewo", + "repo": "nix2container", + "type": "github" + } + }, + "nix2container_7": { + "inputs": { + "flake-utils": "flake-utils_36", + "nixpkgs": "nixpkgs_35" + }, + "locked": { + "lastModified": 1658567952, + "narHash": "sha256-XZ4ETYAMU7XcpEeAFP3NOl9yDXNuZAen/aIJ84G+VgA=", + "owner": "nlewo", + "repo": "nix2container", + "rev": "60bb43d405991c1378baf15a40b5811a53e32ffa", + "type": "github" + }, + "original": { + "owner": "nlewo", + "repo": "nix2container", "type": "github" } }, @@ -7864,7 +5132,7 @@ "nix_3": { "inputs": { "lowdown-src": "lowdown-src_3", - "nixpkgs": "nixpkgs_11", + "nixpkgs": "nixpkgs_12", "nixpkgs-regression": "nixpkgs-regression_3" }, "locked": { @@ -7885,7 +5153,7 @@ "nix_4": { "inputs": { "lowdown-src": "lowdown-src_4", - "nixpkgs": "nixpkgs_15", + "nixpkgs": "nixpkgs_18", "nixpkgs-regression": "nixpkgs-regression_4" }, "locked": { @@ -7906,7 +5174,7 @@ "nix_5": { "inputs": { "lowdown-src": "lowdown-src_5", - "nixpkgs": "nixpkgs_18", + "nixpkgs": "nixpkgs_23", "nixpkgs-regression": "nixpkgs-regression_5" }, "locked": { @@ -7927,7 +5195,7 @@ "nix_6": { "inputs": { "lowdown-src": "lowdown-src_6", - "nixpkgs": "nixpkgs_22", + "nixpkgs": "nixpkgs_27", "nixpkgs-regression": "nixpkgs-regression_6" }, "locked": { @@ -7948,7 +5216,7 @@ "nix_7": { "inputs": { "lowdown-src": "lowdown-src_7", - "nixpkgs": "nixpkgs_26", + "nixpkgs": "nixpkgs_32", "nixpkgs-regression": "nixpkgs-regression_7" }, "locked": { @@ -7966,59 +5234,405 @@ "type": "github" } }, - "nix_8": { + "nixago": { "inputs": { - "lowdown-src": "lowdown-src_8", - "nixpkgs": "nixpkgs_30", - "nixpkgs-regression": "nixpkgs-regression_8" + "flake-utils": [ + "liqwid-libs", + "liqwid-nix", + "haskell-nix", + "tullia", + "std", + "flake-utils" + ], + "nixago-exts": [ + "liqwid-libs", + "liqwid-nix", + "haskell-nix", + "tullia", + "std", + "blank" + ], + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "haskell-nix", + "tullia", + "std", + "nixpkgs" + ] }, "locked": { - "lastModified": 1643066034, - "narHash": "sha256-xEPeMcNJVOeZtoN+d+aRwolpW8mFSEQx76HTRdlhPhg=", - "owner": "NixOS", - "repo": "nix", - "rev": "a1cd7e58606a41fcf62bf8637804cf8306f17f62", + "lastModified": 1661824785, + "narHash": "sha256-/PnwdWoO/JugJZHtDUioQp3uRiWeXHUdgvoyNbXesz8=", + "owner": "nix-community", + "repo": "nixago", + "rev": "8c1f9e5f1578d4b2ea989f618588d62a335083c3", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "2.6.0", - "repo": "nix", + "owner": "nix-community", + "repo": "nixago", "type": "github" } }, - "nix_9": { + "nixago_2": { "inputs": { - "lowdown-src": "lowdown-src_9", - "nixpkgs": "nixpkgs_35", - "nixpkgs-regression": "nixpkgs-regression_9" + "flake-utils": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "std", + "flake-utils" + ], + "nixago-exts": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "std", + "blank" + ], + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "std", + "nixpkgs" + ] }, "locked": { - "lastModified": 1643066034, - "narHash": "sha256-xEPeMcNJVOeZtoN+d+aRwolpW8mFSEQx76HTRdlhPhg=", - "owner": "NixOS", - "repo": "nix", - "rev": "a1cd7e58606a41fcf62bf8637804cf8306f17f62", + "lastModified": 1661824785, + "narHash": "sha256-/PnwdWoO/JugJZHtDUioQp3uRiWeXHUdgvoyNbXesz8=", + "owner": "nix-community", + "repo": "nixago", + "rev": "8c1f9e5f1578d4b2ea989f618588d62a335083c3", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "2.6.0", - "repo": "nix", + "owner": "nix-community", + "repo": "nixago", + "type": "github" + } + }, + "nixago_3": { + "inputs": { + "flake-utils": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "std", + "flake-utils" + ], + "nixago-exts": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "std", + "blank" + ], + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1661824785, + "narHash": "sha256-/PnwdWoO/JugJZHtDUioQp3uRiWeXHUdgvoyNbXesz8=", + "owner": "nix-community", + "repo": "nixago", + "rev": "8c1f9e5f1578d4b2ea989f618588d62a335083c3", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixago", + "type": "github" + } + }, + "nixago_4": { + "inputs": { + "flake-utils": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "std", + "flake-utils" + ], + "nixago-exts": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "std", + "blank" + ], + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1661824785, + "narHash": "sha256-/PnwdWoO/JugJZHtDUioQp3uRiWeXHUdgvoyNbXesz8=", + "owner": "nix-community", + "repo": "nixago", + "rev": "8c1f9e5f1578d4b2ea989f618588d62a335083c3", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixago", + "type": "github" + } + }, + "nixago_5": { + "inputs": { + "flake-utils": [ + "liqwid-libs", + "ply", + "haskellNix", + "tullia", + "std", + "flake-utils" + ], + "nixago-exts": [ + "liqwid-libs", + "ply", + "haskellNix", + "tullia", + "std", + "blank" + ], + "nixpkgs": [ + "liqwid-libs", + "ply", + "haskellNix", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1661824785, + "narHash": "sha256-/PnwdWoO/JugJZHtDUioQp3uRiWeXHUdgvoyNbXesz8=", + "owner": "nix-community", + "repo": "nixago", + "rev": "8c1f9e5f1578d4b2ea989f618588d62a335083c3", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixago", + "type": "github" + } + }, + "nixago_6": { + "inputs": { + "flake-utils": [ + "liqwid-nix", + "haskell-nix", + "tullia", + "std", + "flake-utils" + ], + "nixago-exts": [ + "liqwid-nix", + "haskell-nix", + "tullia", + "std", + "blank" + ], + "nixpkgs": [ + "liqwid-nix", + "haskell-nix", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1661824785, + "narHash": "sha256-/PnwdWoO/JugJZHtDUioQp3uRiWeXHUdgvoyNbXesz8=", + "owner": "nix-community", + "repo": "nixago", + "rev": "8c1f9e5f1578d4b2ea989f618588d62a335083c3", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixago", + "type": "github" + } + }, + "nixago_7": { + "inputs": { + "flake-utils": [ + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "std", + "flake-utils" + ], + "nixago-exts": [ + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "std", + "blank" + ], + "nixpkgs": [ + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1661824785, + "narHash": "sha256-/PnwdWoO/JugJZHtDUioQp3uRiWeXHUdgvoyNbXesz8=", + "owner": "nix-community", + "repo": "nixago", + "rev": "8c1f9e5f1578d4b2ea989f618588d62a335083c3", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixago", + "type": "github" + } + }, + "nixago_8": { + "inputs": { + "flake-utils": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "std", + "flake-utils" + ], + "nixago-exts": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "std", + "blank" + ], + "nixpkgs": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1661824785, + "narHash": "sha256-/PnwdWoO/JugJZHtDUioQp3uRiWeXHUdgvoyNbXesz8=", + "owner": "nix-community", + "repo": "nixago", + "rev": "8c1f9e5f1578d4b2ea989f618588d62a335083c3", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixago", + "type": "github" + } + }, + "nixago_9": { + "inputs": { + "flake-utils": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "std", + "flake-utils" + ], + "nixago-exts": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "std", + "blank" + ], + "nixpkgs": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1661824785, + "narHash": "sha256-/PnwdWoO/JugJZHtDUioQp3uRiWeXHUdgvoyNbXesz8=", + "owner": "nix-community", + "repo": "nixago", + "rev": "8c1f9e5f1578d4b2ea989f618588d62a335083c3", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixago", "type": "github" } }, "nixpkgs": { "locked": { - "lastModified": 1657292830, - "narHash": "sha256-ldfVSTveWceDCmW6gf3B4kR6vwmz/XS80y5wsLLHFJU=", + "lastModified": 1632864508, + "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "334ec8b503c3981e37a04b817a70e8d026ea9e84", + "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", "type": "github" }, "original": { "id": "nixpkgs", + "ref": "nixos-21.05-small", "type": "indirect" } }, @@ -8038,102 +5652,6 @@ "type": "github" } }, - "nixpkgs-2003_10": { - "locked": { - "lastModified": 1620055814, - "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-20.03-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2003_11": { - "locked": { - "lastModified": 1620055814, - "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-20.03-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2003_12": { - "locked": { - "lastModified": 1620055814, - "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-20.03-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2003_13": { - "locked": { - "lastModified": 1620055814, - "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-20.03-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2003_14": { - "locked": { - "lastModified": 1620055814, - "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-20.03-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2003_15": { - "locked": { - "lastModified": 1620055814, - "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-20.03-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, "nixpkgs-2003_2": { "locked": { "lastModified": 1620055814, @@ -8230,141 +5748,13 @@ "type": "github" } }, - "nixpkgs-2003_8": { - "locked": { - "lastModified": 1620055814, - "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-20.03-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2003_9": { - "locked": { - "lastModified": 1620055814, - "narHash": "sha256-8LEHoYSJiL901bTMVatq+rf8y7QtWuZhwwpKE2fyaRY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "1db42b7fe3878f3f5f7a4f2dc210772fd080e205", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-20.03-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, "nixpkgs-2105": { "locked": { - "lastModified": 1645296114, - "narHash": "sha256-y53N7TyIkXsjMpOG7RhvqJFGDacLs9HlyHeSTBioqYU=", + "lastModified": 1659914493, + "narHash": "sha256-lkA5X3VNMKirvA+SUzvEhfA7XquWLci+CGi505YFAIs=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "530a53dcbc9437363471167a5e4762c5fcfa34a1", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2105_10": { - "locked": { - "lastModified": 1645296114, - "narHash": "sha256-y53N7TyIkXsjMpOG7RhvqJFGDacLs9HlyHeSTBioqYU=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "530a53dcbc9437363471167a5e4762c5fcfa34a1", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2105_11": { - "locked": { - "lastModified": 1645296114, - "narHash": "sha256-y53N7TyIkXsjMpOG7RhvqJFGDacLs9HlyHeSTBioqYU=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "530a53dcbc9437363471167a5e4762c5fcfa34a1", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2105_12": { - "locked": { - "lastModified": 1645296114, - "narHash": "sha256-y53N7TyIkXsjMpOG7RhvqJFGDacLs9HlyHeSTBioqYU=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "530a53dcbc9437363471167a5e4762c5fcfa34a1", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2105_13": { - "locked": { - "lastModified": 1645296114, - "narHash": "sha256-y53N7TyIkXsjMpOG7RhvqJFGDacLs9HlyHeSTBioqYU=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "530a53dcbc9437363471167a5e4762c5fcfa34a1", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2105_14": { - "locked": { - "lastModified": 1645296114, - "narHash": "sha256-y53N7TyIkXsjMpOG7RhvqJFGDacLs9HlyHeSTBioqYU=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "530a53dcbc9437363471167a5e4762c5fcfa34a1", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2105_15": { - "locked": { - "lastModified": 1645296114, - "narHash": "sha256-y53N7TyIkXsjMpOG7RhvqJFGDacLs9HlyHeSTBioqYU=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "530a53dcbc9437363471167a5e4762c5fcfa34a1", + "rev": "022caabb5f2265ad4006c1fa5b1ebe69fb0c3faf", "type": "github" }, "original": { @@ -8376,11 +5766,11 @@ }, "nixpkgs-2105_2": { "locked": { - "lastModified": 1645296114, - "narHash": "sha256-y53N7TyIkXsjMpOG7RhvqJFGDacLs9HlyHeSTBioqYU=", + "lastModified": 1659914493, + "narHash": "sha256-lkA5X3VNMKirvA+SUzvEhfA7XquWLci+CGi505YFAIs=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "530a53dcbc9437363471167a5e4762c5fcfa34a1", + "rev": "022caabb5f2265ad4006c1fa5b1ebe69fb0c3faf", "type": "github" }, "original": { @@ -8392,11 +5782,11 @@ }, "nixpkgs-2105_3": { "locked": { - "lastModified": 1645296114, - "narHash": "sha256-y53N7TyIkXsjMpOG7RhvqJFGDacLs9HlyHeSTBioqYU=", + "lastModified": 1659914493, + "narHash": "sha256-lkA5X3VNMKirvA+SUzvEhfA7XquWLci+CGi505YFAIs=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "530a53dcbc9437363471167a5e4762c5fcfa34a1", + "rev": "022caabb5f2265ad4006c1fa5b1ebe69fb0c3faf", "type": "github" }, "original": { @@ -8408,11 +5798,11 @@ }, "nixpkgs-2105_4": { "locked": { - "lastModified": 1645296114, - "narHash": "sha256-y53N7TyIkXsjMpOG7RhvqJFGDacLs9HlyHeSTBioqYU=", + "lastModified": 1659914493, + "narHash": "sha256-lkA5X3VNMKirvA+SUzvEhfA7XquWLci+CGi505YFAIs=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "530a53dcbc9437363471167a5e4762c5fcfa34a1", + "rev": "022caabb5f2265ad4006c1fa5b1ebe69fb0c3faf", "type": "github" }, "original": { @@ -8424,11 +5814,11 @@ }, "nixpkgs-2105_5": { "locked": { - "lastModified": 1645296114, - "narHash": "sha256-y53N7TyIkXsjMpOG7RhvqJFGDacLs9HlyHeSTBioqYU=", + "lastModified": 1659914493, + "narHash": "sha256-lkA5X3VNMKirvA+SUzvEhfA7XquWLci+CGi505YFAIs=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "530a53dcbc9437363471167a5e4762c5fcfa34a1", + "rev": "022caabb5f2265ad4006c1fa5b1ebe69fb0c3faf", "type": "github" }, "original": { @@ -8440,11 +5830,11 @@ }, "nixpkgs-2105_6": { "locked": { - "lastModified": 1645296114, - "narHash": "sha256-y53N7TyIkXsjMpOG7RhvqJFGDacLs9HlyHeSTBioqYU=", + "lastModified": 1659914493, + "narHash": "sha256-lkA5X3VNMKirvA+SUzvEhfA7XquWLci+CGi505YFAIs=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "530a53dcbc9437363471167a5e4762c5fcfa34a1", + "rev": "022caabb5f2265ad4006c1fa5b1ebe69fb0c3faf", "type": "github" }, "original": { @@ -8456,43 +5846,11 @@ }, "nixpkgs-2105_7": { "locked": { - "lastModified": 1645296114, - "narHash": "sha256-y53N7TyIkXsjMpOG7RhvqJFGDacLs9HlyHeSTBioqYU=", + "lastModified": 1659914493, + "narHash": "sha256-lkA5X3VNMKirvA+SUzvEhfA7XquWLci+CGi505YFAIs=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "530a53dcbc9437363471167a5e4762c5fcfa34a1", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2105_8": { - "locked": { - "lastModified": 1645296114, - "narHash": "sha256-y53N7TyIkXsjMpOG7RhvqJFGDacLs9HlyHeSTBioqYU=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "530a53dcbc9437363471167a5e4762c5fcfa34a1", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.05-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2105_9": { - "locked": { - "lastModified": 1645296114, - "narHash": "sha256-y53N7TyIkXsjMpOG7RhvqJFGDacLs9HlyHeSTBioqYU=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "530a53dcbc9437363471167a5e4762c5fcfa34a1", + "rev": "022caabb5f2265ad4006c1fa5b1ebe69fb0c3faf", "type": "github" }, "original": { @@ -8504,171 +5862,11 @@ }, "nixpkgs-2111": { "locked": { - "lastModified": 1658346836, - "narHash": "sha256-c9BZZbi0tqCQ4j6CMVDlsut3Q3ET1Fezf+qIslCfkhs=", + "lastModified": 1659446231, + "narHash": "sha256-hekabNdTdgR/iLsgce5TGWmfIDZ86qjPhxDg/8TlzhE=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "a1fe662eb26ffc2a036b37c4670392ade632c413", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2111_10": { - "locked": { - "lastModified": 1648744337, - "narHash": "sha256-bYe1dFJAXovjqiaPKrmAbSBEK5KUkgwVaZcTbSoJ7hg=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "0a58eebd8ec65ffdef2ce9562784123a73922052", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2111_11": { - "locked": { - "lastModified": 1659375853, - "narHash": "sha256-aiMfO6U1w1u93vB+5qCHCQDZKgpJ7qs4GJOQvI3CN/4=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "511f6a5c3248f9019a41e70c1891484de2bc906c", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2111_12": { - "locked": { - "lastModified": 1648744337, - "narHash": "sha256-bYe1dFJAXovjqiaPKrmAbSBEK5KUkgwVaZcTbSoJ7hg=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "0a58eebd8ec65ffdef2ce9562784123a73922052", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2111_13": { - "locked": { - "lastModified": 1658346836, - "narHash": "sha256-c9BZZbi0tqCQ4j6CMVDlsut3Q3ET1Fezf+qIslCfkhs=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a1fe662eb26ffc2a036b37c4670392ade632c413", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2111_14": { - "locked": { - "lastModified": 1648744337, - "narHash": "sha256-bYe1dFJAXovjqiaPKrmAbSBEK5KUkgwVaZcTbSoJ7hg=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "0a58eebd8ec65ffdef2ce9562784123a73922052", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2111_15": { - "locked": { - "lastModified": 1658346836, - "narHash": "sha256-c9BZZbi0tqCQ4j6CMVDlsut3Q3ET1Fezf+qIslCfkhs=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a1fe662eb26ffc2a036b37c4670392ade632c413", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2111_16": { - "locked": { - "lastModified": 1648744337, - "narHash": "sha256-bYe1dFJAXovjqiaPKrmAbSBEK5KUkgwVaZcTbSoJ7hg=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "0a58eebd8ec65ffdef2ce9562784123a73922052", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2111_17": { - "locked": { - "lastModified": 1658346836, - "narHash": "sha256-c9BZZbi0tqCQ4j6CMVDlsut3Q3ET1Fezf+qIslCfkhs=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a1fe662eb26ffc2a036b37c4670392ade632c413", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2111_18": { - "locked": { - "lastModified": 1648744337, - "narHash": "sha256-bYe1dFJAXovjqiaPKrmAbSBEK5KUkgwVaZcTbSoJ7hg=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "0a58eebd8ec65ffdef2ce9562784123a73922052", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2111_19": { - "locked": { - "lastModified": 1658346836, - "narHash": "sha256-c9BZZbi0tqCQ4j6CMVDlsut3Q3ET1Fezf+qIslCfkhs=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a1fe662eb26ffc2a036b37c4670392ade632c413", + "rev": "eabc38219184cc3e04a974fe31857d8e0eac098d", "type": "github" }, "original": { @@ -8679,166 +5877,6 @@ } }, "nixpkgs-2111_2": { - "locked": { - "lastModified": 1648744337, - "narHash": "sha256-bYe1dFJAXovjqiaPKrmAbSBEK5KUkgwVaZcTbSoJ7hg=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "0a58eebd8ec65ffdef2ce9562784123a73922052", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2111_20": { - "locked": { - "lastModified": 1648744337, - "narHash": "sha256-bYe1dFJAXovjqiaPKrmAbSBEK5KUkgwVaZcTbSoJ7hg=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "0a58eebd8ec65ffdef2ce9562784123a73922052", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2111_21": { - "locked": { - "lastModified": 1658346836, - "narHash": "sha256-c9BZZbi0tqCQ4j6CMVDlsut3Q3ET1Fezf+qIslCfkhs=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a1fe662eb26ffc2a036b37c4670392ade632c413", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2111_22": { - "locked": { - "lastModified": 1648744337, - "narHash": "sha256-bYe1dFJAXovjqiaPKrmAbSBEK5KUkgwVaZcTbSoJ7hg=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "0a58eebd8ec65ffdef2ce9562784123a73922052", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2111_23": { - "locked": { - "lastModified": 1658346836, - "narHash": "sha256-c9BZZbi0tqCQ4j6CMVDlsut3Q3ET1Fezf+qIslCfkhs=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a1fe662eb26ffc2a036b37c4670392ade632c413", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2111_24": { - "locked": { - "lastModified": 1648744337, - "narHash": "sha256-bYe1dFJAXovjqiaPKrmAbSBEK5KUkgwVaZcTbSoJ7hg=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "0a58eebd8ec65ffdef2ce9562784123a73922052", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2111_25": { - "locked": { - "lastModified": 1659375853, - "narHash": "sha256-aiMfO6U1w1u93vB+5qCHCQDZKgpJ7qs4GJOQvI3CN/4=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "511f6a5c3248f9019a41e70c1891484de2bc906c", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2111_26": { - "locked": { - "lastModified": 1648744337, - "narHash": "sha256-bYe1dFJAXovjqiaPKrmAbSBEK5KUkgwVaZcTbSoJ7hg=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "0a58eebd8ec65ffdef2ce9562784123a73922052", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2111_27": { - "locked": { - "lastModified": 1658346836, - "narHash": "sha256-c9BZZbi0tqCQ4j6CMVDlsut3Q3ET1Fezf+qIslCfkhs=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a1fe662eb26ffc2a036b37c4670392ade632c413", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2111_28": { - "locked": { - "lastModified": 1648744337, - "narHash": "sha256-bYe1dFJAXovjqiaPKrmAbSBEK5KUkgwVaZcTbSoJ7hg=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "0a58eebd8ec65ffdef2ce9562784123a73922052", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2111_29": { "locked": { "lastModified": 1659446231, "narHash": "sha256-hekabNdTdgR/iLsgce5TGWmfIDZ86qjPhxDg/8TlzhE=", @@ -8856,27 +5894,11 @@ }, "nixpkgs-2111_3": { "locked": { - "lastModified": 1658346836, - "narHash": "sha256-c9BZZbi0tqCQ4j6CMVDlsut3Q3ET1Fezf+qIslCfkhs=", + "lastModified": 1659446231, + "narHash": "sha256-hekabNdTdgR/iLsgce5TGWmfIDZ86qjPhxDg/8TlzhE=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "a1fe662eb26ffc2a036b37c4670392ade632c413", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2111_30": { - "locked": { - "lastModified": 1648744337, - "narHash": "sha256-bYe1dFJAXovjqiaPKrmAbSBEK5KUkgwVaZcTbSoJ7hg=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "0a58eebd8ec65ffdef2ce9562784123a73922052", + "rev": "eabc38219184cc3e04a974fe31857d8e0eac098d", "type": "github" }, "original": { @@ -8888,11 +5910,11 @@ }, "nixpkgs-2111_4": { "locked": { - "lastModified": 1648744337, - "narHash": "sha256-bYe1dFJAXovjqiaPKrmAbSBEK5KUkgwVaZcTbSoJ7hg=", + "lastModified": 1659446231, + "narHash": "sha256-hekabNdTdgR/iLsgce5TGWmfIDZ86qjPhxDg/8TlzhE=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "0a58eebd8ec65ffdef2ce9562784123a73922052", + "rev": "eabc38219184cc3e04a974fe31857d8e0eac098d", "type": "github" }, "original": { @@ -8904,11 +5926,11 @@ }, "nixpkgs-2111_5": { "locked": { - "lastModified": 1658346836, - "narHash": "sha256-c9BZZbi0tqCQ4j6CMVDlsut3Q3ET1Fezf+qIslCfkhs=", + "lastModified": 1659446231, + "narHash": "sha256-hekabNdTdgR/iLsgce5TGWmfIDZ86qjPhxDg/8TlzhE=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "a1fe662eb26ffc2a036b37c4670392ade632c413", + "rev": "eabc38219184cc3e04a974fe31857d8e0eac098d", "type": "github" }, "original": { @@ -8920,11 +5942,11 @@ }, "nixpkgs-2111_6": { "locked": { - "lastModified": 1648744337, - "narHash": "sha256-bYe1dFJAXovjqiaPKrmAbSBEK5KUkgwVaZcTbSoJ7hg=", + "lastModified": 1659446231, + "narHash": "sha256-hekabNdTdgR/iLsgce5TGWmfIDZ86qjPhxDg/8TlzhE=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "0a58eebd8ec65ffdef2ce9562784123a73922052", + "rev": "eabc38219184cc3e04a974fe31857d8e0eac098d", "type": "github" }, "original": { @@ -8935,38 +5957,6 @@ } }, "nixpkgs-2111_7": { - "locked": { - "lastModified": 1658346836, - "narHash": "sha256-c9BZZbi0tqCQ4j6CMVDlsut3Q3ET1Fezf+qIslCfkhs=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a1fe662eb26ffc2a036b37c4670392ade632c413", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2111_8": { - "locked": { - "lastModified": 1648744337, - "narHash": "sha256-bYe1dFJAXovjqiaPKrmAbSBEK5KUkgwVaZcTbSoJ7hg=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "0a58eebd8ec65ffdef2ce9562784123a73922052", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-21.11-darwin", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-2111_9": { "locked": { "lastModified": 1659446231, "narHash": "sha256-hekabNdTdgR/iLsgce5TGWmfIDZ86qjPhxDg/8TlzhE=", @@ -8984,513 +5974,302 @@ }, "nixpkgs-2205": { "locked": { - "lastModified": 1660033036, - "narHash": "sha256-GjwzXmdN5SVTT0RIZ11uDTQxaHLTLt9/AbBeIHNfidQ=", + "lastModified": 1663981975, + "narHash": "sha256-TKaxWAVJR+a5JJauKZqibmaM5e/Pi5tBDx9s8fl/kSE=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "490f6174c03132bf8f078d0f3a6e5890a47f9b30", + "rev": "309faedb8338d3ae8ad8f1043b3ccf48c9cc2970", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-22.05", + "ref": "nixpkgs-22.05-darwin", "repo": "nixpkgs", "type": "github" } }, "nixpkgs-2205_2": { "locked": { - "lastModified": 1660033036, - "narHash": "sha256-GjwzXmdN5SVTT0RIZ11uDTQxaHLTLt9/AbBeIHNfidQ=", + "lastModified": 1663981975, + "narHash": "sha256-TKaxWAVJR+a5JJauKZqibmaM5e/Pi5tBDx9s8fl/kSE=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "490f6174c03132bf8f078d0f3a6e5890a47f9b30", + "rev": "309faedb8338d3ae8ad8f1043b3ccf48c9cc2970", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-22.05", + "ref": "nixpkgs-22.05-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2205_3": { + "locked": { + "lastModified": 1663981975, + "narHash": "sha256-TKaxWAVJR+a5JJauKZqibmaM5e/Pi5tBDx9s8fl/kSE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "309faedb8338d3ae8ad8f1043b3ccf48c9cc2970", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-22.05-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2205_4": { + "locked": { + "lastModified": 1663981975, + "narHash": "sha256-TKaxWAVJR+a5JJauKZqibmaM5e/Pi5tBDx9s8fl/kSE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "309faedb8338d3ae8ad8f1043b3ccf48c9cc2970", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-22.05-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2205_5": { + "locked": { + "lastModified": 1663981975, + "narHash": "sha256-TKaxWAVJR+a5JJauKZqibmaM5e/Pi5tBDx9s8fl/kSE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "309faedb8338d3ae8ad8f1043b3ccf48c9cc2970", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-22.05-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2205_6": { + "locked": { + "lastModified": 1663981975, + "narHash": "sha256-TKaxWAVJR+a5JJauKZqibmaM5e/Pi5tBDx9s8fl/kSE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "309faedb8338d3ae8ad8f1043b3ccf48c9cc2970", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-22.05-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2205_7": { + "locked": { + "lastModified": 1663981975, + "narHash": "sha256-TKaxWAVJR+a5JJauKZqibmaM5e/Pi5tBDx9s8fl/kSE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "309faedb8338d3ae8ad8f1043b3ccf48c9cc2970", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-22.05-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2211": { + "locked": { + "lastModified": 1669997163, + "narHash": "sha256-vhjC0kZMFoN6jzK0GR+tBzKi5KgBXgehadfidW8+Va4=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "6f87491a54d8d64d30af6663cb3bf5d2ee7db958", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-22.11-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-2211_2": { + "locked": { + "lastModified": 1669997163, + "narHash": "sha256-vhjC0kZMFoN6jzK0GR+tBzKi5KgBXgehadfidW8+Va4=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "6f87491a54d8d64d30af6663cb3bf5d2ee7db958", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-22.11-darwin", "repo": "nixpkgs", "type": "github" } }, "nixpkgs-latest": { "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", + "lastModified": 1669639772, + "narHash": "sha256-eiy6Zr0omoRZCxn7WOffTeLSZzQGiGrKcN4ErmTqzow=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", + "rev": "a2494bf2042d605ca1c4a679401bdc4971da54fb", "type": "github" }, "original": { "owner": "NixOS", "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - } - }, - "nixpkgs-latest_10": { - "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - } - }, - "nixpkgs-latest_11": { - "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - } - }, - "nixpkgs-latest_12": { - "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - } - }, - "nixpkgs-latest_13": { - "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - } - }, - "nixpkgs-latest_14": { - "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - } - }, - "nixpkgs-latest_15": { - "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - } - }, - "nixpkgs-latest_16": { - "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - } - }, - "nixpkgs-latest_17": { - "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - } - }, - "nixpkgs-latest_18": { - "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - } - }, - "nixpkgs-latest_19": { - "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", + "rev": "a2494bf2042d605ca1c4a679401bdc4971da54fb", "type": "github" } }, "nixpkgs-latest_2": { "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", + "lastModified": 1673021095, + "narHash": "sha256-dNu+pgM1thYL1ME2zSW4PwEHDb37Kgv3S/HoBwErIAQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", + "rev": "0cac47c9cc840f2a68cf49a6da3ff2a657ad2e64", "type": "github" }, "original": { "owner": "NixOS", "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", "type": "github" } }, - "nixpkgs-latest_20": { + "nixpkgs-lib": { "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", + "dir": "lib", + "lastModified": 1672350804, + "narHash": "sha256-jo6zkiCabUBn3ObuKXHGqqORUMH27gYDIFFfLq5P4wg=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", + "rev": "677ed08a50931e38382dbef01cba08a8f7eac8f6", "type": "github" }, "original": { + "dir": "lib", "owner": "NixOS", + "ref": "nixos-unstable", "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", "type": "github" } }, - "nixpkgs-latest_21": { + "nixpkgs-lib_2": { "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", + "dir": "lib", + "lastModified": 1672350804, + "narHash": "sha256-jo6zkiCabUBn3ObuKXHGqqORUMH27gYDIFFfLq5P4wg=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", + "rev": "677ed08a50931e38382dbef01cba08a8f7eac8f6", "type": "github" }, "original": { + "dir": "lib", "owner": "NixOS", + "ref": "nixos-unstable", "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", "type": "github" } }, - "nixpkgs-latest_22": { + "nixpkgs-lib_3": { "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", + "dir": "lib", + "lastModified": 1678375444, + "narHash": "sha256-XIgHfGvjFvZQ8hrkfocanCDxMefc/77rXeHvYdzBMc8=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", + "rev": "130fa0baaa2b93ec45523fdcde942f6844ee9f6e", "type": "github" }, "original": { + "dir": "lib", "owner": "NixOS", + "ref": "nixos-unstable", "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", "type": "github" } }, - "nixpkgs-latest_23": { + "nixpkgs-lib_4": { "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", + "dir": "lib", + "lastModified": 1678375444, + "narHash": "sha256-XIgHfGvjFvZQ8hrkfocanCDxMefc/77rXeHvYdzBMc8=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", + "rev": "130fa0baaa2b93ec45523fdcde942f6844ee9f6e", "type": "github" }, "original": { + "dir": "lib", "owner": "NixOS", + "ref": "nixos-unstable", "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", "type": "github" } }, - "nixpkgs-latest_24": { + "nixpkgs-lib_5": { "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", + "dir": "lib", + "lastModified": 1665349835, + "narHash": "sha256-UK4urM3iN80UXQ7EaOappDzcisYIuEURFRoGQ/yPkug=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", + "rev": "34c5293a71ffdb2fe054eb5288adc1882c1eb0b1", "type": "github" }, "original": { + "dir": "lib", "owner": "NixOS", + "ref": "nixos-unstable", "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", "type": "github" } }, - "nixpkgs-latest_25": { + "nixpkgs-lib_6": { "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", + "dir": "lib", + "lastModified": 1678375444, + "narHash": "sha256-XIgHfGvjFvZQ8hrkfocanCDxMefc/77rXeHvYdzBMc8=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", + "rev": "130fa0baaa2b93ec45523fdcde942f6844ee9f6e", "type": "github" }, "original": { + "dir": "lib", "owner": "NixOS", + "ref": "nixos-unstable", "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", "type": "github" } }, - "nixpkgs-latest_26": { + "nixpkgs-lib_7": { "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", + "dir": "lib", + "lastModified": 1665349835, + "narHash": "sha256-UK4urM3iN80UXQ7EaOappDzcisYIuEURFRoGQ/yPkug=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", + "rev": "34c5293a71ffdb2fe054eb5288adc1882c1eb0b1", "type": "github" }, "original": { + "dir": "lib", "owner": "NixOS", + "ref": "nixos-unstable", "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - } - }, - "nixpkgs-latest_27": { - "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - } - }, - "nixpkgs-latest_28": { - "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - } - }, - "nixpkgs-latest_29": { - "locked": { - "lastModified": 1659622790, - "narHash": "sha256-fYelfx2ScXVprcivGPif+hi9cOZPt3/4wV5rC3AwZDs=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "cf63df0364f67848083ff75bc8ac9b7ca7aa5a01", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "cf63df0364f67848083ff75bc8ac9b7ca7aa5a01", - "type": "github" - } - }, - "nixpkgs-latest_3": { - "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - } - }, - "nixpkgs-latest_30": { - "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - } - }, - "nixpkgs-latest_4": { - "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - } - }, - "nixpkgs-latest_5": { - "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - } - }, - "nixpkgs-latest_6": { - "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - } - }, - "nixpkgs-latest_7": { - "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - } - }, - "nixpkgs-latest_8": { - "locked": { - "lastModified": 1653918805, - "narHash": "sha256-6ahwAnBNGgqSNSn/6RnsxrlFi+fkA+RyT6o/5S1915o=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a0a69be4b5ee63f1b5e75887a406e9194012b492", - "type": "github" - } - }, - "nixpkgs-latest_9": { - "locked": { - "lastModified": 1659622790, - "narHash": "sha256-fYelfx2ScXVprcivGPif+hi9cOZPt3/4wV5rC3AwZDs=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "cf63df0364f67848083ff75bc8ac9b7ca7aa5a01", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "cf63df0364f67848083ff75bc8ac9b7ca7aa5a01", "type": "github" } }, @@ -9509,96 +6288,6 @@ "type": "indirect" } }, - "nixpkgs-regression_10": { - "locked": { - "lastModified": 1643052045, - "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", - "type": "indirect" - } - }, - "nixpkgs-regression_11": { - "locked": { - "lastModified": 1643052045, - "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", - "type": "indirect" - } - }, - "nixpkgs-regression_12": { - "locked": { - "lastModified": 1643052045, - "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", - "type": "indirect" - } - }, - "nixpkgs-regression_13": { - "locked": { - "lastModified": 1643052045, - "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", - "type": "indirect" - } - }, - "nixpkgs-regression_14": { - "locked": { - "lastModified": 1643052045, - "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", - "type": "indirect" - } - }, - "nixpkgs-regression_15": { - "locked": { - "lastModified": 1643052045, - "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", - "type": "indirect" - } - }, "nixpkgs-regression_2": { "locked": { "lastModified": 1643052045, @@ -9689,139 +6378,61 @@ "type": "indirect" } }, - "nixpkgs-regression_8": { + "nixpkgs-stable": { "locked": { - "lastModified": 1643052045, - "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "lastModified": 1673800717, + "narHash": "sha256-SFHraUqLSu5cC6IxTprex/nTsI81ZQAtDvlBvGDWfnA=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "rev": "2f9fd351ec37f5d479556cd48be4ca340da59b8f", "type": "github" }, "original": { - "id": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", - "type": "indirect" + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" } }, - "nixpkgs-regression_9": { + "nixpkgs-stable_2": { "locked": { - "lastModified": 1643052045, - "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "lastModified": 1673800717, + "narHash": "sha256-SFHraUqLSu5cC6IxTprex/nTsI81ZQAtDvlBvGDWfnA=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "rev": "2f9fd351ec37f5d479556cd48be4ca340da59b8f", "type": "github" }, "original": { - "id": "nixpkgs", - "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", - "type": "indirect" + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-stable_3": { + "locked": { + "lastModified": 1673800717, + "narHash": "sha256-SFHraUqLSu5cC6IxTprex/nTsI81ZQAtDvlBvGDWfnA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "2f9fd351ec37f5d479556cd48be4ca340da59b8f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" } }, "nixpkgs-unstable": { "locked": { - "lastModified": 1648219316, - "narHash": "sha256-Ctij+dOi0ZZIfX5eMhgwugfvB+WZSrvVNAyAuANOsnQ=", + "lastModified": 1663905476, + "narHash": "sha256-0CSwRKaYravh9v6qSlBpM0gNg0UhKT2lL7Yn6Zbx7UM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "30d3d79b7d3607d56546dd2a6b49e156ba0ec634", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-unstable_10": { - "locked": { - "lastModified": 1648219316, - "narHash": "sha256-Ctij+dOi0ZZIfX5eMhgwugfvB+WZSrvVNAyAuANOsnQ=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "30d3d79b7d3607d56546dd2a6b49e156ba0ec634", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-unstable_11": { - "locked": { - "lastModified": 1648219316, - "narHash": "sha256-Ctij+dOi0ZZIfX5eMhgwugfvB+WZSrvVNAyAuANOsnQ=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "30d3d79b7d3607d56546dd2a6b49e156ba0ec634", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-unstable_12": { - "locked": { - "lastModified": 1648219316, - "narHash": "sha256-Ctij+dOi0ZZIfX5eMhgwugfvB+WZSrvVNAyAuANOsnQ=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "30d3d79b7d3607d56546dd2a6b49e156ba0ec634", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-unstable_13": { - "locked": { - "lastModified": 1648219316, - "narHash": "sha256-Ctij+dOi0ZZIfX5eMhgwugfvB+WZSrvVNAyAuANOsnQ=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "30d3d79b7d3607d56546dd2a6b49e156ba0ec634", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-unstable_14": { - "locked": { - "lastModified": 1648219316, - "narHash": "sha256-Ctij+dOi0ZZIfX5eMhgwugfvB+WZSrvVNAyAuANOsnQ=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "30d3d79b7d3607d56546dd2a6b49e156ba0ec634", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-unstable_15": { - "locked": { - "lastModified": 1648219316, - "narHash": "sha256-Ctij+dOi0ZZIfX5eMhgwugfvB+WZSrvVNAyAuANOsnQ=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "30d3d79b7d3607d56546dd2a6b49e156ba0ec634", + "rev": "e14f9fb57315f0d4abde222364f19f88c77d2b79", "type": "github" }, "original": { @@ -9833,11 +6444,11 @@ }, "nixpkgs-unstable_2": { "locked": { - "lastModified": 1648219316, - "narHash": "sha256-Ctij+dOi0ZZIfX5eMhgwugfvB+WZSrvVNAyAuANOsnQ=", + "lastModified": 1663905476, + "narHash": "sha256-0CSwRKaYravh9v6qSlBpM0gNg0UhKT2lL7Yn6Zbx7UM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "30d3d79b7d3607d56546dd2a6b49e156ba0ec634", + "rev": "e14f9fb57315f0d4abde222364f19f88c77d2b79", "type": "github" }, "original": { @@ -9849,11 +6460,11 @@ }, "nixpkgs-unstable_3": { "locked": { - "lastModified": 1648219316, - "narHash": "sha256-Ctij+dOi0ZZIfX5eMhgwugfvB+WZSrvVNAyAuANOsnQ=", + "lastModified": 1663905476, + "narHash": "sha256-0CSwRKaYravh9v6qSlBpM0gNg0UhKT2lL7Yn6Zbx7UM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "30d3d79b7d3607d56546dd2a6b49e156ba0ec634", + "rev": "e14f9fb57315f0d4abde222364f19f88c77d2b79", "type": "github" }, "original": { @@ -9865,11 +6476,11 @@ }, "nixpkgs-unstable_4": { "locked": { - "lastModified": 1648219316, - "narHash": "sha256-Ctij+dOi0ZZIfX5eMhgwugfvB+WZSrvVNAyAuANOsnQ=", + "lastModified": 1663905476, + "narHash": "sha256-0CSwRKaYravh9v6qSlBpM0gNg0UhKT2lL7Yn6Zbx7UM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "30d3d79b7d3607d56546dd2a6b49e156ba0ec634", + "rev": "e14f9fb57315f0d4abde222364f19f88c77d2b79", "type": "github" }, "original": { @@ -9881,11 +6492,11 @@ }, "nixpkgs-unstable_5": { "locked": { - "lastModified": 1648219316, - "narHash": "sha256-Ctij+dOi0ZZIfX5eMhgwugfvB+WZSrvVNAyAuANOsnQ=", + "lastModified": 1663905476, + "narHash": "sha256-0CSwRKaYravh9v6qSlBpM0gNg0UhKT2lL7Yn6Zbx7UM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "30d3d79b7d3607d56546dd2a6b49e156ba0ec634", + "rev": "e14f9fb57315f0d4abde222364f19f88c77d2b79", "type": "github" }, "original": { @@ -9897,11 +6508,11 @@ }, "nixpkgs-unstable_6": { "locked": { - "lastModified": 1648219316, - "narHash": "sha256-Ctij+dOi0ZZIfX5eMhgwugfvB+WZSrvVNAyAuANOsnQ=", + "lastModified": 1663905476, + "narHash": "sha256-0CSwRKaYravh9v6qSlBpM0gNg0UhKT2lL7Yn6Zbx7UM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "30d3d79b7d3607d56546dd2a6b49e156ba0ec634", + "rev": "e14f9fb57315f0d4abde222364f19f88c77d2b79", "type": "github" }, "original": { @@ -9913,43 +6524,11 @@ }, "nixpkgs-unstable_7": { "locked": { - "lastModified": 1648219316, - "narHash": "sha256-Ctij+dOi0ZZIfX5eMhgwugfvB+WZSrvVNAyAuANOsnQ=", + "lastModified": 1663905476, + "narHash": "sha256-0CSwRKaYravh9v6qSlBpM0gNg0UhKT2lL7Yn6Zbx7UM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "30d3d79b7d3607d56546dd2a6b49e156ba0ec634", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-unstable_8": { - "locked": { - "lastModified": 1648219316, - "narHash": "sha256-Ctij+dOi0ZZIfX5eMhgwugfvB+WZSrvVNAyAuANOsnQ=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "30d3d79b7d3607d56546dd2a6b49e156ba0ec634", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-unstable_9": { - "locked": { - "lastModified": 1648219316, - "narHash": "sha256-Ctij+dOi0ZZIfX5eMhgwugfvB+WZSrvVNAyAuANOsnQ=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "30d3d79b7d3607d56546dd2a6b49e156ba0ec634", + "rev": "e14f9fb57315f0d4abde222364f19f88c77d2b79", "type": "github" }, "original": { @@ -9961,19 +6540,37 @@ }, "nixpkgs_10": { "locked": { - "lastModified": 1657292830, - "narHash": "sha256-ldfVSTveWceDCmW6gf3B4kR6vwmz/XS80y5wsLLHFJU=", - "owner": "NixOS", + "lastModified": 1665087388, + "narHash": "sha256-FZFPuW9NWHJteATOf79rZfwfRn5fE0wi9kRzvGfDHPA=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "334ec8b503c3981e37a04b817a70e8d026ea9e84", + "rev": "95fda953f6db2e9496d2682c4fc7b82f959878f7", "type": "github" }, "original": { - "id": "nixpkgs", - "type": "indirect" + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" } }, "nixpkgs_11": { + "locked": { + "lastModified": 1670841420, + "narHash": "sha256-mSEia1FzrsHbfqjorMyYiX8NXdDVeR1Pw1k55jMJlJY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "33e0d99cbedf2acfd7340d2150837fbb28039a64", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_12": { "locked": { "lastModified": 1632864508, "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", @@ -9988,75 +6585,28 @@ "type": "indirect" } }, - "nixpkgs_12": { - "locked": { - "lastModified": 1647297614, - "narHash": "sha256-ulGq3W5XsrBMU/u5k9d4oPy65pQTkunR4HKKtTq0RwY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "73ad5f9e147c0d2a2061f1d4bd91e05078dc0b58", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, "nixpkgs_13": { - "flake": false, "locked": { - "lastModified": 1645493675, - "narHash": "sha256-9xundbZQbhFodsQRh6QMN1GeSXfo3y/5NL0CZcJULz0=", + "lastModified": 1663905476, + "narHash": "sha256-0CSwRKaYravh9v6qSlBpM0gNg0UhKT2lL7Yn6Zbx7UM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "74b10859829153d5c5d50f7c77b86763759e8654", + "rev": "e14f9fb57315f0d4abde222364f19f88c77d2b79", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, "nixpkgs_14": { "locked": { - "lastModified": 1657292830, - "narHash": "sha256-ldfVSTveWceDCmW6gf3B4kR6vwmz/XS80y5wsLLHFJU=", + "lastModified": 1653581809, + "narHash": "sha256-Uvka0V5MTGbeOfWte25+tfRL3moECDh1VwokWSZUdoY=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "334ec8b503c3981e37a04b817a70e8d026ea9e84", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "type": "indirect" - } - }, - "nixpkgs_15": { - "locked": { - "lastModified": 1632864508, - "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "ref": "nixos-21.05-small", - "type": "indirect" - } - }, - "nixpkgs_16": { - "locked": { - "lastModified": 1647297614, - "narHash": "sha256-ulGq3W5XsrBMU/u5k9d4oPy65pQTkunR4HKKtTq0RwY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "73ad5f9e147c0d2a2061f1d4bd91e05078dc0b58", + "rev": "83658b28fe638a170a19b8933aa008b30640fbd1", "type": "github" }, "original": { @@ -10066,23 +6616,53 @@ "type": "github" } }, - "nixpkgs_17": { - "flake": false, + "nixpkgs_15": { "locked": { - "lastModified": 1645493675, - "narHash": "sha256-9xundbZQbhFodsQRh6QMN1GeSXfo3y/5NL0CZcJULz0=", + "lastModified": 1654807842, + "narHash": "sha256-ADymZpr6LuTEBXcy6RtFHcUZdjKTBRTMYwu19WOx17E=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "74b10859829153d5c5d50f7c77b86763759e8654", + "rev": "fc909087cc3386955f21b4665731dbdaceefb1d8", "type": "github" }, "original": { "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_16": { + "locked": { + "lastModified": 1665087388, + "narHash": "sha256-FZFPuW9NWHJteATOf79rZfwfRn5fE0wi9kRzvGfDHPA=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "95fda953f6db2e9496d2682c4fc7b82f959878f7", + "type": "github" + }, + "original": { + "owner": "nixos", "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, + "nixpkgs_17": { + "locked": { + "lastModified": 1671271357, + "narHash": "sha256-xRJdLbWK4v2SewmSStYrcLa0YGJpleufl44A19XSW8k=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "40f79f003b6377bd2f4ed4027dde1f8f922995dd", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "nixpkgs_18": { "locked": { "lastModified": 1632864508, @@ -10100,11 +6680,11 @@ }, "nixpkgs_19": { "locked": { - "lastModified": 1647297614, - "narHash": "sha256-ulGq3W5XsrBMU/u5k9d4oPy65pQTkunR4HKKtTq0RwY=", + "lastModified": 1653581809, + "narHash": "sha256-Uvka0V5MTGbeOfWte25+tfRL3moECDh1VwokWSZUdoY=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "73ad5f9e147c0d2a2061f1d4bd91e05078dc0b58", + "rev": "83658b28fe638a170a19b8933aa008b30640fbd1", "type": "github" }, "original": { @@ -10116,42 +6696,58 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1657292830, - "narHash": "sha256-ldfVSTveWceDCmW6gf3B4kR6vwmz/XS80y5wsLLHFJU=", + "lastModified": 1653581809, + "narHash": "sha256-Uvka0V5MTGbeOfWte25+tfRL3moECDh1VwokWSZUdoY=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "334ec8b503c3981e37a04b817a70e8d026ea9e84", + "rev": "83658b28fe638a170a19b8933aa008b30640fbd1", "type": "github" }, "original": { - "id": "nixpkgs", - "type": "indirect" + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" } }, "nixpkgs_20": { - "flake": false, "locked": { - "lastModified": 1645493675, - "narHash": "sha256-9xundbZQbhFodsQRh6QMN1GeSXfo3y/5NL0CZcJULz0=", + "lastModified": 1654807842, + "narHash": "sha256-ADymZpr6LuTEBXcy6RtFHcUZdjKTBRTMYwu19WOx17E=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "74b10859829153d5c5d50f7c77b86763759e8654", + "rev": "fc909087cc3386955f21b4665731dbdaceefb1d8", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, "nixpkgs_21": { "locked": { - "lastModified": 1657292830, - "narHash": "sha256-ldfVSTveWceDCmW6gf3B4kR6vwmz/XS80y5wsLLHFJU=", + "lastModified": 1665087388, + "narHash": "sha256-FZFPuW9NWHJteATOf79rZfwfRn5fE0wi9kRzvGfDHPA=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "95fda953f6db2e9496d2682c4fc7b82f959878f7", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_22": { + "locked": { + "lastModified": 1667292599, + "narHash": "sha256-7ISOUI1aj6UKMPIL+wwthENL22L3+A9V+jS8Is3QsRo=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "334ec8b503c3981e37a04b817a70e8d026ea9e84", + "rev": "ef2f213d9659a274985778bff4ca322f3ef3ac68", "type": "github" }, "original": { @@ -10159,7 +6755,7 @@ "type": "indirect" } }, - "nixpkgs_22": { + "nixpkgs_23": { "locked": { "lastModified": 1632864508, "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", @@ -10174,13 +6770,13 @@ "type": "indirect" } }, - "nixpkgs_23": { + "nixpkgs_24": { "locked": { - "lastModified": 1647297614, - "narHash": "sha256-ulGq3W5XsrBMU/u5k9d4oPy65pQTkunR4HKKtTq0RwY=", + "lastModified": 1653581809, + "narHash": "sha256-Uvka0V5MTGbeOfWte25+tfRL3moECDh1VwokWSZUdoY=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "73ad5f9e147c0d2a2061f1d4bd91e05078dc0b58", + "rev": "83658b28fe638a170a19b8933aa008b30640fbd1", "type": "github" }, "original": { @@ -10190,38 +6786,38 @@ "type": "github" } }, - "nixpkgs_24": { - "flake": false, - "locked": { - "lastModified": 1645493675, - "narHash": "sha256-9xundbZQbhFodsQRh6QMN1GeSXfo3y/5NL0CZcJULz0=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "74b10859829153d5c5d50f7c77b86763759e8654", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, "nixpkgs_25": { "locked": { - "lastModified": 1657292830, - "narHash": "sha256-ldfVSTveWceDCmW6gf3B4kR6vwmz/XS80y5wsLLHFJU=", + "lastModified": 1654807842, + "narHash": "sha256-ADymZpr6LuTEBXcy6RtFHcUZdjKTBRTMYwu19WOx17E=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "334ec8b503c3981e37a04b817a70e8d026ea9e84", + "rev": "fc909087cc3386955f21b4665731dbdaceefb1d8", "type": "github" }, "original": { - "id": "nixpkgs", - "type": "indirect" + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" } }, "nixpkgs_26": { + "locked": { + "lastModified": 1665087388, + "narHash": "sha256-FZFPuW9NWHJteATOf79rZfwfRn5fE0wi9kRzvGfDHPA=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "95fda953f6db2e9496d2682c4fc7b82f959878f7", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_27": { "locked": { "lastModified": 1632864508, "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", @@ -10236,13 +6832,13 @@ "type": "indirect" } }, - "nixpkgs_27": { + "nixpkgs_28": { "locked": { - "lastModified": 1647297614, - "narHash": "sha256-ulGq3W5XsrBMU/u5k9d4oPy65pQTkunR4HKKtTq0RwY=", + "lastModified": 1653581809, + "narHash": "sha256-Uvka0V5MTGbeOfWte25+tfRL3moECDh1VwokWSZUdoY=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "73ad5f9e147c0d2a2061f1d4bd91e05078dc0b58", + "rev": "83658b28fe638a170a19b8933aa008b30640fbd1", "type": "github" }, "original": { @@ -10252,74 +6848,59 @@ "type": "github" } }, - "nixpkgs_28": { - "flake": false, + "nixpkgs_29": { "locked": { - "lastModified": 1645493675, - "narHash": "sha256-9xundbZQbhFodsQRh6QMN1GeSXfo3y/5NL0CZcJULz0=", + "lastModified": 1654807842, + "narHash": "sha256-ADymZpr6LuTEBXcy6RtFHcUZdjKTBRTMYwu19WOx17E=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "74b10859829153d5c5d50f7c77b86763759e8654", + "rev": "fc909087cc3386955f21b4665731dbdaceefb1d8", "type": "github" }, "original": { "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1654807842, + "narHash": "sha256-ADymZpr6LuTEBXcy6RtFHcUZdjKTBRTMYwu19WOx17E=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "fc909087cc3386955f21b4665731dbdaceefb1d8", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_30": { + "locked": { + "lastModified": 1665087388, + "narHash": "sha256-FZFPuW9NWHJteATOf79rZfwfRn5fE0wi9kRzvGfDHPA=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "95fda953f6db2e9496d2682c4fc7b82f959878f7", + "type": "github" + }, + "original": { + "owner": "nixos", "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs_29": { - "locked": { - "lastModified": 1657292830, - "narHash": "sha256-ldfVSTveWceDCmW6gf3B4kR6vwmz/XS80y5wsLLHFJU=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "334ec8b503c3981e37a04b817a70e8d026ea9e84", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "type": "indirect" - } - }, - "nixpkgs_3": { - "locked": { - "lastModified": 1632864508, - "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "ref": "nixos-21.05-small", - "type": "indirect" - } - }, - "nixpkgs_30": { - "locked": { - "lastModified": 1632864508, - "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "ref": "nixos-21.05-small", - "type": "indirect" - } - }, "nixpkgs_31": { "locked": { - "lastModified": 1647297614, - "narHash": "sha256-ulGq3W5XsrBMU/u5k9d4oPy65pQTkunR4HKKtTq0RwY=", + "lastModified": 1670841420, + "narHash": "sha256-mSEia1FzrsHbfqjorMyYiX8NXdDVeR1Pw1k55jMJlJY=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "73ad5f9e147c0d2a2061f1d4bd91e05078dc0b58", + "rev": "33e0d99cbedf2acfd7340d2150837fbb28039a64", "type": "github" }, "original": { @@ -10330,51 +6911,6 @@ } }, "nixpkgs_32": { - "flake": false, - "locked": { - "lastModified": 1645493675, - "narHash": "sha256-9xundbZQbhFodsQRh6QMN1GeSXfo3y/5NL0CZcJULz0=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "74b10859829153d5c5d50f7c77b86763759e8654", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_33": { - "locked": { - "lastModified": 1657292830, - "narHash": "sha256-ldfVSTveWceDCmW6gf3B4kR6vwmz/XS80y5wsLLHFJU=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "334ec8b503c3981e37a04b817a70e8d026ea9e84", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "type": "indirect" - } - }, - "nixpkgs_34": { - "locked": { - "lastModified": 1657292830, - "narHash": "sha256-ldfVSTveWceDCmW6gf3B4kR6vwmz/XS80y5wsLLHFJU=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "334ec8b503c3981e37a04b817a70e8d026ea9e84", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "type": "indirect" - } - }, - "nixpkgs_35": { "locked": { "lastModified": 1632864508, "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", @@ -10389,13 +6925,28 @@ "type": "indirect" } }, - "nixpkgs_36": { + "nixpkgs_33": { "locked": { - "lastModified": 1647297614, - "narHash": "sha256-ulGq3W5XsrBMU/u5k9d4oPy65pQTkunR4HKKtTq0RwY=", + "lastModified": 1663905476, + "narHash": "sha256-0CSwRKaYravh9v6qSlBpM0gNg0UhKT2lL7Yn6Zbx7UM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "73ad5f9e147c0d2a2061f1d4bd91e05078dc0b58", + "rev": "e14f9fb57315f0d4abde222364f19f88c77d2b79", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_34": { + "locked": { + "lastModified": 1653581809, + "narHash": "sha256-Uvka0V5MTGbeOfWte25+tfRL3moECDh1VwokWSZUdoY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "83658b28fe638a170a19b8933aa008b30640fbd1", "type": "github" }, "original": { @@ -10405,388 +6956,76 @@ "type": "github" } }, + "nixpkgs_35": { + "locked": { + "lastModified": 1654807842, + "narHash": "sha256-ADymZpr6LuTEBXcy6RtFHcUZdjKTBRTMYwu19WOx17E=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "fc909087cc3386955f21b4665731dbdaceefb1d8", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_36": { + "locked": { + "lastModified": 1665087388, + "narHash": "sha256-FZFPuW9NWHJteATOf79rZfwfRn5fE0wi9kRzvGfDHPA=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "95fda953f6db2e9496d2682c4fc7b82f959878f7", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "nixpkgs_37": { - "flake": false, "locked": { - "lastModified": 1645493675, - "narHash": "sha256-9xundbZQbhFodsQRh6QMN1GeSXfo3y/5NL0CZcJULz0=", + "lastModified": 1671271357, + "narHash": "sha256-xRJdLbWK4v2SewmSStYrcLa0YGJpleufl44A19XSW8k=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "74b10859829153d5c5d50f7c77b86763759e8654", + "rev": "40f79f003b6377bd2f4ed4027dde1f8f922995dd", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-unstable", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs_38": { - "locked": { - "lastModified": 1657292830, - "narHash": "sha256-ldfVSTveWceDCmW6gf3B4kR6vwmz/XS80y5wsLLHFJU=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "334ec8b503c3981e37a04b817a70e8d026ea9e84", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "type": "indirect" - } - }, - "nixpkgs_39": { - "locked": { - "lastModified": 1632864508, - "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "ref": "nixos-21.05-small", - "type": "indirect" - } - }, "nixpkgs_4": { "locked": { - "lastModified": 1647297614, - "narHash": "sha256-ulGq3W5XsrBMU/u5k9d4oPy65pQTkunR4HKKtTq0RwY=", - "owner": "NixOS", + "lastModified": 1665087388, + "narHash": "sha256-FZFPuW9NWHJteATOf79rZfwfRn5fE0wi9kRzvGfDHPA=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "73ad5f9e147c0d2a2061f1d4bd91e05078dc0b58", + "rev": "95fda953f6db2e9496d2682c4fc7b82f959878f7", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_40": { - "locked": { - "lastModified": 1647297614, - "narHash": "sha256-ulGq3W5XsrBMU/u5k9d4oPy65pQTkunR4HKKtTq0RwY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "73ad5f9e147c0d2a2061f1d4bd91e05078dc0b58", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_41": { - "flake": false, - "locked": { - "lastModified": 1645493675, - "narHash": "sha256-9xundbZQbhFodsQRh6QMN1GeSXfo3y/5NL0CZcJULz0=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "74b10859829153d5c5d50f7c77b86763759e8654", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_42": { - "locked": { - "lastModified": 1657292830, - "narHash": "sha256-ldfVSTveWceDCmW6gf3B4kR6vwmz/XS80y5wsLLHFJU=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "334ec8b503c3981e37a04b817a70e8d026ea9e84", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "type": "indirect" - } - }, - "nixpkgs_43": { - "locked": { - "lastModified": 1632864508, - "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "ref": "nixos-21.05-small", - "type": "indirect" - } - }, - "nixpkgs_44": { - "locked": { - "lastModified": 1647297614, - "narHash": "sha256-ulGq3W5XsrBMU/u5k9d4oPy65pQTkunR4HKKtTq0RwY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "73ad5f9e147c0d2a2061f1d4bd91e05078dc0b58", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_45": { - "flake": false, - "locked": { - "lastModified": 1645493675, - "narHash": "sha256-9xundbZQbhFodsQRh6QMN1GeSXfo3y/5NL0CZcJULz0=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "74b10859829153d5c5d50f7c77b86763759e8654", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_46": { - "locked": { - "lastModified": 1657292830, - "narHash": "sha256-ldfVSTveWceDCmW6gf3B4kR6vwmz/XS80y5wsLLHFJU=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "334ec8b503c3981e37a04b817a70e8d026ea9e84", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "type": "indirect" - } - }, - "nixpkgs_47": { - "locked": { - "lastModified": 1632864508, - "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "ref": "nixos-21.05-small", - "type": "indirect" - } - }, - "nixpkgs_48": { - "locked": { - "lastModified": 1647297614, - "narHash": "sha256-ulGq3W5XsrBMU/u5k9d4oPy65pQTkunR4HKKtTq0RwY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "73ad5f9e147c0d2a2061f1d4bd91e05078dc0b58", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_49": { - "flake": false, - "locked": { - "lastModified": 1645493675, - "narHash": "sha256-9xundbZQbhFodsQRh6QMN1GeSXfo3y/5NL0CZcJULz0=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "74b10859829153d5c5d50f7c77b86763759e8654", - "type": "github" - }, - "original": { - "owner": "NixOS", + "owner": "nixos", "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, "nixpkgs_5": { - "flake": false, "locked": { - "lastModified": 1645493675, - "narHash": "sha256-9xundbZQbhFodsQRh6QMN1GeSXfo3y/5NL0CZcJULz0=", + "lastModified": 1678293141, + "narHash": "sha256-lLlQHaR0y+q6nd6kfpydPTGHhl1rS9nU9OQmztzKOYs=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "74b10859829153d5c5d50f7c77b86763759e8654", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_50": { - "locked": { - "lastModified": 1632864508, - "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "ref": "nixos-21.05-small", - "type": "indirect" - } - }, - "nixpkgs_51": { - "locked": { - "lastModified": 1647297614, - "narHash": "sha256-ulGq3W5XsrBMU/u5k9d4oPy65pQTkunR4HKKtTq0RwY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "73ad5f9e147c0d2a2061f1d4bd91e05078dc0b58", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_52": { - "flake": false, - "locked": { - "lastModified": 1645493675, - "narHash": "sha256-9xundbZQbhFodsQRh6QMN1GeSXfo3y/5NL0CZcJULz0=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "74b10859829153d5c5d50f7c77b86763759e8654", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_53": { - "locked": { - "lastModified": 1657292830, - "narHash": "sha256-ldfVSTveWceDCmW6gf3B4kR6vwmz/XS80y5wsLLHFJU=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "334ec8b503c3981e37a04b817a70e8d026ea9e84", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "type": "indirect" - } - }, - "nixpkgs_54": { - "locked": { - "lastModified": 1632864508, - "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "ref": "nixos-21.05-small", - "type": "indirect" - } - }, - "nixpkgs_55": { - "locked": { - "lastModified": 1647297614, - "narHash": "sha256-ulGq3W5XsrBMU/u5k9d4oPy65pQTkunR4HKKtTq0RwY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "73ad5f9e147c0d2a2061f1d4bd91e05078dc0b58", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_56": { - "flake": false, - "locked": { - "lastModified": 1645493675, - "narHash": "sha256-9xundbZQbhFodsQRh6QMN1GeSXfo3y/5NL0CZcJULz0=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "74b10859829153d5c5d50f7c77b86763759e8654", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_57": { - "locked": { - "lastModified": 1657292830, - "narHash": "sha256-ldfVSTveWceDCmW6gf3B4kR6vwmz/XS80y5wsLLHFJU=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "334ec8b503c3981e37a04b817a70e8d026ea9e84", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "type": "indirect" - } - }, - "nixpkgs_58": { - "locked": { - "lastModified": 1632864508, - "narHash": "sha256-d127FIvGR41XbVRDPVvozUPQ/uRHbHwvfyKHwEt5xFM=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "82891b5e2c2359d7e58d08849e4c89511ab94234", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "ref": "nixos-21.05-small", - "type": "indirect" - } - }, - "nixpkgs_59": { - "locked": { - "lastModified": 1647297614, - "narHash": "sha256-ulGq3W5XsrBMU/u5k9d4oPy65pQTkunR4HKKtTq0RwY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "73ad5f9e147c0d2a2061f1d4bd91e05078dc0b58", + "rev": "c90c4025bb6e0c4eaf438128a3b2640314b1c58d", "type": "github" }, "original": { @@ -10798,31 +7037,15 @@ }, "nixpkgs_6": { "locked": { - "lastModified": 1657292830, - "narHash": "sha256-ldfVSTveWceDCmW6gf3B4kR6vwmz/XS80y5wsLLHFJU=", + "lastModified": 1678891326, + "narHash": "sha256-cjgrjKx7y+hO9I8O2b6QvBaTt9w7Xhk/5hsnJYTUb2I=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "334ec8b503c3981e37a04b817a70e8d026ea9e84", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "type": "indirect" - } - }, - "nixpkgs_60": { - "flake": false, - "locked": { - "lastModified": 1645493675, - "narHash": "sha256-9xundbZQbhFodsQRh6QMN1GeSXfo3y/5NL0CZcJULz0=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "74b10859829153d5c5d50f7c77b86763759e8654", + "rev": "1544ef240132d4357d9a39a40c8e6afd1678b052", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } @@ -10844,11 +7067,11 @@ }, "nixpkgs_8": { "locked": { - "lastModified": 1647297614, - "narHash": "sha256-ulGq3W5XsrBMU/u5k9d4oPy65pQTkunR4HKKtTq0RwY=", + "lastModified": 1653581809, + "narHash": "sha256-Uvka0V5MTGbeOfWte25+tfRL3moECDh1VwokWSZUdoY=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "73ad5f9e147c0d2a2061f1d4bd91e05078dc0b58", + "rev": "83658b28fe638a170a19b8933aa008b30640fbd1", "type": "github" }, "original": { @@ -10859,18 +7082,16 @@ } }, "nixpkgs_9": { - "flake": false, "locked": { - "lastModified": 1645493675, - "narHash": "sha256-9xundbZQbhFodsQRh6QMN1GeSXfo3y/5NL0CZcJULz0=", + "lastModified": 1654807842, + "narHash": "sha256-ADymZpr6LuTEBXcy6RtFHcUZdjKTBRTMYwu19WOx17E=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "74b10859829153d5c5d50f7c77b86763759e8654", + "rev": "fc909087cc3386955f21b4665731dbdaceefb1d8", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } @@ -10892,108 +7113,6 @@ "type": "github" } }, - "old-ghc-nix_10": { - "flake": false, - "locked": { - "lastModified": 1631092763, - "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", - "owner": "angerman", - "repo": "old-ghc-nix", - "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", - "type": "github" - }, - "original": { - "owner": "angerman", - "ref": "master", - "repo": "old-ghc-nix", - "type": "github" - } - }, - "old-ghc-nix_11": { - "flake": false, - "locked": { - "lastModified": 1631092763, - "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", - "owner": "angerman", - "repo": "old-ghc-nix", - "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", - "type": "github" - }, - "original": { - "owner": "angerman", - "ref": "master", - "repo": "old-ghc-nix", - "type": "github" - } - }, - "old-ghc-nix_12": { - "flake": false, - "locked": { - "lastModified": 1631092763, - "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", - "owner": "angerman", - "repo": "old-ghc-nix", - "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", - "type": "github" - }, - "original": { - "owner": "angerman", - "ref": "master", - "repo": "old-ghc-nix", - "type": "github" - } - }, - "old-ghc-nix_13": { - "flake": false, - "locked": { - "lastModified": 1631092763, - "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", - "owner": "angerman", - "repo": "old-ghc-nix", - "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", - "type": "github" - }, - "original": { - "owner": "angerman", - "ref": "master", - "repo": "old-ghc-nix", - "type": "github" - } - }, - "old-ghc-nix_14": { - "flake": false, - "locked": { - "lastModified": 1631092763, - "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", - "owner": "angerman", - "repo": "old-ghc-nix", - "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", - "type": "github" - }, - "original": { - "owner": "angerman", - "ref": "master", - "repo": "old-ghc-nix", - "type": "github" - } - }, - "old-ghc-nix_15": { - "flake": false, - "locked": { - "lastModified": 1631092763, - "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", - "owner": "angerman", - "repo": "old-ghc-nix", - "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", - "type": "github" - }, - "original": { - "owner": "angerman", - "ref": "master", - "repo": "old-ghc-nix", - "type": "github" - } - }, "old-ghc-nix_2": { "flake": false, "locked": { @@ -11096,1495 +7215,64 @@ "type": "github" } }, - "old-ghc-nix_8": { - "flake": false, - "locked": { - "lastModified": 1631092763, - "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", - "owner": "angerman", - "repo": "old-ghc-nix", - "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", - "type": "github" - }, - "original": { - "owner": "angerman", - "ref": "master", - "repo": "old-ghc-nix", - "type": "github" - } - }, - "old-ghc-nix_9": { - "flake": false, - "locked": { - "lastModified": 1631092763, - "narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=", - "owner": "angerman", - "repo": "old-ghc-nix", - "rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8", - "type": "github" - }, - "original": { - "owner": "angerman", - "ref": "master", - "repo": "old-ghc-nix", - "type": "github" - } - }, "plutarch": { "inputs": { - "cardano-base": "cardano-base", - "cardano-crypto": "cardano-crypto", - "cardano-prelude": "cardano-prelude", - "emanote": [ - "liqwid-plutarch-extra", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "flat": "flat", - "haskell-language-server": "haskell-language-server", - "haskell-nix": "haskell-nix", - "haskell-nix-extra-hackage": "haskell-nix-extra-hackage", - "hercules-ci-effects": "hercules-ci-effects", - "iohk-nix": "iohk-nix", - "nixpkgs": [ - "liqwid-plutarch-extra", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-latest": "nixpkgs-latest_2", - "plutus": "plutus", - "protolude": "protolude", - "secp256k1-haskell": "secp256k1-haskell" + "tooling": "tooling" }, "locked": { - "lastModified": 1659381657, - "narHash": "sha256-W0EWY0DV2idbIeqtJnShVHQ83exME8TK2GYQGbVpz8A=", + "lastModified": 1675976388, + "narHash": "sha256-+LdMi2zKoRR12hifT8fck/+VpTzS4rOrlQN6pg8xhsU=", "owner": "Plutonomicon", "repo": "plutarch-plutus", - "rev": "45b7c77a9ee9bd6c7dc25ddebcc3d12c58c4c3a2", + "rev": "d3df05ce67d8b5a3d2ca851a6e5a1b8ff8cb358f", "type": "github" }, "original": { "owner": "Plutonomicon", - "ref": "staging", - "repo": "plutarch-plutus", - "type": "github" - } - }, - "plutarch-context-builder": { - "inputs": { - "haskell-language-server": [ - "liqwid-plutarch-extra", - "plutarch-context-builder", - "plutarch", - "haskell-language-server" - ], - "haskell-nix": [ - "liqwid-plutarch-extra", - "plutarch-context-builder", - "plutarch", - "haskell-nix" - ], - "haskell-nix-extra-hackage": [ - "liqwid-plutarch-extra", - "plutarch-context-builder", - "plutarch", - "haskell-nix-extra-hackage" - ], - "iohk-nix": [ - "liqwid-plutarch-extra", - "plutarch-context-builder", - "plutarch", - "iohk-nix" - ], - "liqwid-nix": "liqwid-nix_3", - "nixpkgs": [ - "liqwid-plutarch-extra", - "plutarch-context-builder", - "plutarch", - "nixpkgs" - ], - "nixpkgs-2111": "nixpkgs-2111_3", - "nixpkgs-latest": "nixpkgs-latest_3", - "plutarch": "plutarch_2" - }, - "locked": { - "lastModified": 1659452596, - "narHash": "sha256-j0StZAogDVbpjzBXsWzlAO4JPp2pafMnG5ndgMyeuwU=", - "owner": "Liqwid-Labs", - "repo": "plutarch-context-builder", - "rev": "7dfa384bbf5427412ba78ef48ddd86ca251fdb18", - "type": "github" - }, - "original": { - "owner": "Liqwid-Labs", - "ref": "staging", - "repo": "plutarch-context-builder", - "type": "github" - } - }, - "plutarch-context-builder_2": { - "inputs": { - "haskell-language-server": [ - "plutarch-context-builder", - "plutarch", - "haskell-language-server" - ], - "haskell-nix": [ - "plutarch-context-builder", - "plutarch", - "haskell-nix" - ], - "haskell-nix-extra-hackage": [ - "plutarch-context-builder", - "plutarch", - "haskell-nix-extra-hackage" - ], - "iohk-nix": [ - "plutarch-context-builder", - "plutarch", - "iohk-nix" - ], - "liqwid-nix": "liqwid-nix_6", - "nixpkgs": [ - "plutarch-context-builder", - "plutarch", - "nixpkgs" - ], - "nixpkgs-2111": "nixpkgs-2111_11", - "nixpkgs-latest": "nixpkgs-latest_11", - "plutarch": "plutarch_6" - }, - "locked": { - "lastModified": 1659452596, - "narHash": "sha256-j0StZAogDVbpjzBXsWzlAO4JPp2pafMnG5ndgMyeuwU=", - "owner": "Liqwid-Labs", - "repo": "plutarch-context-builder", - "rev": "7dfa384bbf5427412ba78ef48ddd86ca251fdb18", - "type": "github" - }, - "original": { - "owner": "Liqwid-Labs", - "ref": "plutus-v1", - "repo": "plutarch-context-builder", - "type": "github" - } - }, - "plutarch-context-builder_3": { - "inputs": { - "haskell-language-server": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-context-builder", - "plutarch", - "haskell-language-server" - ], - "haskell-nix": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-context-builder", - "plutarch", - "haskell-nix" - ], - "haskell-nix-extra-hackage": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-context-builder", - "plutarch", - "haskell-nix-extra-hackage" - ], - "iohk-nix": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-context-builder", - "plutarch", - "iohk-nix" - ], - "liqwid-nix": "liqwid-nix_11", - "nixpkgs": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-context-builder", - "plutarch", - "nixpkgs" - ], - "nixpkgs-2111": "nixpkgs-2111_19", - "nixpkgs-latest": "nixpkgs-latest_19", - "plutarch": "plutarch_10" - }, - "locked": { - "lastModified": 1659452596, - "narHash": "sha256-j0StZAogDVbpjzBXsWzlAO4JPp2pafMnG5ndgMyeuwU=", - "owner": "Liqwid-Labs", - "repo": "plutarch-context-builder", - "rev": "7dfa384bbf5427412ba78ef48ddd86ca251fdb18", - "type": "github" - }, - "original": { - "owner": "Liqwid-Labs", - "ref": "staging", - "repo": "plutarch-context-builder", - "type": "github" - } - }, - "plutarch-numeric": { - "inputs": { - "haskell-language-server": [ - "liqwid-plutarch-extra", - "plutarch-numeric", - "plutarch", - "haskell-language-server" - ], - "haskell-nix": [ - "liqwid-plutarch-extra", - "plutarch-numeric", - "plutarch", - "haskell-nix" - ], - "haskell-nix-extra-hackage": [ - "liqwid-plutarch-extra", - "plutarch-numeric", - "plutarch", - "haskell-nix-extra-hackage" - ], - "iohk-nix": [ - "liqwid-plutarch-extra", - "plutarch-numeric", - "plutarch", - "iohk-nix" - ], - "liqwid-nix": "liqwid-nix_4", - "nixpkgs": [ - "liqwid-plutarch-extra", - "plutarch-numeric", - "plutarch", - "nixpkgs" - ], - "nixpkgs-2111": "nixpkgs-2111_5", - "nixpkgs-latest": "nixpkgs-latest_5", - "plutarch": "plutarch_3" - }, - "locked": { - "lastModified": 1659450964, - "narHash": "sha256-jkxeMZ5ZjEl94MG5jWC+ogeh8m5sCpR7FX2Srtedvc4=", - "owner": "liqwid-labs", - "repo": "plutarch-numeric", - "rev": "65a1a5dec3836cf4e3c793bf780a4ee84b0a9331", - "type": "github" - }, - "original": { - "owner": "liqwid-labs", - "ref": "main", - "repo": "plutarch-numeric", - "type": "github" - } - }, - "plutarch-numeric_2": { - "inputs": { - "haskell-language-server": [ - "plutarch-numeric", - "plutarch", - "haskell-language-server" - ], - "haskell-nix": [ - "plutarch-numeric", - "plutarch", - "haskell-nix" - ], - "haskell-nix-extra-hackage": [ - "plutarch-numeric", - "plutarch", - "haskell-nix-extra-hackage" - ], - "iohk-nix": [ - "plutarch-numeric", - "plutarch", - "iohk-nix" - ], - "liqwid-nix": "liqwid-nix_7", - "nixpkgs": [ - "plutarch-numeric", - "plutarch", - "nixpkgs" - ], - "nixpkgs-2111": "nixpkgs-2111_13", - "nixpkgs-latest": "nixpkgs-latest_13", - "plutarch": "plutarch_7" - }, - "locked": { - "lastModified": 1659450964, - "narHash": "sha256-jkxeMZ5ZjEl94MG5jWC+ogeh8m5sCpR7FX2Srtedvc4=", - "owner": "Liqwid-Labs", - "repo": "plutarch-numeric", - "rev": "65a1a5dec3836cf4e3c793bf780a4ee84b0a9331", - "type": "github" - }, - "original": { - "owner": "Liqwid-Labs", - "ref": "main", - "repo": "plutarch-numeric", - "type": "github" - } - }, - "plutarch-numeric_3": { - "inputs": { - "haskell-language-server": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-numeric", - "plutarch", - "haskell-language-server" - ], - "haskell-nix": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-numeric", - "plutarch", - "haskell-nix" - ], - "haskell-nix-extra-hackage": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-numeric", - "plutarch", - "haskell-nix-extra-hackage" - ], - "iohk-nix": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-numeric", - "plutarch", - "iohk-nix" - ], - "liqwid-nix": "liqwid-nix_12", - "nixpkgs": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-numeric", - "plutarch", - "nixpkgs" - ], - "nixpkgs-2111": "nixpkgs-2111_21", - "nixpkgs-latest": "nixpkgs-latest_21", - "plutarch": "plutarch_11" - }, - "locked": { - "lastModified": 1659450964, - "narHash": "sha256-jkxeMZ5ZjEl94MG5jWC+ogeh8m5sCpR7FX2Srtedvc4=", - "owner": "liqwid-labs", - "repo": "plutarch-numeric", - "rev": "65a1a5dec3836cf4e3c793bf780a4ee84b0a9331", - "type": "github" - }, - "original": { - "owner": "liqwid-labs", - "ref": "main", - "repo": "plutarch-numeric", - "type": "github" - } - }, - "plutarch-numeric_4": { - "inputs": { - "haskell-language-server": [ - "plutarch-safe-money", - "plutarch-numeric", - "plutarch", - "haskell-language-server" - ], - "haskell-nix": [ - "plutarch-safe-money", - "plutarch-numeric", - "plutarch", - "haskell-nix" - ], - "haskell-nix-extra-hackage": [ - "plutarch-safe-money", - "plutarch-numeric", - "plutarch", - "haskell-nix-extra-hackage" - ], - "iohk-nix": [ - "plutarch-safe-money", - "plutarch-numeric", - "plutarch", - "iohk-nix" - ], - "liqwid-nix": "liqwid-nix_14", - "nixpkgs": [ - "plutarch-safe-money", - "plutarch-numeric", - "plutarch", - "nixpkgs" - ], - "nixpkgs-2111": "nixpkgs-2111_27", - "nixpkgs-latest": "nixpkgs-latest_27", - "plutarch": "plutarch_14" - }, - "locked": { - "lastModified": 1659450964, - "narHash": "sha256-jkxeMZ5ZjEl94MG5jWC+ogeh8m5sCpR7FX2Srtedvc4=", - "owner": "Liqwid-Labs", - "repo": "plutarch-numeric", - "rev": "65a1a5dec3836cf4e3c793bf780a4ee84b0a9331", - "type": "github" - }, - "original": { - "owner": "Liqwid-Labs", - "ref": "main", - "repo": "plutarch-numeric", - "type": "github" - } - }, - "plutarch-quickcheck": { - "inputs": { - "haskell-language-server": [ - "liqwid-plutarch-extra", - "plutarch-quickcheck", - "plutarch", - "haskell-language-server" - ], - "haskell-nix": [ - "liqwid-plutarch-extra", - "plutarch-quickcheck", - "plutarch", - "haskell-nix" - ], - "haskell-nix-extra-hackage": [ - "liqwid-plutarch-extra", - "plutarch-quickcheck", - "plutarch", - "haskell-nix-extra-hackage" - ], - "iohk-nix": [ - "liqwid-plutarch-extra", - "plutarch-quickcheck", - "plutarch", - "iohk-nix" - ], - "liqwid-nix": "liqwid-nix_5", - "nixpkgs": [ - "liqwid-plutarch-extra", - "plutarch-quickcheck", - "plutarch", - "nixpkgs" - ], - "nixpkgs-2111": "nixpkgs-2111_7", - "nixpkgs-latest": "nixpkgs-latest_7", - "plutarch": "plutarch_4" - }, - "locked": { - "lastModified": 1659450065, - "narHash": "sha256-x6B9sjrZaTite4TSLLyOWfmG3JJbOZuGUNMDZ1f4qhk=", - "owner": "liqwid-labs", - "repo": "plutarch-quickcheck", - "rev": "2c5b77f1a622ce68d80a09b286eb0ac85527ff26", - "type": "github" - }, - "original": { - "owner": "liqwid-labs", - "ref": "staging", - "repo": "plutarch-quickcheck", - "type": "github" - } - }, - "plutarch-quickcheck_2": { - "inputs": { - "haskell-language-server": [ - "plutarch-quickcheck", - "plutarch", - "haskell-language-server" - ], - "haskell-nix": [ - "plutarch-quickcheck", - "plutarch", - "haskell-nix" - ], - "haskell-nix-extra-hackage": [ - "plutarch-quickcheck", - "plutarch", - "haskell-nix-extra-hackage" - ], - "iohk-nix": [ - "plutarch-quickcheck", - "plutarch", - "iohk-nix" - ], - "liqwid-nix": "liqwid-nix_8", - "nixpkgs": [ - "plutarch-quickcheck", - "plutarch", - "nixpkgs" - ], - "nixpkgs-2111": "nixpkgs-2111_15", - "nixpkgs-latest": "nixpkgs-latest_15", - "plutarch": "plutarch_8" - }, - "locked": { - "lastModified": 1659450065, - "narHash": "sha256-x6B9sjrZaTite4TSLLyOWfmG3JJbOZuGUNMDZ1f4qhk=", - "owner": "liqwid-labs", - "repo": "plutarch-quickcheck", - "rev": "2c5b77f1a622ce68d80a09b286eb0ac85527ff26", - "type": "github" - }, - "original": { - "owner": "liqwid-labs", - "ref": "staging", - "repo": "plutarch-quickcheck", - "type": "github" - } - }, - "plutarch-quickcheck_3": { - "inputs": { - "haskell-language-server": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-quickcheck", - "plutarch", - "haskell-language-server" - ], - "haskell-nix": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-quickcheck", - "plutarch", - "haskell-nix" - ], - "haskell-nix-extra-hackage": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-quickcheck", - "plutarch", - "haskell-nix-extra-hackage" - ], - "iohk-nix": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-quickcheck", - "plutarch", - "iohk-nix" - ], - "liqwid-nix": "liqwid-nix_13", - "nixpkgs": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-quickcheck", - "plutarch", - "nixpkgs" - ], - "nixpkgs-2111": "nixpkgs-2111_23", - "nixpkgs-latest": "nixpkgs-latest_23", - "plutarch": "plutarch_12" - }, - "locked": { - "lastModified": 1659450065, - "narHash": "sha256-x6B9sjrZaTite4TSLLyOWfmG3JJbOZuGUNMDZ1f4qhk=", - "owner": "liqwid-labs", - "repo": "plutarch-quickcheck", - "rev": "2c5b77f1a622ce68d80a09b286eb0ac85527ff26", - "type": "github" - }, - "original": { - "owner": "liqwid-labs", - "ref": "staging", - "repo": "plutarch-quickcheck", - "type": "github" - } - }, - "plutarch-safe-money": { - "inputs": { - "haskell-language-server": [ - "plutarch-safe-money", - "plutarch", - "haskell-language-server" - ], - "haskell-nix": [ - "plutarch-safe-money", - "plutarch", - "haskell-nix" - ], - "haskell-nix-extra-hackage": [ - "plutarch-safe-money", - "plutarch", - "haskell-nix-extra-hackage" - ], - "iohk-nix": [ - "plutarch-safe-money", - "plutarch", - "iohk-nix" - ], - "liqwid-nix": "liqwid-nix_9", - "liqwid-plutarch-extra": "liqwid-plutarch-extra_2", - "nixpkgs": [ - "plutarch-safe-money", - "plutarch", - "nixpkgs" - ], - "nixpkgs-2111": "nixpkgs-2111_25", - "nixpkgs-latest": "nixpkgs-latest_25", - "plutarch": "plutarch_13", - "plutarch-numeric": "plutarch-numeric_4" - }, - "locked": { - "lastModified": 1659604619, - "narHash": "sha256-pqjjb/J773z2cE7bBsszxj2QnefewJlIIe1NbDeKrLw=", - "owner": "Liqwid-Labs", - "repo": "plutarch-safe-money", - "rev": "6e4f2112a36b2937fc2f3f7143abb4f4c42e7428", - "type": "github" - }, - "original": { - "owner": "Liqwid-Labs", - "ref": "main", - "repo": "plutarch-safe-money", - "type": "github" - } - }, - "plutarch-script-export": { - "inputs": { - "haskell-language-server": [ - "plutarch-script-export", - "plutarch", - "haskell-language-server" - ], - "haskell-nix": [ - "plutarch-script-export", - "plutarch", - "haskell-nix" - ], - "haskell-nix-extra-hackage": [ - "plutarch-script-export", - "plutarch", - "haskell-nix-extra-hackage" - ], - "iohk-nix": [ - "plutarch-script-export", - "plutarch", - "iohk-nix" - ], - "liqwid-nix": "liqwid-nix_15", - "nixpkgs": [ - "plutarch-script-export", - "plutarch", - "nixpkgs" - ], - "nixpkgs-2111": "nixpkgs-2111_29", - "nixpkgs-latest": "nixpkgs-latest_29", - "plutarch": "plutarch_15" - }, - "locked": { - "lastModified": 1660213721, - "narHash": "sha256-YkDefu3XK1FelMFCgf3jOkzc3ugCS1DXUgr9rZoukPw=", - "owner": "Liqwid-Labs", - "repo": "plutarch-script-export", - "rev": "4d8f6af19d727c46fc8d746b1f6d3e356196610f", - "type": "github" - }, - "original": { - "owner": "Liqwid-Labs", - "ref": "main", - "repo": "plutarch-script-export", - "type": "github" - } - }, - "plutarch_10": { - "inputs": { - "cardano-base": "cardano-base_10", - "cardano-crypto": "cardano-crypto_10", - "cardano-prelude": "cardano-prelude_10", - "emanote": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-context-builder", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "flat": "flat_10", - "haskell-language-server": "haskell-language-server_19", - "haskell-nix": "haskell-nix_19", - "haskell-nix-extra-hackage": "haskell-nix-extra-hackage_10", - "hercules-ci-effects": "hercules-ci-effects_10", - "iohk-nix": "iohk-nix_19", - "nixpkgs": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-context-builder", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-latest": "nixpkgs-latest_20", - "plutus": "plutus_10", - "protolude": "protolude_10", - "secp256k1-haskell": "secp256k1-haskell_10" - }, - "locked": { - "lastModified": 1659381657, - "narHash": "sha256-W0EWY0DV2idbIeqtJnShVHQ83exME8TK2GYQGbVpz8A=", - "owner": "Plutonomicon", - "repo": "plutarch-plutus", - "rev": "45b7c77a9ee9bd6c7dc25ddebcc3d12c58c4c3a2", - "type": "github" - }, - "original": { - "owner": "Plutonomicon", - "ref": "staging", - "repo": "plutarch-plutus", - "type": "github" - } - }, - "plutarch_11": { - "inputs": { - "cardano-base": "cardano-base_11", - "cardano-crypto": "cardano-crypto_11", - "cardano-prelude": "cardano-prelude_11", - "emanote": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-numeric", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "flat": "flat_11", - "haskell-language-server": "haskell-language-server_21", - "haskell-nix": "haskell-nix_21", - "haskell-nix-extra-hackage": "haskell-nix-extra-hackage_11", - "hercules-ci-effects": "hercules-ci-effects_11", - "iohk-nix": "iohk-nix_21", - "nixpkgs": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-numeric", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-latest": "nixpkgs-latest_22", - "plutus": "plutus_11", - "protolude": "protolude_11", - "secp256k1-haskell": "secp256k1-haskell_11" - }, - "locked": { - "lastModified": 1659381657, - "narHash": "sha256-W0EWY0DV2idbIeqtJnShVHQ83exME8TK2GYQGbVpz8A=", - "owner": "Plutonomicon", - "repo": "plutarch-plutus", - "rev": "45b7c77a9ee9bd6c7dc25ddebcc3d12c58c4c3a2", - "type": "github" - }, - "original": { - "owner": "Plutonomicon", - "ref": "staging", - "repo": "plutarch-plutus", - "type": "github" - } - }, - "plutarch_12": { - "inputs": { - "cardano-base": "cardano-base_12", - "cardano-crypto": "cardano-crypto_12", - "cardano-prelude": "cardano-prelude_12", - "emanote": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-quickcheck", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "flat": "flat_12", - "haskell-language-server": "haskell-language-server_23", - "haskell-nix": "haskell-nix_23", - "haskell-nix-extra-hackage": "haskell-nix-extra-hackage_12", - "hercules-ci-effects": "hercules-ci-effects_12", - "iohk-nix": "iohk-nix_23", - "nixpkgs": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch-quickcheck", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-latest": "nixpkgs-latest_24", - "plutus": "plutus_12", - "protolude": "protolude_12", - "secp256k1-haskell": "secp256k1-haskell_12" - }, - "locked": { - "lastModified": 1659381657, - "narHash": "sha256-W0EWY0DV2idbIeqtJnShVHQ83exME8TK2GYQGbVpz8A=", - "owner": "Plutonomicon", - "repo": "plutarch-plutus", - "rev": "45b7c77a9ee9bd6c7dc25ddebcc3d12c58c4c3a2", - "type": "github" - }, - "original": { - "owner": "Plutonomicon", - "ref": "staging", - "repo": "plutarch-plutus", - "type": "github" - } - }, - "plutarch_13": { - "inputs": { - "cardano-base": "cardano-base_13", - "cardano-crypto": "cardano-crypto_13", - "cardano-prelude": "cardano-prelude_13", - "emanote": [ - "plutarch-safe-money", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "flat": "flat_13", - "haskell-language-server": "haskell-language-server_25", - "haskell-nix": "haskell-nix_25", - "haskell-nix-extra-hackage": "haskell-nix-extra-hackage_13", - "hercules-ci-effects": "hercules-ci-effects_13", - "iohk-nix": "iohk-nix_25", - "nixpkgs": [ - "plutarch-safe-money", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-latest": "nixpkgs-latest_26", - "plutus": "plutus_13", - "protolude": "protolude_13", - "secp256k1-haskell": "secp256k1-haskell_13" - }, - "locked": { - "lastModified": 1659381657, - "narHash": "sha256-W0EWY0DV2idbIeqtJnShVHQ83exME8TK2GYQGbVpz8A=", - "owner": "Plutonomicon", - "repo": "plutarch-plutus", - "rev": "45b7c77a9ee9bd6c7dc25ddebcc3d12c58c4c3a2", - "type": "github" - }, - "original": { - "owner": "Plutonomicon", - "ref": "staging", - "repo": "plutarch-plutus", - "type": "github" - } - }, - "plutarch_14": { - "inputs": { - "cardano-base": "cardano-base_14", - "cardano-crypto": "cardano-crypto_14", - "cardano-prelude": "cardano-prelude_14", - "emanote": [ - "plutarch-safe-money", - "plutarch-numeric", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "flat": "flat_14", - "haskell-language-server": "haskell-language-server_27", - "haskell-nix": "haskell-nix_27", - "haskell-nix-extra-hackage": "haskell-nix-extra-hackage_14", - "hercules-ci-effects": "hercules-ci-effects_14", - "iohk-nix": "iohk-nix_27", - "nixpkgs": [ - "plutarch-safe-money", - "plutarch-numeric", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-latest": "nixpkgs-latest_28", - "plutus": "plutus_14", - "protolude": "protolude_14", - "secp256k1-haskell": "secp256k1-haskell_14" - }, - "locked": { - "lastModified": 1659381657, - "narHash": "sha256-W0EWY0DV2idbIeqtJnShVHQ83exME8TK2GYQGbVpz8A=", - "owner": "Plutonomicon", - "repo": "plutarch-plutus", - "rev": "45b7c77a9ee9bd6c7dc25ddebcc3d12c58c4c3a2", - "type": "github" - }, - "original": { - "owner": "Plutonomicon", - "ref": "staging", - "repo": "plutarch-plutus", - "type": "github" - } - }, - "plutarch_15": { - "inputs": { - "cardano-base": "cardano-base_15", - "cardano-crypto": "cardano-crypto_15", - "cardano-prelude": "cardano-prelude_15", - "emanote": [ - "plutarch-script-export", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "flat": "flat_15", - "haskell-language-server": "haskell-language-server_29", - "haskell-nix": "haskell-nix_29", - "haskell-nix-extra-hackage": "haskell-nix-extra-hackage_15", - "hercules-ci-effects": "hercules-ci-effects_15", - "iohk-nix": "iohk-nix_29", - "nixpkgs": [ - "plutarch-script-export", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-latest": "nixpkgs-latest_30", - "plutus": "plutus_15", - "protolude": "protolude_15", - "secp256k1-haskell": "secp256k1-haskell_15" - }, - "locked": { - "lastModified": 1659381657, - "narHash": "sha256-W0EWY0DV2idbIeqtJnShVHQ83exME8TK2GYQGbVpz8A=", - "owner": "Plutonomicon", - "repo": "plutarch-plutus", - "rev": "45b7c77a9ee9bd6c7dc25ddebcc3d12c58c4c3a2", - "type": "github" - }, - "original": { - "owner": "Plutonomicon", - "ref": "staging", + "ref": "master", "repo": "plutarch-plutus", "type": "github" } }, "plutarch_2": { "inputs": { - "cardano-base": "cardano-base_2", - "cardano-crypto": "cardano-crypto_2", - "cardano-prelude": "cardano-prelude_2", - "emanote": [ - "liqwid-plutarch-extra", - "plutarch-context-builder", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "flat": "flat_2", - "haskell-language-server": "haskell-language-server_3", - "haskell-nix": "haskell-nix_3", - "haskell-nix-extra-hackage": "haskell-nix-extra-hackage_2", - "hercules-ci-effects": "hercules-ci-effects_2", - "iohk-nix": "iohk-nix_3", - "nixpkgs": [ - "liqwid-plutarch-extra", - "plutarch-context-builder", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-latest": "nixpkgs-latest_4", - "plutus": "plutus_2", - "protolude": "protolude_2", - "secp256k1-haskell": "secp256k1-haskell_2" + "tooling": "tooling_2" }, "locked": { - "lastModified": 1659381657, - "narHash": "sha256-W0EWY0DV2idbIeqtJnShVHQ83exME8TK2GYQGbVpz8A=", + "lastModified": 1675976388, + "narHash": "sha256-+LdMi2zKoRR12hifT8fck/+VpTzS4rOrlQN6pg8xhsU=", "owner": "Plutonomicon", "repo": "plutarch-plutus", - "rev": "45b7c77a9ee9bd6c7dc25ddebcc3d12c58c4c3a2", + "rev": "d3df05ce67d8b5a3d2ca851a6e5a1b8ff8cb358f", "type": "github" }, "original": { "owner": "Plutonomicon", - "ref": "staging", - "repo": "plutarch-plutus", - "type": "github" - } - }, - "plutarch_3": { - "inputs": { - "cardano-base": "cardano-base_3", - "cardano-crypto": "cardano-crypto_3", - "cardano-prelude": "cardano-prelude_3", - "emanote": [ - "liqwid-plutarch-extra", - "plutarch-numeric", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "flat": "flat_3", - "haskell-language-server": "haskell-language-server_5", - "haskell-nix": "haskell-nix_5", - "haskell-nix-extra-hackage": "haskell-nix-extra-hackage_3", - "hercules-ci-effects": "hercules-ci-effects_3", - "iohk-nix": "iohk-nix_5", - "nixpkgs": [ - "liqwid-plutarch-extra", - "plutarch-numeric", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-latest": "nixpkgs-latest_6", - "plutus": "plutus_3", - "protolude": "protolude_3", - "secp256k1-haskell": "secp256k1-haskell_3" - }, - "locked": { - "lastModified": 1659381657, - "narHash": "sha256-W0EWY0DV2idbIeqtJnShVHQ83exME8TK2GYQGbVpz8A=", - "owner": "Plutonomicon", - "repo": "plutarch-plutus", - "rev": "45b7c77a9ee9bd6c7dc25ddebcc3d12c58c4c3a2", - "type": "github" - }, - "original": { - "owner": "Plutonomicon", - "ref": "staging", - "repo": "plutarch-plutus", - "type": "github" - } - }, - "plutarch_4": { - "inputs": { - "cardano-base": "cardano-base_4", - "cardano-crypto": "cardano-crypto_4", - "cardano-prelude": "cardano-prelude_4", - "emanote": [ - "liqwid-plutarch-extra", - "plutarch-quickcheck", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "flat": "flat_4", - "haskell-language-server": "haskell-language-server_7", - "haskell-nix": "haskell-nix_7", - "haskell-nix-extra-hackage": "haskell-nix-extra-hackage_4", - "hercules-ci-effects": "hercules-ci-effects_4", - "iohk-nix": "iohk-nix_7", - "nixpkgs": [ - "liqwid-plutarch-extra", - "plutarch-quickcheck", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-latest": "nixpkgs-latest_8", - "plutus": "plutus_4", - "protolude": "protolude_4", - "secp256k1-haskell": "secp256k1-haskell_4" - }, - "locked": { - "lastModified": 1659381657, - "narHash": "sha256-W0EWY0DV2idbIeqtJnShVHQ83exME8TK2GYQGbVpz8A=", - "owner": "Plutonomicon", - "repo": "plutarch-plutus", - "rev": "45b7c77a9ee9bd6c7dc25ddebcc3d12c58c4c3a2", - "type": "github" - }, - "original": { - "owner": "Plutonomicon", - "ref": "staging", - "repo": "plutarch-plutus", - "type": "github" - } - }, - "plutarch_5": { - "inputs": { - "cardano-base": "cardano-base_5", - "cardano-crypto": "cardano-crypto_5", - "cardano-prelude": "cardano-prelude_5", - "emanote": [ - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "flat": "flat_5", - "haskell-language-server": "haskell-language-server_9", - "haskell-nix": "haskell-nix_9", - "haskell-nix-extra-hackage": "haskell-nix-extra-hackage_5", - "hercules-ci-effects": "hercules-ci-effects_5", - "iohk-nix": "iohk-nix_9", - "nixpkgs": [ - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-latest": "nixpkgs-latest_10", - "plutus": "plutus_5", - "protolude": "protolude_5", - "secp256k1-haskell": "secp256k1-haskell_5" - }, - "locked": { - "lastModified": 1659381657, - "narHash": "sha256-W0EWY0DV2idbIeqtJnShVHQ83exME8TK2GYQGbVpz8A=", - "owner": "Plutonomicon", - "repo": "plutarch-plutus", - "rev": "45b7c77a9ee9bd6c7dc25ddebcc3d12c58c4c3a2", - "type": "github" - }, - "original": { - "owner": "Plutonomicon", - "ref": "staging", - "repo": "plutarch-plutus", - "type": "github" - } - }, - "plutarch_6": { - "inputs": { - "cardano-base": "cardano-base_6", - "cardano-crypto": "cardano-crypto_6", - "cardano-prelude": "cardano-prelude_6", - "emanote": [ - "plutarch-context-builder", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "flat": "flat_6", - "haskell-language-server": "haskell-language-server_11", - "haskell-nix": "haskell-nix_11", - "haskell-nix-extra-hackage": "haskell-nix-extra-hackage_6", - "hercules-ci-effects": "hercules-ci-effects_6", - "iohk-nix": "iohk-nix_11", - "nixpkgs": [ - "plutarch-context-builder", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-latest": "nixpkgs-latest_12", - "plutus": "plutus_6", - "protolude": "protolude_6", - "secp256k1-haskell": "secp256k1-haskell_6" - }, - "locked": { - "lastModified": 1659381657, - "narHash": "sha256-W0EWY0DV2idbIeqtJnShVHQ83exME8TK2GYQGbVpz8A=", - "owner": "Plutonomicon", - "repo": "plutarch-plutus", - "rev": "45b7c77a9ee9bd6c7dc25ddebcc3d12c58c4c3a2", - "type": "github" - }, - "original": { - "owner": "Plutonomicon", - "ref": "staging", - "repo": "plutarch-plutus", - "type": "github" - } - }, - "plutarch_7": { - "inputs": { - "cardano-base": "cardano-base_7", - "cardano-crypto": "cardano-crypto_7", - "cardano-prelude": "cardano-prelude_7", - "emanote": [ - "plutarch-numeric", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "flat": "flat_7", - "haskell-language-server": "haskell-language-server_13", - "haskell-nix": "haskell-nix_13", - "haskell-nix-extra-hackage": "haskell-nix-extra-hackage_7", - "hercules-ci-effects": "hercules-ci-effects_7", - "iohk-nix": "iohk-nix_13", - "nixpkgs": [ - "plutarch-numeric", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-latest": "nixpkgs-latest_14", - "plutus": "plutus_7", - "protolude": "protolude_7", - "secp256k1-haskell": "secp256k1-haskell_7" - }, - "locked": { - "lastModified": 1659381657, - "narHash": "sha256-W0EWY0DV2idbIeqtJnShVHQ83exME8TK2GYQGbVpz8A=", - "owner": "Plutonomicon", - "repo": "plutarch-plutus", - "rev": "45b7c77a9ee9bd6c7dc25ddebcc3d12c58c4c3a2", - "type": "github" - }, - "original": { - "owner": "Plutonomicon", - "ref": "staging", - "repo": "plutarch-plutus", - "type": "github" - } - }, - "plutarch_8": { - "inputs": { - "cardano-base": "cardano-base_8", - "cardano-crypto": "cardano-crypto_8", - "cardano-prelude": "cardano-prelude_8", - "emanote": [ - "plutarch-quickcheck", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "flat": "flat_8", - "haskell-language-server": "haskell-language-server_15", - "haskell-nix": "haskell-nix_15", - "haskell-nix-extra-hackage": "haskell-nix-extra-hackage_8", - "hercules-ci-effects": "hercules-ci-effects_8", - "iohk-nix": "iohk-nix_15", - "nixpkgs": [ - "plutarch-quickcheck", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-latest": "nixpkgs-latest_16", - "plutus": "plutus_8", - "protolude": "protolude_8", - "secp256k1-haskell": "secp256k1-haskell_8" - }, - "locked": { - "lastModified": 1659381657, - "narHash": "sha256-W0EWY0DV2idbIeqtJnShVHQ83exME8TK2GYQGbVpz8A=", - "owner": "Plutonomicon", - "repo": "plutarch-plutus", - "rev": "45b7c77a9ee9bd6c7dc25ddebcc3d12c58c4c3a2", - "type": "github" - }, - "original": { - "owner": "Plutonomicon", - "ref": "staging", - "repo": "plutarch-plutus", - "type": "github" - } - }, - "plutarch_9": { - "inputs": { - "cardano-base": "cardano-base_9", - "cardano-crypto": "cardano-crypto_9", - "cardano-prelude": "cardano-prelude_9", - "emanote": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "flat": "flat_9", - "haskell-language-server": "haskell-language-server_17", - "haskell-nix": "haskell-nix_17", - "haskell-nix-extra-hackage": "haskell-nix-extra-hackage_9", - "hercules-ci-effects": "hercules-ci-effects_9", - "iohk-nix": "iohk-nix_17", - "nixpkgs": [ - "plutarch-safe-money", - "liqwid-plutarch-extra", - "plutarch", - "haskell-nix", - "nixpkgs-unstable" - ], - "nixpkgs-latest": "nixpkgs-latest_18", - "plutus": "plutus_9", - "protolude": "protolude_9", - "secp256k1-haskell": "secp256k1-haskell_9" - }, - "locked": { - "lastModified": 1659381657, - "narHash": "sha256-W0EWY0DV2idbIeqtJnShVHQ83exME8TK2GYQGbVpz8A=", - "owner": "Plutonomicon", - "repo": "plutarch-plutus", - "rev": "45b7c77a9ee9bd6c7dc25ddebcc3d12c58c4c3a2", - "type": "github" - }, - "original": { - "owner": "Plutonomicon", - "ref": "staging", + "ref": "master", "repo": "plutarch-plutus", "type": "github" } }, "plutus": { "inputs": { - "cardano-repo-tool": "cardano-repo-tool", + "CHaP": "CHaP", "gitignore-nix": "gitignore-nix", "hackage-nix": "hackage-nix", - "haskell-language-server": "haskell-language-server_2", - "haskell-nix": "haskell-nix_2", - "iohk-nix": "iohk-nix_2", - "nixpkgs": "nixpkgs_5", - "pre-commit-hooks-nix": "pre-commit-hooks-nix", - "sphinxcontrib-haddock": "sphinxcontrib-haddock" + "haskell-language-server": "haskell-language-server", + "haskell-nix": "haskell-nix_3", + "iohk-nix": "iohk-nix_3", + "nixpkgs": "nixpkgs_13", + "pre-commit-hooks-nix": "pre-commit-hooks-nix_2", + "sphinxcontrib-haddock": "sphinxcontrib-haddock", + "std": "std_3", + "tullia": "tullia_3" }, "locked": { - "lastModified": 1656595231, - "narHash": "sha256-3EBhSroECMOSP02qZGT0Zb3QHWibI/tYjdcaT5/YotY=", + "lastModified": 1670888424, + "narHash": "sha256-tLzbC5TMhzI4SAitO5ZXC4mN3HR6NDAFROJynnJIEFI=", "owner": "input-output-hk", "repo": "plutus", - "rev": "b39a526e983cb931d0cc49b7d073d6d43abd22b5", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "plutus", - "type": "github" - } - }, - "plutus_10": { - "inputs": { - "cardano-repo-tool": "cardano-repo-tool_10", - "gitignore-nix": "gitignore-nix_10", - "hackage-nix": "hackage-nix_10", - "haskell-language-server": "haskell-language-server_20", - "haskell-nix": "haskell-nix_20", - "iohk-nix": "iohk-nix_20", - "nixpkgs": "nixpkgs_41", - "pre-commit-hooks-nix": "pre-commit-hooks-nix_10", - "sphinxcontrib-haddock": "sphinxcontrib-haddock_10" - }, - "locked": { - "lastModified": 1656595231, - "narHash": "sha256-3EBhSroECMOSP02qZGT0Zb3QHWibI/tYjdcaT5/YotY=", - "owner": "input-output-hk", - "repo": "plutus", - "rev": "b39a526e983cb931d0cc49b7d073d6d43abd22b5", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "plutus", - "type": "github" - } - }, - "plutus_11": { - "inputs": { - "cardano-repo-tool": "cardano-repo-tool_11", - "gitignore-nix": "gitignore-nix_11", - "hackage-nix": "hackage-nix_11", - "haskell-language-server": "haskell-language-server_22", - "haskell-nix": "haskell-nix_22", - "iohk-nix": "iohk-nix_22", - "nixpkgs": "nixpkgs_45", - "pre-commit-hooks-nix": "pre-commit-hooks-nix_11", - "sphinxcontrib-haddock": "sphinxcontrib-haddock_11" - }, - "locked": { - "lastModified": 1656595231, - "narHash": "sha256-3EBhSroECMOSP02qZGT0Zb3QHWibI/tYjdcaT5/YotY=", - "owner": "input-output-hk", - "repo": "plutus", - "rev": "b39a526e983cb931d0cc49b7d073d6d43abd22b5", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "plutus", - "type": "github" - } - }, - "plutus_12": { - "inputs": { - "cardano-repo-tool": "cardano-repo-tool_12", - "gitignore-nix": "gitignore-nix_12", - "hackage-nix": "hackage-nix_12", - "haskell-language-server": "haskell-language-server_24", - "haskell-nix": "haskell-nix_24", - "iohk-nix": "iohk-nix_24", - "nixpkgs": "nixpkgs_49", - "pre-commit-hooks-nix": "pre-commit-hooks-nix_12", - "sphinxcontrib-haddock": "sphinxcontrib-haddock_12" - }, - "locked": { - "lastModified": 1656595231, - "narHash": "sha256-3EBhSroECMOSP02qZGT0Zb3QHWibI/tYjdcaT5/YotY=", - "owner": "input-output-hk", - "repo": "plutus", - "rev": "b39a526e983cb931d0cc49b7d073d6d43abd22b5", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "plutus", - "type": "github" - } - }, - "plutus_13": { - "inputs": { - "cardano-repo-tool": "cardano-repo-tool_13", - "gitignore-nix": "gitignore-nix_13", - "hackage-nix": "hackage-nix_13", - "haskell-language-server": "haskell-language-server_26", - "haskell-nix": "haskell-nix_26", - "iohk-nix": "iohk-nix_26", - "nixpkgs": "nixpkgs_52", - "pre-commit-hooks-nix": "pre-commit-hooks-nix_13", - "sphinxcontrib-haddock": "sphinxcontrib-haddock_13" - }, - "locked": { - "lastModified": 1656595231, - "narHash": "sha256-3EBhSroECMOSP02qZGT0Zb3QHWibI/tYjdcaT5/YotY=", - "owner": "input-output-hk", - "repo": "plutus", - "rev": "b39a526e983cb931d0cc49b7d073d6d43abd22b5", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "plutus", - "type": "github" - } - }, - "plutus_14": { - "inputs": { - "cardano-repo-tool": "cardano-repo-tool_14", - "gitignore-nix": "gitignore-nix_14", - "hackage-nix": "hackage-nix_14", - "haskell-language-server": "haskell-language-server_28", - "haskell-nix": "haskell-nix_28", - "iohk-nix": "iohk-nix_28", - "nixpkgs": "nixpkgs_56", - "pre-commit-hooks-nix": "pre-commit-hooks-nix_14", - "sphinxcontrib-haddock": "sphinxcontrib-haddock_14" - }, - "locked": { - "lastModified": 1656595231, - "narHash": "sha256-3EBhSroECMOSP02qZGT0Zb3QHWibI/tYjdcaT5/YotY=", - "owner": "input-output-hk", - "repo": "plutus", - "rev": "b39a526e983cb931d0cc49b7d073d6d43abd22b5", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "plutus", - "type": "github" - } - }, - "plutus_15": { - "inputs": { - "cardano-repo-tool": "cardano-repo-tool_15", - "gitignore-nix": "gitignore-nix_15", - "hackage-nix": "hackage-nix_15", - "haskell-language-server": "haskell-language-server_30", - "haskell-nix": "haskell-nix_30", - "iohk-nix": "iohk-nix_30", - "nixpkgs": "nixpkgs_60", - "pre-commit-hooks-nix": "pre-commit-hooks-nix_15", - "sphinxcontrib-haddock": "sphinxcontrib-haddock_15" - }, - "locked": { - "lastModified": 1656595231, - "narHash": "sha256-3EBhSroECMOSP02qZGT0Zb3QHWibI/tYjdcaT5/YotY=", - "owner": "input-output-hk", - "repo": "plutus", - "rev": "b39a526e983cb931d0cc49b7d073d6d43abd22b5", + "rev": "8b6dacf70fa57fcc63d05cc2b07c20e92ff61480", "type": "github" }, "original": { @@ -12595,48 +7283,24 @@ }, "plutus_2": { "inputs": { - "cardano-repo-tool": "cardano-repo-tool_2", + "CHaP": "CHaP_3", "gitignore-nix": "gitignore-nix_2", "hackage-nix": "hackage-nix_2", - "haskell-language-server": "haskell-language-server_4", - "haskell-nix": "haskell-nix_4", - "iohk-nix": "iohk-nix_4", - "nixpkgs": "nixpkgs_9", - "pre-commit-hooks-nix": "pre-commit-hooks-nix_2", - "sphinxcontrib-haddock": "sphinxcontrib-haddock_2" - }, - "locked": { - "lastModified": 1656595231, - "narHash": "sha256-3EBhSroECMOSP02qZGT0Zb3QHWibI/tYjdcaT5/YotY=", - "owner": "input-output-hk", - "repo": "plutus", - "rev": "b39a526e983cb931d0cc49b7d073d6d43abd22b5", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "plutus", - "type": "github" - } - }, - "plutus_3": { - "inputs": { - "cardano-repo-tool": "cardano-repo-tool_3", - "gitignore-nix": "gitignore-nix_3", - "hackage-nix": "hackage-nix_3", - "haskell-language-server": "haskell-language-server_6", + "haskell-language-server": "haskell-language-server_2", "haskell-nix": "haskell-nix_6", "iohk-nix": "iohk-nix_6", - "nixpkgs": "nixpkgs_13", + "nixpkgs": "nixpkgs_33", "pre-commit-hooks-nix": "pre-commit-hooks-nix_3", - "sphinxcontrib-haddock": "sphinxcontrib-haddock_3" + "sphinxcontrib-haddock": "sphinxcontrib-haddock_2", + "std": "std_8", + "tullia": "tullia_7" }, "locked": { - "lastModified": 1656595231, - "narHash": "sha256-3EBhSroECMOSP02qZGT0Zb3QHWibI/tYjdcaT5/YotY=", + "lastModified": 1670888424, + "narHash": "sha256-tLzbC5TMhzI4SAitO5ZXC4mN3HR6NDAFROJynnJIEFI=", "owner": "input-output-hk", "repo": "plutus", - "rev": "b39a526e983cb931d0cc49b7d073d6d43abd22b5", + "rev": "8b6dacf70fa57fcc63d05cc2b07c20e92ff61480", "type": "github" }, "original": { @@ -12645,266 +7309,77 @@ "type": "github" } }, - "plutus_4": { + "ply": { "inputs": { - "cardano-repo-tool": "cardano-repo-tool_4", - "gitignore-nix": "gitignore-nix_4", - "hackage-nix": "hackage-nix_4", - "haskell-language-server": "haskell-language-server_8", - "haskell-nix": "haskell-nix_8", - "iohk-nix": "iohk-nix_8", + "CHaP": "CHaP_2", + "easy-purescript-nix": "easy-purescript-nix", + "flake-utils": "flake-utils_18", + "haskellNix": "haskellNix", + "nixpkgs": [ + "liqwid-libs", + "ply", + "haskellNix", + "nixpkgs-unstable" + ], + "pre-commit-hooks": "pre-commit-hooks_2" + }, + "locked": { + "lastModified": 1676952116, + "narHash": "sha256-BuiXDtCxOZQCs0hHhBtHGNBIxFTZxbSSp+f0U8kP/+c=", + "owner": "liqwid-labs", + "repo": "ply", + "rev": "623c017d2867147022283c6d4f6886a77bced09e", + "type": "github" + }, + "original": { + "owner": "liqwid-labs", + "ref": "seungheonoh/purs", + "repo": "ply", + "type": "github" + } + }, + "pre-commit-hooks": { + "inputs": { + "flake-compat": "flake-compat_8", + "flake-utils": "flake-utils_17", + "gitignore": "gitignore_2", "nixpkgs": "nixpkgs_17", - "pre-commit-hooks-nix": "pre-commit-hooks-nix_4", - "sphinxcontrib-haddock": "sphinxcontrib-haddock_4" + "nixpkgs-stable": "nixpkgs-stable_2" }, "locked": { - "lastModified": 1656595231, - "narHash": "sha256-3EBhSroECMOSP02qZGT0Zb3QHWibI/tYjdcaT5/YotY=", - "owner": "input-output-hk", - "repo": "plutus", - "rev": "b39a526e983cb931d0cc49b7d073d6d43abd22b5", + "lastModified": 1677832802, + "narHash": "sha256-XQf+k6mBYTiQUjWRf/0fozy5InAs03O1b30adCpWeXs=", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "382bee738397ca005206eefa36922cc10df8a21c", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "plutus", - "type": "github" - } - }, - "plutus_5": { - "inputs": { - "cardano-repo-tool": "cardano-repo-tool_5", - "gitignore-nix": "gitignore-nix_5", - "hackage-nix": "hackage-nix_5", - "haskell-language-server": "haskell-language-server_10", - "haskell-nix": "haskell-nix_10", - "iohk-nix": "iohk-nix_10", - "nixpkgs": "nixpkgs_20", - "pre-commit-hooks-nix": "pre-commit-hooks-nix_5", - "sphinxcontrib-haddock": "sphinxcontrib-haddock_5" - }, - "locked": { - "lastModified": 1656595231, - "narHash": "sha256-3EBhSroECMOSP02qZGT0Zb3QHWibI/tYjdcaT5/YotY=", - "owner": "input-output-hk", - "repo": "plutus", - "rev": "b39a526e983cb931d0cc49b7d073d6d43abd22b5", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "plutus", - "type": "github" - } - }, - "plutus_6": { - "inputs": { - "cardano-repo-tool": "cardano-repo-tool_6", - "gitignore-nix": "gitignore-nix_6", - "hackage-nix": "hackage-nix_6", - "haskell-language-server": "haskell-language-server_12", - "haskell-nix": "haskell-nix_12", - "iohk-nix": "iohk-nix_12", - "nixpkgs": "nixpkgs_24", - "pre-commit-hooks-nix": "pre-commit-hooks-nix_6", - "sphinxcontrib-haddock": "sphinxcontrib-haddock_6" - }, - "locked": { - "lastModified": 1656595231, - "narHash": "sha256-3EBhSroECMOSP02qZGT0Zb3QHWibI/tYjdcaT5/YotY=", - "owner": "input-output-hk", - "repo": "plutus", - "rev": "b39a526e983cb931d0cc49b7d073d6d43abd22b5", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "plutus", - "type": "github" - } - }, - "plutus_7": { - "inputs": { - "cardano-repo-tool": "cardano-repo-tool_7", - "gitignore-nix": "gitignore-nix_7", - "hackage-nix": "hackage-nix_7", - "haskell-language-server": "haskell-language-server_14", - "haskell-nix": "haskell-nix_14", - "iohk-nix": "iohk-nix_14", - "nixpkgs": "nixpkgs_28", - "pre-commit-hooks-nix": "pre-commit-hooks-nix_7", - "sphinxcontrib-haddock": "sphinxcontrib-haddock_7" - }, - "locked": { - "lastModified": 1656595231, - "narHash": "sha256-3EBhSroECMOSP02qZGT0Zb3QHWibI/tYjdcaT5/YotY=", - "owner": "input-output-hk", - "repo": "plutus", - "rev": "b39a526e983cb931d0cc49b7d073d6d43abd22b5", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "plutus", - "type": "github" - } - }, - "plutus_8": { - "inputs": { - "cardano-repo-tool": "cardano-repo-tool_8", - "gitignore-nix": "gitignore-nix_8", - "hackage-nix": "hackage-nix_8", - "haskell-language-server": "haskell-language-server_16", - "haskell-nix": "haskell-nix_16", - "iohk-nix": "iohk-nix_16", - "nixpkgs": "nixpkgs_32", - "pre-commit-hooks-nix": "pre-commit-hooks-nix_8", - "sphinxcontrib-haddock": "sphinxcontrib-haddock_8" - }, - "locked": { - "lastModified": 1656595231, - "narHash": "sha256-3EBhSroECMOSP02qZGT0Zb3QHWibI/tYjdcaT5/YotY=", - "owner": "input-output-hk", - "repo": "plutus", - "rev": "b39a526e983cb931d0cc49b7d073d6d43abd22b5", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "plutus", - "type": "github" - } - }, - "plutus_9": { - "inputs": { - "cardano-repo-tool": "cardano-repo-tool_9", - "gitignore-nix": "gitignore-nix_9", - "hackage-nix": "hackage-nix_9", - "haskell-language-server": "haskell-language-server_18", - "haskell-nix": "haskell-nix_18", - "iohk-nix": "iohk-nix_18", - "nixpkgs": "nixpkgs_37", - "pre-commit-hooks-nix": "pre-commit-hooks-nix_9", - "sphinxcontrib-haddock": "sphinxcontrib-haddock_9" - }, - "locked": { - "lastModified": 1656595231, - "narHash": "sha256-3EBhSroECMOSP02qZGT0Zb3QHWibI/tYjdcaT5/YotY=", - "owner": "input-output-hk", - "repo": "plutus", - "rev": "b39a526e983cb931d0cc49b7d073d6d43abd22b5", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "plutus", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", "type": "github" } }, "pre-commit-hooks-nix": { - "flake": false, - "locked": { - "lastModified": 1624971177, - "narHash": "sha256-Amf/nBj1E77RmbSSmV+hg6YOpR+rddCbbVgo5C7BS0I=", - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "rev": "397f0713d007250a2c7a745e555fa16c5dc8cadb", - "type": "github" + "inputs": { + "flake-compat": "flake-compat_3", + "flake-utils": "flake-utils_5", + "gitignore": "gitignore", + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "hercules-ci-effects", + "hercules-ci-agent", + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable" }, - "original": { - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "type": "github" - } - }, - "pre-commit-hooks-nix_10": { - "flake": false, "locked": { - "lastModified": 1624971177, - "narHash": "sha256-Amf/nBj1E77RmbSSmV+hg6YOpR+rddCbbVgo5C7BS0I=", + "lastModified": 1678376203, + "narHash": "sha256-3tyYGyC8h7fBwncLZy5nCUjTJPrHbmNwp47LlNLOHSM=", "owner": "cachix", "repo": "pre-commit-hooks.nix", - "rev": "397f0713d007250a2c7a745e555fa16c5dc8cadb", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "type": "github" - } - }, - "pre-commit-hooks-nix_11": { - "flake": false, - "locked": { - "lastModified": 1624971177, - "narHash": "sha256-Amf/nBj1E77RmbSSmV+hg6YOpR+rddCbbVgo5C7BS0I=", - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "rev": "397f0713d007250a2c7a745e555fa16c5dc8cadb", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "type": "github" - } - }, - "pre-commit-hooks-nix_12": { - "flake": false, - "locked": { - "lastModified": 1624971177, - "narHash": "sha256-Amf/nBj1E77RmbSSmV+hg6YOpR+rddCbbVgo5C7BS0I=", - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "rev": "397f0713d007250a2c7a745e555fa16c5dc8cadb", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "type": "github" - } - }, - "pre-commit-hooks-nix_13": { - "flake": false, - "locked": { - "lastModified": 1624971177, - "narHash": "sha256-Amf/nBj1E77RmbSSmV+hg6YOpR+rddCbbVgo5C7BS0I=", - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "rev": "397f0713d007250a2c7a745e555fa16c5dc8cadb", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "type": "github" - } - }, - "pre-commit-hooks-nix_14": { - "flake": false, - "locked": { - "lastModified": 1624971177, - "narHash": "sha256-Amf/nBj1E77RmbSSmV+hg6YOpR+rddCbbVgo5C7BS0I=", - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "rev": "397f0713d007250a2c7a745e555fa16c5dc8cadb", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "type": "github" - } - }, - "pre-commit-hooks-nix_15": { - "flake": false, - "locked": { - "lastModified": 1624971177, - "narHash": "sha256-Amf/nBj1E77RmbSSmV+hg6YOpR+rddCbbVgo5C7BS0I=", - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "rev": "397f0713d007250a2c7a745e555fa16c5dc8cadb", + "rev": "1a20b9708962096ec2481eeb2ddca29ed747770a", "type": "github" }, "original": { @@ -12914,13 +7389,23 @@ } }, "pre-commit-hooks-nix_2": { - "flake": false, + "inputs": { + "flake-utils": "flake-utils_11", + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1624971177, - "narHash": "sha256-Amf/nBj1E77RmbSSmV+hg6YOpR+rddCbbVgo5C7BS0I=", + "lastModified": 1663082609, + "narHash": "sha256-lmCCIu4dj59qbzkGKHQtolhpIEQMeAd2XUbXVPqgPYo=", "owner": "cachix", "repo": "pre-commit-hooks.nix", - "rev": "397f0713d007250a2c7a745e555fa16c5dc8cadb", + "rev": "60cad1a326df17a8c6cf2bb23436609fdd83024e", "type": "github" }, "original": { @@ -12930,13 +7415,22 @@ } }, "pre-commit-hooks-nix_3": { - "flake": false, + "inputs": { + "flake-utils": "flake-utils_33", + "nixpkgs": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1624971177, - "narHash": "sha256-Amf/nBj1E77RmbSSmV+hg6YOpR+rddCbbVgo5C7BS0I=", + "lastModified": 1663082609, + "narHash": "sha256-lmCCIu4dj59qbzkGKHQtolhpIEQMeAd2XUbXVPqgPYo=", "owner": "cachix", "repo": "pre-commit-hooks.nix", - "rev": "397f0713d007250a2c7a745e555fa16c5dc8cadb", + "rev": "60cad1a326df17a8c6cf2bb23436609fdd83024e", "type": "github" }, "original": { @@ -12945,14 +7439,17 @@ "type": "github" } }, - "pre-commit-hooks-nix_4": { - "flake": false, + "pre-commit-hooks_2": { + "inputs": { + "flake-utils": "flake-utils_23", + "nixpkgs": "nixpkgs_22" + }, "locked": { - "lastModified": 1624971177, - "narHash": "sha256-Amf/nBj1E77RmbSSmV+hg6YOpR+rddCbbVgo5C7BS0I=", + "lastModified": 1667992213, + "narHash": "sha256-8Ens8ozllvlaFMCZBxg6S7oUyynYx2v7yleC5M0jJsE=", "owner": "cachix", "repo": "pre-commit-hooks.nix", - "rev": "397f0713d007250a2c7a745e555fa16c5dc8cadb", + "rev": "ebcbfe09d2bd6d15f68de3a0ebb1e4dcb5cd324b", "type": "github" }, "original": { @@ -12961,14 +7458,20 @@ "type": "github" } }, - "pre-commit-hooks-nix_5": { - "flake": false, + "pre-commit-hooks_3": { + "inputs": { + "flake-compat": "flake-compat_17", + "flake-utils": "flake-utils_39", + "gitignore": "gitignore_3", + "nixpkgs": "nixpkgs_37", + "nixpkgs-stable": "nixpkgs-stable_3" + }, "locked": { - "lastModified": 1624971177, - "narHash": "sha256-Amf/nBj1E77RmbSSmV+hg6YOpR+rddCbbVgo5C7BS0I=", + "lastModified": 1677832802, + "narHash": "sha256-XQf+k6mBYTiQUjWRf/0fozy5InAs03O1b30adCpWeXs=", "owner": "cachix", "repo": "pre-commit-hooks.nix", - "rev": "397f0713d007250a2c7a745e555fa16c5dc8cadb", + "rev": "382bee738397ca005206eefa36922cc10df8a21c", "type": "github" }, "original": { @@ -12977,582 +7480,16 @@ "type": "github" } }, - "pre-commit-hooks-nix_6": { - "flake": false, - "locked": { - "lastModified": 1624971177, - "narHash": "sha256-Amf/nBj1E77RmbSSmV+hg6YOpR+rddCbbVgo5C7BS0I=", - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "rev": "397f0713d007250a2c7a745e555fa16c5dc8cadb", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "type": "github" - } - }, - "pre-commit-hooks-nix_7": { - "flake": false, - "locked": { - "lastModified": 1624971177, - "narHash": "sha256-Amf/nBj1E77RmbSSmV+hg6YOpR+rddCbbVgo5C7BS0I=", - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "rev": "397f0713d007250a2c7a745e555fa16c5dc8cadb", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "type": "github" - } - }, - "pre-commit-hooks-nix_8": { - "flake": false, - "locked": { - "lastModified": 1624971177, - "narHash": "sha256-Amf/nBj1E77RmbSSmV+hg6YOpR+rddCbbVgo5C7BS0I=", - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "rev": "397f0713d007250a2c7a745e555fa16c5dc8cadb", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "type": "github" - } - }, - "pre-commit-hooks-nix_9": { - "flake": false, - "locked": { - "lastModified": 1624971177, - "narHash": "sha256-Amf/nBj1E77RmbSSmV+hg6YOpR+rddCbbVgo5C7BS0I=", - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "rev": "397f0713d007250a2c7a745e555fa16c5dc8cadb", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "type": "github" - } - }, - "protolude": { - "flake": false, - "locked": { - "lastModified": 1647139352, - "narHash": "sha256-JyHAQfTTUswP8MeGEZibx/2/v01Q7cU5mNpnmDazh24=", - "owner": "protolude", - "repo": "protolude", - "rev": "3e249724fd0ead27370c8c297b1ecd38f92cbd5b", - "type": "github" - }, - "original": { - "owner": "protolude", - "repo": "protolude", - "type": "github" - } - }, - "protolude_10": { - "flake": false, - "locked": { - "lastModified": 1647139352, - "narHash": "sha256-JyHAQfTTUswP8MeGEZibx/2/v01Q7cU5mNpnmDazh24=", - "owner": "protolude", - "repo": "protolude", - "rev": "3e249724fd0ead27370c8c297b1ecd38f92cbd5b", - "type": "github" - }, - "original": { - "owner": "protolude", - "repo": "protolude", - "type": "github" - } - }, - "protolude_11": { - "flake": false, - "locked": { - "lastModified": 1647139352, - "narHash": "sha256-JyHAQfTTUswP8MeGEZibx/2/v01Q7cU5mNpnmDazh24=", - "owner": "protolude", - "repo": "protolude", - "rev": "3e249724fd0ead27370c8c297b1ecd38f92cbd5b", - "type": "github" - }, - "original": { - "owner": "protolude", - "repo": "protolude", - "type": "github" - } - }, - "protolude_12": { - "flake": false, - "locked": { - "lastModified": 1647139352, - "narHash": "sha256-JyHAQfTTUswP8MeGEZibx/2/v01Q7cU5mNpnmDazh24=", - "owner": "protolude", - "repo": "protolude", - "rev": "3e249724fd0ead27370c8c297b1ecd38f92cbd5b", - "type": "github" - }, - "original": { - "owner": "protolude", - "repo": "protolude", - "type": "github" - } - }, - "protolude_13": { - "flake": false, - "locked": { - "lastModified": 1647139352, - "narHash": "sha256-JyHAQfTTUswP8MeGEZibx/2/v01Q7cU5mNpnmDazh24=", - "owner": "protolude", - "repo": "protolude", - "rev": "3e249724fd0ead27370c8c297b1ecd38f92cbd5b", - "type": "github" - }, - "original": { - "owner": "protolude", - "repo": "protolude", - "type": "github" - } - }, - "protolude_14": { - "flake": false, - "locked": { - "lastModified": 1647139352, - "narHash": "sha256-JyHAQfTTUswP8MeGEZibx/2/v01Q7cU5mNpnmDazh24=", - "owner": "protolude", - "repo": "protolude", - "rev": "3e249724fd0ead27370c8c297b1ecd38f92cbd5b", - "type": "github" - }, - "original": { - "owner": "protolude", - "repo": "protolude", - "type": "github" - } - }, - "protolude_15": { - "flake": false, - "locked": { - "lastModified": 1647139352, - "narHash": "sha256-JyHAQfTTUswP8MeGEZibx/2/v01Q7cU5mNpnmDazh24=", - "owner": "protolude", - "repo": "protolude", - "rev": "3e249724fd0ead27370c8c297b1ecd38f92cbd5b", - "type": "github" - }, - "original": { - "owner": "protolude", - "repo": "protolude", - "type": "github" - } - }, - "protolude_2": { - "flake": false, - "locked": { - "lastModified": 1647139352, - "narHash": "sha256-JyHAQfTTUswP8MeGEZibx/2/v01Q7cU5mNpnmDazh24=", - "owner": "protolude", - "repo": "protolude", - "rev": "3e249724fd0ead27370c8c297b1ecd38f92cbd5b", - "type": "github" - }, - "original": { - "owner": "protolude", - "repo": "protolude", - "type": "github" - } - }, - "protolude_3": { - "flake": false, - "locked": { - "lastModified": 1647139352, - "narHash": "sha256-JyHAQfTTUswP8MeGEZibx/2/v01Q7cU5mNpnmDazh24=", - "owner": "protolude", - "repo": "protolude", - "rev": "3e249724fd0ead27370c8c297b1ecd38f92cbd5b", - "type": "github" - }, - "original": { - "owner": "protolude", - "repo": "protolude", - "type": "github" - } - }, - "protolude_4": { - "flake": false, - "locked": { - "lastModified": 1647139352, - "narHash": "sha256-JyHAQfTTUswP8MeGEZibx/2/v01Q7cU5mNpnmDazh24=", - "owner": "protolude", - "repo": "protolude", - "rev": "3e249724fd0ead27370c8c297b1ecd38f92cbd5b", - "type": "github" - }, - "original": { - "owner": "protolude", - "repo": "protolude", - "type": "github" - } - }, - "protolude_5": { - "flake": false, - "locked": { - "lastModified": 1647139352, - "narHash": "sha256-JyHAQfTTUswP8MeGEZibx/2/v01Q7cU5mNpnmDazh24=", - "owner": "protolude", - "repo": "protolude", - "rev": "3e249724fd0ead27370c8c297b1ecd38f92cbd5b", - "type": "github" - }, - "original": { - "owner": "protolude", - "repo": "protolude", - "type": "github" - } - }, - "protolude_6": { - "flake": false, - "locked": { - "lastModified": 1647139352, - "narHash": "sha256-JyHAQfTTUswP8MeGEZibx/2/v01Q7cU5mNpnmDazh24=", - "owner": "protolude", - "repo": "protolude", - "rev": "3e249724fd0ead27370c8c297b1ecd38f92cbd5b", - "type": "github" - }, - "original": { - "owner": "protolude", - "repo": "protolude", - "type": "github" - } - }, - "protolude_7": { - "flake": false, - "locked": { - "lastModified": 1647139352, - "narHash": "sha256-JyHAQfTTUswP8MeGEZibx/2/v01Q7cU5mNpnmDazh24=", - "owner": "protolude", - "repo": "protolude", - "rev": "3e249724fd0ead27370c8c297b1ecd38f92cbd5b", - "type": "github" - }, - "original": { - "owner": "protolude", - "repo": "protolude", - "type": "github" - } - }, - "protolude_8": { - "flake": false, - "locked": { - "lastModified": 1647139352, - "narHash": "sha256-JyHAQfTTUswP8MeGEZibx/2/v01Q7cU5mNpnmDazh24=", - "owner": "protolude", - "repo": "protolude", - "rev": "3e249724fd0ead27370c8c297b1ecd38f92cbd5b", - "type": "github" - }, - "original": { - "owner": "protolude", - "repo": "protolude", - "type": "github" - } - }, - "protolude_9": { - "flake": false, - "locked": { - "lastModified": 1647139352, - "narHash": "sha256-JyHAQfTTUswP8MeGEZibx/2/v01Q7cU5mNpnmDazh24=", - "owner": "protolude", - "repo": "protolude", - "rev": "3e249724fd0ead27370c8c297b1ecd38f92cbd5b", - "type": "github" - }, - "original": { - "owner": "protolude", - "repo": "protolude", - "type": "github" - } - }, "root": { "inputs": { - "haskell-language-server": [ - "plutarch", - "haskell-language-server" - ], - "haskell-nix": [ - "plutarch", - "haskell-nix" - ], - "haskell-nix-extra-hackage": [ - "plutarch", - "haskell-nix-extra-hackage" - ], - "iohk-nix": [ - "plutarch", - "iohk-nix" - ], - "liqwid-nix": "liqwid-nix", - "liqwid-plutarch-extra": "liqwid-plutarch-extra", + "flake-parts": "flake-parts", + "liqwid-libs": "liqwid-libs", + "liqwid-nix": "liqwid-nix_2", "nixpkgs": [ - "plutarch", + "liqwid-nix", "nixpkgs" ], - "nixpkgs-2111": "nixpkgs-2111_9", - "nixpkgs-latest": "nixpkgs-latest_9", - "plutarch": "plutarch_5", - "plutarch-context-builder": "plutarch-context-builder_2", - "plutarch-numeric": "plutarch-numeric_2", - "plutarch-quickcheck": "plutarch-quickcheck_2", - "plutarch-safe-money": "plutarch-safe-money", - "plutarch-script-export": "plutarch-script-export" - } - }, - "secp256k1-haskell": { - "flake": false, - "locked": { - "lastModified": 1650290419, - "narHash": "sha256-XrjiqCC7cNTFib78gdMPGNettAkwAxQlbC/n+/mRFt4=", - "owner": "haskoin", - "repo": "secp256k1-haskell", - "rev": "3df963ab6ae14ec122691a97af09a7331511a387", - "type": "github" - }, - "original": { - "owner": "haskoin", - "repo": "secp256k1-haskell", - "type": "github" - } - }, - "secp256k1-haskell_10": { - "flake": false, - "locked": { - "lastModified": 1650290419, - "narHash": "sha256-XrjiqCC7cNTFib78gdMPGNettAkwAxQlbC/n+/mRFt4=", - "owner": "haskoin", - "repo": "secp256k1-haskell", - "rev": "3df963ab6ae14ec122691a97af09a7331511a387", - "type": "github" - }, - "original": { - "owner": "haskoin", - "repo": "secp256k1-haskell", - "type": "github" - } - }, - "secp256k1-haskell_11": { - "flake": false, - "locked": { - "lastModified": 1650290419, - "narHash": "sha256-XrjiqCC7cNTFib78gdMPGNettAkwAxQlbC/n+/mRFt4=", - "owner": "haskoin", - "repo": "secp256k1-haskell", - "rev": "3df963ab6ae14ec122691a97af09a7331511a387", - "type": "github" - }, - "original": { - "owner": "haskoin", - "repo": "secp256k1-haskell", - "type": "github" - } - }, - "secp256k1-haskell_12": { - "flake": false, - "locked": { - "lastModified": 1650290419, - "narHash": "sha256-XrjiqCC7cNTFib78gdMPGNettAkwAxQlbC/n+/mRFt4=", - "owner": "haskoin", - "repo": "secp256k1-haskell", - "rev": "3df963ab6ae14ec122691a97af09a7331511a387", - "type": "github" - }, - "original": { - "owner": "haskoin", - "repo": "secp256k1-haskell", - "type": "github" - } - }, - "secp256k1-haskell_13": { - "flake": false, - "locked": { - "lastModified": 1650290419, - "narHash": "sha256-XrjiqCC7cNTFib78gdMPGNettAkwAxQlbC/n+/mRFt4=", - "owner": "haskoin", - "repo": "secp256k1-haskell", - "rev": "3df963ab6ae14ec122691a97af09a7331511a387", - "type": "github" - }, - "original": { - "owner": "haskoin", - "repo": "secp256k1-haskell", - "type": "github" - } - }, - "secp256k1-haskell_14": { - "flake": false, - "locked": { - "lastModified": 1650290419, - "narHash": "sha256-XrjiqCC7cNTFib78gdMPGNettAkwAxQlbC/n+/mRFt4=", - "owner": "haskoin", - "repo": "secp256k1-haskell", - "rev": "3df963ab6ae14ec122691a97af09a7331511a387", - "type": "github" - }, - "original": { - "owner": "haskoin", - "repo": "secp256k1-haskell", - "type": "github" - } - }, - "secp256k1-haskell_15": { - "flake": false, - "locked": { - "lastModified": 1650290419, - "narHash": "sha256-XrjiqCC7cNTFib78gdMPGNettAkwAxQlbC/n+/mRFt4=", - "owner": "haskoin", - "repo": "secp256k1-haskell", - "rev": "3df963ab6ae14ec122691a97af09a7331511a387", - "type": "github" - }, - "original": { - "owner": "haskoin", - "repo": "secp256k1-haskell", - "type": "github" - } - }, - "secp256k1-haskell_2": { - "flake": false, - "locked": { - "lastModified": 1650290419, - "narHash": "sha256-XrjiqCC7cNTFib78gdMPGNettAkwAxQlbC/n+/mRFt4=", - "owner": "haskoin", - "repo": "secp256k1-haskell", - "rev": "3df963ab6ae14ec122691a97af09a7331511a387", - "type": "github" - }, - "original": { - "owner": "haskoin", - "repo": "secp256k1-haskell", - "type": "github" - } - }, - "secp256k1-haskell_3": { - "flake": false, - "locked": { - "lastModified": 1650290419, - "narHash": "sha256-XrjiqCC7cNTFib78gdMPGNettAkwAxQlbC/n+/mRFt4=", - "owner": "haskoin", - "repo": "secp256k1-haskell", - "rev": "3df963ab6ae14ec122691a97af09a7331511a387", - "type": "github" - }, - "original": { - "owner": "haskoin", - "repo": "secp256k1-haskell", - "type": "github" - } - }, - "secp256k1-haskell_4": { - "flake": false, - "locked": { - "lastModified": 1650290419, - "narHash": "sha256-XrjiqCC7cNTFib78gdMPGNettAkwAxQlbC/n+/mRFt4=", - "owner": "haskoin", - "repo": "secp256k1-haskell", - "rev": "3df963ab6ae14ec122691a97af09a7331511a387", - "type": "github" - }, - "original": { - "owner": "haskoin", - "repo": "secp256k1-haskell", - "type": "github" - } - }, - "secp256k1-haskell_5": { - "flake": false, - "locked": { - "lastModified": 1650290419, - "narHash": "sha256-XrjiqCC7cNTFib78gdMPGNettAkwAxQlbC/n+/mRFt4=", - "owner": "haskoin", - "repo": "secp256k1-haskell", - "rev": "3df963ab6ae14ec122691a97af09a7331511a387", - "type": "github" - }, - "original": { - "owner": "haskoin", - "repo": "secp256k1-haskell", - "type": "github" - } - }, - "secp256k1-haskell_6": { - "flake": false, - "locked": { - "lastModified": 1650290419, - "narHash": "sha256-XrjiqCC7cNTFib78gdMPGNettAkwAxQlbC/n+/mRFt4=", - "owner": "haskoin", - "repo": "secp256k1-haskell", - "rev": "3df963ab6ae14ec122691a97af09a7331511a387", - "type": "github" - }, - "original": { - "owner": "haskoin", - "repo": "secp256k1-haskell", - "type": "github" - } - }, - "secp256k1-haskell_7": { - "flake": false, - "locked": { - "lastModified": 1650290419, - "narHash": "sha256-XrjiqCC7cNTFib78gdMPGNettAkwAxQlbC/n+/mRFt4=", - "owner": "haskoin", - "repo": "secp256k1-haskell", - "rev": "3df963ab6ae14ec122691a97af09a7331511a387", - "type": "github" - }, - "original": { - "owner": "haskoin", - "repo": "secp256k1-haskell", - "type": "github" - } - }, - "secp256k1-haskell_8": { - "flake": false, - "locked": { - "lastModified": 1650290419, - "narHash": "sha256-XrjiqCC7cNTFib78gdMPGNettAkwAxQlbC/n+/mRFt4=", - "owner": "haskoin", - "repo": "secp256k1-haskell", - "rev": "3df963ab6ae14ec122691a97af09a7331511a387", - "type": "github" - }, - "original": { - "owner": "haskoin", - "repo": "secp256k1-haskell", - "type": "github" - } - }, - "secp256k1-haskell_9": { - "flake": false, - "locked": { - "lastModified": 1650290419, - "narHash": "sha256-XrjiqCC7cNTFib78gdMPGNettAkwAxQlbC/n+/mRFt4=", - "owner": "haskoin", - "repo": "secp256k1-haskell", - "rev": "3df963ab6ae14ec122691a97af09a7331511a387", - "type": "github" - }, - "original": { - "owner": "haskoin", - "repo": "secp256k1-haskell", - "type": "github" + "nixpkgs-latest": "nixpkgs-latest_2" } }, "sphinxcontrib-haddock": { @@ -13571,102 +7508,6 @@ "type": "github" } }, - "sphinxcontrib-haddock_10": { - "flake": false, - "locked": { - "lastModified": 1594136664, - "narHash": "sha256-O9YT3iCUBHP3CEF88VDLLCO2HSP3HqkNA2q2939RnVY=", - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "rev": "f3956b3256962b2d27d5a4e96edb7951acf5de34", - "type": "github" - }, - "original": { - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "type": "github" - } - }, - "sphinxcontrib-haddock_11": { - "flake": false, - "locked": { - "lastModified": 1594136664, - "narHash": "sha256-O9YT3iCUBHP3CEF88VDLLCO2HSP3HqkNA2q2939RnVY=", - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "rev": "f3956b3256962b2d27d5a4e96edb7951acf5de34", - "type": "github" - }, - "original": { - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "type": "github" - } - }, - "sphinxcontrib-haddock_12": { - "flake": false, - "locked": { - "lastModified": 1594136664, - "narHash": "sha256-O9YT3iCUBHP3CEF88VDLLCO2HSP3HqkNA2q2939RnVY=", - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "rev": "f3956b3256962b2d27d5a4e96edb7951acf5de34", - "type": "github" - }, - "original": { - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "type": "github" - } - }, - "sphinxcontrib-haddock_13": { - "flake": false, - "locked": { - "lastModified": 1594136664, - "narHash": "sha256-O9YT3iCUBHP3CEF88VDLLCO2HSP3HqkNA2q2939RnVY=", - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "rev": "f3956b3256962b2d27d5a4e96edb7951acf5de34", - "type": "github" - }, - "original": { - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "type": "github" - } - }, - "sphinxcontrib-haddock_14": { - "flake": false, - "locked": { - "lastModified": 1594136664, - "narHash": "sha256-O9YT3iCUBHP3CEF88VDLLCO2HSP3HqkNA2q2939RnVY=", - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "rev": "f3956b3256962b2d27d5a4e96edb7951acf5de34", - "type": "github" - }, - "original": { - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "type": "github" - } - }, - "sphinxcontrib-haddock_15": { - "flake": false, - "locked": { - "lastModified": 1594136664, - "narHash": "sha256-O9YT3iCUBHP3CEF88VDLLCO2HSP3HqkNA2q2939RnVY=", - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "rev": "f3956b3256962b2d27d5a4e96edb7951acf5de34", - "type": "github" - }, - "original": { - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "type": "github" - } - }, "sphinxcontrib-haddock_2": { "flake": false, "locked": { @@ -13683,222 +7524,14 @@ "type": "github" } }, - "sphinxcontrib-haddock_3": { - "flake": false, - "locked": { - "lastModified": 1594136664, - "narHash": "sha256-O9YT3iCUBHP3CEF88VDLLCO2HSP3HqkNA2q2939RnVY=", - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "rev": "f3956b3256962b2d27d5a4e96edb7951acf5de34", - "type": "github" - }, - "original": { - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "type": "github" - } - }, - "sphinxcontrib-haddock_4": { - "flake": false, - "locked": { - "lastModified": 1594136664, - "narHash": "sha256-O9YT3iCUBHP3CEF88VDLLCO2HSP3HqkNA2q2939RnVY=", - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "rev": "f3956b3256962b2d27d5a4e96edb7951acf5de34", - "type": "github" - }, - "original": { - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "type": "github" - } - }, - "sphinxcontrib-haddock_5": { - "flake": false, - "locked": { - "lastModified": 1594136664, - "narHash": "sha256-O9YT3iCUBHP3CEF88VDLLCO2HSP3HqkNA2q2939RnVY=", - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "rev": "f3956b3256962b2d27d5a4e96edb7951acf5de34", - "type": "github" - }, - "original": { - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "type": "github" - } - }, - "sphinxcontrib-haddock_6": { - "flake": false, - "locked": { - "lastModified": 1594136664, - "narHash": "sha256-O9YT3iCUBHP3CEF88VDLLCO2HSP3HqkNA2q2939RnVY=", - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "rev": "f3956b3256962b2d27d5a4e96edb7951acf5de34", - "type": "github" - }, - "original": { - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "type": "github" - } - }, - "sphinxcontrib-haddock_7": { - "flake": false, - "locked": { - "lastModified": 1594136664, - "narHash": "sha256-O9YT3iCUBHP3CEF88VDLLCO2HSP3HqkNA2q2939RnVY=", - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "rev": "f3956b3256962b2d27d5a4e96edb7951acf5de34", - "type": "github" - }, - "original": { - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "type": "github" - } - }, - "sphinxcontrib-haddock_8": { - "flake": false, - "locked": { - "lastModified": 1594136664, - "narHash": "sha256-O9YT3iCUBHP3CEF88VDLLCO2HSP3HqkNA2q2939RnVY=", - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "rev": "f3956b3256962b2d27d5a4e96edb7951acf5de34", - "type": "github" - }, - "original": { - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "type": "github" - } - }, - "sphinxcontrib-haddock_9": { - "flake": false, - "locked": { - "lastModified": 1594136664, - "narHash": "sha256-O9YT3iCUBHP3CEF88VDLLCO2HSP3HqkNA2q2939RnVY=", - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "rev": "f3956b3256962b2d27d5a4e96edb7951acf5de34", - "type": "github" - }, - "original": { - "owner": "michaelpj", - "repo": "sphinxcontrib-haddock", - "type": "github" - } - }, "stackage": { "flake": false, "locked": { - "lastModified": 1654046327, - "narHash": "sha256-IxX46Dh4OZpF3k7KPMa3tZSScYYGqFxXpCnMc0QRkuQ=", + "lastModified": 1668388618, + "narHash": "sha256-2gWOWqdwtruJ+Dj2yCFQz+SDNC58LEsUdI1FycKXzYQ=", "owner": "input-output-hk", "repo": "stackage.nix", - "rev": "cc1d778723fcd431f9b2ed632a50c610c3e38b54", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "stackage.nix", - "type": "github" - } - }, - "stackage_10": { - "flake": false, - "locked": { - "lastModified": 1654046327, - "narHash": "sha256-IxX46Dh4OZpF3k7KPMa3tZSScYYGqFxXpCnMc0QRkuQ=", - "owner": "input-output-hk", - "repo": "stackage.nix", - "rev": "cc1d778723fcd431f9b2ed632a50c610c3e38b54", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "stackage.nix", - "type": "github" - } - }, - "stackage_11": { - "flake": false, - "locked": { - "lastModified": 1654046327, - "narHash": "sha256-IxX46Dh4OZpF3k7KPMa3tZSScYYGqFxXpCnMc0QRkuQ=", - "owner": "input-output-hk", - "repo": "stackage.nix", - "rev": "cc1d778723fcd431f9b2ed632a50c610c3e38b54", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "stackage.nix", - "type": "github" - } - }, - "stackage_12": { - "flake": false, - "locked": { - "lastModified": 1654046327, - "narHash": "sha256-IxX46Dh4OZpF3k7KPMa3tZSScYYGqFxXpCnMc0QRkuQ=", - "owner": "input-output-hk", - "repo": "stackage.nix", - "rev": "cc1d778723fcd431f9b2ed632a50c610c3e38b54", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "stackage.nix", - "type": "github" - } - }, - "stackage_13": { - "flake": false, - "locked": { - "lastModified": 1654046327, - "narHash": "sha256-IxX46Dh4OZpF3k7KPMa3tZSScYYGqFxXpCnMc0QRkuQ=", - "owner": "input-output-hk", - "repo": "stackage.nix", - "rev": "cc1d778723fcd431f9b2ed632a50c610c3e38b54", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "stackage.nix", - "type": "github" - } - }, - "stackage_14": { - "flake": false, - "locked": { - "lastModified": 1654046327, - "narHash": "sha256-IxX46Dh4OZpF3k7KPMa3tZSScYYGqFxXpCnMc0QRkuQ=", - "owner": "input-output-hk", - "repo": "stackage.nix", - "rev": "cc1d778723fcd431f9b2ed632a50c610c3e38b54", - "type": "github" - }, - "original": { - "owner": "input-output-hk", - "repo": "stackage.nix", - "type": "github" - } - }, - "stackage_15": { - "flake": false, - "locked": { - "lastModified": 1654046327, - "narHash": "sha256-IxX46Dh4OZpF3k7KPMa3tZSScYYGqFxXpCnMc0QRkuQ=", - "owner": "input-output-hk", - "repo": "stackage.nix", - "rev": "cc1d778723fcd431f9b2ed632a50c610c3e38b54", + "rev": "754e9647154ba2ea5ff5c6e5549ecc98898b7a90", "type": "github" }, "original": { @@ -13910,11 +7543,11 @@ "stackage_2": { "flake": false, "locked": { - "lastModified": 1654046327, - "narHash": "sha256-IxX46Dh4OZpF3k7KPMa3tZSScYYGqFxXpCnMc0QRkuQ=", + "lastModified": 1670890221, + "narHash": "sha256-kV7irjUr4Ot3b2MwTcgVKYuEe+legxhGh4ApBeESy1s=", "owner": "input-output-hk", "repo": "stackage.nix", - "rev": "cc1d778723fcd431f9b2ed632a50c610c3e38b54", + "rev": "56f59c2d4ecdb237348a0774274f38874f81a3ca", "type": "github" }, "original": { @@ -13926,11 +7559,11 @@ "stackage_3": { "flake": false, "locked": { - "lastModified": 1654046327, - "narHash": "sha256-IxX46Dh4OZpF3k7KPMa3tZSScYYGqFxXpCnMc0QRkuQ=", + "lastModified": 1667351848, + "narHash": "sha256-gXjvvU0hW8NtbuFyCy+hzp669sEMAubS0zhMIPg/QOg=", "owner": "input-output-hk", "repo": "stackage.nix", - "rev": "cc1d778723fcd431f9b2ed632a50c610c3e38b54", + "rev": "128fd7fcb43c96ae422b4b1b3d485a40432848de", "type": "github" }, "original": { @@ -13942,11 +7575,11 @@ "stackage_4": { "flake": false, "locked": { - "lastModified": 1654046327, - "narHash": "sha256-IxX46Dh4OZpF3k7KPMa3tZSScYYGqFxXpCnMc0QRkuQ=", + "lastModified": 1668388618, + "narHash": "sha256-2gWOWqdwtruJ+Dj2yCFQz+SDNC58LEsUdI1FycKXzYQ=", "owner": "input-output-hk", "repo": "stackage.nix", - "rev": "cc1d778723fcd431f9b2ed632a50c610c3e38b54", + "rev": "754e9647154ba2ea5ff5c6e5549ecc98898b7a90", "type": "github" }, "original": { @@ -13958,11 +7591,11 @@ "stackage_5": { "flake": false, "locked": { - "lastModified": 1654046327, - "narHash": "sha256-IxX46Dh4OZpF3k7KPMa3tZSScYYGqFxXpCnMc0QRkuQ=", + "lastModified": 1668388618, + "narHash": "sha256-2gWOWqdwtruJ+Dj2yCFQz+SDNC58LEsUdI1FycKXzYQ=", "owner": "input-output-hk", "repo": "stackage.nix", - "rev": "cc1d778723fcd431f9b2ed632a50c610c3e38b54", + "rev": "754e9647154ba2ea5ff5c6e5549ecc98898b7a90", "type": "github" }, "original": { @@ -13974,11 +7607,11 @@ "stackage_6": { "flake": false, "locked": { - "lastModified": 1654046327, - "narHash": "sha256-IxX46Dh4OZpF3k7KPMa3tZSScYYGqFxXpCnMc0QRkuQ=", + "lastModified": 1670890221, + "narHash": "sha256-kV7irjUr4Ot3b2MwTcgVKYuEe+legxhGh4ApBeESy1s=", "owner": "input-output-hk", "repo": "stackage.nix", - "rev": "cc1d778723fcd431f9b2ed632a50c610c3e38b54", + "rev": "56f59c2d4ecdb237348a0774274f38874f81a3ca", "type": "github" }, "original": { @@ -13990,11 +7623,11 @@ "stackage_7": { "flake": false, "locked": { - "lastModified": 1654046327, - "narHash": "sha256-IxX46Dh4OZpF3k7KPMa3tZSScYYGqFxXpCnMc0QRkuQ=", + "lastModified": 1667351848, + "narHash": "sha256-gXjvvU0hW8NtbuFyCy+hzp669sEMAubS0zhMIPg/QOg=", "owner": "input-output-hk", "repo": "stackage.nix", - "rev": "cc1d778723fcd431f9b2ed632a50c610c3e38b54", + "rev": "128fd7fcb43c96ae422b4b1b3d485a40432848de", "type": "github" }, "original": { @@ -14003,35 +7636,979 @@ "type": "github" } }, - "stackage_8": { - "flake": false, + "std": { + "inputs": { + "blank": "blank", + "devshell": "devshell", + "dmerge": "dmerge", + "flake-utils": "flake-utils_3", + "makes": [ + "liqwid-libs", + "liqwid-nix", + "haskell-nix", + "tullia", + "std", + "blank" + ], + "mdbook-kroki-preprocessor": "mdbook-kroki-preprocessor", + "microvm": [ + "liqwid-libs", + "liqwid-nix", + "haskell-nix", + "tullia", + "std", + "blank" + ], + "n2c": "n2c", + "nixago": "nixago", + "nixpkgs": "nixpkgs_4", + "yants": "yants" + }, "locked": { - "lastModified": 1654046327, - "narHash": "sha256-IxX46Dh4OZpF3k7KPMa3tZSScYYGqFxXpCnMc0QRkuQ=", - "owner": "input-output-hk", - "repo": "stackage.nix", - "rev": "cc1d778723fcd431f9b2ed632a50c610c3e38b54", + "lastModified": 1665513321, + "narHash": "sha256-D6Pacw9yf/HMs84KYuCxHXnNDL7v43gtcka5URagFqE=", + "owner": "divnix", + "repo": "std", + "rev": "94a90eedb9cfc115b12ae8f6622d9904788559e4", "type": "github" }, "original": { - "owner": "input-output-hk", - "repo": "stackage.nix", + "owner": "divnix", + "repo": "std", "type": "github" } }, - "stackage_9": { - "flake": false, + "std_2": { + "inputs": { + "blank": "blank_2", + "devshell": "devshell_2", + "dmerge": "dmerge_2", + "flake-utils": "flake-utils_8", + "makes": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "std", + "blank" + ], + "mdbook-kroki-preprocessor": "mdbook-kroki-preprocessor_2", + "microvm": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "std", + "blank" + ], + "n2c": "n2c_2", + "nixago": "nixago_2", + "nixpkgs": "nixpkgs_10", + "yants": "yants_2" + }, "locked": { - "lastModified": 1654046327, - "narHash": "sha256-IxX46Dh4OZpF3k7KPMa3tZSScYYGqFxXpCnMc0QRkuQ=", + "lastModified": 1665513321, + "narHash": "sha256-D6Pacw9yf/HMs84KYuCxHXnNDL7v43gtcka5URagFqE=", + "owner": "divnix", + "repo": "std", + "rev": "94a90eedb9cfc115b12ae8f6622d9904788559e4", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "std", + "type": "github" + } + }, + "std_3": { + "inputs": { + "blank": "blank_3", + "devshell": "devshell_3", + "dmerge": "dmerge_3", + "flake-utils": "flake-utils_12", + "makes": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "std", + "blank" + ], + "mdbook-kroki-preprocessor": "mdbook-kroki-preprocessor_3", + "microvm": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "std", + "blank" + ], + "n2c": "n2c_3", + "nixago": "nixago_3", + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "nixpkgs" + ], + "yants": "yants_3" + }, + "locked": { + "lastModified": 1665252656, + "narHash": "sha256-RHktFB35O/KjK2P21E+TtCR8sIpoowGFGZPC0KOT0rg=", + "owner": "divnix", + "repo": "std", + "rev": "2240a587e19e1610d967a72e5409176bc6908244", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "std", + "type": "github" + } + }, + "std_4": { + "inputs": { + "blank": "blank_4", + "devshell": "devshell_4", + "dmerge": "dmerge_4", + "flake-utils": "flake-utils_15", + "makes": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "std", + "blank" + ], + "mdbook-kroki-preprocessor": "mdbook-kroki-preprocessor_4", + "microvm": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "std", + "blank" + ], + "n2c": "n2c_4", + "nixago": "nixago_4", + "nixpkgs": "nixpkgs_16", + "yants": "yants_4" + }, + "locked": { + "lastModified": 1665513321, + "narHash": "sha256-D6Pacw9yf/HMs84KYuCxHXnNDL7v43gtcka5URagFqE=", + "owner": "divnix", + "repo": "std", + "rev": "94a90eedb9cfc115b12ae8f6622d9904788559e4", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "std", + "type": "github" + } + }, + "std_5": { + "inputs": { + "blank": "blank_5", + "devshell": "devshell_5", + "dmerge": "dmerge_5", + "flake-utils": "flake-utils_21", + "makes": [ + "liqwid-libs", + "ply", + "haskellNix", + "tullia", + "std", + "blank" + ], + "mdbook-kroki-preprocessor": "mdbook-kroki-preprocessor_5", + "microvm": [ + "liqwid-libs", + "ply", + "haskellNix", + "tullia", + "std", + "blank" + ], + "n2c": "n2c_5", + "nixago": "nixago_5", + "nixpkgs": "nixpkgs_21", + "yants": "yants_5" + }, + "locked": { + "lastModified": 1665513321, + "narHash": "sha256-D6Pacw9yf/HMs84KYuCxHXnNDL7v43gtcka5URagFqE=", + "owner": "divnix", + "repo": "std", + "rev": "94a90eedb9cfc115b12ae8f6622d9904788559e4", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "std", + "type": "github" + } + }, + "std_6": { + "inputs": { + "blank": "blank_6", + "devshell": "devshell_6", + "dmerge": "dmerge_6", + "flake-utils": "flake-utils_26", + "makes": [ + "liqwid-nix", + "haskell-nix", + "tullia", + "std", + "blank" + ], + "mdbook-kroki-preprocessor": "mdbook-kroki-preprocessor_6", + "microvm": [ + "liqwid-nix", + "haskell-nix", + "tullia", + "std", + "blank" + ], + "n2c": "n2c_6", + "nixago": "nixago_6", + "nixpkgs": "nixpkgs_26", + "yants": "yants_6" + }, + "locked": { + "lastModified": 1665513321, + "narHash": "sha256-D6Pacw9yf/HMs84KYuCxHXnNDL7v43gtcka5URagFqE=", + "owner": "divnix", + "repo": "std", + "rev": "94a90eedb9cfc115b12ae8f6622d9904788559e4", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "std", + "type": "github" + } + }, + "std_7": { + "inputs": { + "blank": "blank_7", + "devshell": "devshell_7", + "dmerge": "dmerge_7", + "flake-utils": "flake-utils_30", + "makes": [ + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "std", + "blank" + ], + "mdbook-kroki-preprocessor": "mdbook-kroki-preprocessor_7", + "microvm": [ + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "std", + "blank" + ], + "n2c": "n2c_7", + "nixago": "nixago_7", + "nixpkgs": "nixpkgs_30", + "yants": "yants_7" + }, + "locked": { + "lastModified": 1665513321, + "narHash": "sha256-D6Pacw9yf/HMs84KYuCxHXnNDL7v43gtcka5URagFqE=", + "owner": "divnix", + "repo": "std", + "rev": "94a90eedb9cfc115b12ae8f6622d9904788559e4", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "std", + "type": "github" + } + }, + "std_8": { + "inputs": { + "blank": "blank_8", + "devshell": "devshell_8", + "dmerge": "dmerge_8", + "flake-utils": "flake-utils_34", + "makes": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "std", + "blank" + ], + "mdbook-kroki-preprocessor": "mdbook-kroki-preprocessor_8", + "microvm": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "std", + "blank" + ], + "n2c": "n2c_8", + "nixago": "nixago_8", + "nixpkgs": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "nixpkgs" + ], + "yants": "yants_8" + }, + "locked": { + "lastModified": 1665252656, + "narHash": "sha256-RHktFB35O/KjK2P21E+TtCR8sIpoowGFGZPC0KOT0rg=", + "owner": "divnix", + "repo": "std", + "rev": "2240a587e19e1610d967a72e5409176bc6908244", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "std", + "type": "github" + } + }, + "std_9": { + "inputs": { + "blank": "blank_9", + "devshell": "devshell_9", + "dmerge": "dmerge_9", + "flake-utils": "flake-utils_37", + "makes": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "std", + "blank" + ], + "mdbook-kroki-preprocessor": "mdbook-kroki-preprocessor_9", + "microvm": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "std", + "blank" + ], + "n2c": "n2c_9", + "nixago": "nixago_9", + "nixpkgs": "nixpkgs_36", + "yants": "yants_9" + }, + "locked": { + "lastModified": 1665513321, + "narHash": "sha256-D6Pacw9yf/HMs84KYuCxHXnNDL7v43gtcka5URagFqE=", + "owner": "divnix", + "repo": "std", + "rev": "94a90eedb9cfc115b12ae8f6622d9904788559e4", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "std", + "type": "github" + } + }, + "tooling": { + "inputs": { + "cardano-haskell-packages": "cardano-haskell-packages", + "emanote": "emanote", + "flake-parts": "flake-parts_7", + "haskell-nix": "haskell-nix_2", + "iohk-nix": "iohk-nix_2", + "nixpkgs": "nixpkgs_11", + "plutus": "plutus" + }, + "locked": { + "lastModified": 1675797045, + "narHash": "sha256-FO6MX9hcXoTf2bUyO5o2BTlzKDVtLSuBX2lOwsLEcQs=", + "owner": "mlabs-haskell", + "repo": "mlabs-tooling.nix", + "rev": "6f78b002ab2c477a928a9332b6e0e18828cffc62", + "type": "github" + }, + "original": { + "owner": "mlabs-haskell", + "repo": "mlabs-tooling.nix", + "type": "github" + } + }, + "tooling_2": { + "inputs": { + "cardano-haskell-packages": "cardano-haskell-packages_2", + "emanote": "emanote_2", + "flake-parts": "flake-parts_10", + "haskell-nix": "haskell-nix_5", + "iohk-nix": "iohk-nix_5", + "nixpkgs": "nixpkgs_31", + "plutus": "plutus_2" + }, + "locked": { + "lastModified": 1675797045, + "narHash": "sha256-FO6MX9hcXoTf2bUyO5o2BTlzKDVtLSuBX2lOwsLEcQs=", + "owner": "mlabs-haskell", + "repo": "mlabs-tooling.nix", + "rev": "6f78b002ab2c477a928a9332b6e0e18828cffc62", + "type": "github" + }, + "original": { + "owner": "mlabs-haskell", + "repo": "mlabs-tooling.nix", + "type": "github" + } + }, + "tullia": { + "inputs": { + "nix-nomad": "nix-nomad", + "nix2container": "nix2container", + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "haskell-nix", + "nixpkgs" + ], + "std": "std" + }, + "locked": { + "lastModified": 1666200256, + "narHash": "sha256-cJPS8zBu30SMhxMe7I8DWutwqMuhPsEez87y9gxMKc4=", "owner": "input-output-hk", - "repo": "stackage.nix", - "rev": "cc1d778723fcd431f9b2ed632a50c610c3e38b54", + "repo": "tullia", + "rev": "575362c2244498e8d2c97f72861510fa72e75d44", "type": "github" }, "original": { "owner": "input-output-hk", - "repo": "stackage.nix", + "repo": "tullia", + "type": "github" + } + }, + "tullia_2": { + "inputs": { + "nix-nomad": "nix-nomad_2", + "nix2container": "nix2container_2", + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "nixpkgs" + ], + "std": "std_2" + }, + "locked": { + "lastModified": 1668711738, + "narHash": "sha256-CBjky16o9pqsGE1bWu6nRlRajgSXMEk+yaFQLibqXcE=", + "owner": "input-output-hk", + "repo": "tullia", + "rev": "ead1f515c251f0e060060ef0e2356a51d3dfe4b0", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "tullia", + "type": "github" + } + }, + "tullia_3": { + "inputs": { + "nix-nomad": "nix-nomad_3", + "nix2container": "nix2container_3", + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "nixpkgs" + ], + "std": "std_4" + }, + "locked": { + "lastModified": 1670354948, + "narHash": "sha256-TF5KX7Al0xz6I+Cx84zeeWthSASlxTeJZmPBLSZ3e9c=", + "owner": "input-output-hk", + "repo": "tullia", + "rev": "b40dc577bb43b440645fb081d88df72b20a4bd57", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "ref": "gh-comment", + "repo": "tullia", + "type": "github" + } + }, + "tullia_4": { + "inputs": { + "nix-nomad": "nix-nomad_4", + "nix2container": "nix2container_4", + "nixpkgs": [ + "liqwid-libs", + "ply", + "haskellNix", + "nixpkgs" + ], + "std": "std_5" + }, + "locked": { + "lastModified": 1666200256, + "narHash": "sha256-cJPS8zBu30SMhxMe7I8DWutwqMuhPsEez87y9gxMKc4=", + "owner": "input-output-hk", + "repo": "tullia", + "rev": "575362c2244498e8d2c97f72861510fa72e75d44", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "tullia", + "type": "github" + } + }, + "tullia_5": { + "inputs": { + "nix-nomad": "nix-nomad_5", + "nix2container": "nix2container_5", + "nixpkgs": [ + "liqwid-nix", + "haskell-nix", + "nixpkgs" + ], + "std": "std_6" + }, + "locked": { + "lastModified": 1666200256, + "narHash": "sha256-cJPS8zBu30SMhxMe7I8DWutwqMuhPsEez87y9gxMKc4=", + "owner": "input-output-hk", + "repo": "tullia", + "rev": "575362c2244498e8d2c97f72861510fa72e75d44", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "tullia", + "type": "github" + } + }, + "tullia_6": { + "inputs": { + "nix-nomad": "nix-nomad_6", + "nix2container": "nix2container_6", + "nixpkgs": [ + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "nixpkgs" + ], + "std": "std_7" + }, + "locked": { + "lastModified": 1668711738, + "narHash": "sha256-CBjky16o9pqsGE1bWu6nRlRajgSXMEk+yaFQLibqXcE=", + "owner": "input-output-hk", + "repo": "tullia", + "rev": "ead1f515c251f0e060060ef0e2356a51d3dfe4b0", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "repo": "tullia", + "type": "github" + } + }, + "tullia_7": { + "inputs": { + "nix-nomad": "nix-nomad_7", + "nix2container": "nix2container_7", + "nixpkgs": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "nixpkgs" + ], + "std": "std_9" + }, + "locked": { + "lastModified": 1670354948, + "narHash": "sha256-TF5KX7Al0xz6I+Cx84zeeWthSASlxTeJZmPBLSZ3e9c=", + "owner": "input-output-hk", + "repo": "tullia", + "rev": "b40dc577bb43b440645fb081d88df72b20a4bd57", + "type": "github" + }, + "original": { + "owner": "input-output-hk", + "ref": "gh-comment", + "repo": "tullia", + "type": "github" + } + }, + "utils": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "utils_2": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "utils_3": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "utils_4": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "utils_5": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "utils_6": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "utils_7": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "yants": { + "inputs": { + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "haskell-nix", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1660507851, + "narHash": "sha256-BKjq7JnVuUR/xDtcv6Vm9GYGKAblisXrAgybor9hT/s=", + "owner": "divnix", + "repo": "yants", + "rev": "0b895ca02a8fa72bad50b454cb3e7d8a66407c96", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "yants", + "type": "github" + } + }, + "yants_2": { + "inputs": { + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1660507851, + "narHash": "sha256-BKjq7JnVuUR/xDtcv6Vm9GYGKAblisXrAgybor9hT/s=", + "owner": "divnix", + "repo": "yants", + "rev": "0b895ca02a8fa72bad50b454cb3e7d8a66407c96", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "yants", + "type": "github" + } + }, + "yants_3": { + "inputs": { + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1660507851, + "narHash": "sha256-BKjq7JnVuUR/xDtcv6Vm9GYGKAblisXrAgybor9hT/s=", + "owner": "divnix", + "repo": "yants", + "rev": "0b895ca02a8fa72bad50b454cb3e7d8a66407c96", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "yants", + "type": "github" + } + }, + "yants_4": { + "inputs": { + "nixpkgs": [ + "liqwid-libs", + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1660507851, + "narHash": "sha256-BKjq7JnVuUR/xDtcv6Vm9GYGKAblisXrAgybor9hT/s=", + "owner": "divnix", + "repo": "yants", + "rev": "0b895ca02a8fa72bad50b454cb3e7d8a66407c96", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "yants", + "type": "github" + } + }, + "yants_5": { + "inputs": { + "nixpkgs": [ + "liqwid-libs", + "ply", + "haskellNix", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1660507851, + "narHash": "sha256-BKjq7JnVuUR/xDtcv6Vm9GYGKAblisXrAgybor9hT/s=", + "owner": "divnix", + "repo": "yants", + "rev": "0b895ca02a8fa72bad50b454cb3e7d8a66407c96", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "yants", + "type": "github" + } + }, + "yants_6": { + "inputs": { + "nixpkgs": [ + "liqwid-nix", + "haskell-nix", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1660507851, + "narHash": "sha256-BKjq7JnVuUR/xDtcv6Vm9GYGKAblisXrAgybor9hT/s=", + "owner": "divnix", + "repo": "yants", + "rev": "0b895ca02a8fa72bad50b454cb3e7d8a66407c96", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "yants", + "type": "github" + } + }, + "yants_7": { + "inputs": { + "nixpkgs": [ + "liqwid-nix", + "plutarch", + "tooling", + "haskell-nix", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1660507851, + "narHash": "sha256-BKjq7JnVuUR/xDtcv6Vm9GYGKAblisXrAgybor9hT/s=", + "owner": "divnix", + "repo": "yants", + "rev": "0b895ca02a8fa72bad50b454cb3e7d8a66407c96", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "yants", + "type": "github" + } + }, + "yants_8": { + "inputs": { + "nixpkgs": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1660507851, + "narHash": "sha256-BKjq7JnVuUR/xDtcv6Vm9GYGKAblisXrAgybor9hT/s=", + "owner": "divnix", + "repo": "yants", + "rev": "0b895ca02a8fa72bad50b454cb3e7d8a66407c96", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "yants", + "type": "github" + } + }, + "yants_9": { + "inputs": { + "nixpkgs": [ + "liqwid-nix", + "plutarch", + "tooling", + "plutus", + "tullia", + "std", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1660507851, + "narHash": "sha256-BKjq7JnVuUR/xDtcv6Vm9GYGKAblisXrAgybor9hT/s=", + "owner": "divnix", + "repo": "yants", + "rev": "0b895ca02a8fa72bad50b454cb3e7d8a66407c96", + "type": "github" + }, + "original": { + "owner": "divnix", + "repo": "yants", "type": "github" } } diff --git a/flake.nix b/flake.nix index d60ca23..d033f85 100644 --- a/flake.nix +++ b/flake.nix @@ -1,109 +1,84 @@ { description = "agora"; - inputs = { - nixpkgs.follows = "plutarch/nixpkgs"; - nixpkgs-latest.url = "github:NixOS/nixpkgs?rev=cf63df0364f67848083ff75bc8ac9b7ca7aa5a01"; - # temporary fix for nix versions that have the transitive follows bug - # see https://github.com/NixOS/nix/issues/6013 - nixpkgs-2111 = { url = "github:NixOS/nixpkgs/nixpkgs-21.11-darwin"; }; - - haskell-nix-extra-hackage.follows = "plutarch/haskell-nix-extra-hackage"; - haskell-nix.follows = "plutarch/haskell-nix"; - iohk-nix.follows = "plutarch/iohk-nix"; - haskell-language-server.follows = "plutarch/haskell-language-server"; - - # Plutarch and its friends - plutarch = { - url = "github:Plutonomicon/plutarch-plutus?ref=staging"; - - inputs.emanote.follows = - "plutarch/haskell-nix/nixpkgs-unstable"; - inputs.nixpkgs.follows = - "plutarch/haskell-nix/nixpkgs-unstable"; - }; - - plutarch-numeric.url = - "github:Liqwid-Labs/plutarch-numeric?ref=main"; - plutarch-safe-money.url = - "github:Liqwid-Labs/plutarch-safe-money?ref=main"; - liqwid-plutarch-extra.url = - "github:Liqwid-Labs/liqwid-plutarch-extra?ref=plutus-v1"; - plutarch-quickcheck.url = - "github:liqwid-labs/plutarch-quickcheck?ref=staging"; - plutarch-context-builder.url = - "github:Liqwid-Labs/plutarch-context-builder?ref=plutus-v1"; - plutarch-script-export.url = - "github:Liqwid-Labs/plutarch-script-export?ref=main"; - - liqwid-nix.url = "github:Liqwid-Labs/liqwid-nix?ref=main"; + nixConfig = { + extra-experimental-features = [ "nix-command" "flakes" "ca-derivations" ]; + extra-substituters = [ "https://cache.iog.io" "https://mlabs.cachix.org" ]; + extra-trusted-public-keys = [ "hydra.iohk.io:f/Ea+s+dFdN+3Y/G+FDgSq+a5NEWhJGzdjvKNGv0/EQ=" ]; + allow-import-from-derivation = "true"; + max-jobs = "auto"; + auto-optimise-store = "true"; }; - outputs = inputs@{ liqwid-nix, ... }: - let - benchCheckOverlay = self: super: { - toFlake = - let - inherit (self) inputs perSystem pkgsFor'; - flake = super.toFlake or { }; - name = "benchCheck"; - in - flake // { - checks = perSystem (system: - flake.checks.${system} // { - ${name} = - let - pkgs' = pkgsFor' system; - bench = flake.packages.${system}."agora:bench:agora-bench"; - in - pkgs'.runCommand name - { - nativeBuildInputs = [ pkgs'.diffutils ]; - } '' - export LC_CTYPE=C.UTF-8 - export LC_ALL=C.UTF-8 - export LANG=C.UTF-8 - cd ${inputs.self} - ${bench}/bin/agora-bench | diff bench.csv - \ - || (echo "bench.csv is outdated"; exit 1) - mkdir "$out" - ''; - }); + inputs = { + nixpkgs.follows = "liqwid-nix/nixpkgs"; + nixpkgs-latest.url = "github:NixOS/nixpkgs"; + + liqwid-nix = { + url = "github:Liqwid-Labs/liqwid-nix/v2.7.2"; + inputs.nixpkgs-latest.follows = "nixpkgs-latest"; + }; + + liqwid-libs.url = + "github:Liqwid-Labs/liqwid-libs"; + }; + + outputs = inputs@{ self, flake-parts, ... }: + flake-parts.lib.mkFlake { inherit inputs; } { + imports = [ + inputs.liqwid-nix.flakeModule + ]; + systems = [ "x86_64-linux" "aarch64-darwin" "x86_64-darwin" "aarch64-linux" ]; + perSystem = { config, self', inputs', pkgs, system, ... }: + let + pkgs = import inputs.nixpkgs-latest { inherit system; }; + in + { + onchain.default = { + src = ./.; + ghc.version = "ghc925"; + fourmolu.package = pkgs.haskell.packages.ghc943.fourmolu_0_10_1_0; + hlint = { }; + cabalFmt = { }; + hasktags = { }; + applyRefact = { }; + shell = { }; + hoogleImage.enable = false; + enableBuildChecks = true; + extraHackageDeps = [ + "${inputs.liqwid-libs}/plutarch-quickcheck" + "${inputs.liqwid-libs}/plutarch-context-builder" + "${inputs.liqwid-libs}/liqwid-plutarch-extra" + "${inputs.liqwid-libs}/liqwid-script-export" + "${inputs.liqwid-libs.inputs.ply}/ply-core" + "${inputs.liqwid-libs.inputs.ply}/ply-plutarch" + ]; }; - }; - in - (liqwid-nix.buildProject - { - inherit inputs; - src = ./.; - } - [ - liqwid-nix.haskellProject - liqwid-nix.plutarchProject - (liqwid-nix.addDependencies [ - "${inputs.plutarch-numeric}" - "${inputs.plutarch-safe-money}" - "${inputs.plutarch-quickcheck}" - "${inputs.plutarch-context-builder}" - "${inputs.liqwid-plutarch-extra}" - "${inputs.plutarch-script-export}" - ]) - (liqwid-nix.enableFormatCheck [ - "-XQuasiQuotes" - "-XTemplateHaskell" - "-XTypeApplications" - "-XImportQualifiedPost" - "-XPatternSynonyms" - "-XOverloadedRecordDot" - ]) - liqwid-nix.enableLintCheck - liqwid-nix.enableCabalFormatCheck - liqwid-nix.enableNixFormatCheck - liqwid-nix.addBuildChecks - (liqwid-nix.addCommandLineTools (pkgs: _: [ - pkgs.haskellPackages.hasktags - ])) - benchCheckOverlay - ] - ).toFlake; + ci.required = [ "all_onchain" ]; + packages.export = + pkgs.stdenv.mkDerivation { + name = "export"; + src = ./.; + buildInput = [ + self'.packages."agora:exe:agora-scripts" + ]; + buildPhase = '' + export PATH=$PATH:${self'.packages."agora:exe:agora-scripts"}/bin + agora-scripts file --builder raw + agora-scripts file --builder rawDebug + ''; + installPhase = '' + NAME=${if self ? rev then self.shortRev else "dirty"} + mkdir $out + cp raw.json $out/agora-"$NAME".json + cp rawDebug.json $out/agora-debug-"$NAME".json + ''; + }; + }; + + flake.hydraJobs.x86_64-linux = ( + self.checks.x86_64-linux + // self.packages.x86_64-linux + ); + }; }