Proposal Phase
The Proposal Phase is the first phase of the community governance process. In the Proposal Phase, token holders can submit proposals to the community governance contracts, and token holders can stake support for any submitted proposal using their total voting power.
The Proposal Phase lasts until a given proposal reaches staked support of 15% of the total voting power in that generation (the support threshold), or 9 days and 16 hours have passed, whichever comes first. If 9 days and 16 hours pass without a single proposal reaching the support threshold, then the community governance process ends for that generation, and no proposal is executed or put up for a vote.
Submitting a Proposal
Proposals are submitted to the PolicyProposals.sol
contract for that generation. In order to determine the current PolicyProposals.sol
contract, please see the section on "Finding Active Contracts".
The root policy contract manages proposal upgrades if they pass the full community governance process. When successfully voted through, and any applicable delay period has passed, the root policy contract calls the execute
function of the proposal, and will execute whatever code is inside.
The Community Governance process can modify any underlying contract code in the entire system when executing a proposal. This is intentional behavior, but it comes with great responsibility. Upgrade proposals need to be free of exploitable smart contract bugs, and be carefully tested to ensure that the entire currency system is still functional after an upgrade.
Please see the GitHub repository for best practices and templates when submitting a proposal. The GitHub repository will go over how to set up your developer environment, run tests on the currency, and the procedure for submitting a proposal for review.
Submitting a Proposal to the PolicyProposals.sol
contract requires calling the registerProposal(Proposal _prop)
function with the address of the contract you deployed. Each deployed contract can only be proposed as a proposal once per generation and requires a one-time fee.
Submitting a proposal requires a fee of 10,000 ECO. This is to ensure that only earnest proposals are submitted to the PolicyProposals
contract.
If the proposal fails to reach the support threshold, 5,000 ECO is eligible to be refunded after the proposal phase ends. To claim a refund, please see the "Claiming a Proposal Refund" section. If the proposal is enacted, the 10,000 ECO is sent to the community treasury. The unrefunded amounts are also sent to the treasury, but only once all refunds have been issued.
Supporting a Proposal
During the proposal phase, any address can choose to stake its support for a given proposal and can unstake support at any time. The weight of their support is equal to their total voting power. Any number of active proposals may be supported at any time, by staking support for each of them individually.
Staking support for a proposal gives the full weight of that addresses' voting power to the proposal and does not require a user to lock up their tokens. For an explanation of how voting power is calculated each generation, see the "Generational Voting Power" section.
The proposal phase proceeds to the "Voting Phase" as soon as one proposal has reached the support threshold of 15% of the total voting power in that generation. If the 9-day 16-hour end time of the phase is reached and no proposal has reached the support threshold, the community governance process is over until it restarts in the next generation (4 days and 8 hours later). If a proposal reaches the support threshold, the ProposalVotes.sol
contract is cloned to start voting on that proposal immediately and all other proposals are left behind.
Deploying the Voting Phase
Once a proposal reaches the support threshold, the support phase immediately ends and the voting phase may then be deployed. Deploying the ProposalVotes.sol
contract uses a "Supervisor Function" in the PolicyProposals.sol
called deployProposalVoting()
. Calling deployProposalVoting()
clones the ProposalVotes.sol
contract and registers it in the root policy contract.
Claiming a Proposal Refund
To claim a refund, call refund(Proposal _prop)
in the PolicyProposals.sol
contract with the address of the proposal submitted at the start of the voting process. Refunds can be claimed on behalf of other users, but all funds are sent to the user who submitted the proposal.
Last updated