# Encointer Democracy Specification III TL;DR - We allow an infinite amount of proposals. - A proposal will be enacted if it is in confirmed state for long enough. - On enactment of a proposal, all proposals of the same type get cancelled. ## Overview ### Proposal Submission - Everyone can submit a proposal - There can be an infinite amount of proposals ``` enum ProposalAction { AddLocations(CommunityIdentifier, Vec<Location>), UpdateNominalIncome(CommunityIdentifier, NominalIncomeType), ... } enum ProposalAccessPolicy { Global, Community(cid) } enum ProposalState { ongoing, confirming(since), approved(since), cancelled } struct Proposal { start: BlockNumber, type: ProposalAction, state: ProposalState accessPolicy: ProposalAccessPolicy } ``` ### Voting - On every vote, we update the proposal state (Algorithm 1): - check if proposal is ongoing(since) < cancel date - if yes: cancel, return - if no: do nothing - check if proposal is older than lifetime - if yes: cancel, return - else: do nothing - check if passing - if yes: check if already confirming - if yes: check if it is confirming for > confirmation period - if yes: change state to approved - if no: no nothing - if no: change state to confirming with the current block number - if no: check if already confirming: - if yes: change to not confirming - if no: do nothing ### Adaptive Quorum Biasing - We dont use curves on turnout and approval like Substrate. - In order to determine if a proposal is passing, we use AQB. - The exact parameters are TBD and could even vary for different proposal types. ### Proposal Cancelling - If one proposal is approved, we cancel all ongoing proposals of the same type - We cannot loop over all proposals for performance reasons so: - keep datastructure ProposalAction -> cancelDate - when trying to accept check if - ongoing(since) < cancelDate - if true: cancel - else enact - on approval update cancel date to current block ### Enactment - There is an enactment extrinsic which will enact a approved proposal if approved(since) >= cancelDate ``` fn enact_proposal(proposal: Proposal) { match proposal.type { ProposalAction::AddLocations(cid, locations) => encointer_communities::Pallet::add_locations(CommunityMasterOrigin, cid, locations), ProposalAction::UpdateNominalIncome(cid, balance) => encointer_communities::Pallet::update_nominal_income( CommunityMasterOrigin, cid, balance, ), }; } ``` ### Additional Extrinsics - `update_proposal_state(proposalId)` extrinsic in order to run Algorithm 1 in case if there is no more incoming vote but the proposal state should be updated. - `cleanup(proposalId)` deletes a proposal if it is ongoing since < cancelDate ### Naming issues - cancelDate should be cancelBlockNumber or cancelledAt? ### Open Questions - Can we enact in the voting call? - Fee fairness? - Some proposals caan only be encated at certain times?