Submit a proposal
New Proposal on the overview page, or /propose directly, opens the form. It builds the call for you and shows it before you sign, so the only transaction you send is the one that puts the proposal on-chain.
You need voting power above the proposal threshold to submit. The threshold is on every proposal page under Governor configuration.
Pick a type
| Type | What it is |
|---|---|
| Parameter change (executable) | A real change, routed through GovHub, that can be queued and executed once it passes |
| Signal proposal (non-executable) | Records what the community wants. It carries no call, so it cannot be queued or executed |
Use a signal proposal to settle a direction before anyone writes the parameter change for it. Use a parameter change when you already know the value you want.
Title and description
The Title is what the whole site lists the proposal under, up to 256 characters, and it is required. The Description is the case you are making, and voters read it on the proposal page.
The two are stored on-chain as one text, with the title as its first heading:
# Raise the burn ratio
Because ...
Neither can be edited afterwards. The description is hashed into the proposal, so changing a character would make it a different proposal.
Building a parameter change
Three fields, each of which narrows the next.
Target contract. The system contract that owns the parameter. The form lists the six that governance can touch and shows what each one does, along with its address. Write a proposal has the full table of contracts and their parameters.
Parameter key. The parameters that contract exposes, each with its type. Once you pick one, the form shows what it does and the range the contract allows.
Value. What you want the parameter set to. The Value type next to it is filled in for you and cannot be changed: it is whatever that parameter takes. A bool parameter gives you a true/false chooser; everything else is a text field.
Amounts of L2P are given in wei, and durations in the unit the contract uses. The range shown under the parameter is the one the contract enforces, and the form will not let you submit outside it.
The summary panel
On the right, the proposal as it will be submitted: the title, the description, the type and, for a parameter change, the target, the key and the value. Under it stands Resulting call, the actual instruction that will be sent:
GovHub.updateParam("burnRatio", 750, <the validator set address>)
Read that line before you sign. It is exactly what the chain will do if the proposal passes.
Custom address
The target dropdown also offers Custom address, for a contract that is not in the list. It comes with two warnings.
You pick the value type yourself, from address, uint256, uint64, bool or raw hex bytes, and there is no range to check it against, so the form can only tell you the value is well-formed, not that it is sensible.
More importantly, the governor only ever executes calls to targets it whitelists. A proposal aimed at anything else can win its vote and then never be executable, which is by design rather than a bug. Check that the target is whitelisted before you spend a proposal on it.
What the form refuses
| Message | What to fix |
|---|---|
| This field is required | Title, parameter key or value is empty |
| Enter a valid address (0x followed by 40 hex characters) | The address is malformed |
| The address cannot be the zero address | This parameter will not accept the all-zero address |
| Enter a whole, non-negative number | A numeric parameter got something that is not a plain whole number |
| The value is outside the range allowed by the contract | The number is legal but the contract would reject it |
| Select true or false | A bool parameter needs one of the two |
| Enter valid hex bytes (0x with an even number of hex characters) | Raw bytes must be 0x plus an even number of hex characters |
Errors only appear once you have pressed Create Proposal, so nothing turns red while you are still typing.
Submitting
Create Proposal sends one transaction: a call to the governor's propose function carrying the targets, the values, the calldata and your description. Your wallet asks you to sign it, and when it goes through the site confirms it, gives you a link to the transaction and takes you back to the overview.
The proposal does not appear in the list instantly. The indexer has to see it on-chain first, which takes a moment. After that it sits in Pending until the voting delay has passed, and then it opens for voting on its own.