Skip to main content

Proposals

Learn how to create, vote on, and execute governance proposals.

Proposal Types

Parameter Change

Modify protocol settings like interest rates, fees, or limits

Contract Upgrade

Upgrade smart contract implementations

Treasury Spend

Allocate funds for development, marketing, or rewards

Emergency Action

Critical fixes that bypass normal timelock

Creating a Proposal

Requirements

RequirementValue
Minimum voting power1,000 effective votes
Self-delegationMust be active
Cool-down7 days between proposals per user

Step 1: Draft Your Proposal

Create a detailed proposal document:
# [Title]: Brief Description

## Summary
One paragraph explaining the change.

## Motivation
Why is this change needed? What problem does it solve?

## Specification
Technical details of the change:
- Contract: TrustVault
- Function: updateInterestRate(uint256)
- New value: 500 (5%)

## Security Considerations
Potential risks and mitigations.

## Timeline
When should this be implemented?

Step 2: Community Discussion

  1. Post on governance forum
  2. Share in Discord #governance channel
  3. Gather feedback for 3-7 days
  4. Refine proposal based on input

Step 3: Submit On-Chain

const governor = new ethers.Contract(GOVERNOR_ADDRESS, GovernorABI, signer);

// Prepare proposal
const targets = [TRUST_VAULT_ADDRESS];
const values = [0];
const calldatas = [
  trustVault.interface.encodeFunctionData('updateInterestRate', [500])
];
const description = "Proposal #5: Reduce base interest rate to 5%";

// Submit proposal
const tx = await governor.propose(
  targets,
  values,
  calldatas,
  description,
  0, // ProposalType.ParameterChange
  "QmIPFSHash..." // Link to full proposal
);

const receipt = await tx.wait();
const proposalId = receipt.events[0].args.proposalId;

Voting

Voting Period

PhaseDuration
Voting delay1 day
Voting period7 days
Timelock48 hours

How to Vote

// Vote options: 0 = Against, 1 = For, 2 = Abstain
await governor.castVote(proposalId, 1); // Vote For

// Vote with reason
await governor.castVoteWithReason(
  proposalId,
  1,
  "This will improve capital efficiency"
);

Via UI

  1. Go to Governance in the app
  2. Find the active proposal
  3. Click Vote
  4. Select For, Against, or Abstain
  5. Confirm transaction

Proposal States

┌─────────────────────────────────────────────────────────────────┐
│  PROPOSAL LIFECYCLE                                             │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  Pending ──► Active ──► Succeeded ──► Queued ──► Executed      │
│     │          │            │                                   │
│     │          │            └──► Defeated (not enough votes)    │
│     │          │                                                │
│     │          └──► Defeated (quorum not met)                   │
│     │                                                           │
│     └──► Cancelled (by proposer)                                │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘
StateDescription
PendingWaiting for voting delay (1 day)
ActiveVoting in progress (7 days)
CanceledCancelled by proposer
DefeatedFailed to reach quorum or majority
SucceededPassed, ready for queue
QueuedIn timelock (48 hours)
ExecutedSuccessfully executed
ExpiredNot executed within timelock window

Execution

After a proposal succeeds and the timelock passes:
// Execute the proposal
await governor.execute(
  targets,
  values,
  calldatas,
  ethers.id(description)
);
Anyone can execute a successful proposal after the timelock period.

Active Proposals

No active proposals. Be the first to shape usmewe’s future!
IDTitleStatusVotes ForVotes AgainstEnds
------

Past Proposals

IDTitleResultDate
----

Best Practices

Use format: “[Category] Brief Description”Good: “[Parameter] Reduce base interest rate to 5%” Bad: “Interest rate change”
Include exact function calls, parameters, and expected outcomes.
Get feedback before submitting. Rushed proposals often fail.
Consider attack vectors and edge cases. Get technical review.
Don’t request emergency for non-emergencies.

Cancelling a Proposal

Proposers can cancel their proposal before execution:
await governor.cancel(
  targets,
  values,
  calldatas,
  ethers.id(description)
);
You cannot cancel after execution has started.

API Reference

# Get all proposals
curl -X GET "https://api.usmewe.com/v1/governance/proposals"

# Get specific proposal
curl -X GET "https://api.usmewe.com/v1/governance/proposals/{id}"

# Get user's votes
curl -X GET "https://api.usmewe.com/v1/governance/votes/me" \
  -H "Authorization: Bearer YOUR_TOKEN"