# Democracy Pallet

- [`democracy::Config`](https://docs.rs/pallet-democracy/latest/pallet_democracy/trait.Config.html)
- [`Call`](https://docs.rs/pallet-democracy/latest/pallet_democracy/enum.Call.html)

## Overview

The Democracy pallet handles the administration of general stakeholder voting.

There are two different queues that a proposal can be added to before it
becomes a referendum, 1) the proposal queue consisting of all public proposals
and 2) the external queue consisting of a single proposal that originates
from one of the _external_ origins (such as a collective group).

Every launch period - a length defined in the runtime - the Democracy pallet
launches a referendum from a proposal that it takes from either the proposal
queue or the external queue in turn. Any token holder in the system can vote
on referenda. The voting system
uses time-lock voting by allowing the token holder to set their _conviction_
behind a vote. The conviction will dictate the length of time the tokens
will be locked, as well as the multiplier that scales the vote power.

### Terminology

- **Enactment Period:** The minimum period of locking and the period between a proposal being
approved and enacted.
- **Lock Period:** A period of time after proposal enactment that the tokens of _winning_ voters
will be locked.
- **Conviction:** An indication of a voter's strength of belief in their vote. An increase
of one in conviction indicates that a token holder is willing to lock their tokens for twice
as many lock periods after enactment.
- **Vote:** A value that can either be in approval ("Aye") or rejection ("Nay")
  of a particular referendum.
- **Proposal:** A submission to the chain that represents an action that a proposer (either an
account or an external origin) suggests that the system adopt.
- **Referendum:** A proposal that is in the process of being voted on for
  either acceptance or rejection as a change to the system.
- **Delegation:** The act of granting your voting power to the decisions of another account for
  up to a certain conviction.

### Adaptive Quorum Biasing

A _referendum_ can be either simple majority-carries in which 50%+1 of the
votes decide the outcome or _adaptive quorum biased_. Adaptive quorum biasing
makes the threshold for passing or rejecting a referendum higher or lower
depending on how the referendum was originally proposed. There are two types of
adaptive quorum biasing: 1) _positive turnout bias_ makes a referendum
require a super-majority to pass that decreases as turnout increases and
2) _negative turnout bias_ makes a referendum require a super-majority to
reject that decreases as turnout increases. Another way to think about the
quorum biasing is that _positive bias_ referendums will be rejected by
default and _negative bias_ referendums get passed by default.

## Interface

### Dispatchable Functions

#### Public

These calls can be made from any externally held account capable of creating
a signed extrinsic.

Basic actions:
- `propose` - Submits a sensitive action, represented as a hash. Requires a deposit.
- `second` - Signals agreement with a proposal, moves it higher on the proposal queue, and
  requires a matching deposit to the original.
- `vote` - Votes in a referendum, either the vote is "Aye" to enact the proposal or "Nay" to
  keep the status quo.
- `unvote` - Cancel a previous vote, this must be done by the voter before the vote ends.
- `delegate` - Delegates the voting power (tokens * conviction) to another account.
- `undelegate` - Stops the delegation of voting power to another account.

Administration actions that can be done to any account:
- `reap_vote` - Remove some account's expired votes.
- `unlock` - Redetermine the account's balance lock, potentially making tokens available.

Preimage actions:
- `note_preimage` - Registers the preimage for an upcoming proposal, requires
  a deposit that is returned once the proposal is enacted.
- `note_preimage_operational` - same but provided by `T::OperationalPreimageOrigin`.
- `note_imminent_preimage` - Registers the preimage for an upcoming proposal.
  Does not require a deposit, but the proposal must be in the dispatch queue.
- `note_imminent_preimage_operational` - same but provided by `T::OperationalPreimageOrigin`.
- `reap_preimage` - Removes the preimage for an expired proposal. Will only
  work under the condition that it's the same account that noted it and
  after the voting period, OR it's a different account after the enactment period.

#### Cancellation Origin

This call can only be made by the `CancellationOrigin`.

- `emergency_cancel` - Schedules an emergency cancellation of a referendum.
  Can only happen once to a specific referendum.

#### ExternalOrigin

This call can only be made by the `ExternalOrigin`.

- `external_propose` - Schedules a proposal to become a referendum once it is is legal
  for an externally proposed referendum.

#### External Majority Origin

This call can only be made by the `ExternalMajorityOrigin`.

- `external_propose_majority` - Schedules a proposal to become a majority-carries
	 referendum once it is legal for an externally proposed referendum.

#### External Default Origin

This call can only be made by the `ExternalDefaultOrigin`.

- `external_propose_default` - Schedules a proposal to become a negative-turnout-bias
  referendum once it is legal for an externally proposed referendum.

#### Fast Track Origin

This call can only be made by the `FastTrackOrigin`.

- `fast_track` - Schedules the current externally proposed proposal that
  is "majority-carries" to become a referendum immediately.

#### Veto Origin

This call can only be made by the `VetoOrigin`.

- `veto_external` - Vetoes and blacklists the external proposal hash.

#### Root

- `cancel_referendum` - Removes a referendum.
- `cancel_queued` - Cancels a proposal that is queued for enactment.
- `clear_public_proposal` - Removes all public proposals.

License: Apache-2.0
