[Proposal] Ratify the Results of GG18 and Formally Request the Community Multisig Holders to Payout Matching Allocations

Hey, thanks for your answer. My question was about our place at the end of this round compared to now. So now it’s clear, and as a product manager/designer, I would say that Gitcoin should make it way more clear for users so they know the rule. I know that they can find the rule but we can’t see them highlighted in the user flow.

And it’s so simple to highlight them cause there are only 2 rules:

  1. Minimum amount
  2. Minimum GP score

To this point, I wonder if these result posts could continue the precedent of sharing high-level “rules” that the sybil defense is based off of (i.e. logic + ideally code snippets used to surface related accounts, minimum donation definition, etc.) Then if a particular project has additional questions about the rules/logic that their community triggered- this can be addressed in greater detail for their instance.

Since sybil action shouldn’t be conflated with self-attack- I think it would be helpful for groups like @yazdini and @priyank who might want more info on the silencing, and then can verify for themselves the donors who were hitting these rules.

Overall though- I support ratifying these results. In line with expectations and past rounds’ sybil-rates.


Just wanted to express my best wishes to the team behind GG18, what a great round this was! Thank you to @M0nkeyFl0wer @umarkhaneth @jon-spark-eco @MathildaDV and the rest for making sure to support the community whenever and however possible throughout those two weeks :slight_smile:


Delivering here on my promise to share more details.

How to Calculate Cluster Match QF:

  • First, a quick review of simple QF:

    • Sum the square roots of each individual’s contribution to a project
    • Square that sum to get a per-project value
    • Distribute the matching fund proportional to the relative size of each projects square (and enforce a matching cap so that no project takes too much of the pool by itself)
  • Next, cluster-match QF. Cluster-match QF orients matching funds around communities rather than individuals. This is mainly the same overall process however before we square root contributions we cluster them together.

    • Cluster based on the donation profile of a donor. A donation profile is defined as the set of decisions you made on each project: donate or don’t donate. Donors who made all the same decisions are clustered together
    • The contributions to a project by the same cluster are added together as if they were the same voting bloc. Then their square root is taken.
    • After that the process is the same: sum the square roots of all clusters grouped by project, square the sums, and payout the matching fund proportionally.

In Code:

Thank you to @Joel_m for writing this python function:

def donation_profile_clustermatch(donation_df):
  # run cluster match, using donation profiles as the clusters
  # i.e., everyone who donated to the same set of projects gets put under the same square root.

  # donation_df is expected to be a pandas Dataframe where rows are unique donors, columns are projects, 
  # and entry i,j denote user i's total donation to project j 

  # we'll store donation profiles as binary strings.
  # i.e. say there are four projects total. if an agent donated to project 0, project 1, and project 3, they will be put in cluster "1101".
  # here the indices 0,1,2,3 refer to the ordering in the input list of projects.

  projects = donation_df.columns

  clusters = {} # a dictionary that will map clusters to the total donation amounts coming from those clusters.

  # build up the cluster donation amounts
  for (wallet, donations) in donation_df.iterrows():

    # figure out what cluster the current user is in
    c = ''.join('1' if donations[p] > 0 else '0' for p in projects)

    # now update that cluster's donation amounts (or initialize new donation amounts if this is the first donor from that cluster)
    if c in clusters.keys():
      for p in projects:
        clusters[c][p] += donations[p]
      clusters[c] = {p: donations[p] for p in projects}

  # now do QF on the clustered donations.
  funding = {p: sum(sqrt(clusters[c][p]) for c in clusters.keys()) ** 2 for p in projects}

  return funding

More Numbers

Here are the calculation details including both matching formulas and pre/post squelching voter numbers and donation amounts.

The ‘base’ totals are the numbers after applying our basic rules: have a passport score over 20 and donate at least $1.

The ‘eligible’ totals are the numbers after applying our sybil squelching based on the rules stated above:

I’ll note that while pulling this data together I found a bug in how my data was being aggregated. I fixed this and it affected the results. To me this underscored the necessary importance of transparency. We need to rapidly move toward turning off post-round squelching and relying only on passport + better QF.


Hi Priyank, thanks for your question. I can see how this would be confusing at first.

Looking at your data, I agree that your matching seems low when comparing your number of voters to the number of voters of projects who receive similar matching. Digging deeper into your data, I see this is because of how identical your voters are. Of your 187 eligible voters, 151 (over 80%) of them supported only Nawonmesh.

Under Cluster-Match QF, your results are different from what they would be under Simple QF. While Simple QF places great importance on the number of individuals supporting a project, Cluster-Match QF places importance on the number of communities in support. Why is this a good thing?

It means a single special-interest community can’t dominate the matching pool. QF is meant to allocate funding to public goods based on the breadth of support for those goods. This means it would be wrong to allow a single community to dominate just because it has many people. For example, if enough people from my hometown on Long Island decided we needed to improve our parks and we could quickly each give $1 to a gitcoin grant then we would outvote everyone else to claim a lions share of the matching pool by ourselves. This would be unfortunate for every other community who does not benefit from our project. On the other hand, if the same number of people from all across the world supported us (perhaps our parks are growing medical herbs) then Cluster-Match QF would allocate much more funding. I hope this gives the intuition behind the math.

The other benefit of this QF implementation is that it means sybil attackers have to also donate to other projects in order to earn more matching for their own project, raising more money for public goods.

In the long-run, we can continue to improve our QF implementations and imo this is a big step in the right direction. I do see how it can be confusing. Especially given that we did not announce we would switch to Cluster-Match QF before the round began. I still think now is the right time to do so because it means we can right away begin improving how we are allocating funding.

This was probably just a simple miss. Imo your message here is sufficient to opt-in. I am adding Nawonmesh to the list!


Thank you and rest of Gitcoin team for publishing updated results. This, in my eye, is most informative and logically organized matching report that Gitcoin has produced so far. This greatly increases my confidence in both sybil defense and algorithm presented.

Based on @Joel_m reply to my questions in QED program post post, I can understand rationale for decision to swap algorithms without announcing it first.

Naively clustering by donation profile is only really possible if you don’t tell people you’re going to do it before hand (or if you’re not too worried about people strategizing).

I will attempt to sanity-check base amounts later, but at the moment I find round data plausible and no longer have any reservations against final report or the process itself.


Thank you @umarkhaneth and squad for sharing the results as well as the rationale on calculations. Cluster matching is definitely a game changer!

I vote to Ratify the round results

As feedback, maybe there can be a zkproof attached to the results so folks can confirm the calculations match the logic provided. That being said I understand that you cannot reveal all the strategies used to identify the red team but I hope we can strike a healthy middle ground.

I’d like to ask what the time distribution looks for producing these results? are there any specific leverage points which could reduce the time to output significantly?


Great nuanced points here as expected from @ale.k , especially about how hard it can be to tell the actor behind sybil action. Also thank you for sanity-checking the results.

Thank you for being so engaged and asking for more transparency. This doesn’t happen without that! Please keep doing it :saluting_face:

Interesting, I don’t know enough about zkproofs to know if this is possible but would be quite cool if so.

One of the big improvements this round was having regendata which makes it much easier to access clean data sets from grants stack, passport, and onchain. I can’t think of other specific leverage points besides having more/better detection methods ready to go in advance of the round ending


:sweat_smile: :rofl: :joy:
It took me couple of seconds to understand the meme :laughing:


I am unsure if I am using the right vocab, but is it fair to assume that clusters are unique to each core round? i.e., the clusters created for allocating the pool for Eth Infra are mutually exclusive from those created for allocations in Climate. Or are clusters agnostic of core rounds and reflective of decisions made on all projects across all core rounds?


Hi Umar,

Appreciate the detailed explanation. I now understand the reasoning behind the Cluster-Match QF. While that seems like an approach in the right direction, I wanted to highlight few concerns on this, citing Nawonmesh as an example.

  1. In my opinion, urgent climate action needs a bottom-up approach through the formation of many grassroots organizations focused on building local climate resilience by solving local challenges, not just globally appealing projects like medical herbs. In such cases, funding support will have to come primarily from their local communities as these projects might not appeal to global donors, although local climate efforts also contribute to global GHG reduction. Cluster-Match QF seems to be incentivising the opposite approach i.e. a top-down approach and makes Gitcoin unsuitable as a funding source for grassroots climate orgs having only local appeal.

  2. The logic of crowdfunding is to get initial social proof from the existing community of the project owners before the larger community jumps in to donate. That is how any web2 crowdfunding platform also works. Now, if that existing community is supposed to prove their legitimacy by also donating to other projects (who they know nothing about), it just creates lot of unnecessary donor friction.

  3. Two-third of India survives in less than $2/day. Nawonmesh is a grassroots project operational in one of the most backward regions of rural India. You can imagine the financial capabilities of the immediate and extended communities Nawonmesh serves. Convincing these people to (a) resonate with a project having no immediate benefits to them and (b) DONATE $1, that too in CRYPTO, was itself very very difficult. Expecting them to give more to unrelated projects is completely unrealistic. If I had asked them to also donate to other projects, they would not have donated to Nawonmesh too as it would have been an overkill for them.

Also, ChainEye dashboard had 240 passport votes for us. but you have mentioned 187 eligible voters. I am unable to understand this gap.

Thanks a lot. Appreciate it man.


Thanks so much for sharing this @umarkhaneth . Really appreciate your time and effort for this. Something similar happened to one of the projects I am associated with > Impact Stream.
Despite the number of votes, the matching amount for us is $10?

I echo @priyank , Cluster-Match QF is defeating the purpose of empowering grassroot level organizations to raise funding from Gitcoin as the only support they can get is from their local community. How will that happen? How will we onboard local orgs solving for challenges on local level? Please excuse my ignorance but would like to learn about this.


from someone who is an ETH core dev:

I don’t know who to flag this to but “iron wallet” is not core Ethereum haha it’s in the name :stuck_out_tongue: cc @Owocki
same with INTMAX

maybe worth digging in on how they got in the round?


Hey Rohit, that’s right on the money. We cluster based on the donations only within a single core round at a time. It’d be a cool experiment to try clustering based on donations to all core rounds and seeing if this gives better results.

Hey Priyank! If our goal is the greatest global GHG reduction then shouldn’t we be searching for projects which most reduce global GHGs and funding those, regardless of if they’re local or not? Climate knowledge is not my forte and I’ll defer to @M0nkeyFl0wer for his opinion on this.

Cluster-Match QF is very bottoms-up however rather than trying to fund the largest single community it focuses on funding those who serve the most communities. You’re right that this may make it unsuitable for orgs with only local appeal (like parks on Long Island). There may be better funding sources out there for local orgs imo. Gitcoin has always been digital-first.

I agree! That’s not the answer I would seek. Instead, if I’m participating in a global funding round I’d ask what the appeal of my project is to people outside my local community and how I can create value for a more diverse supporter base. The behavior we want to reward is cooperation across differences. If a project is supported by people who are very different then that is a strong signal.

I can’t speak to how the ChainEye dashboard was built. If it’s just based on passport score then they’re missing the post-round squelching we do as described here.

Hi Sejal! Thanks for posting on our forum. Did you see the detailed spreadsheet? Impact Stream’s matching increased when going to Cluster Match QF.

This mechanism disempowers uniform, established monoliths and actually empowers grassroots organizations if they’re made of diverse, different members. For example, in the Web3 Community and Education round greenpill network with it’s global, distributed chapters saw an increase in matching funding of $3,787.93 when going to cluster match QF

Hey Owocki! thanks for sharing – will take a look


Thank you to everyone who puts their effort into to making Gitcoin and Quadratic Funding a meaningful way to fund public goods and projects. Every time the Tor Project participates in these funding rounds, I am impressed by the amount of collective effort goes into making them run, communicating clearly with the community, and improving over time.

Cluster-Match QF takes the projects you vote for as signals of the communities you belong to. It then calculates matching amounts for each supporter and unique community combination. This method provides more significant matching funding to projects that receive support from more diverse communities.

Awesome. Thank you for making it clear the evolution of QF and the reasoning behind the changes.

Congrats to all the grantees!


There might be one possibility with cluster-matching QF that could benefit local communities. The new algorithm increases the total cost for Sybil attackers and tilts the scale for the system to be “cheaper to defend than attack.” It might be a worthwhile exercise (possibly a prospectively funded project in Citizens Round if anyone is interested) to evaluate if we can lower the requirement for Passport Score in the frontend with cluster-matching QF as an additional rear-guard mechanism to nullify Sybil contributions.

To validate this, someone would need to rerun the squelching with one or two lower passport scores and analyze the impact on the final distribution. If the data supports this hypothesis, a lower score will reduce some friction local communities have in onboarding contributors to Gitcoin Grants.

Here is some background in the 2-minute snippet from @owocki’s conversation with Joel Miller:


hey @umarkhaneth, cluster QF def feels like a step in the right direction.

Just trying to wrap my head around whats happening - Cluster QF filters donors having voted for multiple projects and counts them for QF , so does it also exclude a few donors that projects might have had that have just donated to that single project or that figure needs to cross a certain threshold?

Post Cluster sybil analysis the QF formula applied is the same and you are not tweaking the matching multiple depending on multiplicity of votes from a donor yet?

The difference between base and eligible voters represents the no of votes that projects rcvd from donors just voting for that particular project?


First, Thanks for the hard work done for doing the cluster match QF :slight_smile:

I just have a question: " the same cluster are added together as if they were the same voting bloc", I do not quite understand it. Say if one cluster/community has 100 voters, it is considered as one voter?

I understand that the votes from the same cluster should be given less weight, but treating them as from one voter is not quite fair especially for some local communities.


Hi Umar, I agree 100% with your statement. But as of today, none of the climate projects write their GHG reduction potential on their gitcoin grant pages. The simple reason for this is that it is something very difficult to quantify accurately at the early stage of the projects. Due to that, the global appeal of a project does not mean that it has the highest GHG reduction potential. It might just be due to an interesting product, eg. medicinal herbs, or the likability of the founder on twitter interactions. Many grassroots orgs like Nawonmesh work on not-so-interesting things like local regeneration. And are run by senior citizens who are non-digital savvy and non-native English speaker, so spending time on Twitter spaces to showcase their charisma is not their forte (The main reason I am representing Nawonmesh in all the online interactions). It is much easier for them to interact with their local community for support.

Unfortunately, the experience of Nawonmesh’s founder says that the fundraising opportunities for regenerative activities are limited in their region.

Fair logic.

I also feel that we need to increase the donor base of the whole climate round. Compared to the other core rounds, the amount donated and unique donors are way less for the climate round. One of the easy ways to achieve that could have been to let climate projects onboard their communities and then few members from a particular project’s community would have started cross-funding other projects too in subsequent rounds. Imagine if 100 climate projects could bring in just 50 new people, it would have almost doubled the ‘unique donors’ count for the climate round. But, due to Cluster-Match QF, the strategy of onboarding new communities has been somewhat disincentivized.

Why are the “Eligible Voters” numbers different for the same project in the “Climate” and “Climate - Shell” sheets in the updated results?


Thanks to @umarkhaneth and team for all the great work! Here’s some quick comments on the discussion going on

I am against automation of the payout process that @umarkhaneth , @M0nkeyFl0wer & @annika are in favor of.

it’s not just a mathematical formula but a social consensus on the best way to leverage the wisdom of the crowds. And the post analysis, pre-payout period is when some of the most active discussions take place. it would be tragic to let go of this tradition.

My main concern with this rounds distribution is just how closely it mirrors the ‘winner take all’ approach of the real world. Consider this chart i found showing the distribution in the open source round, the inequality is worse than any capitalistic nation.

I wonder if we could develop a gini coefficient or some such metric capturing inequality among projects as a 1st step to possibly reducing it in future rounds. Here’s some interesting research on progressive taxation in quadratic funding systems from DoraHacks thats worth exploring


I also don’t know how much were following the gitcoin beta round squelching, but the difference that my project received from the 1st spreadsheet to the last was over 30%. These window periods are valuable for getting the community’s assistance in identifying sybil attackers, such as how mini meadows & some others got caught last round in this window period.

I will say that contrary to my expectations, the teams active on gitcoin radio have performed better under cluster QF. Maybe because we each gave to so many different projects that it increased the value of our vote. So while it won’t initially help local convergence, it is certainly helping digital coordination!

I agree with this point, I urge the team to consider making 10 cents the minimum vote for matching. $1 while living in the west is very different from $1 in the global south. Also, 20-35% of my project votes came from those giving less than a dollar, sometimes 10 cents and tragically even a few 95 cents :frowning_face:

Finally, I request the team to not publicly list the payout address of projects as many operate in hostile environments where this information could be used against them