Small Grants Results

I’m curious to know why the results of the small grants round changed after the end of time. My proposal was sitting at 8th with 380 votes. The top 10 were marked with a border and mine was included. Now it shows a different result. I don’t have a screen cap. Maybe someone else does?

I know this is a large grants thread, but there isn’t a small grants PG topic that was made.

1 Like

I think we need to connect.

There needs to be a full inquiry and essentially a referendum.

The system wasn’t ready to be used in my opinion . I feel as if we have been all used as beta testers.

Please see my feedback also via


I went through the site and couldn’t find a JSON RPC request to return results from snapshot, like there has been in the past. Everything is now hard coded. I can’t imagine that anyone who voted for me decided to remove their votes at the last minute. Especially a whole 80 votes.

Also, I found it to be extremely aggravating to lose a small grant round:

  • a project that has received $3 million in VC funding.
  • a project that will pay other projects outside of the immediate ENS small grant project applicants.
    (so essentially people voted for ENS DAO Public Goods to give money to another entitiy that will give money to another project. That’s a little bit absurd and personally, I am shocked that was allowed to happen.
  • also to the likes of which of a certain persons who has their hands in – I think 3 projects that submit.

Continuously losing to these sort of projects is very aggravating. Not only to mention that I didn’t receive the contract for my own initiative that I started and whereas they ended up going with the route that I proposed, after all.

Small grants should be for projects trying to start up with; one - maybe a few people. But with entire development teams and people who have their toes dipped in every project in some way receiving funding from every direction.It’s difficult seeing funding pipelined to the same projects who receive funding from multiple areas. These are issues that I think about. Attracting new talent into ethereum can be extensive even for skilled developers. There is so much to this ecosystem to learn, it’s essentially a university. You can’t learn all the nuanced aspects over night. It takes time. A lot of it. If this is how the Ethereum Ecosystem is across the board then maybe im wrong about my perspective on EIP-7329 maybe its the quite opposite.


EIP-7329 seems to
explain how a hierarchy of developer specialized topics are evolving.
(a) dev shouldn't be working on two topics like a token standard
and a testnet upgrade that aren't aligned with the same project
objective, which is likely to error due to the scope of

— accessor.eth (@ioevno) October
26, 2023


This is very interesting! Similar things happened for me.

Also, condolences on the way this has effected you personally and no doubt financially.

Please know that we are not alone here. To which I will message you some more info.

If anything these bugs and or systematic / tokenomic flaws will eventuate into a better result for everybody. Sad that it has come to this though.

But I remain positive that more and more people with “influence” (ENS tokens) and such, will understand the need for further investigation and hopefully some new proposals that will provide better systems.

What that looks like exactly would be for another time. However for now, it is very apparent that there is a problem. And one that I will do all I can to assist in spreading awareness on.

Chin up mate. This is going to end up being a good result. :v::handshake:

1 Like

Users can change their vote only up until the ending block time. There is no way to change votes after this. If you discovered that Snapshot results have changed after the closing block time, please promptly report this as a bug on their repository. They will want to know.

The correct results may have been delayed in populating on frontends, but I’m unaware of any discrepancy in the final results displayed in the PG round.

You can use the GraphQL Explorer to inspect the round. The following data was fetched from the snapshot results and matches the outcome displayed on

Submission Total Votes # Voters
Giveth Building the Future of Giving 1,511 43
Ethereum News by @ethdaily 1,285 31
dm3 the web3 messaging interoperability protocol 1,282 36
rotki 1,166 35
Pairwise: Simplifying Choices, Amplifying Voices 645 20
EIP-7212 Research 509 24
Arabic Web3 Education 358 15
MetaGame 349 12
BrightID 340 16
Unitap 340 9
Samhita DAO 311 5
Ethereum Data Accessor Gateway and PnP Dashboard 310 11
Education about Web3 in Brazil (@ModularCrypto) 293 12
Gitcoin Passport Plugin for Discourse 265 11
Commons Stack 232 11
TITLES 167 6
Solow :pig_nose: 156 6
QuillCheck DeFi Fraud Protection 155 7
Swaplace Open-source any token swap platform 137 5
PayrollWTF w/ gasless ENS subnames via NameStone 123 4
Bankless Academy 122 8
Militereum 106 3
Gravity DAO 82 6
Praise Recognize. Reward. Repeat 81 7
ENS: Empowering Ethereum Mexico 2023 80 6
LunCo 60 5
CrossDAO: Cross-chain governance prototype 53 5
DeSpaceQF: Decentralized Space Exploration 47 4
Fairdrive 40 5
Kairos Research 31 3
DAO* 18 3
Impact Stream 16 3
Coding Classes 15 3
Scry Permissionless Oracle Infrastructure 9 2
Connecting the General Public to Careers in Web3 3 1

Thanks for the results @Slobo.


So what is the proposal identifier?

  • The proposal id for Public Good Round 10 is 0x1f9519840ebb3974ad5ccb45edf9865e1a5710a2f27ba13ca147251311fdfa26

  • The proposal id for Ecosystem Round 10 is 0xfd2b613847557ba419622d480939cb12d880df6f648f6e4489095a71c3002543

These are typically the final path or parameter in the URL. You can access the entire space at, and navigate to any proposal.

1 Like

I built new APIs for the recent rounds that combine database and Snapshot data on the backend, which is why network requests are different. I don’t know what you mean by “everything is now hard coded”. Everything is open-source so you can see the relevant code here if you’re curious.

1 Like

ok so im not crazy. got it.the way i saw it was in vote order…

idk. it is what it is.

For ~30 minutes after the voting ended, proposals were mistakenly sorted in the default order (date created) vs by number of votes. I fixed it as soon as I noticed. The vote counts were never inaccurate - just the sorting. Apologies if that caused any confusion.

I have an idea for a more fair UX so that we don’t default to a listed view…

Create a circular node with each branch of the centre “planet” leading out to the orbiting moons so to speak. That way each orbiting moon (project) would be fairly distributed and the moon logo icon would be a great way to encourage the integration of Artist and graphic designers. Along with creating easy to identify branding concepts early on in a project.

You could implement a random shuffle order upon the location of the moon. So it would detract away from key positions being unfairly gamified. Or just have them actually change position on the orbit by coding in a set timer in which all projects rotate.

Other simple indicators could be also included such as if the project holds a reverse record then maybe they get a form of a check mark.

Also, perhaps zoom in to a Moon and this in turn brings up the people who have voted for that project as also circular icon in an orbit around the moon…call them satellites? Maybe. But the diameter and weight of the satellite depends on the % they have voted on a proposal. If 100% vote towards one moon project - they could perhaps become a space station ? (Just using some easy to imagine ideas)

If you / we make the voting process interesting and also rewarding and engaging for the voters then perhaps we will see more actual voters come forward in the future.


yeah, I was actually able to scan through the min version of the js. (im posting this before i click your fixed it link to commit what I think you are referring to)

let me know when you are more available. sooner than later but no real rush.

unction w(e) {
                for (var n = r(f); null !== n;) {
                    if (null === n.callback) l(f);
                    else if (n.startTime <= e) l(f), n.sortIndex = n.expirationTime, t(c, n);
                    else break;
                    n = r(f)

            function S(e) {
                if (v = !1, w(e), !g) {
                    if (null !== r(c)) g = !0, M(x);
                    else {
                        var n = r(f);
                        null !== n && F(S, n.startTime - e)

            function x(e, t) {
                g = !1, v && (v = !1, b(C), C = -1), h = !0;
                var a = m;
                try {
                    for (w(t), p = r(c); null !== p && (!(p.expirationTime > t) || e && !z());) {
                        var u = p.callback;
                        if ("function" == typeof u) {
                            p.callback = null, m = p.priorityLevel;
                            var o = u(p.expirationTime <= t);
                            t = n.unstable_now(), "function" == typeof o ? p.callback = o : p === r(c) && l(c), w(t)
                        } else l(c);
                        p = r(c)
                    if (null !== p) var i = !0;
                    else {
                        var s = r(f);
                        null !== s && F(S, s.startTime - t), i = !1
                    return i
                } finally {
                    p = null, m = a, h = !1
            "undefined" != typeof navigator && void 0 !== navigator.scheduling && void 0 !== navigator.scheduling.isInputPending && navigator.scheduling.isInputPending.bind(navigator.scheduling);
            var E = !1,
                _ = null,
                C = -1,
                P = 5,
                N = -1;

            function z() {
                return !(n.unstable_now() - N < P)

            function T() {
                if (null !== _) {
                    var e = n.unstable_now();
                    N = e;
                    var t = !0;
                    try {
                        t = _(!0, e)
                    } finally {
                        t ? u() : (E = !1, _ = null)
                } else E = !1
            if ("function" == typeof k) u = function () {
            else if ("undefined" != typeof MessageChannel) {
                var L = new MessageChannel,
                    R = L.port2;
                L.port1.onmessage = T, u = function () {
            } else u = function () {
                y(T, 0)

            function M(e) {
                _ = e, E || (E = !0, u())

            function F(e, t) {
                C = y(function () {
                }, t)
            n.unstable_IdlePriority = 5, n.unstable_ImmediatePriority = 1, n.unstable_LowPriority = 4, n.unstable_NormalPriority = 3, n.unstable_Profiling = null, n.unstable_UserBlockingPriority = 2, n.unstable_cancelCallback = function (e) {
                e.callback = null
            }, n.unstable_continueExecution = function () {
                g || h || (g = !0, M(x))
            }, n.unstable_forceFrameRate = function (e) {
                0 > e || 125 < e ? console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported") : P = 0 < e ? Math.floor(1e3 / e) : 5
            }, n.unstable_getCurrentPriorityLevel = function () {
                return m
            }, n.unstable_getFirstCallbackNode = function () {
                return r(c)
            }, n.unstable_next = function (e) {
                switch (m) {
                    case 1:
                    case 2:
                    case 3:
                        var n = 3;
                        n = m
                var t = m;
                m = n;
                try {
                    return e()
                } finally {
                    m = t
            }, n.unstable_pauseExecution = function () {}, n.unstable_requestPaint = function () {}, n.unstable_runWithPriority = function (e, n) {
                switch (e) {
                    case 1:
                    case 2:
                    case 3:
                    case 4:
                    case 5:
                        e = 3
                var t = m;
                m = e;
                try {
                    return n()
                } finally {
                    m = t
            }, n.unstable_scheduleCallback = function (e, l, a) {
                var u = n.unstable_now();
                switch (a = "object" == typeof a && null !== a && "number" == typeof (a = a.delay) && 0 < a ? u + a : u, e) {
                    case 1:
                        var o = -1;
                    case 2:
                        o = 250;
                    case 5:
                        o = 1073741823;
                    case 4:
                        o = 1e4;
                        o = 5e3
                return o = a + o, e = {
                    id: d++,
                    callback: l,
                    priorityLevel: e,
                    startTime: a,
                    expirationTime: o,
                    sortIndex: -1
                }, a > u ? (e.sortIndex = a, t(f, e), null === r(c) && e === r(f) && (v ? (b(C), C = -1) : v = !0, F(S, a - u))) : (e.sortIndex = o, t(c, e), g || h || (g = !0, M(x))), e
            }, n.unstable_shouldYield = z, n.unstable_wrapCallback = function (e) {
                var n = m;
                return function () {
                    var t = m;
                    m = n;
                    try {
                        return e.apply(this, arguments)
                    } finally {
                        m = t


1 Like