diff --git a/docs/articles/governance/Proposals/definitions.en.mdx b/docs/articles/governance/Proposals/definitions.en.mdx new file mode 100644 index 0000000..1e2ca37 --- /dev/null +++ b/docs/articles/governance/Proposals/definitions.en.mdx @@ -0,0 +1,107 @@ +# Definitions and Concepts + +## Proposal Types + +### On-Chain Governance + +On-chain governance refers to all protocol level execution of proposals using Cosmos SDK's `gov` module. Anyone who holds or stakes EVMOS can participate in these votes, regardless of the voter's validator choices. + +### Off-Chain Governance + +Off-chain governance refers to all community decisions that do not require an on-chain protocol-level change. These types of decisions include a wide variety of topics and concepts, from passing meta-governance proposals to the formation of special task forces or workstreams. + + +:::tip +All proposals are assumed to be `On-Chain Proposals` until the necessary infrastructure and toolings for `Off-Chain Voting` is established. Cosmos SDK's `TextProposal` will be used for `Off-Chain Proposals` for the time being. +::: + +--- + +## Proposal Types by Category + +### Protocol Proposals + +| Module | Codebase | Parameters | Description | +| -------------- | ------------ | --------------------------------------------------------------------------------- | ----------------| +| `auth` | `cosmos-sdk` | `MaxMemoCharacters` `TxSigLimit` `TxSizeCostPerByte` `SigVerifyCostED25519` `SigVerifyCostSecp256k1` | The auth module is responsible for specifying the base transaction and account types for an application. [Ref.](https://docs.cosmos.network/v0.46/modules/auth/06_params.html) | +| `bank` | `cosmos-sdk` | `SendEnabled` `DefaultSendEnabled` |The bank module is responsible for handling multi-asset coin transfers between accounts and tracking special-case pseudo-transfers which must work differently with particular kinds of accounts. [Ref.](https://docs.cosmos.network/v0.46/modules/bank/05_params.html)| +| `distribution` | `cosmos-sdk` | `communitytax` `baseproposerreward` `bonusproposerreward` `withdrawaddrenabled` |This simple distribution mechanism describes a functional way to passively distribute rewards between validators and delegators. [Ref.](https://docs.cosmos.network/v0.46/modules/distribution/07_params.html) | +| `governance` | `cosmos-sdk` | `min_deposit` `max_deposit_period` `voting_period` `quorum` `threshold` `veto` | The module enables Cosmos-SDK based blockchain to support an on-chain governance system. [Ref.](https://docs.cosmos.network/v0.46/modules/gov/06_params.html) | + +Additional Protocol Proposals: `slashing`, `staking`, `transfer`, `feemarket`, `claims`, `inflation` + +--- + +### Community Proposals + +Proposals that only require to be posted as a `TextProposal` on the Cosmos SDK - *Most commonly used for meta-governance proposals.* + +--- + +### Workstream & Special Initiatives + +Proposals that requests any type of funding from the `CommunityPool` or the DAO's treasury to form an in-house workstream (team, squad, sub-DAO, guild) or project with the direct purpose of benefiting the Evmos ecosystem. + +#### **Workstreams** + +Workstreams are typically DAO-funded teams with a recurring budget with no termination date (i.e., Community Outreach, Marketing & Creative Services, etc). More information on workstreams can be found on the [DAO Workstreams page.](/governance/workstreams/index) + +Workstreams are the sub-units of how Evmos DAO advances its purpose. A workstream is a group of people actively working on tasks that align with Evmos' Constitutional Values and community run initiatives. As such, ratifying workstreams sets boundaries on what is and isn't in scope for Evmos DAO's governance. + +Anyone may start a workstream and gather momentum behind it by posting on Commonwealth. Until a formal proposal for a budget is made, this workstream is considered “informal.” A workstream can be as broad or narrow as its initiators like, but workstream proposals must satisfy the following criteria: + +- Have a clear objective that aligns with Evmos' values and objectives as listed in the [Constitution](/constitution). +- Distinguish itself from or explicitly state its improvements on existing workstreams. +- Propose clear budgets and timelines for producing outcomes and all in line with the budget proposal flow. + +Workstreams have five potential states. Each of the five states and the requirements for a workstream in each state are outlined below: + +- **Informal:** The workstream is not funded by the DAO, and has not made a formal proposal with its goals and a budgetary request. +- **Proposed:** The workstream has made a formal proposal to the DAO for a working budget. +- **Active:** The workstream is active and funded by the DAO. +- **Inactive:** The workstream has been discontinued and is no longer being funded by the DAO. + +#### **Special Initiatives / Projects** + +Special Initiatives and Projects are DAO-funded projects with a set budget and "completion" goal or date (i.e., Governance Tooling Project, Event Sponsorships, etc.) + +--- + +### Protocol Incentives + Evmos Specific Proposals + +| Module | Codebase | Parameters | Description | +| -------------- | ------------ | --------------------------------------------------------------------------------- | ----------------| +| `revenue` | `evmos` | `EnableFeeSplit` `DeveloperShares` `AddrDerivationCostCreate` |[reference](https://docs.evmos.org/modules/feesplit/07_parameters.html) | +| `incentives` | `evmos` | `EnableIncentives` `AllocationLimit` `IncentivesEpochIdentifier` `rewardScaler` |[reference](https://docs.evmos.org/modules/incentives/07_parameters.html) | +| `erc20` | `evmos` | `register_coin` `register_erc20` |[reference](https://docs.evmos.org/modules/erc20/07_parameters.html) | +| `evm` | `evmos` | `ExtraEIPs` `ChainConfig` |[reference](https://docs.evmos.org/modules/evm/08_params.html) | + +--- + +### Network Upgrades & Security + +| Module | Codebase | Parameters | Description | +| -------------- | ------------ | --------------------------------------------------------------------------------- | ----------------| +| `crisis` | `cosmos-sdk` | `ConstantFee` |The crisis module halts the blockchain under the circumstance that a blockchain invariant is broken. [Ref.](https://docs.cosmos.network/v0.46/modules/crisis/04_params.html)| +| `upgrade` | `cosmos-sdk` | `MsgSoftwareUpgrade` | `x/upgrade` is an implementation of a Cosmos SDK module that facilitates smoothly upgrading a live Cosmos chain to a new (breaking) software version. [Ref.](https://docs.cosmos.network/v0.46/modules/upgrade/)| + +:::tip +Emergency and Network Upgrade Proposals are exempt from following the Proposal Lifecycle Framework. The community is expected to do its due dilligence when such proposals are uploaded. +::: + +--- + +## Proposal Phase & Identification Tags + +**You do not need to know the proposal phase and identification naming conventions! A Governance Council member will assist -- the content below is for reference.** + +Proposal Phases are denoted as: `[IDEATION]`, `[PRE-PROPOSAL]`, `[PROPOSAL]`, `[VOTING]` for the 4-phases, and `[PASSED]`, `[REJECTED]`, `[DEFERRED]` for proposals in the other stages. Refer to the [Proposal Lifecycle](/governance/proposals/lifecycle) page for more information on proposal lifecycle phases. + + +:::tip +Proposal Identification Tags are only required for Governance, Workstream (subDAO), and Community Treasury Related Proposals Only +::: + +The `ECP-#` tag will be assigned and added by a Governance Council member in the `Phase 2: ECP Formalization` or `Phase 3: ECP Signaling` phase. **You do not have to worry about adding in the tag yourself.** + +These tags are for internal tracking and organization purposes. Make sure to check the [Proposal Submission Guidelines](/governance/proposals/submission) for more information on how to properly prepare your proposal for on-chain voting. \ No newline at end of file diff --git a/docs/articles/governance/Proposals/index.mdx b/docs/articles/governance/Proposals/index.mdx new file mode 100644 index 0000000..9989baf --- /dev/null +++ b/docs/articles/governance/Proposals/index.mdx @@ -0,0 +1,22 @@ +# Proposals Framework + +## Evmos Community Proposals (ECPs) + +ECPs are standardized proposals subject to voting that (once enacted) regulate and define the behavior of the Evmos DAO's Governance system, and provides a funding mechanism for special projects and workstreams. + +## The Evmos Community Proposal Framework + +The Evmos Community Proposal (ECP) Framework sets the guideline for all subsequent ECPs to follow. This ECP is the foundational ECP that provides the necessary templates, processes, and guidelines for working within the framework and defines the key roles required for the operation and enforcement of the ECP process. + +### ECP Framework Components + +[**1. Definitions of the ECP Framework**](/governance/proposals/definitions) - *Defines core concepts of the ECP Framework and the different types of proposals.* + +[**2. The ECP Lifecycle**](/governance/proposals/lifecycle) - *Defines the formal stages in the lifecycle of proposals from conception to approval, rejection, or deferral.* + +[**3. ECP Standards and Templates**](/governance/proposals/templates) - *Defines the processes, rules, and components required for all proposals before going to vote.* + +[**4. ECP Submission Guidelines**](/governance/proposals/submission) - *Defines the proposal submission procedures and guidelines for on-chain voting.* + +[**5. Evmos Governance Council**](/governance/workstreams/current#governance-council-wip) - *Defines the responsibilities and enforcement powers reserved to the Governance Council of Evmos DAO.* + diff --git a/docs/articles/governance/Proposals/lifecycle.en.mdx b/docs/articles/governance/Proposals/lifecycle.en.mdx new file mode 100644 index 0000000..31d8142 --- /dev/null +++ b/docs/articles/governance/Proposals/lifecycle.en.mdx @@ -0,0 +1,77 @@ +import ContentTimeline from '/src/components/ProposalSteps'; + +# Proposal Lifecycle + + + +## **Phase 1**: Discussion & Ideation + +The purpose of this phase is to vet ideas with the active Evmos community members. Each idea for a proposal should have its own Commonwealth thread, and discussions should be as narrowly focused as possible. Anyone can participate and is encouraged to provide feedback in this phase of governance. The goal of Phase 1 discussion is to gain a rough community consensus, and refine the idea so that it can be formalized. The thread author should make an effort to address all comments and take them into consideration. + +- **Minimum Duration:** 48 hours +- **Forum Tag:** `[IDEATION]` + +## **Phase 2**: ECP Formalization + +Phase 2 is where the idea is formalized into an ECP that includes all of the criteria specified in the ECP Template. It must be a clear and complete description of the proposed enhancement. All ECPs must have the following core components, **with additional/varying sections for certain proposal types (refer to the [templates page](/governance/proposals/templates))**: + +:::tip +

Title: Short and sweet, with the [correct tags](/governance/proposals/definitions#proposal-phase--identification-tags) prefixed.

+
+ +**Summary** - A brief, high-level summary of what changes are being suggested. Summary should be a single sentence, or a bulleted list. + +**Authors** - List of authors and contributors involved in the writing of the proposal. + +**Abstract** - Abstract is a multi-sentence (short paragraph) technical summary. This should be a very terse and human-readable version of the motivation and specification sections. Someone should be able to read only the abstract to get the gist of what this specification does. + +**Motivation** - The motivation section should describe the "why" of this proposal. What problem does it solve? What benefit does it provide to the Evmos network? + +**Proposal Type Specific Content** + +Make sure to double check your proposal type to see what [additional information or details are required](/governance/proposals/templates). **Especially for funding proposals!** +::: + +- **Minimum Duration:** 72 hours (3 days) +- **Forum Tag:** `[PRE-PROPOSAL]` + + +## **Phase 3**: ECP Signaling (Temperature Check) + +At any point during Phase 2, the author may finalize the ECP by initiating a community temperature check. To do this, the author must change the tag of the forum post to `[PROPOSAL]`, and add a forum poll to gauge the community sentiment. + +Proposals should only move to Phase 3 once the author has considered all community comments, responded to all concerns and questions, and believes that the proposal is ready to go on-chain for a final network-wide vote. Proposals in Phase 3 should not be edited further with the exception of minor mistakes. + +**Forum Tag:** `[PROPOSAL]` + + +## **Phase 4**: On-Chain Voting + +If the signaling polls in Phase 3 show an overall positive sentiment and no major issues are brought up, the proposal may be submitted on-chain for the formal voting. Submission guidelines [are listed here](/governance/proposals/submission). + +**Forum Tag (Depending on Outcome):** `[VOTING]`, `[PASSED]`, `[REJECTED]`, `[VETO]` + +## Proposal Lifecycle Flowchart + +![Proposal Lifecycle](/img/lifecycle-flowchart.png) + +## Other ECP Statuses + +- **Withdrawn:** Assigned when a member withdraws their proposal, or if the proposal is abandoned with no activity. **Forum Tag:** `[WITHDRAWN]` +- **Deferred:** Assigned when a proposal has been deemed as not ready or not a priority but can be re-proposed at a later date. This status can be assigned during Phase 3 with a failed forum poll or signaling. **Forum Tag:** `[DEFER]` + +## Governance Council & Core Devs + +**Governance Council** + +The Evmos DAO Governance Council may "fast-track" a proposal onto on-chain voting for time-sensitive and urgent matters. The Council must provide the community a post-mortem on why the Council deemed it was necessary to forego the Proposal Lifecycle. If the community deems that the decision was made in bad faith, the Community is encouraged to engage in discussions and hold the responsible parties responsible through disciplinary actions or even the removal of Council members through an on-chain vote. + +**Core Developers** + +Core developers are not bound to the ECP Framework for network and protocol related proposals. It is expected, however, that thorough testing and due diligence is performed by the developers for all network upgrades. It should be noted, however, that network upgrades must still go through the process of on-chain voting. + +## Assistance & Review + +All proposers are welcome to approach the Governance Workstream for assistance in any part of the Proposal Lifecycle. In addition, proposers may request a formal review of the proposal before going on chain. + + diff --git a/docs/articles/governance/Proposals/submission.en.mdx b/docs/articles/governance/Proposals/submission.en.mdx new file mode 100644 index 0000000..b7a8309 --- /dev/null +++ b/docs/articles/governance/Proposals/submission.en.mdx @@ -0,0 +1,211 @@ +# Submission Guidelines + +## Preparing the Proposal Payload + +Many proposals allow for long form text to be included, usually under the key `description`. These provide the opportunity to include [markdown](https://www.markdownguide.org/) if formatted correctly as well as line breaks with `\n`. Beware, however, that if you are using the CLI to create a proposal, and setting `description` using a flag, the text will be [escaped](https://en.wikipedia.org/wiki/Escape_sequences_in_C) which may have undesired effects. If you're using markdown or line breaks it's recommended to put the proposal text into a json file and include that file as part of the CLI proposal, as opposed to individual fields in flags. + +### Attaching Metadata + +**YAML Frontmatter** + +Although not a technical requirement, it is highly recommended that you upload your complete proposal onto IPFS with the following metadata at the very beginning. For more information on YAML frontmatter, refer to [this documentation.](https://assemble.io/docs/YAML-front-matter.html) + +```yaml + +--- +title: Launching the Evmos Liquidity Incentives Program +authors: Tricky, Benny Lava, LPX +proposal: ECP-PS-1 +type: CommunityPoolSpend +funding_amt: 2000000 +discussion: https://commonwealth.im/evmos/discussion/6977-prevote-kickstart-defi-on-evmos +polls: https://bafybeieyr4vsc3gubivurtvvuunhmkl3uqvsuv3zuag34gnh3xzgdyzcpe.ipfs.w3s.link/polls.json +govreviewed: true +created_at: 2022-09-17T19:14:49.280Z + +--- + +``` + +At the end of the on-chain proposal, provide the IPFS hash or IPNS link to the proposal with the metadata with a simple `IPFS: ` at the end. This data will be used in the future for indexing and analysis purposes for off-chain governance. + +### Text Proposals + +`TextProposal` are used by delegators to agree to a certain strategy, plan, commitment, future upgrade, or any other statement in the form of text. Aside from having a record of the proposal outcome on the Evmos chain, a text proposal has no direct effect on Evmos. + +**TextProposal Example Payload** + +[Proposal 1](https://commonwealth.im/evmos/proposal/1-airdrop-claim-mission) was representative of one of four core network activities that users had to participate in to claim tokens from the Evmos Rektdrop. + +```json +{ + "title": "Airdrop Claim Mission", + "description": "Vote to claim", + "deposit": "10000000000000000000aevmos" +} +``` + +### Community Pool + +For community pool spend proposals, there are five components: +
    +
  1. 1. **Title** - the distinguishing name of the proposal, typically the way the that explorers list proposals
  2. +
  3. 2. **Description** - the body of the proposal that further describes what is being proposed and details surrounding the proposal
  4. +
  5. 3. **Recipient** - the Evmos (bech32-based) address that will receive funding from the Community Pool
  6. +
  7. 4. **Amount** - the amount of funding that the recipient will receive in atto-EVMOS (`aevmos`)
  8. +
  9. 5. **Deposit** - the amount that will be contributed to the deposit (in `aevmos`) from the account submitting the proposal
  10. +
+ +**Community Pool Spend Payloads** + +In this simple example (below), a network explorer will list the governance proposal as a `CommunityPoolSpendProposal`. When an observer selects the proposal, they'll see the description. Not all explorers will show the recipient and amount, so ensure that you verify that the description aligns with the what the governance proposal is programmed to enact. If the description says that a certain address will receive a certain number of EVMOS, it should also be programmed to do that, but it's possible that that's not the case (accidentally or otherwise). + +The `amount` is `1000000000000000000aevmos`. This is equal to 1 EVMOS, so `recipient` address `evmos1mx9nqk5agvlsvt2yc8259nwztmxq7zjq50mxkp` will receive 1 EVMOS if this proposal is passed. + +The `deposit` of `64000000000000000000aevmos` results in 64 EVMOS being used from the proposal submitter's account. There is a minimum deposit required for a proposal to enter the voting period, and anyone may contribute to this deposit within a 5-day period. If the minimum deposit isn't reached before this time, the deposit amounts will be burned. Deposit amounts will also be burned if quorum isn't met in the vote or if the proposal is vetoed. + +**CommunityPoolSpend Example Payload** + +```json + +// JSON PROPOSAL PAYLOAD + +{ + "title": "Community Pool Spend", + "description": "This is the summary of the key information about this proposal. Include the URL to a PDF version of your full proposal.", + "recipient": "evmos1mx9nqk5agvlsvt2yc8259nwztmxq7zjq50mxkp", + "amount": [ + { + "denom": "aevmos", + "amount": "1000000000000000000" + } + ], + "deposit": "64000000000000000000aevmos" +} + +``` + +### Parameter Change + +Changes to the `gov` module are different from the other kinds of parameter changes because `gov` has subkeys, [as discussed here](https://github.com/cosmos/cosmos-sdk/issues/5800). + +For parameter-change proposals, there are seven components: + +
    +
  1. 1. **Title** - the distinguishing name of the proposal, typically the way the that explorers list proposals
  2. +
  3. 2. **Description** - the body of the proposal that further describes what is being proposed and details surrounding the proposal
  4. +
  5. 3. **Subspace** - the Evmos module with the parameter that is being changed
  6. +
  7. 4. **Key** - the parameter that will be changed
  8. +
  9. 5. **Value** - the value of the parameter that will be changed by the governance mechanism
  10. +
  11. 6. **Denom** - `aevmos` (atto-EVMOS) will be the type of asset used as the deposit
  12. +
  13. 7. **Amount** - the amount that will be contributed to the deposit (in `aevmos`) from the account submitting the proposal
  14. +
+ +**ParamChange Proposal Example** + +In the example below, a network explorer listed the governance proposal by its title: "Increase the minimum deposit for governance proposals." When a user selects the proposal, they'll see the proposal’s description. This proposal can be [found on the Evmos network here](https://commonwealth.im/evmos/proposal/7-increase-the-minimum-deposit-for-governance-proposals). + +Not all explorers will show the proposed parameter changes that are coded into the proposal, so the delegator should verify that the description aligns with what the governance proposal is programmed to enact. If the description says that a certain parameter will be increased, it should also be programmed to do that, but it's possible that that's not the case (accidentally or otherwise). + +Users can query the proposal details with the evmosd command-line interface using this command: + + +`evmosd --node https://tendermint.bd.evmos.org:26657 query gov proposal 7` + +```json +{ + "title": "Increase the minimum deposit for governance proposals", + "description": "If successful, this parameter-change governance proposal will change the minimum deposit for future proposals from 10 evmos tokens to 64.", + "changes": [ + { + "subspace": "gov", + "key": "depositparams", + "value": {"mindeposit":[{"denom":"aevmos","amount":"64000000000000000000"}], + "max_deposit_period":"1209600000000000"} + } + ], + "deposit": "20100000000000000000aevmos" +} +``` + +The deposit `denom` is `aevmos` and `amount` is `20100000000000000000`. Therefore, a deposit of 20.1 EVMOS will be included with this proposal. At the time, the EVMOS mainnet had a 10 EVMOS minimum deposit, so this proposal was put directly into the voting period (and subsequently passed). There is a minimum deposit required for a proposal to enter the voting period, and anyone may contribute to this deposit within a 5-day period. If the minimum deposit isn't reached before this time, the deposit amounts will be burned. + +## Submitting the Proposal + +For information on how to use `evmosd` binary to submit an on-chain proposal through the governance module. + +
    +
  1. 1. `evmosd` is the command-line interface client that is used to send transactions and query Evmos
  2. +
  3. 2. `tx gov submit-proposal param-change` indicates that the transaction is submitting a parameter-change proposal
  4. +
  5. 3. `--from mykey` is the account key that pays the transaction fee and deposit amount
  6. +
  7. 4. `--gas 500000` is the maximum amount of gas permitted to be used to process the transaction + - the more content there is in the description of your proposal, the more gas your transaction will consume + - if this number isn't high enough and there isn't enough gas to process your transaction, the transaction will fail + - the transaction will only use the amount of gas needed to process the transaction
  8. +
  9. 5. `--gas-prices` is the flat-rate per unit of gas value for a validator to process your transaction
  10. +
  11. 6. `--chain-id evmos_9001-2` is Evmos Mainnet. + - the testnet chain ID is `evmos_9000-4`. For current and past testnet information, please look at the [testnet repository](https://github.com/evmos/testnets)
  12. +
  13. 7. `--node` is using a full node to send the transaction to the Evmos Mainnet
  14. +
+ +### Testnet Submission + +You may want to submit your proposal to the testnet chain before the mainnet for a number of reasons: + +
    +
  1. 1. To see what the proposal description will look like
  2. +
  3. 2. To signal that your proposal is about to go live on the mainnet
  4. +
  5. 3. To share what the proposal will look like in advance with stakeholders
  6. +
  7. 4. To test the functionality of the governance features
  8. +
+ +Submitting your proposal to the testnet increases the likelihood that you will discover a flaw before deploying your proposal on mainnet. A few things to keep in mind: + +- you'll need testnet tokens for your proposal +- the parameters for testnet proposals are different (eg. voting period timing, deposit amount, deposit denomination) +- the deposit denomination is in `'atevmos'` instead of `'aevmos'` + +```mdx highlight=5,7-8 +evmosd tx gov submit-proposal \ + --title= \ + --description=<description> \ + --type="Text" \ + --deposit="1000000atevmos" \ + --from=<mykey> \ + --chain-id="evmos_9000-4" + --node <testnet-address> +``` + +### Mainnet Submission + +This is the command format for using `evmosd` (the command-line interface) to submit your proposal on-chain: + +```mdx highlight=5,7-8 +evmosd tx gov submit-proposal \ + --title=<title> \ + --description=<description> \ + --type="Text" \ + --deposit="1000000aevmos" \ + --from=<mykey> \ + --chain-id="evmos_9001-2" + --node <address> +``` +Use the `evmos tx gov --help` flag to get more info about the governance commands + +## Deposit Period + +The deposit period lasts either 3 days or until the proposal deposit totals 192 EVMOS, whichever happens first. + +### Deposits + +Deposit amounts are at risk of being burned. Prior to a governance proposal entering the voting period (ie. for the proposal to be voted upon), there must be at least a minimum number of EVMOS deposited (192). Anyone may contribute to this deposit. Deposits of passed and failed proposals are returned to the contributors. + +In the past, different people have considered contributions amounts differently. There is some consensus that this should be a personal choice. There is also some consensus that this can be an opportunity for supporters to signal their support by adding to the deposit amount, so a proposer may choose to leave contribution room (ie. a deposit below 192 EVMOS) so that others may participate. It is important to remember that any contributed EVMOS are at risk of being burned. + +### Burned deposits + +Deposits are burned when proposals: + +1. **Expire** - deposits will be burned if the deposit period ends before reaching the minimum deposit (192 EVMOS) +2. **Fail to reach quorum** - deposits will be burned for proposals that do not reach quorum ie. 33.4% of all staked EVMOS must vote +3. **Are vetoed** - deposits for proposals with 33.4% of voting power backing the `NoWithVeto` option are also burned diff --git a/docs/articles/governance/Proposals/templates.en.mdx b/docs/articles/governance/Proposals/templates.en.mdx new file mode 100644 index 0000000..7f1d039 --- /dev/null +++ b/docs/articles/governance/Proposals/templates.en.mdx @@ -0,0 +1,138 @@ +# Formatting & Templates + +The Evmos Governance Framework allows for various different types of proposals, both on-chain and off-chain. This section serves as a basic guide for the necessary components of proposals. Depending on the proposal type, certain components may be required. Use this table as a reference sheet for which of the following components are required for your type. + +## A. Universal Components + +All proposals must include the following **Proposal Components**. + +:::tip +<p style={{ fontSize: '0.9rem'}}>**Title** - Short and sweet, with the [correct tags](/governance/proposals/definitions#proposal-phase--identification-tags) prefixed.</p> + +<p style={{ fontSize: '0.9rem'}}>**Author(s)** - List of authors and contributors involved in the writing of the proposal.</p> + +<p style={{ fontSize: '0.9rem'}}>**Summary** - A brief, high-level summary of what changes are being suggested. Summary should be a single sentence, or a bulleted list.</p> + +<p style={{ fontSize: '0.9rem'}}>**Abstract** - Abstract is a multi-sentence (short paragraph) technical summary. This should be a very terse and human-readable version of the motivation and specification sections. Someone should be able to read only the abstract to get the gist of what this specification does.</p> + +<p style={{ fontSize: '0.9rem'}}>**Motivation** - The motivation section should describe the "why" of this proposal. What problem does it solve? What benefit does it provide to the Evmos network?</p> +::: + +## B. Project/Protocol Introduction + +:::tip +<h3 style={{ marginTop: 0 }}>Project / Initiative Specification</h3> +<hr /> + +<h4>Project & Team Introduction</h4> + +A quick introduction to the project or initiative: what it is, how it works, why the project is unique, and why your team can knock it out of the park. + +<h4>Background & Context</h4> + +Background information on the project, such as where the inspiration came from, why you're passionate about it, how long you have been working on it, previous funding rounds (if applicable). + +<h4>Achievements & Obstacles</h4> + +List all the achievements you have managed to accomplish so far, and the obstacles or blockers that you have hit. + +<h4>Project Goals</h4> +<ul> +<li>Short Term Goals (1-4 months)</li> +<li>Mid Term Goals (4-12 months)</li> +<li>Long Term Goals (12+ months)</li> +<li>Success Metrics and/or KPIs to measure the growth of your project</li> +</ul> +::: + +## C. Funding Request +:::tip +<h3 style={{ marginTop: 0 }}>Fund Utilization and Distribution</h3> +<hr /> + +<h4>Amount of Funds Requested</h4> + +What is the total amount of funds that are being requested from the community pool? Are you pegging it to EVMOS token amount or USD? + +<h4>Fund Utilization Plan</h4> + +Justify your funding request with an itemized list of how the funds will be used. + +<h4>Multisig Wallet Signatories</h4> + +Who will be the signatories on the multisig wallet? If not using a multisig wallet, what is the justification? How will the project be held accountable? + +<h4>Fund Distribution Method</h4> + +Detail and justify the distribution stages of the funds. If requesting a full distribution, explain the need for the full amount, how the project will be held accountable. + +**Example of a milestone-based approach:** + +| Stage | Milestone, KPI, or Project Goal | Relevant Details | Amount Released | +| --- | --- | --- | --- | +| Kickoff | Released Upon the Passing of Proposal | Funds will be used for the work done by Foo and compensate Bar for XYZ. | 10% | +| 1 of 5 | Testnet Release (Milestone A) | Funds released when our project is live on testnet which will mark the beginning of Milestone A as listed in section X) | 10% | +| 2 of 5 | Completion of Security Audits | Funds released when our smart contracts have gone through security audits outlined in Short Term Goals in Section X) | 20% | +| 3 of 5 | Mainnet Launch (Milestone B) | Funds released when our project is launched on mainnet, which is listed as Milestone B in section X) | 20% | +| 4 of 5 | Protocol v2 Proposed | Funds released when the plans for our upgraded v2 is announced and detailed, as outlined in Midterm Goals in Section X) | 20% | +| 5 of 5 | v2 Launch | Final release of funds on the launch of v2 as listed in Milestone X. | 20% | + +**Example of a timeline-based distribution approach:** + +This proposal will fund the Evmos Marketing Workstream for a period of 6 months. Each month, 1/6th of the total amount will be released to the workstreams’ multisig (address: __________________), and workstream contributors compensation will be paid out in accordance with the Fund Utilization Plan outlined in Section X. + +If at any point the community believes that the Marketing Workstream is not fulfilling its duty to the best of its ability, the community may propose to return the funds to the pool, or hold the funds until the core marketing team can prove that X has been implemented and Y has been replaced with Z. + +<h4>Closing Statements</h4> + +Final thoughts and details that you wish to convey to the community. +::: + +## D. Workstreams & Special Initiatives +:::tip +Anyone may start a workstream and gather momentum behind it by posting on Commonwealth. For more information on Workstream proposals, refer to [this section](/governance/proposals/definitions#workstream--special-initiatives). + + +<h3 style={{ marginTop: 0 }}>Workstream (Sub-DAO, Team, Committee) Proposals</h3> +<hr /> + +<h4>Workstream Introduction</h4> + +- Introduce the workstream or subDAO that you are proposing. What are your mission, visions, and values? +- How does it bring value to the Evmos ecosystem or the DAO? +- Does the workstream that is being proposed have any overlap with existing workstreams? + +<h4>Primary Duties</h4> + +What are the primary duties of the workstream? + +<h4>Projects and Initiatives</h4> + +What are some of the projects and initiatives that will be launched to achieve your mission and duties? + +<h4>Progress Reports and Achievements</h4> + +If the workstream was previously working informally, what did it achieve? If going straight from ideation to funding, what are you and your workstream members' qualifications? + +<h4>Milestones and Timelines</h4> + +<ul> + <li>What are the key milestones for the workstream?</li> + <li>If there is a timeline associated with your workstream, share with the community!</li> +</ul> + +<h4>Workstream Members and Organizational Structure</h4> + +<ul> + <li>Steward(s) / Leader(s): Who are the members managing the workstream and accountable for its outcomes?</li> + <li>Members: who is committed to working on this project and what are their responsibilities?</li> + <li>Compensation: what is the compensation amount per member, how will compensation work, and justify the amounts.</li> +</ul> + +<h4>Total Budget</h4> + +What amount is required for the workstream to achieve the initial target, and how will it be spent? +::: +## F. Protocol (ParamChange) Proposals + +Refer to the [official Evmos documentation](https://docs.evmos.org/users/governance/param_change.html) for protocol and `ParamChange` proposals. \ No newline at end of file diff --git a/docs/articles/governance/Workstreams/current.en.mdx b/docs/articles/governance/Workstreams/current.en.mdx new file mode 100644 index 0000000..f4d7eb9 --- /dev/null +++ b/docs/articles/governance/Workstreams/current.en.mdx @@ -0,0 +1,437 @@ +import Card from '@mui/material/Card'; +import Box from '@mui/material/Box'; +import Divider from '@mui/material/Divider'; +import Chip from '@mui/material/Chip'; +import Tabs from '@mui/material/Tabs'; +import Tab from '@mui/material/Tab'; +import Typography from '@mui/material/Typography'; +import LaunchIcon from '@mui/icons-material/Launch'; +import Values from '/src/components/WSValues'; +import FundingTable from '/src/components/FundingRequest'; +import TabPanel from '/src/components/ContentTabs'; + +# Operating Workstreams + +Workstreams have five potential states. Each of the five states and the requirements for a workstream in each state are outlined below: + +- **⚪ Informal:** The workstream is not funded by the DAO, and has not made a formal proposal with its goals and a budgetary request. +- **🟡 Proposed:** The workstream has made a formal proposal to the DAO for a working budget. +- **🟢 Active:** The workstream is active and funded by the DAO. +- **🛑 Inactive:** The workstream has been discontinued and is no longer being funded by the DAO. + +## Overview + + +| 🔌 | Workstream | Mission | Budget | Established | +|---|---|---|---|---| +| ⚪ | [Governance Council](/governance/workstreams/current#governance-council) | Protect, improve, and serve the Evmos network and community with neutrality and transparency. | TBD | Jul 22 | +| ⚪ | [Community Mod & Support](/governance/workstreams/current#community-moderation-and-support) | Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. | TBD | Jun 22 | + + +## Informal Workstreams + +### Governance Council (WIP) + + <Box mt={3}> + <Card sx={{ padding: '40px', pt: 0, backgroundColor: '#1212128f', backgroundImage: 'unset' }}> + <Divider textAlign="center" sx={{ mt: 2, mb: 2, fontWeight: 700, fontSize: '1.1rem'}}> + <Chip label="Workstream Introduction" /> + </Divider> + +Decentralized governance is a double-edged sword with constant challenges to overcome and often burdened with inefficient processes. It is also the beauty and soul of a DAO, with the ethos of decentralization and equality at the very core. The Governance Council exists and operates as a neutral party with allegiances only to the Evmos network and the guiding values of the Evmos Constitution. While the workstream is tasked with various duties, our mandate is simple: to facilitate and protect the integrity of Evmos' governance processes and, to the best of our ability, create a fair and transparent environment in which the network and the community can prosper and thrive. + + <Values + mission="Protect, improve, and serve the Evmos network and community with neutrality and transparency." + vision="To see Evmos DAO evolve into a fully decentralized and self-sustainable organization that is capable of propelling the growth of the network." + values="Progressive Decentralization, Continuous Improvement, Hybrid Governance" + /> + + <Divider textAlign="center" sx={{ mt: 3, mb: 2, fontWeight: 700}}> + <Chip label="Workstream Scope and Duties" /> + </Divider> + +<h4>Primary Duties</h4> + + <Divider sx={{ mt: 2, mb: 2, fontWeight: 700}} /> + +<div className="duties"> + +**A. Governance Framework Improvement & Implementation** + +- The Constitution must be completed and amended as promised in Proposal 51, which ratified the *Interim* Constitution. +- The Evmos Governance Framework serves to empower each member of the community by providing clear and standardized methods of interacting with the wider DAO, thereby defining its future shape and trajectory. It is crucial that we strive to continuously improve our processes. +- Governance processes that have been passed by the community must be implemented and enforced assuming that they adhere to the Guiding Principles of our Constitution. +- We must be diligent in listening to the community's feedback on governance painpoints, shortcomings, and inefficiencies. +- We must strive to fix or improve inefficiencies and shortcomings when a viable plan is ideated or presented. +- We must continue our research and observations into other DAOs and remain up to date with evolving DAO philosophies, tools, and scientific research. + +**B. Growing Governance Participation & Engagement** + +- The strength of our governance relates directly to the participation levels in both on-chain and off-chain governance. +- Decisions and proposals can only be as well-rounded and well-defined as the number of participants that played a role in contributing to the ideation and feedback process. Similarly, a decision or proposal is only as credible as the consensus surrounding it. +- The Governance Workstream should aim to promote and increase engagement by stakeholders in all aspects of the governance processes. +- The Governance Council will work to improve and provide access to the resources necessary to participate in the governance process — for all members of the community. +- The Governance Workstream should be in constant engagement with the community, in as many mediums as possible. + +**C. Facilitating Communications and the Flow of Information** + +- Effective communication is a crucial strategy that must be used by the Governance Workstream. Transparent and effective governance requires an effective, reliable, and unbiased communications strategy. Without communication and information flow, it is extremely difficult to facilitate an effective and efficient governance. +- The Governance Council will work to improve and create easier access to the resources necessary to understand and stay up-to-date in our governance — for all members of the community. +- The Governance Council must establish a more consistent, high-quality information feed of all issues and proposals for the community at large to digest. +- The Governance Council, when requested by the community, will act as a liasion to the Evmos Foundation and attempt to seek information and clarity into concerns or issues brought up. +- The Governance Council will remain in constant communication with the Foundation to ensure the alignment of the goals of the DAO, the community, and the core members. +- The Governance Council will work with the Community Moderation & Support team in the ideation of better communication initiatives, as well as pinpointing areas that are in need of improvements or clarifications. +- The Governance Council will host community meetings, project introductions, and public forums when requested. +- The Governance Council will continue to attend, participate in, and — if requested — take on the responsibility of hosting the weekly Governance meetings on Discord. + +**D. Governance and Proposal Framework Guidance and Feedback** + +- The Governance Council will continue to provide assistance to individuals, teams, and projects that are seeking to submit a proposal. This includes all phases, from pre-Commonwealth ideation to the final on-chain submission, assuming that all procedures are being followed properly and in good faith. Our assistance in drafting proposals should not be seen as an endorsement or guarantee. +- The Governance Workstream will always strive to voice all thoughts on an issue or proposal from a neutral, rational point of view. +- The Governance Council will continue to work on improving governance documentation and begin ideating tools and resources for a more effective and user-friendly governance. + +**E. Onboarding of New Workstreams and sub-DAOs** + +The Governance Council will assist in the creation of new workstreams. When focusing on accelerating the progress of the DAO, the goal is to grow horizontally via more sub-DAOs (vs. growing vertically). Through more sub-DAOs, the entire org can increase the number of teams trying new approaches to solving and innovating on existing problems and focuses while maintaining the same level of meta-organizational admin/overhead required to run. Our general stance on workstream or funding proposals will be: + +- Support funding proposals that presents a decent chance of driving forward KPIs +- Explore funding proposals that may have a chance of bringing value and test the waters +- Support the allocation of more resources to sub-DAOs that are producing results and are looking to expand +- Investigate and potentially look into de-funding teams or initiatives that are not producing any results + +**F. Protocol & Cross-Chain Collaboration** + +- The Governance Workstream will continue to engage with and act as a community liaison with protocols and projects seeking to collaborate. +- The Governance Council will continue to engage in outreach to projects and protocols for potential collaborative initiatives that could be beneficial to the overall Evmos ecosystem. + +**G. Evmos DAO's Treasury Management, Diversification, & Growth** + +- The Governance Council will deploy a Gnosis Safe multi-sig contract to be used as Evmos DAO's Treasury. +- This contract will act as the DAO's liquid treasury for various purposes, including contributor and bounty rewards, DAO grants, liquidity and incentive programs, asset diversification, and minor expenses that do not warrant its own proposal. +- The Governance Council will soon release its research and propose a plan for its plans to create a self-sustaining DAO. + +(More in ECP-3) + +</div> + + +<h4>Special Projects & Initiatives</h4> + + <Divider sx={{ mt: 2, mb: 2, fontWeight: 700}} /> + +<div className="duties"> + +**A. Community Liquidity Incentives Programs** (In Progress) + +- Although we have begun the "manual" Liquidity Incentives Program with our recent "Kickstart Evmos DeFi" proposal, our goal is to ultimately have this process be determined by the community on a merit or milestone based system. +- In order to achieve this in a truly transparent and permissionless way, an Off-Chain Governance Framework is required. + +**B. Off-Chain Community Governance Framework** (In Research) + +- Off-Chain governance, in the context of Evmos DAO, can be explained simply as all governance decisions that do not need to utilize the Cosmos SDKs `gov` module. +- This is particularly an interesting topic, as it opens up a whole new realm of possibilities for conducting off-chain governance. For example, we are looking into [Conviction Voting](https://medium.com/giveth/conviction-voting-a-novel-continuous-decision-making-alternative-to-governance-aa746cfb9475) as a possible way to make future incentive programs' distributions allocated by the direct community. +- Another example of our research into off-chain governance can be [viewed here](https://devfolio.co/projects/interchaindao-or-snapshot-proposal-to-cosmos-sdk-bebe) in which Snapshot, a very popular DAO platform for EVMs, was used to execute a testnet proposal. + + +**C. Perpetual Bounty Program** (Planned) + +The Community Bounty Fund is a perpetual, self-replenishing bounty fund that is designed to minimize community spending while helping with network decentralization efforts. + +The concept of a perpetual bounty fund is very straightforward and the establishment of the fund would only require a one-time spend request from the community pool. + +1. The initial funds are delegated to a distributed set of validators that are in the mid-low ranking. +2. The authz module from Cosmos SDK is utilized to re-stake a minimum “maintenance” amount (to account for decreasing APY rates) +3. Utilizing authz, the remainder of the rewards are sent to a multisig wallet. +4. The daily rewards are then utilized to fund bounty programs for the community. + +When compared to a normal community pool budget request, this model would A) take the initial funding amount out of the unbonded circulating supply; B) align with the community goals of striving towards more decentralization; C) provide a steady stream of a workable budget to be bountied out responsibly and methodically. + +**D. Governance Engagement Initiatives** (In Research) + +- The Governance Workstream is constantly looking into ideas or tools that may help with participation rate pre-voting on chain. +- We strongly believe that the best way to reduce failed proposals is to addresss all community concerns during the early stages of a proposal. Increased participation in these early stage proposals would greatly benefit Evmos governance, and is an initiative we are taking seriously. + +**E. Proposal Summary and Risk Assessment Reports** (Planned) + +- The Governance Workstream is looking to provide proposal summaries, context, and our risk assessments for all proposals that go on chain. +- Talks of potentially integrating these reports and other valuable metadata around a proposal into popular block explorers have been initiated and may be considered. + +**F. Deployment of Public Goods and Services** (In Research) + +The Governance Council is currently looking into public goods and infrastructure that we believe is needed to: + +- Attract more projects and organizations to migrate to Evmos +- Attract more developers to build on Evmos +- Allow more flexibility and functionality in what's possible via governance +- Increase governance participation rate and the flow of information + +Some projects that the Governance Council has initiated in this domain: + +- [Governance Issue Tracker](https://www.evmos.community/) +- [Evmos RPC Proxy](https://github.com/EvmosGov/evmos-rpc-proxy) +- [Evmos Datahub](https://github.com/EvmosGov/evmos-datahub) +- [Webmos React Bootstrapping Kit](https://github.com/EvmosGov/webmos) +- **Smart contracts for:** token vesting, payment streaming, payment splits + +**G. Validator Fairness Initiative** (In Progress) + +- The VFI Group was created a few months back in an attempt to get consensus on a Code of Conduct for Validators. +- Although currently at a stalemate, there has been great discussions and is now over 100 members strong. +- We must reach a consensus, as the Interim Constitution was proposed on the premise that these difficult but pressing issues would not be forgotten. + + +<h4>Progress Report and Achievements</h4> + +The Evmos DAO has been operating informally with Governance Initiatives since early June 2022, and was formally recognized by the Evmos Community when the Constitution was ratified on August 31st, 2022. While we realize that we have much work ahead of us, we humbly celebrate the achievements the workstream and DAO members have made thus far. + +**Evmos Community Proposals** + +Assisted in, provided support to, or played a direct role in the proposals listed below. + +| # | Title | Role | +| --- | ------------------------------------------------------------------- | ----------------- | +| 27 | Evmos Get Momentum - $1m Evmos Developer Incentive Program Proposal | Feedback, Support | +| 31 | Grant Request to Sponsor EVMOS Public RPC by Pocket Network | Feedback | +| 34 | Extend Rektdrop Claims Period by 21 days | Direct | +| 35 | Register ERC20 for Osmosis | Direct | +| 37 | Register ERC20 for ATOM (Cosmos Hub) | Direct | +| 39 | Evmos external incentives on Osmosis | Direct, Multisig | +| 40 | Evmos Developer Acquisition with Dystopia Labs | Feedback, Support | +| 42 | Evmos Sponsorship of HackAtom Seoul 2022 / Korea Blockchain Week | Direct, Multisig | +| 44 | Parameter change (maximum deposit time, minimum deposit amount.) | Direct | +| 45 | Sponsor volunteer researcher for EVM-Inter-Chain lobby for Evmos | Multisig | +| 48 | Register ERC20 for Stargaze (STARS) | Direct | +| 49 | Register ERC20 for Regen Network (REGEN) | Direct | +| 51 | The Interim Constitution of Evmos DAO | Direct | +| 53 | Register ERC20 for Juno | Direct | +| 54 | Covalent API's Integration and the #OneMillionWallets Hackathon | Support, Multisig | +| 56 | Register ERC20 for EEUR (e-Money Euro) | Direct | +| 57 | Incubation: ChainHub Texas Blockchain Projects for Evmos | Support, Feedback | +| 58 | Register ERC20 for axlUSDC (Axelar USDC) | Direct | +| 60 | Register ERC20 for axlWBTC (Axelar wBTC) | Direct | +| 61 | Register ERC20 for axlWETH (Axelar wETH) | Direct | +| 62 | Ethermint Funding Proposal For Past Development | Multisig | +| 64 | Launching the Evmos Liquidity Incentives Program | Direct, Multisig | +| 65 | Register ERC20 for stATOM (Stride Staked Atom) | Direct | +| 67 | Liquidity Mining for Axelar, Celer, and Gravity on Kinesis | Support, Multisig | +| 68 | Register ERC20 for USK (Stablecoin of Kujira) | Direct | +| 70 | Extending Osmosis External Incentives | Direct, Multisig | +| 71 | Evmos Faucet for DeFi Kickoff | Direct, Multisig | + +After posting the ["Passing a Community Proposal, Best Practices"](https://commonwealth.im/evmos/discussion/6022-passing-a-community-proposal-best-practices) guide, the Governance Workstream and DAO contributors assisted in passing **24 out of 25 proposals for a success rate of 96%.** + +We are currently assisting in the facilitation and/or drafting of various additional proposals ranging from protocol onboarding to incentives programs. + +**On-Chain Governance Participation** + +Evmos on-chain governance participation rate is currently the highest among the top Cosmos chains (as of data pulled Oct. 8th 2022) and is barely managing to maintain an upwards trend. With a participation rate of almost 90%, the Governance Workstream will most likely be fighting to maintain the status quo, as we are almost at the ceiling. + +| Rank | Network | Voter Turnout | Sample Data (20 Props) | Data | +| ---- | -------- | ------------- | --------------------------------- |-------------| +| 1 | Evmos | 87.35% | Proposals 44 - 64 | [Source <LaunchIcon />](https://docs.google.com/spreadsheets/d/1gOeVy87__DMSnd-qMkrD2zt4sLU_hNGU1B7KsTf25bo/edit#gid=1701165887) | +| 2 | Juno | 82.88% | Proposals 14 - 39 | [Source <LaunchIcon />](https://docs.google.com/spreadsheets/d/1gOeVy87__DMSnd-qMkrD2zt4sLU_hNGU1B7KsTf25bo/edit#gid=248293121) | +| 3 | Osmosis | 64.74% | Proposals 319 - 340 | [Source <LaunchIcon />](https://docs.google.com/spreadsheets/d/1gOeVy87__DMSnd-qMkrD2zt4sLU_hNGU1B7KsTf25bo/edit#gid=1919390603) | +| 4 | Stargaze | 61.85% | Proposals 30 - 53 | [Source <LaunchIcon />](https://docs.google.com/spreadsheets/d/1gOeVy87__DMSnd-qMkrD2zt4sLU_hNGU1B7KsTf25bo/edit#gid=508354030) | +| 5 | Cosmos | 47.49% | Proposals 56 - 77 | [Source <LaunchIcon />](https://docs.google.com/spreadsheets/d/1gOeVy87__DMSnd-qMkrD2zt4sLU_hNGU1B7KsTf25bo/edit#gid=206262929) | + + +<a href="https://docs.google.com/spreadsheets/d/1gOeVy87__DMSnd-qMkrD2zt4sLU_hNGU1B7KsTf25bo/edit#gid=1962230140" target="_blank"><img src="/gov-chart-2.svg" alt="Participation Rate" className="gov-chart"/></a> + +**Off-Chain Governance Participation** + +In addition to all the proposals that have gone on-chain, the Evmos Community has seen a tremendous, sustained growth in off-chain governance participation, specifically on Commonwealth. + +**Achievements** + +- The Drafting & Ratification of the Interim Constitution +- Sponsored 2 Hackathons, with 1 Upcoming +- Consistant Growth in Commonwealth Engagement Rates +- #2 Most Active Global Community on Commonwealth only after Ethereum +- Visible Increase in Weekly Governance Council Attendance + +(**WIP**) + +</div> + + + <Divider textAlign="center" sx={{ mt: 4, mb: 2, fontWeight: 700}}> + <Chip label="Workstream Members & Responsibilities" /> + </Divider> + +<div className="duties"> + + +<h4>Workstream Members and Organizational Structure</h4> + +**Workstream Structure** + +- The Governance Workstream will function as a two-level hierarchy, consisting of **Council Directors** and **Council Contributors**. The key difference between Directors and contributors is that contributors are not required to manage the budget and that they are not directly answerable to Evmos DAO for failing to fulfill the workstream's duties and responsibilities. +- This difference in accountability means that decision-making power must lie in the hands of the Directors rather than the contributors, and is the reason for this explicit hierarchy. +- Workstream leaders in their second term are automatically elected to a Governance Council Director role. +- In practice, it is expected that Council Contributors and Council Directors operate and communicate as equals. Directors will seek to always consult Contributors when making decisions regarding the future of the Governance Workstream. + +**Governance Council Directors** + +|Name |Role |Responsibilities | +|---|---|---| +|LPX |Governance Steward |Meta-Governance, Off-Chain Community Governance Framework, Perpetual Bounty Program, Governance Engagement Initiatives, Deployment of Public Goods and Services | +|Benny Lava |Governance Steward |Community Liquidity Incentives Programs, Protocol & Cross-Chain Collaboration, DeFi Initiatives, IBC Liaison | +|Kilo |CMS Workstream Leader |Management of Community Mod & Support Team | +|GV |Validator Liaison |Validator Fairness Initiative, Validator Communications and Notices | +|Tricky |Foundation Liaison |Evmos DAO and Evmos Core Goal Alignment, Biz Dev Lead | + +**Governance Council Contributors | Open Positions** + +We are looking for part-time or full-time contributors to fill the following positions that play a crucial role in assisting the Governance Council. + + - Executive Secretary of the Council + - The Executive Secretary will be responsible for various high-level administrative support including the scheduling and preparations of weekly meetings, maintaining a public DAO calendar, ensuring deadlines are met, etc. + - Governance Counselors (x3) + - Governance Counselors assist projects and developers through our governance process, including pre-proposal feedback to proposal drafting assistance. + - Governance Counselors should have excellent written communication skills and should be experts in Evmos DAO's Governance Framework. + - Council Historian + - The Council Historian will work closely with the Executive Secretary and ensure that all public meetings are recorded and minutes provided. + - The Council Historian will also be responsible for weekly data collection on Governance Metrics, as directed by the Directors. + +--- + +**Governance Council Directors | Open Positions** + +We are looking for full-time contributors to fill the following roles. The goal of these full-time contributor roles is to eventually grow into its own workstream. + + - Department of Education + - The mission of the Department of Education is to develop, maintain, and promote educational contents and programs for the Evmos Community. + - This includes the creation of interactive educational content in governance related topics, and eventually the creation of technical content for developers. + - Department of Communications + - The Department of Communications is responsible for creating and coordinating direct dialogue between the Evmos DAO and the diverse Community Members. + - Through outreach, communication, townhall meetings, and official announcements from the Governance Council and the various workstreams of the DAO, the Dept. of Communications removes obstacles and barriers and creates opportunities to improve public awareness and involvement in the DAO. + - The Department of Communications will also be responsible for the creation of documentation and communication channels in non-English languages. + - The Department of Communications helps build and maintain the transparent, responsible, and accountable governance system that the Constitution calls for. + - Department of Growth & Outreach + - The Department of Growth will be responsible for the strategic outreach and engagement of developers, projects, and other DAOs for the purpose of ecosystem growth. + - Through the generation of leads, coordination with biz dev, outreach campaigns, and strategic bounties, the Department of Growth should ramp up community engagement, elevate the Evmos brand and awareness, illustrate our vision, mission, and values, and enable the facilitation of easy onboarding of projects and developers. + - Department of Research & Development + - The Department of R&D will work closely with the Governance Council to research, develop, and maintain key infrastructure and public goods and services. + +--- + +</div> + + + <Divider textAlign="center" sx={{ mt: 4, mb: 2, fontWeight: 700}}> + <Chip label="Workstream Budget Request" /> + </Divider> + +<div className="duties"> + + +<h4>Funding Request</h4> + +Funding request made in ECP-2A. + +</div> + + + </Card> + </Box> + +### Community Moderation and Support (WIP) + + <Box mt={3}> + <Card sx={{ padding: '40px', pt: 0, backgroundColor: '#1212128f', backgroundImage: 'unset' }}> + + <Divider textAlign="center" sx={{ mt: 2, mb: 2, fontWeight: 700, fontSize: '1.1rem'}}> + <Chip label="Workstream Introduction" /> + </Divider> + +<h4>Introduction</h4> + +Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. + + <Values + mission="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt." + vision="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt." + values="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt." + /> + + <Divider textAlign="center" sx={{ mt: 3, mb: 2, fontWeight: 700}}> + <Chip label="Workstream Scope and Duties" /> + </Divider> + +<h4>Primary Duties</h4> + + +<div className="duties"> + +**A. Governance Framework Improvement & Implementation** + +- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt. +- Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. +- Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore. + +</div> + + +<h4>Achievements, Milestones, & Timelines</h4> + +<ul> + <li>What are the key milestones for the initial target?</li> + <li>What is the timeline for completing the initial target?</li> +</ul> + + <Divider textAlign="center" sx={{ mt: 4, mb: 2, fontWeight: 700}}> + <Chip label="Workstream Members & Responsibilities" /> + </Divider> + +<h4>Workstream Members and Organizational Structure</h4> + +<ul> + <li>Steward(s) / Leader(s): Who are the members managing the workstream and accountable for its outcomes?</li> + <li>Members: who is committed to working on this project and what are their responsibilities?</li> + <li>Compensation: what is the compensation amount per member, how will compensation work, and justify the amounts.</li> +</ul> + + <Divider textAlign="center" sx={{ mt: 4, mb: 2, fontWeight: 700}}> + <Chip label="Workstream Budget Request" /> + </Divider> + +<div className="duties"> + +<h4>Itemized Funding Request</h4> + + <FundingTable rows={ + [ + { name: 'A. Member Compensation', amount: 1, denom: 'EVMOS', note: 'Distributed Once a Month'}, + { name: 'B. Metrics Bonus', amount: 1, denom: 'EVMOS', note: 'A'} + ] + } + /> + +<h4>Distribution of Funds</h4> + +- Requesting From: `CommunityPool` +- Multisig Address: `TBD` +- Contract Signatories: `TBD` + +</div> + + </Card> + </Box> + +## Proposed Workstreams + +TBD + +## Probationary Workstreams + +N/A + +## Active Workstreams + +N/A + +## Inactive Workstreams + +N/A + + diff --git a/docs/articles/governance/Workstreams/index.mdx b/docs/articles/governance/Workstreams/index.mdx new file mode 100644 index 0000000..42956b2 --- /dev/null +++ b/docs/articles/governance/Workstreams/index.mdx @@ -0,0 +1,38 @@ +# Sub-DAO Workstreams + +## Definition and Purpose + +Workstreams are typically DAO-funded teams with a recurring budget with no termination date (i.e., Community Moderation & Support, Marketing & Creative Services, etc). + +Workstreams are the sub-units of how Evmos DAO advances its purpose. A workstream is a group of people actively working on tasks that align with Evmos' [Constitutional Values](/constitution#3-guiding-principles-and-values) and community run initiatives. As such, ratifying workstreams sets boundaries on what is and isn't in scope for Evmos DAO's governance. + +## Workstream Requirements + +Anyone may start a workstream and gather momentum behind it by posting on Commonwealth. Until a formal proposal for a budget is made, this workstream is considered “informal.” A workstream can be as broad or narrow as its initiators like, but workstream proposals must satisfy the following criteria: + +<ul> + <li>Have a clear objective that aligns with Evmos' values and objectives as listed in the [Constitution](/constitution).</li> + <li>Distinguish itself from or explicitly state its improvements on existing workstreams.</li> + <li>The specific KPI that the sub-DAO will focus on driving success in</li> + <li>The actual work that the sub-DAO will undertake to drive toward the KPI</li> + <li>Propose clear budgets and timelines for producing outcomes and all in line with the budget proposal flow.</li> +</ul> + +## Workstream Formation Process + +Workstreams can be formed through the [Evmos Community Proposal Framework](/governance/proposals). The proposal process can be read more in-depth here and the proposal must include the [Workstream component template.](/governance/proposals/templates#d-workstreams--special-initiatives) + +The burden falls mostly on the proposers of the sub-DAO, i.e., the sub-DAO must convince the Evmos Community to fund its operations and support its mission. In other words, the sub-DAO should lobby for its formalization and funding proposal to pass. + +A great way to build trust within the community is to operate informally first. + +## Workstream Stages + +Workstreams have five potential states. Each of the five states and the requirements for a workstream in each state are outlined below: + +<ul> + <li>**Informal:** The workstream is not funded by the DAO, and has not made a formal proposal with its goals and a budgetary request.</li> + <li>**Proposed:** The workstream has made a formal proposal to the DAO for a working budget.</li> + <li>**Active:** The workstream is active and funded by the DAO. </li> + <li>**Inactive:** The workstream has been discontinued and is no longer being funded by the DAO.</li> +</ul> diff --git a/docs/articles/governance/index.md b/docs/articles/governance/index.md index c80440f..a5d045d 100644 --- a/docs/articles/governance/index.md +++ b/docs/articles/governance/index.md @@ -2,18 +2,28 @@ sidebar_position: 1 --- -# Governance Overview +# Evmos Network Governance -:::tip -**Note:** Working on a governance proposal? Make sure to look at the [best practices](./best-practices). -::: +Governance is the process of interaction and decision-making among the stakeholders of a given system or organization. It is also the way rules, norms and actions are structured, sustained, regulated and upheld. + +## Truly Decentralized, Community Governed Network + +The Evmos network, like other Cosmos-based chains, utilizes `on-chain governance` for all protocol level execution of proposals via the `gov` module included in the Cosmos SDK. This gives the community [full control of the network](/governance/parameters/), including complex parameter changes, distribution changes, treasury pool spending, and even upgrades to the network. Anyone who holds or stakes EVMOS can participate in these votes, regardless of the voter's validator choices. Immense power is given to the community to govern and dictate the future of the chain. + +## Limitations and Shortcomings + +While the governance module in Cosmos SDK is sufficient for on-chain governance, there are limitations and shortcomings of the module that make it difficult to conduct off-chain governance - a crucial component for a DAO to be able to operate efficiently. Furthermore, the Cosmos ecosystem is lacking the innovative DAO management toolings that EVM-based DAOs have at their disposal. We hope to bridge the growing gap in innovations and tools between Ethereum and Cosmos with the deployment of interoperable tools onto our EVM, opening up a new world of tools for IBC chains. + +# Governance Overview Evmos has an on-chain governance mechanism for passing text proposals, changing [chain parameters](./chain-parameters), and spending [funds from the community pool](./community-pool). ## On- and off-chain Governance Structure - +:::tip +**Note:** Working on a governance proposal? Make sure to look at the [best practices](./best-practices). +::: ### Communication Methods Governance practices and decisions are communicated through different types of documents and design artifacts: @@ -41,4 +51,4 @@ involvement from members in the extended community occurs organically. - **[Telegram (@EvmosOrg)](https://t.me/EvmosOrg)** - General Evmos Telegram group - **[Twitter (@EvmosOrg)](https://twitter.com/EvmosOrg)** - - Official Evmos Twitter + - Official Evmos Twitter \ No newline at end of file diff --git a/docs/articles/governance/voting.md b/docs/articles/governance/voting.md new file mode 100644 index 0000000..a75b71c --- /dev/null +++ b/docs/articles/governance/voting.md @@ -0,0 +1,43 @@ +# Voting and Delegations + +## Voting Period + +The voting period is currently a fixed 5-day period. During the voting period, participants may select a vote of either `Yes`, `No`, `Abstain`, or `NoWithVeto`. Voters may change their vote at any time before the voting period ends. + +## Voting Options + +<ol> + <li>1. **`Abstain`**: indicates that the voter is impartial to the outcome of the proposal.</li> + <li>2. **`Yes`**: indicates approval of the proposal in its current form.</li> + <li>3. **`No`**: indicates disapproval of the proposal in its current form.</li> + <li>4. **`NoWithVeto`**: indicates stronger opposition to the proposal than simply voting `No`. If the number of `NoWithVeto` votes is greater than a third of total votes excluding `Abstain` votes, the proposal is rejected and the deposits are [burned](#burned-deposits).</li> +</ol> + +Voting `NoWithVeto` provides a mechanism for a minority group representing a *third* of the participating voting power to reject a proposal that would otherwise pass. This makes explicit an aspect of the consensus protocol: it works as long as only up to [a third of nodes fail](https://docs.tendermint.com/v0.35/introduction/what-is-tendermint.html). In other words, greater than a third of validators are always in a position to cause a proposal to fail outside the formalized governance process and the network's norms, such as by censoring transactions. The purpose of internalizing this aspect of the consensus protocol into the governance process is to discourage validators from relying on collusion and censorship tactics to influence voting outcomes. + +## What determines whether or not a governance proposal passes? + +There are four criteria: + +<ol> + <li>1. A minimum deposit of 192 EVMOS is required for the proposal to enter the voting period + - anyone may contribute to this deposit + - the deposit must be reached within 3 days (this is the deposit period)</li> + <li>2. A minimum of 33.4% of the network's voting power (quorum) is required to participate to make the proposal valid</li> + <li>3. A simple majority (greater than 50%) of the participating voting power must back the `Yes` vote during the 5-day voting period</li> + <li>4. Less than 33.4% of participating voting power votes `NoWithVeto`</li> +</ol> + +Currently, the criteria for submitting and passing/failing all proposal types is the same. + +### How is voting tallied? + +Voting power is determined by stake weight at the end of the 5-day voting period and is proportional to the number of total EVMOS participating in the vote. Only bonded EVMOS count towards the voting power for a governance proposal. Liquid EVMOS will not count toward a vote or quorum. + +Inactive validators can cast a vote, but their voting power (including the backing of their delegators) will not count toward the vote if they are not in the active set when the voting period ends. That means that if I delegate to a validator that is either jailed, tombstoned, or ranked lower than 150 in stake-backing at the time that the voting period ends, my stake-weight will not count in the vote. + +Though a simple majority `Yes` vote (ie. 50% of participating voting power) is required for a governance proposal vote to pass, a `NoWithVeto` vote of 33.4% of participating voting power or greater can override this outcome and cause the proposal to fail. This enables a minority group representing greater than 1/3 of voting power to fail a proposal that would otherwise pass. + +### How is quorum determined? + +Voting power, whether backing a vote of `Yes`, `Abstain`, `No`, or `NoWithVeto`, counts toward quorum. Quorum is required for the outcome of a governance proposal vote to be considered valid and for deposit contributors to recover their deposit amounts. If the proposal vote does not reach quorum (ie. less than 33.4% of the network's voting power is participating) within 5 days, any deposit amounts will be burned and the proposal outcome will not be considered to be valid. \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 429d7b4..8e0c4bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,11 @@ "@docusaurus/core": "^2.4.0", "@docusaurus/plugin-ideal-image": "^2.4.0", "@docusaurus/preset-classic": "^2.4.0", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", "@mdx-js/react": "^1.6.22", + "@mui/icons-material": "^5.14.18", + "@mui/material": "^5.14.18", "autoprefixer": "^10.4.16", "clsx": "^1.2.1", "postcss": "^8.4.31", @@ -3140,6 +3144,147 @@ "node": ">=16.14" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/react": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", + "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "node_modules/@emotion/styled": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, "node_modules/@endiliey/react-ideal-image": { "version": "0.0.11", "resolved": "https://registry.npmjs.org/@endiliey/react-ideal-image/-/react-ideal-image-0.0.11.tgz", @@ -3231,6 +3376,40 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "dependencies": { + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "dependencies": { + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.4.tgz", + "integrity": "sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==", + "dependencies": { + "@floating-ui/dom": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -4059,6 +4238,285 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.24", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.24.tgz", + "integrity": "sha512-bKt2pUADHGQtqWDZ8nvL2Lvg2GNJyd/ZUgZAJoYzRgmnxBL9j36MSlS3+exEdYkikcnvVafcBtD904RypFKb0w==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@floating-ui/react-dom": "^2.0.4", + "@mui/types": "^7.2.9", + "@mui/utils": "^5.14.18", + "@popperjs/core": "^2.11.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/base/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.18.tgz", + "integrity": "sha512-yFpF35fEVDV81nVktu0BE9qn2dD/chs7PsQhlyaV3EnTeZi9RZBuvoEfRym1/jmhJ2tcfeWXiRuHG942mQXJJQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + } + }, + "node_modules/@mui/icons-material": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.18.tgz", + "integrity": "sha512-o2z49R1G4SdBaxZjbMmkn+2OdT1bKymLvAYaB6pH59obM1CYv/0vAVm6zO31IqhwtYwXv6A7sLIwCGYTaVkcdg==", + "dependencies": { + "@babel/runtime": "^7.23.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@mui/material": "^5.0.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.18.tgz", + "integrity": "sha512-y3UiR/JqrkF5xZR0sIKj6y7xwuEiweh9peiN3Zfjy1gXWXhz5wjlaLdoxFfKIEBUFfeQALxr/Y8avlHH+B9lpQ==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@mui/base": "5.0.0-beta.24", + "@mui/core-downloads-tracker": "^5.14.18", + "@mui/system": "^5.14.18", + "@mui/types": "^7.2.9", + "@mui/utils": "^5.14.18", + "@types/react-transition-group": "^4.4.8", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mui/material/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/@mui/private-theming": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.18.tgz", + "integrity": "sha512-WSgjqRlzfHU+2Rou3HlR2Gqfr4rZRsvFgataYO3qQ0/m6gShJN+lhVEvwEiJ9QYyVzMDvNpXZAcqp8Y2Vl+PAw==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@mui/utils": "^5.14.18", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.18.tgz", + "integrity": "sha512-pW8bpmF9uCB5FV2IPk6mfbQCjPI5vGI09NOLhtGXPeph/4xIfC3JdIX0TILU0WcTs3aFQqo6s2+1SFgIB9rCXA==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.18.tgz", + "integrity": "sha512-hSQQdb3KF72X4EN2hMEiv8EYJZSflfdd1TRaGPoR7CIAG347OxCslpBUwWngYobaxgKvq6xTrlIl+diaactVww==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@mui/private-theming": "^5.14.18", + "@mui/styled-engine": "^5.14.18", + "@mui/types": "^7.2.9", + "@mui/utils": "^5.14.18", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/system/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mui/types": { + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.9.tgz", + "integrity": "sha512-k1lN/PolaRZfNsRdAqXtcR71sTnv3z/VCCGPxU8HfdftDkzi335MdJ6scZxvofMAd/K/9EbzCZTFBmlNpQVdCg==", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.18.tgz", + "integrity": "sha512-HZDRsJtEZ7WMSnrHV9uwScGze4wM/Y+u6pDVo+grUjt5yXzn+wI8QX/JwTHh9YSw/WpnUL80mJJjgCnWj2VrzQ==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@types/prop-types": "^15.7.10", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", @@ -4235,6 +4693,15 @@ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -4869,9 +5336,9 @@ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" }, "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + "version": "15.7.10", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.10.tgz", + "integrity": "sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A==" }, "node_modules/@types/q": { "version": "1.5.8", @@ -4927,6 +5394,14 @@ "@types/react-router": "*" } }, + "node_modules/@types/react-transition-group": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.9.tgz", + "integrity": "sha512-ZVNmWumUIh5NhH8aMD9CR2hdW0fNuYInlocZHaZ+dgk/1K49j1w/HoAuK1ki+pgscQrOFRTlXeoURtuzEkV3dg==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -8168,9 +8643,9 @@ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" }, "node_modules/csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "node_modules/damerau-levenshtein": { "version": "1.0.8", @@ -8552,6 +9027,15 @@ "utila": "~0.4" } }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -10140,6 +10624,11 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -17966,6 +18455,21 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/react-waypoint": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/react-waypoint/-/react-waypoint-10.3.0.tgz", @@ -19983,6 +20487,11 @@ "postcss": "^8.2.15" } }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, "node_modules/sucrase": { "version": "3.34.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", @@ -24890,6 +25399,127 @@ "tslib": "^2.4.0" } }, + "@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + } + } + }, + "@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "requires": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "requires": { + "@emotion/memoize": "^0.8.1" + } + }, + "@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "@emotion/react": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", + "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + } + }, + "@emotion/serialize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "requires": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "@emotion/styled": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + } + }, + "@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "requires": {} + }, + "@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, "@endiliey/react-ideal-image": { "version": "0.0.11", "resolved": "https://registry.npmjs.org/@endiliey/react-ideal-image/-/react-ideal-image-0.0.11.tgz", @@ -24945,6 +25575,36 @@ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==" }, + "@floating-ui/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "requires": { + "@floating-ui/utils": "^0.1.3" + } + }, + "@floating-ui/dom": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "requires": { + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" + } + }, + "@floating-ui/react-dom": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.4.tgz", + "integrity": "sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==", + "requires": { + "@floating-ui/dom": "^1.5.1" + } + }, + "@floating-ui/utils": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" + }, "@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -25624,6 +26284,138 @@ "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==" }, + "@mui/base": { + "version": "5.0.0-beta.24", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.24.tgz", + "integrity": "sha512-bKt2pUADHGQtqWDZ8nvL2Lvg2GNJyd/ZUgZAJoYzRgmnxBL9j36MSlS3+exEdYkikcnvVafcBtD904RypFKb0w==", + "requires": { + "@babel/runtime": "^7.23.2", + "@floating-ui/react-dom": "^2.0.4", + "@mui/types": "^7.2.9", + "@mui/utils": "^5.14.18", + "@popperjs/core": "^2.11.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1" + }, + "dependencies": { + "clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==" + } + } + }, + "@mui/core-downloads-tracker": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.18.tgz", + "integrity": "sha512-yFpF35fEVDV81nVktu0BE9qn2dD/chs7PsQhlyaV3EnTeZi9RZBuvoEfRym1/jmhJ2tcfeWXiRuHG942mQXJJQ==" + }, + "@mui/icons-material": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.18.tgz", + "integrity": "sha512-o2z49R1G4SdBaxZjbMmkn+2OdT1bKymLvAYaB6pH59obM1CYv/0vAVm6zO31IqhwtYwXv6A7sLIwCGYTaVkcdg==", + "requires": { + "@babel/runtime": "^7.23.2" + } + }, + "@mui/material": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.18.tgz", + "integrity": "sha512-y3UiR/JqrkF5xZR0sIKj6y7xwuEiweh9peiN3Zfjy1gXWXhz5wjlaLdoxFfKIEBUFfeQALxr/Y8avlHH+B9lpQ==", + "requires": { + "@babel/runtime": "^7.23.2", + "@mui/base": "5.0.0-beta.24", + "@mui/core-downloads-tracker": "^5.14.18", + "@mui/system": "^5.14.18", + "@mui/types": "^7.2.9", + "@mui/utils": "^5.14.18", + "@types/react-transition-group": "^4.4.8", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "dependencies": { + "clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==" + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, + "@mui/private-theming": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.18.tgz", + "integrity": "sha512-WSgjqRlzfHU+2Rou3HlR2Gqfr4rZRsvFgataYO3qQ0/m6gShJN+lhVEvwEiJ9QYyVzMDvNpXZAcqp8Y2Vl+PAw==", + "requires": { + "@babel/runtime": "^7.23.2", + "@mui/utils": "^5.14.18", + "prop-types": "^15.8.1" + } + }, + "@mui/styled-engine": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.18.tgz", + "integrity": "sha512-pW8bpmF9uCB5FV2IPk6mfbQCjPI5vGI09NOLhtGXPeph/4xIfC3JdIX0TILU0WcTs3aFQqo6s2+1SFgIB9rCXA==", + "requires": { + "@babel/runtime": "^7.23.2", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + } + }, + "@mui/system": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.18.tgz", + "integrity": "sha512-hSQQdb3KF72X4EN2hMEiv8EYJZSflfdd1TRaGPoR7CIAG347OxCslpBUwWngYobaxgKvq6xTrlIl+diaactVww==", + "requires": { + "@babel/runtime": "^7.23.2", + "@mui/private-theming": "^5.14.18", + "@mui/styled-engine": "^5.14.18", + "@mui/types": "^7.2.9", + "@mui/utils": "^5.14.18", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "dependencies": { + "clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==" + } + } + }, + "@mui/types": { + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.9.tgz", + "integrity": "sha512-k1lN/PolaRZfNsRdAqXtcR71sTnv3z/VCCGPxU8HfdftDkzi335MdJ6scZxvofMAd/K/9EbzCZTFBmlNpQVdCg==", + "requires": {} + }, + "@mui/utils": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.18.tgz", + "integrity": "sha512-HZDRsJtEZ7WMSnrHV9uwScGze4wM/Y+u6pDVo+grUjt5yXzn+wI8QX/JwTHh9YSw/WpnUL80mJJjgCnWj2VrzQ==", + "requires": { + "@babel/runtime": "^7.23.2", + "@types/prop-types": "^15.7.10", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "dependencies": { + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, "@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", @@ -25726,6 +26518,11 @@ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" }, + "@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" + }, "@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -26196,9 +26993,9 @@ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" }, "@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + "version": "15.7.10", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.10.tgz", + "integrity": "sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A==" }, "@types/q": { "version": "1.5.8", @@ -26254,6 +27051,14 @@ "@types/react-router": "*" } }, + "@types/react-transition-group": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.9.tgz", + "integrity": "sha512-ZVNmWumUIh5NhH8aMD9CR2hdW0fNuYInlocZHaZ+dgk/1K49j1w/HoAuK1ki+pgscQrOFRTlXeoURtuzEkV3dg==", + "requires": { + "@types/react": "*" + } + }, "@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -28651,9 +29456,9 @@ } }, "csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "damerau-levenshtein": { "version": "1.0.8", @@ -28937,6 +29742,15 @@ "utila": "~0.4" } }, + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -30133,6 +30947,11 @@ "pkg-dir": "^4.1.0" } }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -35710,6 +36529,17 @@ "use-latest": "^1.2.1" } }, + "react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, "react-waypoint": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/react-waypoint/-/react-waypoint-10.3.0.tgz", @@ -37204,6 +38034,11 @@ "postcss-selector-parser": "^6.0.4" } }, + "stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, "sucrase": { "version": "3.34.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", diff --git a/package.json b/package.json index 3d44608..b6d6fb8 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,11 @@ "@docusaurus/core": "^2.4.0", "@docusaurus/plugin-ideal-image": "^2.4.0", "@docusaurus/preset-classic": "^2.4.0", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", "@mdx-js/react": "^1.6.22", + "@mui/icons-material": "^5.14.18", + "@mui/material": "^5.14.18", "autoprefixer": "^10.4.16", "clsx": "^1.2.1", "postcss": "^8.4.31", diff --git a/src/components/ContentTabs.js b/src/components/ContentTabs.js new file mode 100644 index 0000000..317577c --- /dev/null +++ b/src/components/ContentTabs.js @@ -0,0 +1,65 @@ +import * as React from 'react'; +import PropTypes from 'prop-types'; +import Tabs from '@mui/material/Tabs'; +import Tab from '@mui/material/Tab'; +import Typography from '@mui/material/Typography'; +import Box from '@mui/material/Box'; + +function TabPanel(props) { + const { children, value, index, ...other } = props; + + return ( + <div + role="tabpanel" + hidden={value !== index} + id={`simple-tabpanel-${index}`} + aria-labelledby={`simple-tab-${index}`} + {...other} + > + {value === index && ( + <Box sx={{ p: 3 }}> + {children} + </Box> + )} + </div> + ); +} + +TabPanel.propTypes = { + children: PropTypes.node, + index: PropTypes.number.isRequired, + value: PropTypes.number.isRequired, +}; + +function a11yProps(index) { + return { + id: `simple-tab-${index}`, + 'aria-controls': `simple-tabpanel-${index}`, + }; +} + +export default function BasicTabs(props) { + const [value, setValue] = React.useState(0); + + const handleChange = (event, newValue) => { + setValue(newValue); + }; + + return ( + <Box sx={{ width: '100%' }}> + <Box sx={{ borderBottom: 1, borderColor: 'divider' }}> + <Tabs value={value} onChange={handleChange} aria-label="tabs"> + <Tab label={props.tab1.label} {...a11yProps(0)} /> + <Tab label={props.tab2.label} {...a11yProps(1)} /> + </Tabs> + </Box> + <TabPanel key={value} value={value} index={0}> + {props.tab1.content} + </TabPanel> + <TabPanel key={value} value={value} index={1}> + {props.tab2.content} + </TabPanel> + + </Box> + ); +} diff --git a/src/components/FundingRequest.js b/src/components/FundingRequest.js new file mode 100644 index 0000000..89ce221 --- /dev/null +++ b/src/components/FundingRequest.js @@ -0,0 +1,93 @@ +import * as React from 'react'; +import { styled } from '@mui/material/styles'; +import Table from '@mui/material/Table'; +import TableBody from '@mui/material/TableBody'; +import TableCell, { tableCellClasses } from '@mui/material/TableCell'; +import TableContainer from '@mui/material/TableContainer'; +import TableHead from '@mui/material/TableHead'; +import TableRow from '@mui/material/TableRow'; +import Paper from '@mui/material/Paper'; + +const StyledTableCell = styled(TableCell)(({ theme }) => ({ + [`&.${tableCellClasses.head}`]: { + backgroundColor: '#111111', + color: theme.palette.common.white, + }, + [`&.${tableCellClasses.body}`]: { + fontSize: 14, + }, +})); + +const StyledTableRow = styled(TableRow)(({ theme }) => ({ + '&:nth-of-type(odd)': { + backgroundColor: theme.palette.action.hover, + }, + // hide last border + '&:last-child td, &:last-child th': { + border: 0, + }, +})); + + +function ccyFormat(num) { + return `${num.toFixed(2)}`; +} + +function priceRow(qty, unit) { + return qty * unit; +} + +function createRow(desc, qty, unit) { + const price = priceRow(qty, unit); + return { desc, qty, unit, price }; +} + +function subtotal(items) { + return items.map(({ amount }) => amount).reduce((sum, i) => sum + i, 0); +} + +const TAX_RATE = 0.07; + + +export default function CustomizedTables(props) { + + const invoiceSubtotal = subtotal(props.rows); + const invoiceTaxes = TAX_RATE * invoiceSubtotal; + const invoiceTotal = invoiceTaxes + invoiceSubtotal; + + return ( + <TableContainer component={Paper} sx={{ mt: 4 }}> + <Table sx={{ minWidth: 300 }} aria-label="customized table"> + <TableHead> + <TableRow> + <StyledTableCell>Item</StyledTableCell> + <StyledTableCell align="right">Notes</StyledTableCell> + <StyledTableCell align="right">Amount</StyledTableCell> + <StyledTableCell align="right">Denom.</StyledTableCell> + </TableRow> + </TableHead> + <TableBody> + {props.rows.map((row) => ( + <StyledTableRow key={row.name}> + <StyledTableCell component="th" scope="row"> + {row.name} + </StyledTableCell> + <StyledTableCell align="right">{row.note}</StyledTableCell> + <StyledTableCell align="right">{row.amount}</StyledTableCell> + <StyledTableCell align="right">{row.denom}</StyledTableCell> + </StyledTableRow> + ))} + + <TableRow> + <TableCell rowSpan={2} /> + <TableCell colSpan={1} align="right">Total</TableCell> + <TableCell align="right">{ccyFormat(invoiceSubtotal)}</TableCell> + <TableCell colSpan={1} align="right">EVMOS</TableCell> + + </TableRow> + + </TableBody> + </Table> + </TableContainer> + ); +} diff --git a/src/components/ProposalSteps.js b/src/components/ProposalSteps.js new file mode 100644 index 0000000..ca1458d --- /dev/null +++ b/src/components/ProposalSteps.js @@ -0,0 +1,108 @@ +import * as React from 'react'; +import PropTypes from 'prop-types'; +import { styled } from '@mui/material/styles'; +import Stack from '@mui/material/Stack'; +import Stepper from '@mui/material/Stepper'; +import Step from '@mui/material/Step'; +import StepLabel from '@mui/material/StepLabel'; +import ModelTrainingIcon from '@mui/icons-material/ModelTraining'; +import StepConnector, { stepConnectorClasses } from '@mui/material/StepConnector'; +import GradingIcon from '@mui/icons-material/Grading'; +import ThermostatIcon from '@mui/icons-material/Thermostat'; +import HowToVoteIcon from '@mui/icons-material/HowToVote'; + + +const ColorlibConnector = styled(StepConnector)(({ theme }) => ({ + [`&.${stepConnectorClasses.alternativeLabel}`]: { + top: 40, + }, + [`&.${stepConnectorClasses.active}`]: { + [`& .${stepConnectorClasses.line}`]: { + backgroundImage: + 'linear-gradient( 95deg,rgb(242,113,33) 0%,rgb(233,64,87) 50%,rgb(186, 59, 38) 100%)', + }, + }, + [`&.${stepConnectorClasses.completed}`]: { + [`& .${stepConnectorClasses.line}`]: { + backgroundImage: + 'linear-gradient( 95deg,rgb(242,113,33) 0%,rgb(233,64,87) 50%,rgb(138,35,135) 100%)', + }, + }, + [`& .${stepConnectorClasses.line}`]: { + height: 3, + border: 0, + backgroundColor: + theme.palette.mode === 'dark' ? theme.palette.grey[800] : '#eaeaf0', + borderRadius: 1, + }, +})); + +const ColorlibStepIconRoot = styled('div')(({ theme, ownerState }) => ({ + backgroundColor: theme.palette.mode === 'dark' ? theme.palette.grey[700] : '#ccc', + zIndex: 1, + color: '#fff', + width: 80, + height: 80, + display: 'flex', + borderRadius: '50%', + justifyContent: 'center', + alignItems: 'center', + ...(ownerState.active && { + backgroundImage: + 'linear-gradient( 136deg, rgb(242,113,33) 0%, rgb(237, 76, 49) 50%, rgb(186, 59, 38) 100%)', + boxShadow: '0 4px 10px 0 rgba(0,0,0,.25)', + }), + ...(ownerState.completed && { + backgroundImage: + 'linear-gradient( 136deg, rgb(242,113,33) 0%, rgb(237, 76, 49) 50%, rgb(186, 59, 38) 100%)', + }), +})); + +function ColorlibStepIcon(props) { + const { active, completed, className } = props; + + const icons = { + 1: <ModelTrainingIcon sx={{ fontSize: '2.5rem' }} />, + 2: <GradingIcon sx={{ fontSize: '2.5rem' }} />, + 3: <ThermostatIcon sx={{ fontSize: '2.5rem' }} />, + 4: <HowToVoteIcon sx={{ fontSize: '2.5rem' }} />, + }; + + return ( + <ColorlibStepIconRoot ownerState={{ completed, active }} className={className}> + {icons[String(props.icon)]} + </ColorlibStepIconRoot> + ); +} + +ColorlibStepIcon.propTypes = { + /** + * Whether this step is active. + * @default false + */ + active: PropTypes.bool, + className: PropTypes.string, + /** + * Mark the step as completed. Is passed to child components. + * @default false + */ + completed: PropTypes.bool, + /** + * The label displayed in the step icon. + */ + icon: PropTypes.node, +}; + +const steps = ['Phase 1 - Discussion', 'Phase 2 - Formalization', 'Phase 3 - Signal', 'Phase 4 - On-Chain Vote']; + +export default function CustomizedSteppers(props) { + return ( + <Stepper alternativeLabel activeStep={props.step} connector={<ColorlibConnector />}> + {steps.map((label) => ( + <Step key={label}> + <StepLabel StepIconComponent={ColorlibStepIcon}>{label}</StepLabel> + </Step> + ))} + </Stepper> + ); +} diff --git a/src/components/WSValues.js b/src/components/WSValues.js new file mode 100644 index 0000000..5ae73e8 --- /dev/null +++ b/src/components/WSValues.js @@ -0,0 +1,34 @@ +import * as React from 'react'; +import List from '@mui/material/List'; +import ListItem from '@mui/material/ListItem'; +import Divider from '@mui/material/Divider'; +import ListItemText from '@mui/material/ListItemText'; + +export default function AlignItemsList(props) { + return ( + <List sx={{ width: '100%', mt: 1, padding: 0 }}> + <ListItem alignItems="flex-start" sx={{ padding: '20px 0px' }}> + <ListItemText + primary="🚀 Mission" + secondary={props.mission} + /> + </ListItem> + <Divider component="li" /> + <ListItem alignItems="flex-start" sx={{ padding: '20px 0px' }}> + <ListItemText + primary="📡 Vision" + secondary={props.vision} + + /> + </ListItem> + <Divider component="li" /> + <ListItem alignItems="flex-start" sx={{ padding: '20px 0px' }}> + <ListItemText + primary="🚩 Values" + secondary={props.values} + + /> + </ListItem> + </List> + ); +} diff --git a/src/css/custom.css b/src/css/custom.css index 00bf836..dba29c2 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -143,6 +143,11 @@ button, --ifm-color-primary-lighter: #dca06e; --ifm-color-primary-lightest: #c09068; --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); + --step-text-color: white; +} + +[data-theme='light']{ + --step-text-color: black; } .pseudo-icon { @@ -243,4 +248,12 @@ article a[href^="http"]::after { width: 0.6rem; display: inline-block; margin-left: 0.3rem; +} + +.MuiStepper-root span { + color: var(--step-text-color) !important; +} + +ul { + list-style-type: disc; } \ No newline at end of file diff --git a/static/img/lifecycle-flowchart.png b/static/img/lifecycle-flowchart.png new file mode 100644 index 0000000..6fc3c17 Binary files /dev/null and b/static/img/lifecycle-flowchart.png differ