🗳️ GVote Voting Power: Weighted Snapshot Strategy

To ensure fair and manipulation-resistant voting power calculation in the GVote hybrid governance system, we adopt a weighted snapshot mechanism using multiple historical blocks.

🔧 Snapshot Parameters

  • Total Snapshots: 12

  • Snapshot Interval: Fixed block gap (e.g. every 86400 blocks or every 24 hours)

  • Snapshot Range: From the most recent block X to X - 11×gap

  • Calculation Rule: Weighted average of all snapshots

EffectiveVotingPower = sum(votes[i] × weight[i]) / sum(weights)

📊 Snapshot Weights

Snapshot Index
Relative Block
Assigned Weight
Purpose

1

X

3

Reflects most recent activity

2

X - 1×gap

3

3

X - 2×gap

3

4

X - 3×gap

3

5

X - 4×gap

3

6

X - 5×gap

2

Mid-term holding

7

X - 6×gap

2

8

X - 7×gap

2

9

X - 8×gap

2

10

X - 9×gap

1

Long-term support

11

X -10×gap

1

12

X -11×gap

1


📈 Weight Contribution Summary

Time Range
Snapshot Count
Total Weight
Approx. % of Total

Recent

5

15

57.7%

Mid-Term

4

8

30.8%

Long-Term

3

3

11.5%

Total

12

26

100%


✅ Why This Matters

  • Prevents vote manipulation via short-term token acquisition

  • Rewards consistent holders across both short and long terms

  • Encourages long-term alignment with the GooDog ecosystem

  • Maintains fairness by using a clear, auditable snapshot schedule


🛠️ Notes for Developers

  • Snapshots are pulled using getPastVotes(address, blockNumber)

  • The block numbers are calculated automatically at the start of each GVote round

  • Off-chain scripts may be used to batch-process snapshot reads

  • Voting power is saved to the database as:

interface GVotePower {
  user: string
  round_id: string
  voting_power: number
  block_snapshots: number[] // optional for traceability
}

📚 Future Upgrades

  • Community can propose changes to:

    • Snapshot count

    • Block interval

    • Weight distribution

Last updated