Hello DFINITY community and team,
I’m posting this as the recently elected SNS Canister Management Voting Grant Neuron holder, and I’m deeply concerned about a critical issue I’ve uncovered while auditing SNS DAO proposals. This affects the integrity of governance data on the Internet Computer and needs urgent attention from DFINITY to prevent potential loss of historical records and enable proper auditing.
Background and Discovery
Over the weekend, I set out to audit treasury transfer proposals across various SNS DAOs. I used the excellent Social Hub app developed by Snassy from Sneed DAO (app.sneeddao.com), which allows fetching and exporting proposals via the NNS API. Snassy even added CSV export functionality at my request to make bulk downloads easier.
While exporting proposals filtered by topic (e.g., “Transfer SNS Treasury Funds”), I noticed significant discrepancies. For example, in OpenChat (SNS root canister: 3e3x2-xyaaa-aaaaq-aaalq-cai):
- The app indicated 1,339 total proposals for this topic.
- However, only 95 were actually loadable and exportable.
- Proposal IDs showed large gaps (e.g., Proposal 48 exists, but 49 does not; jumps from 1,030 to 1,032).
- Direct checks on nns.ic0.app confirmed these missing proposals return “Proposal not found” errors.
Initially, I thought this was a bug in the Social Hub app, so I debugged with Snassy. We confirmed the app was correctly querying the NNS API— the proposals simply don’t exist there anymore.
I then reached out to the OpenChat dev team for clarification. Their explanation was shocking: SNS governance canisters perform garbage collection on proposals per action/topic, limited by a parameter called max_proposals_to_keep_per_action
. For OpenChat, this is set to 100 (likely the default for many SNSes).
- Topics with high proposal volumes (like treasury transfers) have old proposals deleted once the limit is exceeded, creating gaps in IDs.
- Topics with fewer proposals (e.g., adding nervous system functions) retain their history.
- Proposal IDs increment sequentially across all topics, but garbage collection is topic-specific, leading to non-sequential visible IDs.
The IC Dashboard (dashboard.internetcomputer.org) shows more complete history because it pulls and stores data in its own DB, whereas the NNS app and API fetch live from the canisters, where old data is gone.
Evidence and Examples
- OpenChat Treasury Transfers: 1,339 indicated, but only ~95 retrievable via API. Missing examples: Proposal 49 (nns.ic0.app/proposal/?u=3e3x2-xyaaa-aaaaq-aaalq-cai&proposal=49) – not found.
- Similar issues in other SNSes like Water Neuron (282 indicated treasury proposals, but only ~60 retrievable).
- Sneed DAO (smaller volume) has no missing proposals, as limits aren’t exceeded.
- Confirmed via canister parameters: For the SNS root canister 2jvtu-yqaaa-aaaaq-aaama-cai,
max_proposals_to_keep_per_action
is 100 (visible on dashboard.internetcomputer.org/canister/2jvtu-yqaaa-aaaaq-aaama-cai#get_nervous_system_parameters).
I’ve compiled a preliminary list of affected SNSes in this Google Sheet for reference: https://docs.google.com/spreadsheets/d/1gs7G0AV4KZYtGt-xTKzM3kuyuSqiNzcn4OT6acTnJio/edit?usp=sharing
Why This Is a Major Problem
- Auditing Impossible: Without full proposal history, we can’t verify treasury movements, decisions, or potential misuse. For blockchain governance, this is unacceptable—how can we “audit all the proposals” if they’re deleted?
- Blockchain Integrity: IC is meant to be immutable and transparent. Garbage collecting governance data undermines trust, especially for DAOs handling funds.
- Wider Implications: This affects multiple SNSes. If not fixed, historical data loss will worsen as DAOs grow. It also echoes past issues, like vote data being discarded post-rewards.
Call to Action
DFINITY team: As the stewards of SNS architecture, please address this ASAP.
- Immediate Fix: Increase or remove
max_proposals_to_keep_per_action
limits across all SNSes. Make full proposal history persistent by default. - Data Recovery: Do you have backups or replicas of garbage-collected proposals? If so, can they be restored or made queryable (e.g., via API or dashboard export)?
- Explanation and Timeline: Provide a detailed response on why this design was chosen, who’s responsible, and a timeline for resolution. If this is an NNS/SNS core function, propose an upgrade motion.
- Community Input: Let’s discuss alternatives, like off-chain archiving or canister upgrades, to preserve data without performance hits.
This isn’t just a technical glitch—it’s a governance crisis. I’ve paused my full audit until this is resolved, but the community deserves transparency now.
Looking forward to your urgent response.
Best,
Dexter
SNS Canister Management Voting Grant Neuron
P.S. Shoutout to Snassy for the Social Hub app—it’s invaluable for DAO oversight. If anyone wants to verify, try exporting from app.sneeddao.com and check against NNS.
https://nns.ic0.app/proposal/?u=3e3x2-xyaaa-aaaaq-aaalq-cai&proposal=48
https://nns.ic0.app/proposal/?u=3e3x2-xyaaa-aaaaq-aaalq-cai&proposal=49
https://app.sneeddao.com/proposals?sns=3e3x2-xyaaa-aaaaq-aaalq-cai
Missing ID’s look at the numbers