Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
You can think of a space as an organization's account on Snapshot which can be viewed by anyone visiting the platform. It serves as a hub for all proposals related to the organization and a source of information for the users.
Moreover space allows its organization to manage the roles of organization members and customize the proposal and voting settings.
Spaces are listed upon arrival on https://snapshot.org and first and foremost can be filtered by the organization or the ENS name used to create the space. They can be also filtered by other parameters listed next to the search field. You can access the space from there or directly through a link which includes the ENS name (i.e. https://snapshot.org/#/pistachiodao.eth). It is also possible to define a custom domain name for your space.
You can browse through all of Space's proposals and apply specific filters to them, including active, pending, and closed proposals, as well as those created by core members, and flagged proposals.
If you want to have a quick access to a chosen space you can join it from the directory of all spaces or through the space's individual page by clicking the Join button. It will create a shortcut for the space on the left sidebar and keep you updated with the number of new proposals displayed on top of the space's avatar.
The content of the space overview will depend on the role of the connected account and the space settings. Below you can see the example of our dummy space and what anyone, even when not connected, can see.
This page guides you step by step through the process of creating a space for your organization.
If you already have a space without ENS domain (legacy), you need to Migrate your space to ENS.
Tap the plus +
button in the left sidebar to create a new space.
If you already own an ENS domain, make sure you are connected to snapshot.org with the Ethereum address that is set as controller of your ENS name (if you are confused about the difference between ENS Registrant and Controller, have a read here).
If the above condition is met, your ENS name will appear. To confirm it's correct, click on it.
To complete the profile of your space you have to enter a name for your DAO (mandatory) and can add further optional information like a description, avatar, categories describing the field that your DAO is operating in and more.
You can add or update this information after you have finished creating the space.
Your space can combine up to 8 voting strategies which will be responsible for calculating the users' voting power. The setting affects all proposals that will be created for that space.
For the initial setup you have to choose one of the three following strategy types to then specify the strategy details:
Let's have a look at each of the possible options and see how you can specify the strategy details.
Voting power is weighted by the amount of the token held by the user. The token can be an ERC-20, ERC-721 or ERC-1155 token standard.
Select your token network
Select your token standard
Enter your token contract address
This option can be used in two different ways:
Whitelist voting lets you specify a list of addresses that will be able to vote
Ticket voting will let any wallet vote (option used mostly for testing purposes)
If you feel ready to dive deeper into the custom setup here are a few hints that you may find useful:
You can select up to 8 different strategies. Voting power is cumulative.
Network can be selected individually for each strategy. This way you can leverage multi-chain voting power calculation.
It is possible to set a different symbol for each strategy. They will be displayed on the proposal page.
You can write a custom voting strategy if the existing ones are the sufficient for your needs. Have a look at Create a voting strategy to learn more.
At the time of writing this article there are around 415 Snapshot voting strategies and this number keeps growing. Learn more about the strategies.
Admins will be able to edit the space settings and moderate proposals.
Authors will be able to create proposals without any constraints like proposal validation. Make sure that members specified in authors field are allowed to submit a proposal.
If you do not want to have the wallet control your settings, you can follow the steps below to create a space on Snapshot.
You will not be able to change settings from the UI
Every time you want to change the settings, you will need to broadcast a new transaction
Create a JSON file for your settings on Snapshot. The format of the JSON file could be as follows: https://github.com/snapshot-labs/snapshot.js/blob/master/test/examples/space.json
Store the JSON file on IPFS
Use the IPFS link on the ENS text record. This will make the ENS owner the only controller of the settings.
You can check if your space is valid from the GitHub link below https://github.com/snapshot-labs/snapshot.js/blob/a0adc547aa0922aa6abd35708a4a292048bca6a2/test/schema.ts#L4
Once the above transaction is successful, go to the below link to update the space in Snapshot:
https://hub.snapshot.org/api/spaces/
<ENS DOMAIN>
/poke
To create your space on Snapshot you need to have an ENS domain. This page will take you through the steps to create an ENS domain.
ENS on Ethereum Mainnet
1a. Search for the availability of your name on Snapshot's Create a space
page
2. If the name is available you will be able to see the 3 steps and the registration fee. Please note that the names with 3 or 4 characters cost considerably more than the names with 5+ characters.
3. Connect your wallet by tapping on the Connect
button on the top left corner of your screen. Make sure your wallet has enough balance to make the transaction successful and that you selected the Ethereum Mainnet (or Goerli Testnet for the demo page).
4. Confirm all transactions for the three steps from your chosen wallet provider.
5. You have now successfully registered on ENS! Additionally, you can also make your Ethereum address point to an ENS name by clicking on ‘Set Reverse Record’ or by going to 'My Account' and then selecting 'Reverse record' and completing the transaction.
Congratulations! You have created your domain on ENS. You are now ready to create your space on Snapshot.
To register a space on you need an ENS domain on the Ethereum Mainnet even if you want to use Ethereum Testnet or any other network (Binance Smart Chain, xDAI, etc). However if you want to experiment with the platform you can register a test space on using an ENS on Goerli Testnet.
If you already have an ENS domain, feel free to skip this and follow the guide.
1b. Search for the availability of your name on ENS by following this link:
If you want to register a custom domain you already own check out this guide:
This page explains what a space verification is and how to get verified.
Space verification is a process of checking if the space is real and can be trusted.
Verified spaces have a special badge next to their name, as presented on the screenshot below.
Make sure to follow all steps from the below checklist:
Space has an avatar image uploaded
Space has a minimum threshold for proposal validation (or limited to authors)
There are at least 5 closed proposals
A link from the official website, the GitHub organization or a tweet to confirm the ownership of the Snapshot space
Space is not using a testnet or network that has no recognition
Ask to get verified by contacting our support on Help Center
Verification process can last up to 72 hours.
By adding a custom domain to your space, you can whitelabel the Snapshot website and present your community with a fully branded governance experience. This feature allows you to display only your specific space at your custom URL and even customize colors to match your brand identity.
More than 400 DAOs already use custom domains for their governance, such as:
vote.balancer.fi vote.morpho.org vote.sushi.com
To enable this whitelabel experience, you must subscribe to our Turbo plan. Once your subscription is active, follow the setup process below.
Go to your DNS provider or registrar and create a new CNAME record.
Host: your custom domain (for example, vote.myprotocol.xyz)
Points to: cname.snapshot.box
After you have created the CNAME record, let us know you’d like to enable whitelabel. Reach out to us through our Help center, Discord, or Telegram.
Read more to learn about space hiberation, why spaces get hibernated, and how to activate them.
Space Hibernation is placing inactive or incorrectly configured spaces into hibernation mode. This process aims to enhance the user experience.
Space Controller and admins will see this warning message if space has gone into hibernation mode:
A space will automatically enter hibernation mode if it meets any of the following conditions:
Inactivity for the past 12 months.
Once a space is in hibernation mode it is impossible to create new proposals.
Navigate to the space settings and click "Reactivate space" at the top of the page.
Snapshot is a voting platform that allows DAOs, DeFi protocols, or NFT communities to vote easily and without gas fees.The tool allows high customization of the voting process to cater to the diverse needs of the users and organizations. Customization includes different aspects like calculation of the users' voting power, selection of the voting mechanism, proposal and vote validation, and many more.In short, Snapshot is an off-chain gasless multi-governance client which results are easy to verify and hard to contest.
Gasless: Create proposals and cast your votes without any gas fees.
Flexible voting strategies: Customize how the voting power is calculated through single or combined strategies that enable voting with ERC20s, NFTs, other contracts, and more.
Proposal and voting validation: Use custom logic to define who can create a proposal or cast a vote.
Multiple voting systems: Single choice, approval voting, quadratic voting, and more.
Signed messages: Votes are cast through signed messages easily verifiable.
Custom branding - spaces can use their own branding, color schemes and domain name.
Fully open-source: Snapshot is fully open source with MIT license, the code is available on GitHub at https://github.com/snapshot-labs.
Snapshot’s protocol involves three core elements: spaces, proposals, and votes. A space functions like an organization’s profile, and every proposal and vote is tied to that space. To create a space, the only requirement is to have an ENS domain. Once a space is set up, users can submit proposals and cast their votes on the space’s page. Administrators of the space can tailor the rules for creating proposals and voting by configuring various voting and validation strategies. For instance, a space might require users to hold a minimum of 500 tokens to create a proposal, or it might assign voting power proportionally to the token balance in a user’s wallet.
Customize your space settings, sub-spaces, manage access, voting strategies and validation and more!
Navigate to your space settings from the space menu by clicking on Settings
.
Space controller is the main account that is able to manage the space settings and assign other addresses as admins of the space. By default it's set as the ENS Controller address however you can change it to another address.
To replace the current space controller by a new controller click the Edit controller
button.
To complete your profile, you can upload an avatar/logo, enter a name for your DAO, a description, select up to 2 categories and other details. These settings can be changed at any time.
You can link your social media accounts to the space on Snapshot by typing in your account handle, i.e. @SnapshotLabs
In order to connect the space with sub-spaces you need to set them up for both main- and the sub-space.
First create the sub-space as you would create a normal space. Once the sub-space is set up, type it's linked ENS domain name in the Sub-spaces input field. If everything went well, you will be able to click the +
on the right.
Head to the sub-space settings and type in the linked ENS domain name of the voting in the correct input field.
If you see a ❌ after typing the sub-space name it means that it cannot be found. Make sure that you have created the sub-space before adding it.
Specify how the voting power should be calculated by adding one or up to 8 strategies.
To learn more about what they are and how they work head to Voting strategies.
In order to specify who can manage the space or create proposals, fill in the apropriate field with addresses for:
Admins - able to edit the space settings and moderate proposals.
Authors - able to create proposals without any constraints Make sure that members specified in authors field are allowed to submit a proposal.
Head to Space roles to learn more about each role.
You can provide guidelines and a template which will be displayed during the proposal creation:
To validate if someone can post a proposal or not you can use the basic validation by default which takes your voting power with space strategies and checks if you pass a defined threshold.
To learn what a validation is head to Validation strategies.
The voting delay is a value in time between the time of proposal creation and the moment when users are allowed to vote. The voting period is the duration that the proposal is active and votes can be cast. It is counted from the moment
Quorum is the amount of voting power collectively achieved by voters which is required for a proposal to pass.
You can enable Shielded Voting within your space if you want to enable partial privacy and reduce voter apathy. Shielded Voting designed by Shutter is enabling that by using threshold encryption. You can learn more about it in the technical overview.
In short, Shielded Voting is a voting setting in which the voters choices are private during the voting period and get revealed when the proposal closes.
To enable it head to Voting tab and select Shutter within the Privacy setting.
In the Delegation tab you can set a custom delegation contract to enable delegate discovery for your space:
You can add a custom domain to your space by following the Add a custom domain guide.
If you want to apply a different design (skin) to your space, you have to set a custom domain first. Head to Add a skin to learn how to add a custom skin for your custom domain.
In order to link your organization's treasury to Snapshot you have to:
Choose the treasury network
Enter its Ethereum address
Fill in the name of that treasury.
It is possible to add multiple treasuries to one space.
You can customize your space even further with various plugins which provide extra features. To learn more about the plugins head to Plugins section.
Make sure to click the Save
button on top of the settings page to apply the changes to your space. Once you sign a message (gasless) in your wallet, changes will be applied!
Create a link between multiple spaces of your organization
Organizations can create multiple spaces and link them together. This is useful for enforcing different space settings for proposal creation, voting, and execution. For example, instead of having to change the space settings each time you create a proposal, you could create additional spaces with some of your most frequently used settings.
You can define a main space, or multiple subspaces, in the Sub-spaces section of the space settings.
Do this for both your main space and all subspaces to link them to each other. If you have setup everything correctly they will be displayed on the space page.
A space can add upto 16 sub-spaces
Learn what a custom skin is and how to use one for your space with a custom domain.
A skin is a custom color scheme which you can use for your space if it has a custom domain set up. The customization will be visible only on the custom domain and will not affect the color scheme of your space on https://snapshot.org.
Head to your space settings on Snapshot and find the Custom domain
section.
Select a skin by scrolling through the list of available choices or by typing the name you are looking for. If none of them work for you, you can create a custom skin following the section below: Create a custom skin
Don't forget that the skin will only be applied to the custom domain URL!
Create a fork of the snapshot-spaces repository:
Create a new file in the skins
directory following the my-space.scss
naming convention:
Add your custom scss
to the newly created file. The class name .my-space
should match the filename you created. Make sure that you edit only the values (i.e. #384aff
on the right-hand side and do not change the properties (i.e. --primary-color)
.
You can have a look at a custom skin example by following this link.
Add the import of your newly created scss
file to the skins/index.js file in the following format:
Create a Pull Request with the above changes on the original snapshot-spaces repo.
After the PR has been merged, you will need to wait for the release of a new version of Snapshot which can take a couple of days. Once it's deployed you can move on to the next step.
Follow the steps from Add a skin to your space to use your own custom skin.
Learn about the meaning of space badges
At Snapshot Labs, we want to help our users safely browse and discover spaces and make informed decisions about them. That’s why we’ve introduced verification and warning badges.
The goal is to provide users a simple way to navigate voting in web3. To facillitate that Snapshot displays a verification badge or warning label next to the space name and in each proposal belonging to that space.
The verification badge signifies that the space has been verified as the authentic version of the protocol it claims to be. Please note that the verified badge does not represent an endorsement of the protocol by Snapshot Labs. A verified badge also says nothing about its merits as an investment. A space may carry a verified badge but might still be a bad investment idea. Think of the verified badge only as a tool to help you find the correct version of the space you’re searching for.
The warning badge means that we either identified that space as impersonating a project, IP infringement or potential scam.
Voting on a proposal which belongs to a space flagged with the warning badge is not dangerous as the vote does not trigger a transaction - your account as assets are safe.
If you are using a ticket strategy which gives everyone 1 vote regardless of their holdings, you are required to set up a Voting Validation. Head here to learn how to do it:
Due to multiple spam attacks on Snapshot each space is now required to set up a Proposal Validation. Learn how to do it in
That's it! You should be able to see the custom color scheme for your space on its custom domain
The review can take the team up to 72 hours, so please be patient
If you would like to get your space verified, head to and follow the guide.
I want to create a space, proposal or cast a vote.
I want to contribute to Snapshot.
I want to integrate Snapshot's functionality in my own product.
Turbo space
Verified space with Turbo plan
Verified
Manually curated by Snapshot Labs to identify spaces that passed the verification criteria.
Warning
Manually curated by Snapshot Labs to identify spaces that impersonate a project, infringe IP, or spaces that are proven to be scams.
Turbo is Snapshot's pro plan, designed specifically for spaces seeking advanced governance tools. By upgrading to Turbo, you gain access to a powerful set of features that streamline proposal creation, voting, and oversight, letting you focus on what really matters: effective, transparent governance.
Increase your proposal character limit from 10,000 to 40,000 characters, enabling more comprehensive and detailed proposals.
Offer up to 1,000 voting choices per proposal (previously limited to 20), giving your community a broader range of input.
Post up to 40 proposals per day and 200 per month, doubling the standard allowance to give you more flexibility.
Personalize Snapshot with your own branding, including a custom domain, colors, and logo, for a fully branded governance experience. Learn more.
Implement up to 10 voting strategies (increased from 8) to accommodate a wide range of governance models.
Improve your space's ranking on the Snapshot homepage and in search results, ensuring your proposals reach the right audience.
Get peace of mind with our dedicated spam and scam detection, where flagged proposals are reported within 2 hours.
Boost community engagement: we’ll feature your first proposal on our social channels to maximize visibility.
Enjoy a private Telegram support group with a maximum 4-hour response time, ensuring fast and personalized assistance.
Your space can use premium or non-premium network as base network or as voting strategy.
The Turbo plan is priced at $6,000 per year.
We support payment with crypto using ETH, USDC, USDT, DAI or GHO on Ethereum or Base at this address: 0x6A870312a810409Ff4f1e8Ff2A2724ad8820Fd70
Please reach out to confirm a payment in our Help center, Discord or Telegram.
Upgrade to Turbo today and unlock the full potential of your Snapshot space with robust features, enhanced visibility, and dedicated support.
Learn about the most popular configurations.
Before we jump into specific use cases, let's have a look at the most common configurations that the majority of spaces use on Snapshot.
The minimum setup required to run your governance on Snapshot consists of:
Selecting at least one Voting strategy
Choosing a Validation strategy for proposal creation
This strategy returns the balance for a specific ERC20 token that user holds in their wallet.
Strategy setup:
You can test it out in the Playground on Snapshot:
This strategy returns the balance of the user's ETH holdings as their Voting power.
Strategy setup:
You only need to provide the ETH
symbol:
You can test it out in the Playground on Snapshot:
This strategy returns the balance for a specific ERC721 NFT as the user's Voting Power.
Strategy setup:
You can test it out in the Playground on Snapshot:
eth-with-balance in its simplest way to assign 1 vote to wallets holding any balance of ETH. Regardless of how big the balance is, the VP is always the same and equal to 1 VP. If the wallet doesn't hold any ETH, the VP is 0.
You can also use this strategy to set a voting threshold by adding an optional parameter minBalance
and defining the minimum required balance which will give the user the eligibility to vote and 1 Voting Power. The parameter value is set to 0 by default.
Strategy setup:
You can test it out in the Playground on Snapshot:
Another very popular strategy that gives you control over who can cast the votes. All you need to do is to provide the addresses which should be eligible to vote, and each will have 1 Voting Power.
To assign arbitrary votes to a specific address, see whitelist weighted.
Note that if you add other Strategies to your space and users meet the criteria set by those Strategies, the whitelist approach will not work anymore.
To be able to combine multiple Voting strategies for whitelisted users, use the Basic Validation strategy in a custom setup with the whitelist
strategy selected, and a minimum score of 1 VP.
Strategy setup:
You can test it out in the Playground on Snapshot:
You can also configure a Validation strategy for voting. The combination of Voting Strategies and Voting validation allows you to achieve high customization of your governance process. How? Let's go through a couple of possible scenarios:
You are using several Voting strategies for the Voting Power calculation, and at the same time, you want to require each user to have at least 10 VP to be able to cast a vote. You can then use Basic Validation with a minimum score of 10.
Only specific users should be able to vote, and their Voting Power should depend on their holdings. You can use whitelist
strategy in the custom Basic Validation setup, and any combination of Voting Strategies for the calculation of the individual Voting power.
Your space is attacked by bots and you want only genuine humans to cast votes. You can use the Gitcoin Validation for Sybil resistance, and select a combination of Voting Strategies for VP calculation.
Let's have a look at the currently available strategies:
The Basic Validation Strategy allows you to specify multiple Voting strategies to determine if a user is eligible to create a proposal.
Voting Strategy is a set of conditions used to calculate user's voting power. Strategies enable Snapshot to calculate the final result of voting on a given proposal.
When setting the Validation strategy up it’s important to keep in mind that it is meant to make it difficult for users outside of your community to post scam proposals.
Therefore make sure to use a high threshold, for example, $100 worth of your organization’s token. A good idea would be to check the holdings of previous proposal creators, both legitimate and scammers, to assess a reasonable value.
In case the threshold you’ve set is too high for some of your community members, don’t forget that you can always add the trusted addresses as Authors, thanks to which they will surpass the Proposal Validation stage.
Below you can see an example of the Basic Proposal Validation using Voting Strategies set for the space:
If you want to set up a more complex validation, you can use custom strategies as shown in the screenshot below:
While Basic Validation focuses on the monetary assets, this validation allows you to set requirements protecting your space against Sybil attacks by checking the Gitcoin Passport stamps which serve as validation for the user’s identity and online reputation.
You can select individual or multiple stamps that matter for your space. You can also decide if they need to meet all of these criteria or only one. The more criteria you select, the more Sybil-resistant your space is.
Minimize the power of large token holders and encourage your community to take part in the vote!
A cryptocurrency whale, more commonly known as a "crypto whale" or just a "whale," is a cryptocurrency community term that refers to individuals or entities that hold large amounts of cryptocurrency. Whales own enough cryptocurrency to influence currency markets. https://www.investopedia.com/terms/b/bitcoin-whale.asp
Whales can influence not only currency markets but also the governance process of web3 communities. With the large holdings, their sheer Voting Power can oftentimes swing a proposal for their advantage. This leads to outcomes that are not welcomed by the community, poses a threat to taking the Treasury over, and also to lowering community participation in the vote as its members don't see the point in voting knowing that one wallet can decide on its outcome.
Let's have a look at different setups that will allow your space to minimize the power of whales.
You can predefine the that all proposals in your space will use. In the case of the anti-whale approach, the best solution is the Quadratic Voting type.
Snapshot's Quadratic Voting (QV) type goes beyond the conventional approach of simply calculating the square root of each voter's voting power. It presents a more nuanced and democratic framework for decision-making.
One of the main features of our QV type is its emphasis on the number of individual voters rather than the size of their voting power. By doing so, it ensures that every voice counts, thereby enhancing collective decision-making and preventing power concentration.
Additionally, Snapshot's QV type provides voters with the flexibility to distribute their voting power across multiple choices. This feature allows for a more precise representation of a voter's diverse opinions, all without any additional cost.
Drawing key principles from the Quadratic Funding model, our QV type fosters greater participation and effectively balances influence. It represents a significant advancement over simpler voting mechanisms that rely on basic square root calculations of voting power.
You can set it up for all proposals in your Space by heading to the Voting tab in the Space settings and selecting the desired Voting System in the Type field:
Let's consider there are 3 voters and two choices, A and B:
Alice with 9 tokens
Bob with 4 tokens
Maria with 1 token
John with 1 token
Here's how they allocate their tokens:
Alice allocates all her 9 tokens to A
Bob allocates all his 4 tokens to B
Maria allocates her 1 token to B
John allocates his 1 token to B
This results in:
A having 9 tokens
B having 6 tokens
Now, let's calculate the individual square root contributions for each choice:
A: the square root of Alice's 9 tokens is √9 = 3.
B: the square root of Bob's 4 tokens is √4 = 2, the square root of Maria's 1 token is √1 = 1, and the square root of John's 1 token is √1 = 1.
Next, we add up the square root contributions for each choice and square the result:
A: we square the 3, so A gets 3^2 = 9.
B: we add 2, 1, and 1, giving us 4, and square it, so B gets 4^2 = 16.
The total amount of tokens is 9 + 16 = 25.
So the percentages for each choice are:
A: 9 / 25 = 36%
B: 16 / 25 = 64%
As a last step, we match these percentages with the total voting power of 14 tokens:
A: 36% of 15 = 5.4 tokens
B: 64% of 15 = 9.6 tokens
This Voting System may encourage the whales to create multiple wallets and split their holdings among them. Therefore it's important to also implement a mechanism providing Sybil Resistance. Read more here!
You can think of it as creating multiple buckets which will determine the Voting Power of an individual address. To put it in the simplest way, imagine that:
users who hold less than 5 tokens will have 0 Voting Power
users who hold from 5 to 10 tokens will have 1 Voting Power
users who hold from 10 to 20 tokens will have 2 Voting Power
users who hold more than 20 tokens will have 5 Voting Power
As you can see, you are able to set various thresholds which will fix user's Voting Power at a specific level. This way whales who may have large holdings, for example 1000 tokens, will not get more than 5 Voting Power.
This way the voting can be more reflective of the public opinion.
Strategy setup:
You can test it out in the Playground on Snapshot:
This strategy executes a chosen Voting Strategy and applies algorithms to its result to reduce the impact of big wallets on the vote.
In practice, the strategy sets a soft restriction on the voting threshold by giving limited incentive to the voter below threshold by moderately increasing the voting power of voters and reducing the impact of whales as token amount increases, keeping the gap in voting power within a relatively moderate range.
As an example, assuming our threshold is 5:
if user's Voting Power is below or equal to 5, their final Voting Power will be moderately increased
if user's Voting Power is above 5, their final Voting Power will be reduced (the higher the Voting Power, the more increased it will be)
The following algorithm is applied to the result of the configured Voting Strategy:
antiWhale.threshold
- point at which the antiWhale
takes effect.
Default: 1625
Lower limit: > 0 - set to default if ≤ 0
thresholdMultiplier
- the multiplier at which all results below antiWhale.threshold
are multiplied.
antiWhale.inflectionPoint
- point at which the output matches the result.
-> Results less than this will increase output.
-> Results greater than the inflection point will decrease output.
Default: 6500
Lower limit: > 0 - set to default if ≤ 0
Must be bigger or equal to antiWhale.threshold
. Otherwise will be same as antiWhale.threshold
antiWhale.exponent
- the exponent is responsible for the antiWhale effect.
-> Must be ≤ 1, or else it will have a pro-whale effect.
-> Must be >0, or else it will cause total voting power to trend to 0. Look at the example below to understand its effect.
Default: 0.5.
Upper limit: 1.
Lower limit: > 0 - set to default if ≤ 0.
log
: Boolean flag to enable or disable logging to the console (used for debugging purposes during development)
Strategy setup:
How to avoid scams, spam and make sure that your proposal authors and voters are genuine humans? How can you take into account users' on-chain reputation? Read on!
A Sybil attack is a type of attack on a computer network service in which an attacker subverts the service's reputation system by creating a large number of pseudonymous identities and uses them to gain a disproportionately large influence.\
In the crypto world, attacks, hacks, and scams are unfortunately all too common. Phishing links can be found everywhere - on Twitter, in seemingly harmless blog posts, and in personal emails. We’ve not been immune to them either! As a popular tool for decentralized decision-making, Snapshot.org is an attractive target for scammers looking to manipulate governance proposals for their own gain.
There are multiple ways which can help you minimize the risk of scams, bots and spam behaviors within your space. We will look into:
Validation Strategies (use for Proposal Creation and Voting)
Voting Strategies (use for Voting Validation)
Let’s first recap what are the different permissions of the roles defined in the Members tab of the Space settings:
Controller - in full control of the space, the only role able to change the Controller of the space.
Admin - able to modify the space settings (apart from the list of Admins), manage the space’s proposals and create proposals.
Moderator - able to manage the space’s proposals and create proposals.
Author - able to create proposals without having to go through proposal validation.
Even though we provide several automated mechanisms to minimise the risk of harmful proposals it is still important to have to ability to review the created proposals by an actual person.
The Moderator role enables just that - without having the access to space settings moderators can hide proposals. It is a great way to have more organization members involved in keeping the governance safe without requiring Admins to be available at all times.
A great addition to the Moderators is a notification system which will inform you and your community about newly created proposals. If your organization uses Discord, you can easily activate our Discord Bot on your server.
To do so, invite the bot with this link.
Then type /
to see the commands (require administrator role):
Voilà! Now you and your Moderators can keep an eye on the notifications and react much quicker when a scam proposal has hit your space.
It is also possible to whitelist accounts which will be allowed to create new proposals regardless of the chosen Validation Strategy (more on the strategies in the next section).
Once added as Authors in the Members tab in the space settings they will surpass the validation process and will be able to create new proposals in the space.
If you wish to limit proposal creators to Admins, Moderators and Authors only, you can do so by enabling the Authors only setting in the Proposal tab in the space settings. Make sure to give the Author role to the users you trust!
In technical terms a Validation Strategy is a JavaScript function that returns a boolean (true
or false
) for the connected account to define if someone is eligible to create a new proposal or cast a vote.
Each space can use one Proposal and one Voting Validation for all of its proposals at a time.
Validation strategy can check both for monetary and non-financial assets of the user like POAPs, Gitcoin Passport stamps.
The Basic Validation Strategy allows you to specify multiple Voting Strategies to determine if a user is eligible to create a proposal.
Voting Strategy is a set of conditions used to calculate user's voting power. Strategies enable Snapshot to calculate the final result of voting on a given proposal.
When setting the Validation Strategy up it’s important to keep in mind that it is meant to make it difficult for users outside of your community to post scam proposals.
Therefore make sure to use a high threshold, for example $100 worth of your organization’s token. A good idea would be to check the holdings of previous proposal creators, both legitimate and scammers, to assess a reasonable value.
In case the threshold you’ve set is too high for some of your community members, don’t forget that you can always add the trusted addresses as Authors, thanks to which they will surpass the Proposal Validation stage.
Below you can see an example of the Basic Proposal Validation using Voting Strategies set for the space:
If you want to set up a more complex validation, you can use custom strategies as shown on the screenshot below:
While Basic Validation focuses on the monetary assets, this validation allows you to set requirements protecting your space against Sybil attacks by checking the Gitcoin Passport stamps which serve as validation for user’s identity and online reputation.
You can select individual or multiple stamps that matter for your space. You can also decide if they need to meet all of these criteria or only one. The more criteria you select, the more sybil resistant your space is.
Useful when combined with Quadratic Voting, which provides a certain level of Sybil resistance.
The strategy combines any arbitrary Voting Strategy defining a membership with any Voting Strategy calculating the Voting Power of a user. In the idea one can only vote if he passes the membership strategy, the membership here can be an identity symbol like possessing a UID or a PUNK (with an erc721
strategy) or any other custom verification strategy based on on-chain behavior.
The membership portion is binary. If the membership strategy returns any number > 0 for an address, then user is considered a member and their Voting Power will be the result of the votingPowerStrategy
.
Otherwise voting power for that address will be 0.
Strategy setup:
You can test it out in the Playground on Snapshot:
Assuming the wallet address has been verified to prove its identity by the Space admins the simplest way to implement is to use whitelist strategy which only allows addresses passed into the param to vote on proposals, which is 1 vote 1 address.
To assign arbitrary votes to a specific address, see whitelist weighted.
Strategy setup:
You can test it out in the Playground on Snapshot:
Find the best solution for your use case!
This section will help you combine Voting types, Validation, and Voting strategies based on your organization's needs. We will look into:
Include tokens added in liquidity pools or staking contracts into Voting Power calculation besides those held in users' wallets.
At the moment, Snapshot already supports calculating the Voting Power of the underlying token in the LP/staking contract from the most popular like Uniswap v2 and v3, Balancer, or SushiSwap.
This page only goes through popular strategies as projects may have a different method to call deposited balance in their contracts, which is often customized for a specific use case.
By enabling such a strategy in your space, you can allow the proposal to capture more users interested in your governance.
Some spaces allow only users holding tokens in liquidity/staking pools to have Voting Power.
The strategy fetches the balance of the input token address in all Uniswap-v2 liquidity pools.
This allows uni-v2 LP token holders to vote based on the underlying token cumulated in each pool.
Strategy setup:
You can test it out in the Playground on Snapshot:
Many platforms offer decent yields on one's Uniswap LP tokens.
By staking in their farms, users transfer their LP tokens to the contract they are interacting with (staking contract) and then can earn rewards from the farm they have joined.
The specific type of LP that can be farmed depends on the individual platforms.
The staked-uniswap
strategy allows you to get token balance of an LP in a staking contract.
Strategy setup:
tokenAddress
: the underlying token you want to use to calculate Voting Power
uniswapAddress
: the Uniswap LP address where users can deposit their token
stakingAddress
: the staking contract address where users stake their LP token
You can test it out in the Playground on Snapshot:
In this context, the USDC / ETH LPs with 0.3% and 0.05% fees represent different contract addresses (poolAddress)
respectively.
The demo illustrates how to get USDC balance in the USDC / ETH 0.3% liquidity pool. If you want to calculate the other token in the pool, you can change the paramtokenReserve
to 1.
Strategy setup:
You can test it out in the Playground on Snapshot:
LP tokens provided in SushiSwap are called SLP tokens, and the SLP tokens can be staked into the farm (MasterChef LP Staking Pool) to earn rewards.
This strategy can return the balance of the underlying token in SushiSwap's LP pools and farms as well.
Strategy setup:
address
- the underlying token address
useStakedBalances
- if true it will also return the token balances from the MasterChef LP Staking Pool
masterchefVersion
- if v2 it will return the token balances from the MasterChef V2 staking contract instead of MasterChef V1.
You can test it out in the Playground on Snapshot:
The strategy is more generic and it gets the balance of the LP token or the underlying base token in the LP from a MasterChef staking pool.
Strategy setup:
chefAddress
: Masterchef contract address
pid
: masterchef pool id (starting with zero)
uniPairAddress
: address of a Uniswap pair (or a sushi pair or any other with the same interface)
if uniPairAddress
is null, returns staked LP token balance as is
if the uniPairAddress
option is provided, converts staked LP token balance to base token balance (based on the pair total supply and base token reserve)
tokenIndex
: index of a token in LP pair, by default 0, can switch to 1 for another base token
weight
: integer multiplier of the result (for combining strategies with different weights | optional)
weightDecimals
: integer divisor of the result (1 gives a decimal before the result | optional)
You can test it out in the Playground on Snapshot:
A lot of use cases are beyond regular LP/staking scope, for example calculating the balance of staked NFT or from a custom contract.
The good news is, if there's a method in your contract that reads the balance of the staked token with a single call (interaction with the Smart Contract), you don't need to create a new strategy.
Instead, use contract-call
strategy, which allows any contract method to be used to calculate voter scores.
Strategy setup:
You can test it out in the Playground on Snapshot:
Learn what the space roles are and how you can assign them to users.
Role is a set of permissions related to managing your space and its proposals which an account (wallet address) can be granted.
Controller of space has a full control over the space settings including managing the list of admins.
Admin can edit space settings with the exception of the list of admin users and archive proposals.
Moderator can manage proposals within the Space and create new ones.
Author can create proposals regardless of their voting power and the proposal validation strategy.
There can be only one controller per space and can be updated only by the current controller.
To update the controller role head to the space settings on Snapshot and the Advanced tab. At the bottom of the page you'll find the Danger zone where you can change the controller:
Paste the address of the account you want to set as space controller in the pop-up window and click Set
. It will trigger your wallet browser extension and ask you to sign a transaction with a gas fee.
To update the admins and authors lists head to the space settings on Snapshot and the Members tab.
You can add addresses one by one and choose their applicable role:
Validation strategies are a way to define who is allowed to vote on a proposal or create a new one.
Voting strategies calculate how much Voting power each user has.
Validation strategies are a way to define who is allowed to vote on a proposal or create a new one.
This handbook uses terms like and , . Make sure to learn about those concepts before diving into this chapter! 👉 👉 👉 We also recommend going through the entire guide to get acquainted with the process of and updating its .
If none of the above are a good fit for your Space, we encourage you to use the Search feature of this documentation with the Lens option selected to ask a question and receive a human-friendly answer
Feel free to reach out to us on to suggest use cases that we did not cover!
In comparison with , Uniswap v3 provides users with the most flexibility and granular control over personal assets by introducing features like concentrated liquidity and multiple LP fee tiers per pair — 0.05%, 0.30%, and 1.00%.
The MasterChef contract has been developed by many projects based on SushiSwap’s original contract like . With MasterChef, users can stake their tokens and in exchange they will get a token reward.
As this is a more advanced strategy, don't hesitate to reach out to our support team on !
The controller is first assigned during the process of space creation. By default, it is the ENS domain controller. To learn more about this step, head to .
Learn how to use Voting Strategies to calculate users' Voting Power based on the NFTs they hold.
NFTs are a type of token that represents something unique or indivisible.
Unlike ERC-20 tokens, NFTs are non-interchangeable, meaning each token has its own distinct value and properties. NFTs are designed to represent ownership or proof of authenticity for a specific digital or physical asset. These assets can include digital art, collectibles, virtual real estate, in-game items, and more.
So, can you give someone Voting Power if they hold an NFT from your collection?
Sure thing, read on!
Define criteria that users have to meet in order to be eligible to vote.
Suppose you want to restrict the ability to vote within your community for example to prevent bots from affecting the results or to prioritize members with higher stakes in your organization. In that case, you can do so by setting up Voting Strategies or a combination of Voting and Validation Strategies for your space.
To recap what Voting and Validation Strategies are:
Validation Strategies are a way to define who is allowed to vote on a proposal or create a new one.
Voting Strategies calculate how much Voting Power each user has.
This solution is a combination of any Voting Strategy/-ies and Voting Validation.
Defining the required threshold of the user's Voting Power can be set up simply and leverage the Voting Strategies used in the Space.
Go to Space Settings and open the Voting tab. At the bottom you can find the Validation section:
Select the Basic Voting Validation.
This way you can easily define how much Voting Power is required for the users to cast votes on Proposals in your Space. Voting Power is calculated on the basis of the Voting Strategies set for your Space.
For example, if your Voting Strategy is erc20-balance-of
and a user holds 20 tokens, their Voting Power will be 20 and they will be eligible to vote with the Basic Validation set at 10.
If they hold 5 tokens, they won't be able to cast a vote as it's < 10 VP.
Select the Gitcoin Passport Validation.
This Validation allows you to set requirements by checking the Gitcoin Passport stamps which serve as validation for the user’s identity and online reputation. You can select individual or multiple stamps that matter for your space. You can also decide if they need to meet all of these criteria or only one.
It is also possible to set a required threshold directly through a Voting Strategy.
We highly recommend the first approach of using a Validation Strategy as it allows higher flexibility and is easier to maintain if the Voting Strategies are changed in the Space Settings.
The strategy specifies the minimum balance required for a single token held in the user's wallet.
Let's have a look at an example below. In order to be eligible to vote users are required to hold at least 20 DAI at the snapshot of proposal creation.
Strategy setup:
You can test it out in the Playground on Snapshot:
This strategy allows you to define multiple thresholds and allocate Voting Power at each level.
In the example below, whoever holds less than 1 unit of the token will have 0 Voting Power.
Users holding more than 1 but less than 4 units of the token will have 1 Voting Power.
The maximum Voting Power per user will be fixed at 4 no matter how much of the token they own.
Strategy setup:
You can test it out in the Playground on Snapshot:
erc20-with-balance in its simplest form assigns 1 vote to wallets holding any balance of the token. Regardless of how big the balance is, the VP is always the same and is at 1 VP. If the wallet doesn't hold any token, the VP is 0.
Now, to use this strategy to set a voting threshold you can add an optional parameter minBalance
and define the minimum required balance which will give the user the eligibility to vote and 1 Voting Power. The parameter value is set to 0 by default.
Strategy setup:
You can test it out in the Playground on Snapshot:
Math
strategy is powerful in its composability. It allows you to apply common mathematical operations to the outputs of Voting Strategies.
As an example, you can take a square root of the Voting Power calculated by erc20-balance-of, or the lower (min
) value out of two different Voting Strategies. You can see all possibilities on the strategy page.
If the Voting Power calculated for your space is based on tokens on different chains and you want to set a minimum threshold defining if a user is eligible to vote, you can use the a-if-lt-b
operand. Don't worry if it sounds cryptic, we will go through it step by step.
a-if-lt-b
3
(x, a, b) = x < b ? a : x
Let's look at the formula first: (x, a, b) = x < b ? a : x
, where:
x - sum of Voting Power calculated by the two Voting Strategies on chains 137
and 1
(as per the example below)
a - first constant, in our case it's 0
b - first constant, in our case it's 100
Strategy setup:
The algorithm will check if x is smaller than b, the second constant:
if it's below b, the final Voting Power will be set to a, first constant -> 0
if it's equal to and higher than b, the final Voting Power will be set to x, the sum of result from the Voting Strategies
As you can see we can easily define what is the minimum Voting Power (our example: 100) coming from different chains that is required for the user to vote!
You can test it out in the Playground on Snapshot:
If you want to require users to hold specific tokens in order to be eligible to vote you can use the holds-tokens
strategy.
The minimum balance for each token can be customized.
Users who meet the criteria will receive 1 Voting Power regardless of the total value of the tokens they hold.
Note, that the minBalance
parameter is exclusive. It means that when set to 1, the user has to hold more than 1 of the specified token in order to vote.
Strategy setup:
You can test it out in the Playground on Snapshot:
Which Voting Strategy to choose to enable users to vote on behalf of their delegators?
Before we jump straight into the Voting Strategies setup, let's first understand how users can delegate their Voting Power to others through Snapshot.
<UPDATE FOR NEW DELEGATION UI>
In order to take the delegated Voting Power into account, your space has to use one of the delegation Voting Strategies.
If the delegation-based Voting Strategies are not set for your space, even if users have delegated their VP or are delegates themselves, their Voting Power will be calculated only on the basis of their own assets. This means 👉 Delegation will not work.
In Snapshot, based on whether the delegated power can be taken back by the delegators when they vote, there are two main delegation strategies:
with-delegation
- the delegator cannot vote, only the delegate can participate in voting
delegation
- allows the delegator to vote despite having delegated their Voting Power
Let's have a look at both in detail:
This strategy is a combination of delegation + own Voting Power (if not delegated to anyone), moreover, it prevents the delegators from taking back their delegated VP.
By using this strategy, one can no longer vote if he delegated to another one, and the delegatee's voting power will be his own VP + delegated VP.
cannot vote on proposals if this strategy is used in the Space and if they have delegated their VP to another address (for the current space or all spaces). If delegators wish to participate in voting themselves, they have to revoke their delegation for the current space or all spaces before the creation of the proposal.
The sub-strategies are used to define the source of own VP and delegation.
Strategy setup
You can test it out in the Playground on Snapshot:
This strategy returns the delegated Voting Power only.
Now, what's the deal with both delegate and delegator casting a vote?
In the delegation
strategy, if A delegates to B and both of them vote, then the delegated voting power is not calculated. Only the vote of A will be calculated.
The vote of B will be counted if A does not vote.
It can include a list of sub-strategies (erc20-...
, erc1155-...
, whitelist
, etc) to calculate the user's Voting Power based on the delegation.
Strategy setup
The below example shows that the space allows YFI balance as the delegated voting power in yam.eth
space.
You can test it out in the Playground on Snapshot:
The standard for fungible, non-fungible, and semi-fungible tokens.
Let's start with a quick overview of the ERC721 and ERC1155 standards:
ERC-721
Most widely recognized, golden NFT standard
Inability to conduct batch transfers
ERC-1155
Supports different token types in a single contract, allows batch transfers
Stores less robust information in order to save time and transaction costs
Let's have a look at what Voting Strategies you can use in your space:
The strategy returns the balance of a specific ERC-1155 token in the user's wallet.
Since the ERC-1155 standard supports multiple token types, the tokenId
here may refer to a particular kind of token or a single item of the collection under the contract address.
Strategy setup:
You can test it out in the Playground on Snapshot:
This strategy returns the balance of voters for all tokens in an ERC1155 contract.
On Polygon, works only with contracts with total tokenIds less than 6000.
Strategy setup:
You can test it out in the Playground on Snapshot:
Use this strategy if you want to calculate the Voting Power taking into account multiple tokenIDs.
Try using this strategy with only a few tokenIDs passed in the parameter for the Score API server is likely to have difficulty handling a large number of requests.
Strategy setup:
You can test it out in the Playground on Snapshot:
The equivalent of the erc721-with-multiplierVoting Strategy.
By adjusting the multiplier
to 5, if a user owns 1 DAWN in his wallet, they will get 5 Voting Power (1*5).
Strategy setup:
You can test it out in the Playground on Snapshot:
If you'd like to give more or less weight to a list of specific tokenIDs, you can do so by using this strategy. It might serve as a great addition to the erc1155-with-multiplier for VP differentiation.
Strategy setup:
You can test it out in the Playground on Snapshot:
Learn which strategies to use to allow users holding NFTs to get Voting Power.
ERC-721 was the first standardized interface for creating and trading NFTs and is still considered the gold standard.
ADD SOME JOYFUL TEXT HERE
In Snapshot, the balanceOf
method is applied to both the erc721 and erc20 strategies. The main difference in their implementation is that the decimal of an NFT should always be set to 0.
This strategy returns the balance of the specific ERC721 NFT that the user holds.
It's the most common strategy for NFT-based voting.
How to set it up? Just provide the contract address of the NFT and its symbol.
One who owned the specified NFT at the snapshot of proposal creation will be able to vote based on the number of NFTs they have in their wallet.
Strategy setup:
You can test it out in the Playground on Snapshot:
This strategy gives an arbitrary weight to the balance of the voters for a specific ERC721 NFT.
By adjusting the multiplier
to 100, if a user owns 1 LAND in his wallet, he will get 100 votes (1*100) on the proposal.
Strategy setup:
You can test it out in the Playground on Snapshot:
Each NFT under the same contract address can be identified by its unique tokenID
.
This strategy returns the balance of the voters for a specific ERC721 NFT with a given tokenID
.
If a user holds the NFT which tokenID is included in the tokenIds
parameter, they will get 1 vote regardless of how many they hold in total.
Strategy setup:
You can test it out in the Playground on Snapshot:
This strategy is a modification of erc721-with-tokenid.
It allows 1 vote per whitelisted tokenID specified in the parameter.
So in contrary to the previous strategy, the user who holds three NFTs, each included in the strategy setup, will have 3 Voting Power.
Strategy setup:
You can test it out in the Playground on Snapshot:
The strategy returns the weighted balance of the voters for ERC721 NFT of which the Token ID is specified in the tokenIdWeightRanges
.
Why it might be useful for your space?
NFTs in the collection have continuous tokenIDs
You want to assign different weights to specific batches of the collection (higher VP for first NFT minters, lower VP for latest NFT owners)
The NFT can be assigned a different weight based on the range its token ID falls within.
For example, a user who owns 3 NFTs with the tokenIds: 1000
, 6000
and 8000
respectively will have 3 Voting Power. [(1*2)+(1*1)+(1*0)]
Strategy setup:
You can test it out in the Playground on Snapshot:
Learn what a proposal is and how to create one.
Proposal is the key element of the voting system. It presents a change suggestion related to a specific organization and enables eligible users to cast their vote.
Head to the space which you wish to create your proposal for.
Connect with the wallet provider - make sure the connected wallet is where you hold the tokens relevant to the specific space.
Click New proposal
in space sidebar:\
Fill in the following fields: - Title - Description (optional, 10K character limit) - Discussion link (optional)\
Select the desired voting system, specify the possible vote options, and define the duration of your proposal. Make sure you allow enough time for users to vote.\
Click Publish
- and that's it! You can see your proposal in the proposals list on the space page.
When you create a proposal by default the snapshot block number will be populated with the latest block synced from our node.
The voting power of each user will be calculated for the state of the blockchain at this specific snapshot. It means that if the user acquires required tokens after the proposal has been created, they will not be taken into account for their voting power calculation.
There is a character limit of 10,000 for the description of a proposal.
One address can have a maximum of 10 active proposals at a time, across multiple spaces.
Each space has a limit on the number of proposals created daily and monthly:
All testnet spaces will have the same proposal limits as a Verified space
You can delegate your voting power to another address.
Enter the address you want to delegate to.
To limit the delegation to a specific space, tap the on toggle button and enter the space key (example: balancer.eth
) you want your delegation to take effect on. If no space is selected, the effect will take place for all spaces.
Click Confirm to save your delegation.
Take POAPs into account when calculating the individual Voting Power.
POAPs stands for Proof of Attendance Protocol. In simple terms, POAPs are like digital badges or tokens that you can earn for attending or participating in certain events, both in-person and online.
Let's say you attend a conference, workshop, or even a virtual event. The organizers of that event can create a unique digital token called a POAP. It serves as proof that someone was present or participated in that specific event. Each token has a unique code or ID that represents their attendance.
Now, how can you reward your community for their attendance by giving them Voting Power?
There are several strategies that you can use for your Space:
The poap
strategy returns the balance of POAP for a certain event as Voting Power. However, when the eventIds
is skipped, it will return the number of all POAP tokens owned by the address.
Strategy setup:
You can test it out in the Playground on Snapshot:
Since POAP is an ERC721 NFT, it can be distinguished by its tokenID, i.e. each tokenID represents a unique POAP. One can designate multiple tokenIDs and attach different weight to each.
Learn how you can submit your vote on a proposal and how your voting power is calculated.
There are several aspects that define if you are eligible to vote on a specific proposal.
More often than not the answer is - you did not hold the sufficient amount of specified token at the time of proposal creation.
Click the Connect wallet
button in the top right corner.
Connect with the wallet provider where you hold the tokens relevant for the space you want to vote in.
Go to the space page on Snapshot and selected the active proposal you are interested in.
Click to Vote
button and sign the message via your wallet provider when prompted.
Learn what a voting strategy is and how to set it up.
Voting strategy is a set of conditions used to calculate user's voting power. Strategies enable Snapshot to calculate the final result of voting on a given proposal.
In technical terms a strategy is a JavaScript function that returns a score for a set of addresses.
Voting strategies can be used to create a score from on-chain data, the data however does not necessarily need to be monetary. As an example a strategy can calculate how many POAPs or specific NFTs a user owns.
Majority of spaces on Snapshot is using a single strategy however if you need a more complex calculation, you can combine up to 8 strategies. They will be applied to all proposals created for your space (created after the update of the settings) and the voting power will be calculated cumulatively.
In order to set up a voting strategy head to your space settings and scroll down to Strategies section. You should see the below pop-up after clicking Add strategy and selecting a strategy from the list:
You will see that there is information that you need to provide in order to make the strategy work, for example the network where the token is deployed, its symbol and address of the token's contract.
Before you add the strategy to your space's settings we highly recommend to test it in the Playground in order to avoid any potential issues with the voting process.
If you made a mistake in your space settings and votes have already been cast it is not possible to revert them. The best solution would be to (1) delete the proposal, (2) update the settings with correct strategies and (3) recreate the proposal from scratch after the settings have been updated.
You can access it from the strategy's detail page by clicking the Playground on the right-hand side:
Your browser will load a Playground page where you can test the custom setup for the chosen strategy. As you can see on the below screenshot you can set the required parameters and provide a list of addresses which in this case are or are not holding a the PUNK
ERC721 token.
If none of the above scenarios work for your use case, you can use the customizable Strategies to leverage your own custom calculation mechanisms. Read on to learn more!
Snapshot provides several Voting Strategies that allow you to use your own API to return user's Voting Power or for example perform mathematical calculations on the results from existing Strategies.
This strategy allows off-chain data to be used as Voting Power through calling a custom API endpoint to request the score for a set of addresses.
It's useful to use this strategy if your API can return the Voting Power directly. It's network agnostic.
Strategy setup:
If you are passing an IPFS URL use the following format:
If you are passing a JSON URL use the following format:
If you are passing an API URL use the following format:
If you are passing a API URL with POST method use the following format:
You can test it out in the Playground on Snapshot:
Math
strategy is powerful in its composability. It allows you to apply common mathematical operations to the outputs of Voting Strategies.
If the Voting Power calculated for your space is based on tokens on different chains and you want to set a minimum threshold defining if a user is eligible to vote, you can use the a-if-lt-b
operand. Don't worry if it sounds cryptic, we will go through it step by step.
Let's look at the formula first: (x, a, b) = x < b ? a : x
, where:
x - sum of Voting Power calculated by the two Voting Strategies on chains 137
and 1
(as per the example below)
a - first constant, in our case it's 0
b - first constant, in our case it's 100
Strategy setup:
The algorithm will check if x is smaller than b, the second constant:
if it's below b, the final Voting Power will be set to a, first constant -> 0
if it's equal to and higher than b, the final Voting Power will be set to x, the sum of result from the Voting Strategies
As you can see we can easily define what is the minimum Voting Power (our example: 100) coming from different chains that is required for the user to vote!
You can test it out in the Playground on Snapshot:
A voting validation is a JavaScript function that returns a boolean (true
or false
) for the connected account. Voting validations are being used on Snapshot to decide if an account can vote or create a proposal in a specific space. Each space can use one voting validation for all of its proposals at a time. While voting strategies calculate the Voting Power mainly on the basis of the monetary assets, the validation strategy can serve as a protection against Sybil attacks. It can take into consideration how many POAPs an account owns or track the account activity to assess if the account is a bot or a real human.
The default validation is checking if the address has any voting power. If the voting power is higher than 0
the connected account is validated. A validation strategy can send a call to a node or subgraph.
When setting the Validation Strategy up it’s important to keep in mind that it is meant to make it difficult for users outside of your community to post scam proposals or post spam votes.
Therefore for Proposal Validation make sure to use a high threshold, for example $100 worth of your organization’s token. A good idea would be to check the holdings of previous proposal creators, both legitimate and scammers, to assess a reasonable value.
Validation strategies can be used for two purposes:
proposal validation - determine if the account can create a new proposal,
voting validation - determine if the account can take part in the voting process.
Head to Proposals tab in the sidebar to update the configuration:
Head to Voting tab in the sidebar to update the configuration:
If you want to allow addresses with any voting power to vote you can use the default voting validation.
If you wish to limit proposal creators to Admins, Moderators and Authors only, you can do so by enabling the Authors only setting in the Proposal tab in the space settings. Make sure to give the Author role to the users you trust!
The Basic validation strategy allows you to use existing Voting Strategies configured for your space or define a custom setup to determine if a user is eligible to create a proposal or cast a vote.
In order to use existing setup of Voting Strategies you can simply chose Basic Validation and define a required threshold as on the screenshot below. 100
corresponds to user's Voting Power calculated on the basis of the Voting Strategies.
If you wish to use a different configuration, toggle the Use custom strategies button and define the strategies for your use case:
Validation strategy built together with Gitcoin Passport. You can select individual or multiple stamps that matter for your space. You can also decide if they need to meet all of these criteria or only one. The more criteria you select, the more sybil resistant your space is.
Have a look at the example of the Gitcoin Passport validation strategy.
Voting validation can be specified in your space settings at https://snapshot.page/#/<SPACE ADDRESS>/settings
.
Learn how you can use Snapshot with a Gnosis Safe Multi-sig wallet.
You can use a Gnosis Safe to vote, create a proposal or setup a space on Snapshot.
Your Safe has to be on the same network as the Space is. Head to Space settings, Strategies tab to check the Space's network.
If you'd like to enable asynchronous signing for all Safe's signers and not have to keep the modal open, you have to enable on-chain signatures in the Safe settings.\
Go to Safe Settings -> Safe Apps.
Enable Always use on-chain signatures
A specific (single choice, weighted, quadratic, and others) can be selected individually for each proposal.
Voting power for each user is calculated on the basis of the voting strategies selected in the .
Space ,, , and users who are eligible according to the strategies defined in the space settings.
Proposal limit Each space has a limit on the number of proposals that can be created daily and monthly. For more details have a look at
Learn more about Space verification and flagging in .
You can combine up to 8 . The limit also applies to multi-chain strategies. ( spaces can add up to 10 strategies)
Can add up to 20 choices on a proposal ( spaces can add up to 1000 choices)
Go to
In technical terms, POAP is a type of ab NFT in ERC721 standard. It's minted on the Gnosis chain and can be migrated to ETH Mainnet as an option. Its contract can be found here: .
How to find the event ID of the POAP?
Visit the POAP and search for the name of the POAP you're looking for:
In the example, if one holds a poap with the tokenID "100001", he will get 100 (1*100) voting power.
Each space specifies their in the You can see the custom setup by opening the space settings. This setup can define if you are eligible to take part in the voting and what is your voting power calculated at the .
In most cases you will be required to have a sufficient amount of tokens in the connected wallet at the time of proposal creation. One of the most common questions we receive on our support channels is
Another aspect determining whether you are eligible to vote or not is a defined by the space. It is a mechanism used to define certain conditions like minimum token balance or also to prevent . In other words the space owner wants to make sure that you are human and that bot or fake accounts are not used to overrule the outcome of the voting.
Select the option(s) you want to vote for. The can differ between individual proposals.
Voilà! You have casted a vote
Strategy/-ies are defined in the space settings in section. Each space can select from one up to eight voting strategies. The default strategy is erc20-balance-of
- it calculates the balance of a predefined ERC20 token for each user.
You can browse through 400+ strategies by selecting the Strategies filter on the main page of . If you can't find a strategy that fulfills your needs you can create a new one. To learn more about creating custom voting strategies head to .
Each strategy will require a different setup and you can read the full description and see the required parameters in the strategy's page, for example . You can find each strategy's details through using the search bar and Strategies filter.
If everything is set up correctly you should see the calculated voting power for each address after clicking the button:
You can also create a new custom Voting or Validation Strategy if none of the available solutions meet your needs. Have a look at the section of this documentation to learn more!
As an example, you can take a square root of the Voting Power calculated by , or the lower (min
) value out of two different Voting Strategies. You can see all possibilities on the .
Strategy used in the example:
Spaces are required to use Proposal Validation. Learn how to set it up on this page or read .
Spaces using only a are required to set a Voting Validation to secure their spaces and ensure a fair voting process preventing spam. Learn here how to set it up:
If you are using only a Voting Strategy for your space you are required to use a for Voting to protect your space from spam votes.
The possibilities are endless! You can build a custom validation strategy for your space. Please have a look at for more details.
To use your multi-sig wallet to interact with Snapshot you can login to Snapshot from Gnosis Safe UI by adding as a Safe app. When you try an action like vote, it will create a pending transaction in your Safe transactions queue. This transaction must be confirmed by the Safe signers within 72 hours. Once the transaction is confirmed the vote will be sent and will appear on the proposal.
By default, the confirmation modal has to stay open until all Safe signers confirm. If you prefer to close the modal, you need to enable on chain signatures. Follow the steps from to change your Safe settings.
That's all Signers can now sign even if you you close the confirmation modal.
40
200
20
100
Unverified
3
15
Flagged
1
5
url
string
URL of the API endpoint
undefined
type
string
Type of the API endpoint ( api-get
or api-post
or ipfs
or json
)
api-get
additionalParams
string
Additional parameters for the API endpoint (optional)
``
a-if-lt-b
3
(x, a, b) = x < b ? a : x
The official JavaScript client for implementing Snapshot's functionality in other apps.
Snapshot.js
is an open source JavaScript client which comes with the core functions of the Snapshot's off-chain voting system. It was designed to work both in the browser and with Node.js
.
Node.js
To install Snapshot.js on Node.js, open your terminal and run:
Browser
You can create an index.html file and include Snapshot.js with:
Install dependencies
Build package
Calculate voting power for a list of voters.
Retrieve voting power for a specific address using given strategies.
Validate an address using a given validation strategy.
Return a Ethers.js JsonRPCProvider connected to an archive node.
To help integrators track and identify activity originating from their applications, Snapshot supports an optional app
parameter. This parameter can be included when users cast votes or create proposals, allowing you to tag these actions with your application's identifier.
app
with Snapshot.jsapp
to Snapshot URLsFor platforms that redirect users to Snapshot, you can append the app
parameter to the URL. This tags the action with your application's identifier when the user interacts on Snapshot.
URL format:
Example:
Parameter requirements
Format: Lowercase alphanumeric string
Maximum length: 24 characters
Purpose: The app
parameter will be stored with the vote or proposal data on Snapshot. This enables you to identify and analyze activities originating from your application.
By using the app
parameter, you can seamlessly integrate Snapshot into your platform while maintaining clear visibility over user interactions related to your application.
Create a validation strategy and use it in your own space
To add your own voting validation strategy on Snapshot you need to fork the snapshot-strategies repository and create a pull request.
src\validations.
basic
strategy folder and rename it to the name of your voting validation.If you are not sure about the Validation
class, have a look at its definition:
To make sure your validation passes all tests, run:
Have a look here on the requirements for adding a new validation strategy and make sure you fulfill the points in the checklist:
The team will then review your PR and after it's approved and merged it will be available to choose in your space settings.
Learn how to create a new custom voting strategy.
If you can't find a strategy that fits your the needs of your space you can create a new custom one. Follow the steps below to learn how to do that:
Create a fork of the snapshot-strategies repository:
erc20-balance-of
strategy folder Navigate to strategies
directory, duplicate the erc20-balance-of
directory and rename it to the chosen name for your new strategy.
There are several files you need to edit:
index.ts
This file defines the logic for calculation of the voting power. As an example, the erc20-balance-of
is taking as parameters space
, network
, provider
, addresses
, options
and snapshot
in order to be able to retrieve the balances of the token specified in the options
parameter for the provided addresses:
schema.json
Describe the structure of your strategy by editing the properties
, required
and additionalProperties
key-value pairs according to the logic from index.ts
file:
./snapshot-strategies/src/strategies/index.ts
examples.json
Provide an example for the custom strategy setup which will be displayed on https://snapshot.org on the strategy's details page.
Make sure to include all the parameters you defined above and a list of addresses to test against:
README.md
Write the description of how the strategy works and provide an example of the setup. It will be displayed on the strategy's details page.
Once you saved all the files run the below command with the name of your new strategy:
The review can take the team up to 72 hours, so please be patient 🙏
To obtain higher rate limits on the Hub API use, apply for an API Key.
We want to ensure that we limit the risk of API downtime and provide a reliable and continuous service. Therefore we decided to implement API Keys to ensure that the requests come from genuine users.
🔓 No API Key: 100 requests per minute.
🔑 With the API Key: 2 million requests per month.
We will review your submission and whitelist the address you provided in the form.
generateKey:
b) Copy the signature and run the below curl
command.
Make sure to use the signature hash from step 5 in the sig
param, do not paste the entire response after signing the message. As an example:
You will receive the API Key as a response of the curl
request. Make sure to store it securely.
The only change you need to make is to add the API Key in the headers of your request:
Alternatively, you can use the apiKey
param in the query string with your key as a value:
If you are using the GraphQL interface you need to provide your key in the headers
tab:
Receive event notifications with webhooks.
Snapshot uses webhooks to notify your application when an event happens. Webhooks are particularly useful for asynchronous events like when a proposal is created, when it starts, or when it ends.
The webhook server sends a request for any new event, the request is sent to the configured URL with POST
method and the event object as body.
Here is an example of the event object:
Here are the possible events:
proposal/created
When a new proposal is created
proposal/start
When the voting period for a proposal starts.
proposal/end
When the voting period for a proposal ends.
proposal/deleted
When a proposal is deleted by the author or an admin of the space.
Discover the delegates of specific spaces and delegate your Voting Power directly through Snapshot,
Snapshot enables a couple of ways to delegate your Voting Power to another address (a ).
You can delegate your Voting Power via:
Let's look at each option in detail.
This page only applies to custom delegation contracts. To see the Snapshot native delegation, head to:
https://snapshot.org/#/delegate/space-name.eth
It is possible to discover the Delegate registry of Spaces that provided their custom delegation contract in settings.
Head to the Space page and click Delegates in the left sidebar**:**
You will then see a list of delegates for the Space with the number of their and their total Voting Power within the Space.
You can delegate your Voting Power to one of the delegates directly by clicking the Delegate
button:
Enter the address you want to delegate to.
To limit the delegation to a specific space, tap the on switch button and enter the space key (example: balancer.eth
) you want your delegation to take effect on. If no space is selected, the effect will take place for all spaces.
Click confirm to save your delegation.
You need to call the setDelegate
method with the space id as the first argument (space id is its ENS domain name, for example fabien.eth), and the address of the delegate as the second argument.
Here is an example of integration in a Solidity contract:
Mainnet
Sepolia
Optimism
Arbitrum
Polygon
BNB Chain
Gnosis Chain
Fantom
Base
Base sepolia
Linea
Blast
Sonic
Mantle
The below methods are sending a request to Score API. Same as it requires an API Key for higher usage limits. You can see we require it for the apiKey
variable.
If you already have an API Key for Hub API, you can reuse it for Score.
In case you don't have an API Key, follow the instructions here:
If you're integrating Snapshot's voting and proposal functionalities directly into your platform using , you can include the app
parameter in your function calls:
The validation name has to be included in the in the validationClasses
variable.
Import and declare you new strategy in the file:
It will trigger the tests which you can find in . If you get any errors read them carefully as they should point directly to the problem.
Ensure you meet the requirements for adding a new strategy by reviewing the checklist for adding a new strategy which can be found at:
Create a Pull Request with the above changes on the original repo.
After the PR has been merged, you will need to wait for the release of a new version of which can take a couple of days. Once it's deployed you can move on to the next step.
Head to the strategy's details page and click Playground button. Follow the instructions from to see if it works as you intended.
Congrats, you've just added a new custom voting strategy!
If you are getting close to 2M requests a month contact our support on
If you haven’t already please fill in the below form or submit it via .
After 72 hours have passed you can continue with the next steps. If you get any errors while generating the key, please contact our support on .
After your address has been whitelisted go to and connect your wallet using the account you provided in the submission form above.
You can use this URL and change example.com with your own endpoint to trigger a test callback.
If you want to subscribe to Webhooks, please fill out this , If you don't receive events even after 48 hours after filling the form, please contact our support on
👉 (if the Space has set up their custom delegation contract)
👉
👉
Go to
The direct delegation to a chosen space has priority over the all spaces delegation. What does it mean? Address A delegates to B for all spaces, and A delegates to C for a chosen space. The chosen space uses overriding delegation strategy. B votes first - their VP is taken into account. C votes - their vote has priority (direct single space delegation) and erases B's Voting power (all spaces delegation). A votes - B and C's Voting Power decreased to 0.
Snapshot uses the Gnosis "Delegate Registry" contract here:
The contract is deployed on this address: The contract is also available on "Supported networks" listed above.
Delegations are stored on this subgraph:
A delegation Voting Strategy must be added to the Snapshot space before delegated votes will be counted. You can use the strategy.
Set up a webhook to receive notifications about specific events to your endpoint.
Use automated bots to get notified about proposals on Snapshot.
Use Snapshot's javascript library to integrate features like space and proposal creation, voting, and more in your product.
Query the GraphQL API exposing Snapshot's data like information about spaces, proposals, voting, and more.
Setup a bot to receive Snapshot notifications.
Snapshot has several bot integrations which can be set up for your organization in order to receive Snapshot specific notifications.
Have a look at the list below to see what is currently possible:
For: Discord Status: Ready Install: Invite the Discord bot with this link: https://discord.com/oauth2/authorize?client_id=892847850780762122&permissions=83968&scope=bot
Type /
to see the commands (require administrator role)
Need help? Contact our support on Help Center
For: Discord, Telegram, X, Email, Slack, Webhook, and many more custom automations Status: Ready Install: https://domino.run/explore/apps/snapshot-tmkg6ni3l3r
For: X Status: Ready Install: https://x.com/proposalbot
For: Telegram Status: Ready Install: https://medium.com/boto-corp/telegram-bot-for-snapshot-no-code-353e7f3e2dc8
You can use the Hub GraphQL API to create flexible queries for the data you need to integrate with Snapshot.
You can run queries on Snapshot data using a GraphQL Explorer.
We have exposed an integrated development environment in the browser that includes docs, syntax highlighting, and validation errors. Click the link below to access the interface.
Production hub
Demo hub
id string
Try on GraphiQL
first number
skip number
where:
- idstring
- id_inarray
orderBy string
orderDirection asc
or desc
Try on GraphiQL
id string
Try on GraphiQL
first number
skip number
where:
- idstring
- id_inarray
- space:string
- space_in:array
- author:string
- author_in:array
- network: string
- network_in: array
- state: array
orderBy string
orderDirection asc
or desc
Try on GraphiQL
Choices are indexed 1-based. The first choice has index 1.
id string
Try on GraphiQL
Choices are indexed 1-based. The first choice has index 1.
first number
skip number
where:
- idstring
- id_inarray
- space:string
- space_in:array
- voter:string
- voter_in:array
- proposal: string
- proposal_in: array
orderBy string
orderDirection asc
or desc
Try on GraphiQL
voter string
space string
proposal string
Try on GraphiQL
first number
skip number
where:
- idstring
- id_inarray
- space:string
- space_in:array
- follower:string
- follower_in:array
orderBy string
orderDirection asc
or desc
Try on GraphiQL
first number
skip number
where:
- id:string
- id_in:array
orderBy string
orderDirection asc
or desc
Try on GraphiQL
first number
skip number
where:
- address:string
orderBy string
orderDirection asc
or desc
Try on GraphiQL
TBD
Messages are all the actions (votes, proposals, space settings etc..) that was confirmed on Snapshot, it also include the order on which these actions were confirmed with the field "mci". These messages can be used to replay the whole Snapshot hub API.
first number
skip number
where:
- timestampstring
- spacearray
- space_in:array
- type:string
- type_in:string
orderBy string
orderDirection asc
or desc
Try on GraphiQL
Learn what a proposal is and how to create one.
Proposal is the key element of the voting system. It presents a change suggestion related to a specific organization and enables eligible users to cast their vote.
Voting power for each user is calculated on the basis of the voting strategies selected in the space settings.
Each proposal has the same voting system which provides three choices: accept, reject, abstain.
Users who:
authenticate themselves via whitelisted by the space,
and are eligible according to the selected by the space.
Head to the space which you wish to create your proposal for.
Make sure the connected wallet is where you hold the tokens relevant to the specific space.
Click the new proposal icon in the top right corner:
Provide the necessary details - title, description and discussion link if there is one.
Select the you would like to use:
Define what should happen if the proposal passes by choosing one of the execution options:
A modal will open with the transaction details to fill in:
Click Publish
and authenticate yourself via your wallet. Depending on the space settings you will have to sign a gasless Ethereum message and/or sign a transaction to confirm your action.
Wait for the transaction to succeed. You can see it's pending in the top right corner, just next to your avatar:
Once the icon with the pending transaction disappears, you can reload the page to view your proposal.
Once the proposal has reached a quorum and passed, anyone can execute the transactions specified for it by clicking the Execute transactions button:
You can now subscribe to mobile notifications from the Spaces you follow on Snapshot!
It's simpler than you think:
Join (follow) a Space you would like to receive notifications for
Click the Alert bell icon to turn the notifications on
Open Coinbase Wallet and Converse and log in with the account you used on Snapshot.
Start receiving notifications from chat.snapshot.eth!
You can easily toggle, start, or stop notifications by sending a message in the chat app:
Lighthouse connects you to all your Snapshot spaces and keeps you updated with push notifications whenever a proposal is created or ending soon. Read proposals and comments, and even vote without leaving the app. Everything is cryptographically verified, allowing you to focus on the content that matters.
If you own or manage a space, Lighthouse also enables you to securely communicate with your voters, analyze engagement, and more.
Snapshot X is an on-chain voting protocol. Technically speaking, it's a set of modular smart-contracts that interact with each other to do all the book-keeping. The difference with the original Snapshot is that Snapshot X is fully on-chain. What this means is:
The protocol is censorship resistant: Anyone can cast a vote. The protocol runs without any reliance on offchain or centralized services which have the power to censor votes. [1]
Voting power is computed on-chain: The voting logic is fully on-chain and auditable so you can be sure of the logic used to compute voting power and decide on the outcome of proposals.
The execution is trustless: Proposal transactions are automatically executed following the passing of a proposal. Say you create a new proposal which, if it passes, will transfer 1ETH to vitalik.eth
. If the proposal passes, the 1ETH will automatically get sent to vitalik.eth
, without any further human action needed.
If anything in these docs is unclear or you would like more detail, do not hesitate to reach out on Discord.
[1] We note that there are in fact offchain services (eg the relayer Mana) built for use with Snapshot X, but these are not mandatory and therefore cannot lead to censorship.
Learn how to create a new space for your organization.
Head to the Create space page and follow the below steps:
Provide the profile information like name
, description
, social links or handles and treasury
.
In order to set your Treasury select the network first.
Choose the network for your organisation. At the moment Snapshot X works with Ethereum.
ℹ️ Starknet implementation is coming soon.
Voting Strategies calculate the Voting Power of each user.
Select a Voting Strategy from the list of available options and provide the required details.
For example for the Delegated Compound Token you have to provide the token contract address, its decimals and the symbol:
Choose how users will be authenticated in order to create a proposal or cast a vote.
The two authenticators provided by Snapshot X are:
It will authenticate a user based on a message signed by an Ethereum private key.
Users have to submit a transaction on Ethereum. Authentication is proving that the sender's address is valid.
Proposal Validation is setting requirements that user needs to meet in order to create a new proposal.
Define the minimum Voting Power required to create a new proposal.
⚠️ We highly recommend setting a high threshold to avoid scam proposals. ⚠️
Once you have defined the required Voting Power, you can then select the Voting Strategies which will be used to calculate the voting power of proposal creators and assess the eligibility to create a new one:
Execution Strategies have two key roles:
determining the status of a proposal at any time,
and executing the payload of a proposal if it has been accepted.
When selecting the execution strategy you have to provide a quorum - minimum number of votes required for a proposal to pass.
Currently Snapshot X provides two Execution Strategies:
-> ideal solution for treasuries on Safe
-> executes transactions on an Avatar contract
-> uses simple quorum
To set the Avatar Execution Strategy up fully you have to enable it on your Safe account after you have created your space. Follow this guide to complete the setup:
-> adds additional security layer to review or cancel transactions before they get executed
-> executes transactions after a delay specified in seconds
-> uses simple quorum
Customize the setup for voting which will affect all proposals in your space:
Voting delay - The delay between when a proposal is created, and when the voting starts. A value of 0 means that as soon as the proposal is created anyone can vote while a value of 3600 means that voting will start 3600 seconds after the proposal is created.
Minimum voting duration - The minimum duration of the voting period. It is impossible to execute a proposal before this period has elapsed.
Maximum voting duration - The maximum duration of the voting period, it is impossible to cast a vote after this period has passed. The minimum voting duration
must be less than or equal to this value.
Space controller is a user that has a full control over the space settings.
The address can differ from your own, you can for example set a multisig account as the controller.
Click Create and sign transaction(s) in your wallet. You will have to sign multiple transactions, each for individual contracts to be deployed:
Space contract
Execution strategy contracts - each space has its execution strategy deployed as an individual contract
And that's it! 🎉
Authenticators are the contracts in charge of authenticating users to create proposals and cast votes.
All proposal creation, proposal update, and vote transactions must be sent to the relevant DAO's space contract via an authenticator.
DAOs are free to write their own custom authenticators that suit their own needs however we provide the following approaches:
Will authenticate a user based on a message signed by an Ethereum private key. Users create an EIP712 signature for the transaction which is checked for validity in this contract.
v
,r
,s
: ECDSA Signature
salt
: The salt used in the signature to prevention replays (only required for proposal creation and updating).
target
: The destination space contract.
functionSelector
: The function selector of the desired action.
This can work in conjunction with a meta transaction relayer to allow proposal creation or vote costs to be sponsored by the DAO, providing a free end user experience.
Will authenticate a user by checking if the caller address corresponds to the author
or voter
address.
target
: The destination space contract.
functionSelector
: The function selector of the desired action.
The core use case for this authenticator is to allow smart contract accounts such as multi-sigs to use Snapshot X as they have no way to generate a signature and therefore cannot authenticate via signature verification.
Our modular approach here allows spaces to authenticate users via other authentication methods without any changes to the space contract.
Query data with Subgraphs on The Graph.
Snapshot’s onchain data can be easily queried with open APIs known as subgraphs. Subgraphs are decentralized APIs powered by The Graph, a protocol for indexing & querying data from blockchains.
Check out the following examples:
Example output
https://gateway.thegraph.com/api/[api-key]/subgraphs/id/4YgtogVaqoM8CErHWDK8mKQ825BcVdKB8vBYmb4avAQo
You can pass any GraphQL query to the Snapshot endpoint and receive data in JSON format.
This following code example will return the exact same output as above.
You can use the GraphiQL Explorer to compose your GraphQL queries by clicking on the fields you want.
The Graph is a decentralized protocol that enables seamless querying and indexing of blockchain data. It simplifies the complex process of querying blockchain data through the use of subgraphs (open APIs).
Anyone can query subgraphs on The Graph
All users get 100,000 free queries per month
Unlocking more queries is a seamless experience, you can pay with crypto or a credit card
After deploying the proxy you should call the initialize
function with the initial set of Space settings.
votingDelay
: The delay between when a proposal is created, and when the voting starts. A value of 0 means that as soon as the proposal is created anyone can vote whilst a value of 3600 means that voting will start 3600 seconds after the proposal is created.
minVotingDuration
: The minimum duration of the voting period. It is impossible to execute a proposal before this period has elapsed.
maxVotingDuration
: The maximum duration of the voting period, it is impossible to cast a vote after this period has passed. The minVotingDuration
must be less than or equal to this value.
proposalValidationStrategyMetadataURI
: A metadata URI corresponding to the proposalValidationStrategy
.
daoURI
: A metadata URI as defined in ERC-4824.
metadataURI
: The metadata URI for the space (its name, description, social tags and treasury address).
votingStrategyMetadataURIs
: An array of metadata URIs corresponding to the votingStrategies
array.
Each DAO on Snapshot X will have at least one space, however a DAO might choose to have multiple spaces if they want to create different rules for individual proposals. As an example one space can use an Ethereum signature as an authentication, another an Ethereum transaction.
Once a space has been created, users can create new proposals by calling the propose
method. Inside propose
, the Proposal Validation Strategy is called to validate author
upon creating a proposal.
author
: The address of the proposal author.
metadataURI
: The metadata URI of the proposal.
userProposalValidationParams
: An array of parameters that will be passed to the Proposal Validation Strategy for the Space.
Since the proposal is created via an authenticator, the exact external interface for creating a proposal will depend on the interface of the chosen authenticator.
Provided that the votingDelay
has not elapsed yet, the proposal author
can update the proposal metadata and execution strategy. This allows mistakes in the initial proposal to be fixed.
author
: The address of the proposal author.
proposalId
: The unique ID of the proposal in the space. IDs are assigned incrementally to proposals based on when the proposal was created.
metadataURI
: The updated metadata URI of the proposal.
Since the proposal is updated via an authenticator, the exact external interface for updating a proposal will depend on the interface of the chosen authenticator.
Once a proposal has been created, and the votingDelay
has elapsed, users can then vote for the proposal.
voter
: The address of the voter.
proposalId
: The unique ID of the proposal in the space. IDs are assigned incrementally to proposals based on when the proposal was created.
choice
: The vote choice: FOR
, AGAINST
, or ABSTAIN
.
userVotingStrategies
: An array of voting strategies that should be iterated through to calculate the voter's voting power. The strategies in this array must be whitelisted by the space however there is no requirement to pass all of the whitelisted strategies. This could be useful when a user knows that they only have voting power on a subset of the whitelisted strategies and therefore can save gas by only passing strategies that they know they have non zero voting power on.
metadataURI
: The metadata URI for the vote.
Since the vote is cast via an authenticator, the exact external interface for casting a vote will depend on the interface of the chosen authenticator.
Calling the execute
function on the space will call the execution strategy with the proposal state along with the execution payload. The execution strategy will then use the proposal state to compute the status of the proposal.
If the proposal status is deemed to be Accepted,
then the payload will be automatically executed by the strategy.
If the proposal status is not Accepted
(or VotingPeriodAccepted
), then the transaction will revert. Note that there is no caller authentication on execute
, simply call theexecute
method on the Space contract directly:
proposalId
: The ID of the proposal.
executionPayload
: The payload of the execution. This must be the same as the payload passed when a proposal was created. We require the payload to be resubmitted because we don't store it inside the proposal state, instead, we just store its hash.
We provide the following view function to access the proposal status at any time.
proposalId
: The ID of the proposal to query.
voter
: The address of the voter to query.
A proposal can be cancelled as long as it has not already been executed.
proposalId
: The ID of the proposal
This can be used to prevent damage from malicious or broken proposals.
All Space settings can be updated using the updateSettings
function:
A single entrypoint is used instead of separate ones for each value so that a single transaction can be used to update a large number of settings. This improves the UX while also preventing undesired behaviour that may arise if proposals are created half way though the settings update process.
If one does not want to update a certain value, then the following placeholder values can be used in the function call (arrays can just be left empty):
Note that Space setting updates will not affect the functioning of ongoing proposals at the time of the settings update since we store the necessary settings data inside the state of each proposal.
A Space contract's implementation can be upgraded to a new version using the following methods:
newImplementation
: The address of the new space implementation.
data
: A encoded function call to initialize the new implementation.
The owner
can be transferred to a new address or renounced entirely.
If you added the Safe execution strategy to your space you have to enable it on your Safe account after creating the space.
Head to your space settings and scroll down to the bottom of the page and click the Safe address on the right side of the screen.
A new tab will open on the Etherscan explorer.
Copy the address of the contract:
Click the App
tab in the sidebar to open the list of available Safe applications.
Click on Custom Module.
Paste the contract's address you copied in the first step in the Module Address
field.
As a last step you will have to sign a transaction.
Snapshot X's main contract is the Space contract. Proposals are created, votes are cast, and all of the proposal state is stored here. Beyond this however, the majority of the protocol functionality has been abstracted out of the Space contract.
These abstractions consist of:
This approach allows a far higher degree of modularity and customisability than what would be possible if all of this logic was handled directly by the Space contract itself.
Creating a space on Snapshot X is like creating a new character in a game. First you need to select an armour to protect your character, then you need to decide on a weapon (spear, sword, bow). Finally, you need to choose a mount for your character to get him to travel from town to town faster.
Let's go over those briefly:
Authenticators Determine how the participants can be authenticated to create a proposal or cast a vote. In general this will be some kind of signature or transaction caller verification.
Proposal validation strategies Determine how an author is validated to create a proposal. A common approach is checking that the author exceeds a certain threshold proposition power calculated through a set of strategies.
Voting strategies Determine how the voting power is computed. Voting strategies are custom contracts that allow you to determine how you compute the voting power of each participant in the vote. Arbitrary logic can be implemented here to create complex and expressive governance mechanisms. The most common way of voting is voting with your tokens (1 token = 1 voting power, so if you have 100 tokens you get a total voting power of 100). This is a voting strategy. But you could imagine other voting strategies: for example, only give voting power to the owners of a specific NFT. Or maybe use a quadratic model, where users only get the square root of their token balance (to minimise the power of whales).
Execution strategies Have two key roles:
1) Determine the status of a proposal at any time during its lifetime.
2) Determine what should happen once a proposal passes.
This latter role will generally consist of executing a set of transactions linked to the proposal. The strategy can control which contracts are authorised to execute the transactions or alternatively execute them directly itself.
This modularity allows anyone to extend the basic protocol to suit their requirements. We provide a set of pre-built and audited modules but we invite you to write your own!
The full usage flow looks like this:
A DAO deploys a Space contract and defines space settings along with a set of authenticators, voting strategies, and a proposal validation strategy.
A user can create a proposal in the Space via a whitelisted authenticator. The proposal validation strategy is queried to check that the user is eligible to create the proposal. To create a proposal, the proposer has to specify an execution strategy contract along with an execution payload that will contain the encoded set of transactions inside the proposal.
Users can vote on the proposal by authenticating through one of the whitelisted authenticator contracts.
Once the voting period has ended, anyone can execute the proposal permissionlessly. This will forward the execution payload to the execution strategy and execute the transactions included.
The below diagram showcases an example of how the contracts that make up Snapshot X fit together along with various actions users can take to create proposals, vote, execute proposals, and update settings.
Learn how you can cast a vote on a proposal.
There are several aspects that define if you are eligible to vote on a specific proposal.
One of the most common questions we receive on our support channels is Why can't I vote?
More often than not the answer is - you did not hold the sufficient amount of specified token at the time of proposal creation.
Click the Connect wallet
button in the top right corner.
Connect with the wallet provider where you hold the tokens relevant for the space you want to vote in.
Go to the space page on Snapshot. You can vote directly from this view or go to the proposal you are interested in to read more details before you vote.
In the proposal page you can see your Voting Power. If it shows 0
it means you cannot vote on the selected proposal.
Select the option you want to vote for - Accept, Reject, Abstain.
Depending on the space settings you will have to sign a gasless Ethereum message and/or sign a transaction to confirm your action.
You will notice that a new icon has appeared in the top right corner, just next to your avatar:
The number indicates the number of pending transactions. Once it disappeared you can reload to page to view your vote. Voilà! You have just cast a vote 🎉
And that's it! You have created a new proposal
data
: The ABI encoded transaction payload for the action. Refer to the section for more information on the payload contents.
data
: The ABI encoded transaction payload for the action. Refer to the section for more information on the payload contents.
Please note, that if you wanted to add sybil resistance to your governance process, this should not be handled by Authenticators, but by or .
You can see an interactive query playground on the , where you can test any query.
The schema for this subgraph is defined .
This is visible from the on Graph Explorer.
Go to and connect your wallet.
Go to to create an API key.
You can use this API key on any subgraph on , and it’s not limited to just Snapshot.
For more information about querying data from your subgraph, .
To explore all the ways you can optimize & customize your subgraph for a better performance, read more about .
is the core contract: it's in charge of tracking proposals, votes, and general settings. In this section we will go into detail on how to deploy a space, and the various user actions that can take place.
Space should be deployed via the Proxy Factory contract, which emits deployment events that will get indexed by the .
To reduce deployment costs and to enable upgradability, we use ERC-1967 proxies and follow Open Zeppelin's on the space contract implementation.
owner
: The address of the account that controls the Space contract. This account will have permissions to update space settings, cancel a proposal, and authorize an upgrade to the implementation. If you would like to remove this trust assumption, the owner can be renounced. Refer to the section for more information.
proposalValidationStrategy
: A strategy that validates whether an author can create a proposal. The strategy consists of a contract address where the strategy lives, along with a set of parameters that configure it for the particular usage. More information in the section.
votingStrategies
: An array of voting strategies selected for the space. The voting power of each user will be calculated as the sum of voting powers returned for each strategy in the list for that user. More information in the section.
authenticators
: An array of whitelisted authenticators. These are the ways in which a user can authenticate themselves in order to vote or propose. More information in the section.
executionStrategy
: The execution strategy that should be used to execute a proposal if it is accepted. The strategy consists of a contract address where the strategy lives, along with an encoded execution payload. More information in the section.
executionStrategy
: The updated execution strategy that should be used to execute a proposal if it is accepted. The strategy consists of a contract address where the strategy lives, along with an encoded execution payload. More information in the section.
The status of a proposal is actually defined by the chosen Execution strategy rather than the space itself, therefore this query actually makes an internal call to the Execution strategy of the proposal. Refer to the section for more information.
proposal
: The proposal state struct object, defined .
proposalStatus
: The status of a proposal at the timestamp when queried. This function will send an internal call to the getProposalStatus
method on the Execution strategy. Refer to the section for more information.
The Space contract implements ERC-4824 which is a standard URI and JSON schema for DAOs, focusing on relating on-chain and off-chain representations of membership and proposals. More information can be found . The standard adds a daoURI
string to the space settings which can be queried using the following interface:
In this section we will go over the actions that can be made by the Space Controller. Note that we use Open Zeppelin's module to gate access to this functions, and therefore at the contract level we use the term owner
instead of controller
.
Refer to for more information.
And that's it, your proposals can now be executed!
.
.
.
.
With that analogy in mind, think about the Space contract like the character, and the , , , and like the different add-ons you need to decide on. We refer to them collectively as Snapshot X Modules.
If you are planning to integrate Snapshot X into your own product, head to section to learn about our SDK.
Each space specifies their in its settings. You can see the custom setup by opening the space settings. This setup can define if you are eligible to take part in the voting and what is your Voting Power calculated at the timestamp of proposal creation.
Go here if you want to create a space, proposal or cast a vote.
Technical documentation for Snapshot X protocol.
Go here if you want to understand the protocol architecture.
Execution Strategies have two key roles:
Determining the status of a proposal at any time,
Executing the payload of a proposal if it has been accepted.
Each proposal should have an Execution strategy set when it is created. This consists of a strategy contract address, along with an execution payload.
This page provides more details on the Execution strategies along with the implementations that we offer.
Every execution strategy should have a public view function getProposalStatus
with the following interface:
This function takes the proposal state as input and returns the proposal status defined by a ProposalStatus
enum. This enum contains all of the possible states the proposal can be in:
Note that because of having separate minVotingDuration
and maxVotingDuration
, we have two separate statuses for inside the voting period: VotingPeriod
and VotingPeriodAccepted
.
Abstracting status functionality outside of the space contract allows far greater flexibility in governance mechanisms since users can define their own logic on exactly how the status is determined. We provide the following implementations:
A proposal is accepted if FOR
votes exceed AGAINST
votes and the total votes (FOR
+ AGAINST
+ ABSTAIN
) exceed the quorum
.
Has a single parameter quorum
which is set when the strategy is deployed.
A proposal is rejected if AGAINST
votes exceed the quorum
, otherwise, it is accepted.
It has a single parameter quorum
that is set when the strategy is deployed.
This approach unlocks optimistic governance mechanisms where proposals are assumed to be accepted unless DAO members choose otherwise by voting against. This can lead to a far higher level of governance efficiency as it reduces the number of on-chain transactions for 'non-controversial' proposals.
It has two parameters: quorum
and emergencyQuorum
, where emergencyQuorum
should be set greater than quorum
.
If the total votes are less than emergencyQuorum
, then the proposal status is computed in the same way as Simple Quorum with the quorum
parameter. However if the higher emergencyQuorum
is met, then the minVotingDuration
is ignored and a proposal can be executed early.
If the proposal status is Accepted
(or VotingPeriodAccepted
) the Execution strategy should then execute the proposal payload. We provide the following payload executor implementations:
An execution strategy that allows proposals to execute transactions from a specified target
Avatar contract, the most popular one being a Safe.
To use this strategy in a proposal, you must whitelist the space in the strategy, this can either be done at deployment or using the enableSpace
function. The proposal payload should consist of an ABI encoded array of type MetaTransaction[]
with the following format:
An execution strategy that is itself a Timelock contract. A timelockDelay
is specified when the Timelock is deployed. When a proposal with this strategy is executed, the proposal transactions are queued in the Timelock for timelockDelay
seconds before they can be executed. The proposal payload should consist of an ABI encoded array of type MetaTransaction[]
with the following format:
Feel free to create your own Execution strategies! The interface of a strategy can be found here.
Proposal validation strategy is used to determine whether a particular author
is allowed to create a proposal.
Each Space has to set a proposal validation strategy which consists of an address and a set of params
that are stored in the space. These strategies should have the following interface:
author
: The author of the proposal.
params
: Parameter array set in the space contract that is the same for every user of the Strategy.
userParams
: Parameter array submitted by the author
when they create a proposal, and can therefore be different for each user.
There is no requirement to use either of these parameter arrays in your strategy, in which case you can just pass an empty array.
DAOs are free to write their own custom strategies that suit their own needs however we provide the following approaches:
A strategy that validates an author
to create a proposal if their propositionPower
calculated from a set of Voting strategies exceeds a proposalThreshold
value. It means that if the proposal threshold is set to 5
, the author needs to have at least 5
Proposition power to create a proposal. This strategy uses the same logic as Voting strategies, so refer to that section for more information.
When calling this strategy, params
should be:
userParams
should contain the indexed strategies that the author
has power with:
A strategy that validates an author
to create a proposal if the author
has not exceeded a limit of maxActiveProposals
.
Each time an author
creates a proposal, a counter is incremented up to a limit of maxActiveProposals
. After this point, no more proposals can be created until a cooldown
period has elapsed since the most recent proposal they created.
Using this strategy can help to prevent proposal creation spam in your space.
These strategies can be combined and extended to provide flexible Proposal validation mechanisms. The interface for Proposal validation strategies can be found here.
Voting strategies are the contracts used to determine the voting power (VP) of users. Voting strategies can be created in a permissionless way, however, to use one, one must whitelist the strategy in the space contract for your DAO.
The most common example is using the ERC-20 token balance of a user to determine their voting power. But you could imagine other voting strategies: owning a specific NFT, owning NFT of collection X and another NFT of collection Y, having participated in protocol XYZ... the possibilities are endless! We are fans of the Turing Complete Governance, the concept of a governance system with arbitrary programmability. This will allow complex and expressive mechanisms of coordination to be seamlessly integrated into governance decisions.
Snapshot X reaches this standard, and we are excited to see what people build!
All voting strategies must have the following interface:
getVotingPower
is called internally by the space contract when a vote is cast. timestamp
is the snapshot at which voting power is calculated for all users. We use a timestamp rather than a block number to better enable multi-chain applications since a timestamp is universal to all chains.
There are two sets of parameters for each voting strategy, params
and userParams
.
params
are set in the space contract and are the same for every user who calls that strategy in the space, they act as configuration parameters for a strategy. An example here is a token contract address that will be queried, or a constant scaling factor that should be applied to the VP returned for every user.
userParams
are submitted by users when they create a proposal or cast a vote, and can therefore be different for each user. An example here is storage proof.
There is no requirement to use either of these parameter arrays in your strategy, in which case you can just pass an empty array.
When a user casts a vote, the array of whitelisted Voting strategies will be iterated through and getVotingPower
will be called on each. The VP of the user will be the aggregate of the voting power from each strategy. The aggregate Voting power for all users is also stored inside a Uint256
, therefore when writing or selecting voting strategies, it is important to consider the likelihood of overflow.
DAOs are free to write their own custom strategies that suit their own needs however we provide the following approaches:
A strategy that allows delegated balances of Compound style checkpoint tokens to be used as Voting power. To use this strategy, your token must have the following interface exposed:
When calling this strategy, params
should be:
userParams
is not needed.
A strategy that allows delegated balances of OpenZeppelin style checkpoint tokens to be used as Voting power. To use this strategy, your token must have the following interface exposed:
When calling this strategy, params
should be:
userParams
is not needed.
A strategy that returns a specified Voting power for addresses that are within a whitelist, and zero otherwise. Having a customisable VP for each user allows more fine-grained control than enforcing a VP of 1 for everyone - which can still be achieved by just setting the value to 1 for each member of the list. Each member of the whitelist should be represented as the struct:
When calling this strategy, params
should then be an ABI encoded array of type Member[]
where the members are sorted into ascending order based on their addr
.
userParams
is not needed.
Feel free to create your own strategies!
We hope that the flexibility of the system will unlock a new era of programmable on-chain governance. The interface of a strategy can be found here.
The UI is the official interface for Snapshot X.
https://github.com/snapshot-labs/sx-monorepo/tree/master/apps/ui
Starknet having its own language (Cairo) and being a ZK Rollup, there are some Starknet specific details. The Snapshot X Starknet implementation allows DAOs to govern their L1 DAO trustlessly, with very little fees and no user friction. Indeed, users do not have to bridge their tokens, nor do they need to create and install a Starknet wallet.
This is all handled seamlessly by the Snapshot X protocol by taking advantage of the existing native bridge, some storage proofs, and a transaction relayer.
This diagram represents the flow of a proposal that will get executed on L1, with voters using their regular EVM account to vote.
https://whimsical.com/storageproofs-7kjLqMvsR3okzFgMrad9Fu
In a nutshell, storage proofs are cryptographic proofs that a user had this token or that NFT in their wallet at a specific moment in time. We use them to compute the voting power of any user at the moment the proposal started, without the user having to bridge their tokens. This technology developed in collaboration with Herodotus, allows for a trustless balance verification that we can use to compute the voting power of users. The exact code for verifying a storage value can be found here.
A user creates a proposal. The space registers it and stores the start timestamp.
When the proposal starts, the space caches the block number on L1 that corresponds to the stored start timestamp
. To do that, we use Herodotus' timestamp remapper contract.
Later on, when a user vote, he provides a storage proof of his balance at the block cached by the space. The space then provides the storage_proof
, the block_number
, and the l1_contract_address
to Herodotus' Facts Registry for verification.
If the verification succeeds, the space can safely accept the vote, the voting_power
of the user having been correctly proven and verified.
For OpenZeppelin ERC20Votes tokens, the function get_past_votes
is reproduced in this voting strategy by proving two values: we first verify the checkpoint c
containing the number of delegated power ; and then verify that the checkpoint c + 1
is empty (ensuring that c
was indeed the latest checkpoint). As a last detail, the Checkpoint
structure got changed by OpenZeppelin to a Checkpoint 208, so we also support this version.
In order to avoid the overhead of installing and managing a Starknet account, we ask users to sign their vote with their Ethereum wallet, and then simply relay the transaction on the Starknet network using our transaction relayer Mana. Once the transaction is relayed, and by leveraging the modularity of our authenticators system, a special authenticator verifies the provided signature and lets the vote be counted in!
But who pays for the relaying fees? It is expected that DAOs who want to provide their users with this ease of vote would be the paying those fees, which should be minimal anyway!
Once the proposal has ended, and if the proposal has been accepted, then the transaction can be broadcast back to our L1 Avatar Execution Strategy contract. This module works hand in hand with Zodiac's Avatar (e.g a Safe), and allows the transactions attached to the proposal to be executed directly on the avatar!
Snapshot X has completed a full audit with ChainSecurity and OpenZeppelin.
To enhance the user experience of interacting with the protocol, we offer a number of additional off-chain services. All of these products are fully open source in the Snapshot Labs Github organization. These are all completely optional and therefore do not introduce any censorship concerns.
SX UI: An easy to use interface for interacting with the protocol.
SX API: A fast and efficient indexer for all the protocol data.
SX.js: A Typescript SDK that can be used to build 3rd Party Integrations with the protocol.
Mana: A meta-transaction relayer that can provide a way for proposal creation and vote costs to be sponsored.
The system included a mechanism that allows DAOs to fund the transactions sent by the relayer, enabling the free end user experience. However importantly, users can directly interact with Snapshot X and therefore do not rely on trusting the relayer to not censor votes. Additionally, Anyone can run a relayer if they want to take over the sponsoring of transactions.
Note that currently Mana only supports proposal creation, proposal updates, and vote casting transactions. It does not currently support proposal execution or space controller actions.
Subscribe to a weekly newsletter summing up what has happened in the spaces you follow.
Snapshot allows you to subscribe to an e-mail notification system which helps you to stay up to date with spaces you follow.
You can opt in to receive the following notifications:
Weekly digest - summary of spaces' activity over the previous week
New proposal - new proposals in spaces you follow
Closed proposal - list of closed proposals with their results
Connect your wallet to Snapshot by clicking the Connect wallet button in the top bar.
Click on your account displayed in the top bar and select ✉️ Email notifications:
Type your e-mail address and click Subscribe. You will be asked to sign a message in your wallet provider extension.
After signing the message and receiving the confirmation of a successful subscription head to your mailbox and verify your e-mail:
A new tab will open with a successful verification message.
Notifications are sent out every Monday on a weekly basis.
You can easily opt-in and out of the available notifications.
Click on your profile name in the top bar and select Email notifications:
A new pop-up window will open where you can toggle the different options:
You can easily unsubscribe via the link in each weekly digest or proposal-related notification email.
Head to your inbox and find an email from the Snapshot subscription, apart from the initial verification message. Scroll down and find the Unsubscribe link.
You'll be redirected to a page informing you that you have successfully unsubscribed from the notifications.
Learn what plugins are and how to use them.
Plugin is an extension which enriches Snapshot by additional functionalities without changing the core of Snapshot's logic. The possibilities are many, from plugins which reward users with an NFT when they cast a vote, through adding a comment box for voters to explain their choice, to enabling on-chain execution of Gnosis Safe transactions.
You can extend your space's functionality by adding plugin(s) to it. They will be applied to all proposals created after the plugin has been added.
In order to add a plugin head to your space settings by clicking Settings on your space's page:
2. Scroll down to the Plugins section and click Add plugin. Select the plugin you want to add in the pop-up window:
4. Click Add and don't forget to Save your new settings.
SX.js is the official Typescript SDK to interact with Snapshot X. The SDK includes a client for Mana, the meta transaction relayer.
Install the latest version of the beta release:
Everything happens thanks to the clients
objects. Depending on the specific Space or Proposal setup, you may need to use a Transaction or Signature Client. This quick guide demonstrates how to easily set all of them up, both for Ethereum and StarkNet:
Address' voting power depends on the strategy used. Below you can see an example of getting voting power for whitelist Voting strategy on Starknet.
Snapshot X EVM
ChainSecurity
03-07-23
Snapshot X Starknet
OpenZeppelin
10-31-23
Mana is a meta-transaction relayer that allows users to interact with Snapshot X without paying gas fee. This service works in conjunction with signature based Snapshot X . Users sign a meta transaction in the SX UI and then the relayer submits each encoded transaction along with its signature to the signature authenticator. If the signature is valid, then the transaction will be forwarded to the relevant space contract.
The API indexes Snapshot X data. Specifically, it monitors events emitted by spaces and space factories so that votes, proposals, and the deployment of new spaces can be tracked. Anyone can run the API. It uses and support multiple chains.
Mainnets: Testnets:
That's it!
You can browse through all plugins by heading to and selecting the Plugins filter in the search bar:
3. Configure the plugin according to your needs.
Each plugin requires different setup so before you add it to your space make sure which parameters do you need to provide. As an example, the Gnosis SafeSnap plugin requires a CHAIN_ID
of the network your safe is using and the realityAddress
. Check out the setup steps if you want to learn more about this specific plugin.
5. Well done, you have added a new plugin to your space!
To learn more about StarkNet's Provider
object, have a look .
The content of this page is being working on at the moment
Combine Safe with Snapshot using oSnap.
“oSnap” is short for Optimistic Snapshot Execution. oSnap lets DAOs propose transactions, do an off-chain governance vote, and have the transaction data submitted in a trustless fashion.
Setting up the oSnap module:
Create a Safe and Snapshot Space, or connect to your current accounts.
Go to Safe Apps, install the Zodiac app, and install the oSnap module through Zodiac.
Set the proposal bond, challenge period, and Snapshot Space.
Link the oSnap module to your Snapshot Space with SafeSnap.
Your oSnap module address is added to the SafeSnap plugin configuration to enforce the results of proposals on-chain.
Using oSnap with Snapshot:
Create a proposal and Snapshot vote, along with the transactions to execute if the proposal passes.
Invite the community to vote on the proposal.
Once the Snapshot voting period ends, anyone can propose the transactions by posting a bond.
After the challenge period, execute the transactions on-chain through the Snapshot interface.
Video tutorial on how to deploy and use an oSnap module:
Follow the oSnap documentation on how to set up an oSnap module for your project.
Deployment tutorial using the Zodiac module:
Snapshot tutorial to configure and execute transactions with Snapshot proposals:
An overview on verifying and disputing proposed transactions:
Updating the oSnap using admin functions:
In order to ensure maximal safety we recommend to define several paremeters for your oSnap setup:
Set a substantial bond for an answer
Select a long challenge period
Set up a monitoring infrastructure for proposed transactions
Learn more about oSnap here:
Boost is a powerful way to incentivize voting on proposals by rewarding active participation or specific actions.
Be aware that we are currently in the beta testing phase, and the contracts have not yet been audited. This means there's an increased risk of undiscovered bugs. Participate at your own risk and only commit tokens that you can afford to have locked or potentially at risk.
Creating a boost is a straightforward process, here's what happens when you set up a boost:
You decide on the number of tokens you wish to commit as a reward and define the distribution criteria.
Upon creation, your boost becomes visible to all voters on the proposal page, complete with its criteria, so voters know what incentives are in play.
As the creator of the boost, you will receive an NFT from the Boost contract after setting up the boost. This NFT represents your ownership and is essentially your claim ticket for retrieving any unclaimed tokens once the claiming period ends. The retrieval of remaining tokens can be done directly from the proposal page.
After the voting on the proposal voting period ends, the claiming period is initiated. This period lasts for two weeks, during which voters can claim their rewards. The length of this period is enforced by us to give voters enough time to claim their rewards.
When setting up a boost, you have the flexibility to choose how rewards are distributed to voters. Two of the primary distribution types are "Lottery" and "Weighted".
The lottery system randomly selects winners, where the chances to win are based on voting power. You can set the number of winners who will share the tokens equally, and to level the playing field, implement a cap on voting power. This cap means that beyond a certain point, additional voting power doesn't increase one's chances in the lottery, giving everyone a more fair shot at the reward.
This method allows you to reward voters proportionally to their voting power. You can also set a maximum reward limit per voter to ensure a more equitable distribution and prevent any single voter from receiving a disproportionately large share of the rewards. This can help maintain balance and fairness in the incentive system, especially in spaces where voting power varies significantly between members.
Boosting has a twofold benefit: increasing participation and allowing for strategic incentivization.
By boosting a proposal, you directly contribute to the governance process, encouraging others to take part in important decisions. Your influence can lead to higher voter turnout and a more robust decision-making process.
Boosting allows you to incentivize voting in a way that aligns with your interests. This strategic layer adds depth to the voting process, as participants can receive additional rewards by voting a certain way.
Our platform incorporates a dual-fee system designed to sustain the ecosystem and prevent misuse. While both fees are currently set to zero during our closed beta, they are structured as follows:
A fixed fee in ETH can be added for Boost creation. Currently, this fee is set to 0 ETH.
The protocol includes a fee mechanism that can be configured as a percentage of the reward tokens. This fee is paid using the same ERC-20 token committed as the reward and is designed to support the platform’s sustainability. Currently, the token fee is set to 0%. If the fee is enabled in the future, it will be clearly displayed in the interface during the Boost creation process.
Combine Gnosis Safe with Snapshot using SafeSnap plugin.
Combining the Gnosis Safe with Snapshot, SafeSnap enables decentralized execution of crypto governance proposals, through on-chain execution of off-chain votes.
SafeSnap plugin is an oracle-based solution which works together with Gnosis Safe and Snapshot in the following way:
A Gnosis Safe module, where anyone can create a new proposal: an array of multisend transaction payloads.
Each proposal is a Reality.eth
question asking if (1) the linked Snapshot proposal passed, (2) did the proposal include the payload, and (3) does the payload do what the proposal describes.
If the proposal passes on Snapshot, then Reality.eth
should resolve to the same outcome, and after a 24 hour cooldown period, the proposal’s transactions are executable by anyone.
Reality uses an ERC-20 token (a given DAO’s governance token) for the bond. The minimum bond can be set by way of a proposal to the DAO.
The UI is a Snapshot plugin, in which users can enter an array of tx-payloads to be executed sequentially by the Gnosis Safe if the proposal passes. Once the proposal has passed, the Reality.eth question has resolved, and the 24 hour cooldown period is over, there is the option on the Snapshot interface to trigger each of the multisend transactions in the proposal.
Follow the official Zodiac guide on how to setup a SafeSnap for your project. I'm a non-dev operator (space controller or admin):
I'm a developer:
More information:
In order to ensure maximal safety we recommend to define several paremeters for your setup:
Set a substantial bond for an answer
Select an arbitrator
Select a long cooldown
Set up a monitoring infrastructure for questions
Learn more about SafeSnape here:
Learn what Domino plugin is and how to add it to your space.
Domino is a crypto notification system which makes it simple for DAOs to monitor and build automated workflows based on governance data. The Domino plugin allows you to alert space members about new and ended proposals on Snapshot.
In order to add a plugin head to your space settings by clicking Settings on your space's page:
Scroll down to the Plugins section and click Add plugin. Select the plugin you want to add in the pop-up window:
Scroll up to the top of the page and click Save to update your space's settings. The plugin will affect all the newly created proposals.
Create a new proposal for your space. You don't need to set anything up for the Domino notifications, they will be enabled automatically.
Users can now head to the proposal's page and click any automation to receive notifications about the proposal.
As a next step users will be redirected to Dominos's webpage in order to set up their custom notification rules:
Learn how to create a new plugin for Snapshot.
If the existing plugins do not fulfill the needs of your space it is possible to create a new one. Keep in mind though that at this moment we have a curated list of plugins that extend the core functionality of Snapshot and we want to make sure that their logic is written in line with Snapshot's values.
Create a fork of the snapshot repository:
Position yourself at the root of the project repository and run the below command to create a new directory for your plugin and provide basic details about it.
Make sure to update myPlugin
with the name of your plugin (using camelCase
naming convention), name
and description
to briefly describe what it does:
Thanks to the plugin.json
file the plugin will be visible in the space settings.
You can check that by running the local server and heading to any space's settings.
Now it's time to add the logic to it!
In order to display the plugin on Snapshot, you need to create its structure by using components. The below table is listing the available components with their render location:
myPlugin/Proposal.vue
below proposal content
myPlugin/ProposalSidebar.vue
proposal sidebar
myPlugin/Create.vue
proposal creation, plugins step
Within those components you can do everything you can do in any other Vue 3 component. You can split the code across multiple components and import them in one of the above, as well as create your own composables or other helper files to structure your code as you like.
It's technically not required but recommended to use Vue 3's composition API and the <script setup>
syntax.
Let's have a look at the Proposal component example.
In order to display your plugin below the proposal content you have to create a Proposal component. Navigate to the plugin directory you have just created in the previous step and create a Proposal.vue
file. You can start with a basic Vue.js single file component.
To do something meaningful, a plugin will probably need some awareness of the current context (space, proposal, etc). This information is passed down to the plugin components as properties. A component on the proposal page, that needs the proposal's id can receive it in the following way:
Here are all properties, that will be passed down to the plugin's main components:
proposal
form content
current proposal
space
space settings
space settings
preview
preview enabled
-
id
-
proposal id route parameter
results
-
current voting results
loadedResults
-
whether voting results finished loading
strategies
-
used strategies
Only the main components (Create.vue
, Proposal.vue
, ProposalSidebar.vue
) in your plugin's root directory will receive those properties automatically. You can of course pass those properties further down to other components as needed.
Any of the existing UI components in src/components
, composables in src/composables
or installed packages (like snapshot.js) can be used normally.
Most plugins will require some configuration options so that a space admin can enter information like their token address, API endpoints and others. Defaults can be defined in the plugin.json
as follows:
Under the "space"
key you can define global config options. They can then be set in the plugin section on a space's settings like so:\
The "proposal"
key let's you define options specific to a single proposal. This key must be set in order for the Create.vue
component to be shown in the proposal creation process.
The snapshot.org interface supports multiple languages and new plugins should be built with that in mind. Don't use raw text strings in your plugin's components directly but use the t
function instead:
The actual strings need to be added in src/locales/default.json
to be available for translators, in order to update the language specific files, like de-DE.json
. You can add your strings on the highest level in default.json
, under a unique key, e.g. your plugin's directory name and the translation will be done automatically.
Learn more about localization in Vue here.
Apart from vue-i18n
, there are custom number and time formatters available in the useIntl
composable.
Once your plugin is tested and ready to deploy, create a new Pull Request on the original snapshot repository. The review can take the team up to 72 hours, so please be patient 🙏
After the PR has been merged, you will need to wait for the release of a new version of Snapshot which can take a couple of days.
Learn what Galxe plugin is and how to add it to your space.
Galxe is building a protocol that powers on-chain credentials with plug-and-play NFT modules. The permissionless infrastructure allows everyone to create, distribute, and gamify NFTs with customized on-chain data.
With the Galxe plugin users can easily create a campaign and integrate it into Snapshot. This solution will incentivize communities to participate in the proposal vote by rewarding them with OATs (On-Chain Achievement Tokens). After users have voted, they can claim an OAT directly from the Project Galaxy Plugin section on the proposal page on Snapshot.
In order to add a plugin head to your space settings by clicking Settings on your space's page:
Create a new proposal which you would like to link to the Galxe plugin. You don't need to specify anything related to Galxe yet.
Once the proposal is created, copy the proposal ID from the address bar in your browser as you will need it in the next step.
2. Scroll down to the Plugins section and click Add plugin. Select the plugin you want to add in the pop-up window:
Add the proposal ID and the Galxe Campaign information which you would like to link with the proposal.
Make sure to replace <Proposal ID>
with your proposal ID which you copied in the previous step.
Then replace the <Space Name/campaign/Campaign ID>
with the details of your space and campaign.
Example:
If you have multiple proposals that distribute OATs to voters, you can also add multiple proposalID:campaignInfo
pairs at once in the following format:
If you delete a proposalID-campaignInfo
pair, users won’t see the OAT information on the page of your proposal even if the proposal has ended or the OATs have already been distributed.
Click Add and scroll up to the top of the page to click Save to persist the updated settings.
That's it, your users will be able to see the Galxe plugin on the proposal's page!
Learn what the POAP plugin is and how to add it to your space.
POAP is a badge which can be acquired by attending events or experiences. In technical terms - a Proof Of Attendance Protocol NFT (non-fungible asset).
With the POAP plugin you can reward voters in your space with a unique POAP for each vote they cast on a Snapshot proposal and as a result grow the overall governance participation of your community.
Ensure that you have the permissions required to add new plugins, or reach out to the admins of the space you'd like to add the plugin to.
Scroll down to Plugins and click the Add plugin button.
A new popup window will show up where you can search for and select the POAP Module by simply clicking on it.
No need for additional settings on this step; leave it as-is and click "Add."
Don't forget to save your settings! Go to the top of the page and click Save. Confirm the changes by signing the message in your wallet.
Now when you create a new proposal, the POAP plugin will be automatically added. There is no need to manually add it to each new proposal.
Once the proposal has been created, you can get your Snapshot proposal ID from the URL of the proposal. Copy all characters following the proposal/
in the address box in the browser and save them somewhere - you will need it to link the proposal to your POAP drop.
Follow the instructions in POAP's guide How Do I Set Up a POAP Drop? but be sure to request "0" mint links.
Take note of your Drop ID, as you will need this for the next steps.
Reach out to the POAP team by filling out the required fields in the POAP Snapshot Proposal Request form. Do not post your request anywhere else.
If you want to check on the status of your request, you should do so by using the chat bubble:
Click the chat bubble in the lower-right corner of the POAP website.
Type “check on my petition”
Enter your drop ID.
Get a response!
If curation needs to contact you, they will do so via the email curation@poap.io. If customer support needs to contact you, they will do so via the email support@poap.io. Beware of scams and never reply to other email addresses.
Join POAP Discord: http://poap.xyz/discord Snapshot Help Center: https://help.snapshot.org/en
\
That's it! You're all set up and users can receive direct notifications about the Snapshot proposals
Your plugin is now available on Snapshot! Make sure to test it thoroughly in production before communicating to your community.