This post is intended to share a proposed framework for categorizing governance participation and distributing rewards accordingly. The objective is to keep the first iteration simple, transparent, and easy to verify, while creating a baseline that can evolve as governance activity increases and clearer standards are defined.
The framework below is shared for open discussion and feedback, particularly around fairness, incentives, and long-term sustainability.
Proposed Criteria
-
Tier 4: Voted in one proposal
-
Tier 3: Voted in at least two proposals
-
Tier 2: Voted in all proposals
-
Tier 1: Voted in all proposals and submitted a rationale for each vote
Note: As there is currently no standardized rubric for evaluating rationales, this model does not assess quality. A rationale was counted as valid if it was posted either on the forum or directly within the voting interface.
Explanation of the Distribution Formula
The total reward pool was distributed proportionally based on performance weights assigned to each tier:
-
Tier 1: 100%
-
Tier 2: 85%
-
Tier 3: 60%
-
Tier 4: 30%
Each tier’s weight was multiplied by the number of voters in that group to calculate total weighted units. The reward pool was then divided by the sum of all weighted units to determine the value of one full-performance unit (100%). Individual rewards were calculated by multiplying this base value by each tier’s assigned weight.
Minor cent-level adjustments were applied to the highest-performance tier to ensure the total distributed amount matched the pool exactly.
Reward Distribution Spreadsheet
The spreadsheet can be seen here:
Dune Script
For auditing, the script used is:
WITH votes AS (
SELECT
evt_tx_hash,
evt_block_date,
proposalId,
reason,
{{unnamed_parameter}} support,
vote_type,
voter,
votingPower
FROM query_5553688
),
proposals AS (
SELECT
evt_tx_hash,
evt_block_number,
proposer,
proposalId,
votingModule,
start_time,
start_date,
end_time,
end_date,
proposal_title,
proposal_type
FROM query_5617498
WHERE start_time >= TIMESTAMP '2025-10-20 00:00:00'
),
voter_proposals AS (
SELECT
v.voter,
v.proposalId,
p.proposal_title,
v.vote_type,
v.votingPower
FROM votes v
INNER JOIN proposals p ON v.proposalId = p.proposalId
WHERE v.votingPower > 2500
),
voter_names AS (
SELECT
voter,
array_agg(DISTINCT proposalId ORDER BY proposalId) AS proposals_voted_on,
array_agg(proposal_title ORDER BY proposalId) AS proposal_titles,
array_agg(vote_type ORDER BY proposalId) AS vote_types,
array_agg(votingPower ORDER BY proposalId) AS voting_powers,
COUNT(DISTINCT proposalId) AS num_proposals_voted
FROM voter_proposals
GROUP BY voter
)
SELECT
vn.voter,
COALESCE(ens.name, CAST(vn.voter AS VARCHAR)) AS voter_name,
vn.proposals_voted_on,
vn.proposal_titles,
vn.vote_types,
vn.voting_powers,
vn.num_proposals_voted
FROM voter_names vn
LEFT JOIN labels.ens ON vn.voter = labels.ens.address
ORDER BY vn.num_proposals_voted DESC, vn.voter