{"id":13632303,"url":"https://github.com/decentraland/governance","last_synced_at":"2026-01-16T10:01:16.670Z","repository":{"id":37078117,"uuid":"285420045","full_name":"decentraland/governance","owner":"decentraland","description":"🏢 Governance platform of the Decentraland DAO","archived":false,"fork":false,"pushed_at":"2026-01-12T18:34:28.000Z","size":139453,"stargazers_count":49,"open_issues_count":65,"forks_count":40,"subscribers_count":8,"default_branch":"master","last_synced_at":"2026-01-13T00:05:19.782Z","etag":null,"topics":["blockchain","dao","dapp","decentraland","ethereum","hacktoberfest","web3"],"latest_commit_sha":null,"homepage":"https://governance.decentraland.org","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/decentraland.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-08-05T22:44:12.000Z","updated_at":"2026-01-06T13:12:34.000Z","dependencies_parsed_at":"2023-09-22T07:12:19.927Z","dependency_job_id":"896c4882-5bd3-46b5-a39b-938a8bd285b5","html_url":"https://github.com/decentraland/governance","commit_stats":null,"previous_names":[],"tags_count":172,"template":false,"template_full_name":null,"purl":"pkg:github/decentraland/governance","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/decentraland%2Fgovernance","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/decentraland%2Fgovernance/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/decentraland%2Fgovernance/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/decentraland%2Fgovernance/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/decentraland","download_url":"https://codeload.github.com/decentraland/governance/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/decentraland%2Fgovernance/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28478049,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T06:30:42.265Z","status":"ssl_error","status_checked_at":"2026-01-16T06:30:16.248Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blockchain","dao","dapp","decentraland","ethereum","hacktoberfest","web3"],"created_at":"2024-08-01T22:02:59.389Z","updated_at":"2026-01-16T10:01:15.537Z","avatar_url":"https://github.com/decentraland.png","language":"TypeScript","funding_links":[],"categories":["TypeScript","[🎓 research](https://github.com/stars/ketsapiwiq/lists/research)"],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://governance.decentraland.org\"\u003e\n    \u003cimg alt=\"Decentraland\" src=\"https://decentraland.org/images/logo.png\" width=\"60\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\u003ch1 align=\"center\"\u003e\n  Decentraland DAO Governance dApp\n\u003c/h1\u003e\n\nThe governance hub for the Decentraland ecosystem. Create and vote on proposals that help shape the future of the metaverse via the Decentraland DAO (Decentralized Autonomous Organization).\n\n![Screenshot of the governance hub for Decentraland homepage](./static/home.png)\n\n# Setup\n\nBefore you start make sure you have installed:\n\n- [Homebrew](https://brew.sh/)\n- [Postgres](https://wiki.postgresql.org/wiki/Homebrew)\n\n### Node version\n\nuse node \u003e= `18`\n\nIf you are starting from scratch and you don't have Node installed in your computer, we recommend using a Node version manager like [nvm](https://github.com/nvm-sh/nvm) to install Node.js and npm instead of the Node installer.\n\n`nvm install v18.8.0` will install node version 18 and the corresponding npm version.\n\n**NOTE**\n\nIf you are using WSL (Windows Subsystem for Linux) as your development environment, clone the repository into the WSL filesystem. If you clone it inside the Windows filesystem, the project will not work.\n\nRun `npm install` to install all the dependencies needed to run the project.\n\n## Environment setup\n\nCreate a copy of `.env.example` and name it as `.env.development`\n\n```bash\n  cp .env.example .env.development\n```\n\nIf you are running this project locally you only need to check the following environment variables:\n\n- `CONNECTION_STRING`: make sure it points to a valid database (see how to create one in the 'Database Setup' section)\n- `COMMITTEE_ADDRESSES`: list of eth addresses separated by `,` that will be able to enact finished proposals\n- `DISCOURSE_API_KEY`: the api key use to publish the proposals on the forum\n- `RPC_PROVIDER_URL`: the rpc provider to get the latest block\n- `BLOCKNATIVE_API_KEY`: api key for [blocknative](https://www.blocknative.com/), a polygon tx gas estimation service we use for calculating airdrops gas fees accurately\n- Snapshot env vars: see snapshot setup\n\n### Setup the required voting power to pass\n\nThe minimum amount of voting power require to pass a proposal of each type it's defined in these variables, if they are not defined or are not numbers `0` will be used instead\n\n```bash\n  GATSBY_VOTING_POWER_TO_PASS_LINKED_WEARABLES=0\n  GATSBY_VOTING_POWER_TO_PASS_CATALYST=0\n  GATSBY_VOTING_POWER_TO_PASS_BAN_NAME=0\n  GATSBY_VOTING_POWER_TO_PASS_POI=0\n  GATSBY_VOTING_POWER_TO_PASS_POLL=0\n```\n\n## Database setup\n\nMake sure you have Postgres installed and running:\n\n```shell\nbrew install postgresql@14\nbrew services start postgresql@14\ncreatedb\n```\n\nYou can create a DB from scratch, or you can use the `import-db.sh` script to create a new DB using the `development.dump` dump.\n\n### Importing DB dump\n\n```bash\ncd scripts/\nbash ./import-db.sh USERNAME [DATABASE_NAME] [DUMP_FILE]\n```\n\nIf no DATABASE_NAME and DUMP_FILE arguments are given, the script will use the default values and create a `governance` db using the `development.dump` dump.\nThe CONNECTION_STRING should look like this:\n\n```bash\npostgres://USERNAME:PASSWORD@localhost:5432/governance\n```\n\n(the default password should be `postgres`)\n\n### Creating DB from scratch\n\nTo create a DB, run in the terminal\n\n```bash\ncreatedb -U YOUR_USER DATABASE_NAME\n```\n\nThe default postgres user is `postgres` or your username, and the default password is `postgres`.\nUse your user and password for the connection string variable, it should look like this:\n\n```bash\npostgres://YOUR_USER:YOUR_PASSWORD@localhost:5432/DATABASE_NAME\n```\n\nOnce you have a `CONNECTION_STRING` you can set up your database tables using the following command:\n\n```bash\nnpm run migrate up\n```\n\n## Snapshot Setup\n\n- `GATSBY_SNAPSHOT_SPACE`: the snapshot space where the proposals will be published\n- `SNAPSHOT_PRIVATE_KEY`, `GATSBY_SNAPSHOT_ADDRESS`: a pair address/key with permissions to publish at that snapshot space\n- The configured SNAPSHOT_PROPOSAL_TYPE for the project is 'single-choice', which means each voter may select only one choice. See [available voting systems](https://docs.snapshot.org/proposals/voting-types#single-choice-voting)\n\n### Creating a Snapshot space\n\nYou are going to need to register an ENS name in the network you'll create the space in. Follow instructions on [Snapshot](https://docs.snapshot.org/spaces/create).\n\n#### Strategy\n\n- DCL Governance uses several strategies:\n\n  - [erc20-balance-of](https://snapshot.org/#/playground/erc20-balance-of)\n\n  - [delegation](https://testnet.snapshot.org/#/strategy/delegation)\n\n  ```json\n  {\n    \"symbol\": \"VP (delegated)\",\n    \"strategies\": [\n      {\n        \"name\": \"erc20-balance-of\",\n        \"params\": {\n          \"symbol\": \"MANA\",\n          \"address\": \"0x The address of the token contract on the network you are using\",\n          \"decimals\": 18\n        }\n      }\n    ],\n    \"delegationSpace\": \"yourEnsName.eth\"\n  }\n  ```\n\n  - [erc721-with-multiplier](https://snapshot.org/#/playground/erc721-with-multiplier)\n\n  ```json\n  {\n    \"symbol\": \"LAND\",\n    \"address\": \"0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d\",\n    \"multiplier\": 2000\n  }\n  ```\n\n  - [erc721-with-multiplier](https://snapshot.org/#/playground/erc721-with-multiplier)\n\n  ```json\n  {\n    \"symbol\": \"NAMES\",\n    \"address\": \"0x2a187453064356c898cae034eaed119e1663acb8\",\n    \"multiplier\": 100\n  }\n  ```\n\n  - [decentraland-estate-size](https://snapshot.org/#/playground/decentraland-estate-size)\n\n  ```json\n  {\n    \"symbol\": \"ESTATE\",\n    \"address\": \"0x959e104e1a4db6317fa58f8295f586e1a978c297\",\n    \"multiplier\": 2000\n  }\n  ```\n\n  -[multichain](https://snapshot.org/#/playground/multichain)\n\n  ```json\n  {\n    \"name\": \"multichain\",\n    \"graphs\": {\n      \"137\": \"https://api.thegraph.com/subgraphs/name/decentraland/blocks-matic-mainnet\"\n    },\n    \"symbol\": \"MANA\",\n    \"strategies\": [\n      {\n        \"name\": \"erc20-balance-of\",\n        \"params\": {\n          \"address\": \"0x0f5d2fb29fb7d3cfee444a200298f468908cc942\",\n          \"decimals\": 18\n        },\n        \"network\": \"1\"\n      },\n      {\n        \"name\": \"erc20-balance-of\",\n        \"params\": {\n          \"address\": \"0xA1c57f48F0Deb89f569dFbE6E2B7f46D33606fD4\",\n          \"decimals\": 18\n        },\n        \"network\": \"137\"\n      }\n    ]\n  }\n  ```\n\nIf you need MANA for testing you can get it by interacting with the contract on etherscan\n\n[Sepolia Faucet](https://www.alchemy.com/faucets/ethereum-sepolia)\n\n[Sepolia FakeMana](https://sepolia.etherscan.io/address/0xfa04d2e2ba9aec166c93dfeeba7427b2303befa9#writeContract)\n\nConnect your wallet and use the `mint` method on the `Contract -\u003e Write Contract` section\n\n- `to (address)` is your address\n- `amount (uint256)` is whatever you want. Take into account that `1000000000000000000 = 1 MANA`\n\nTake into account that the voting power distribution response from snapshot returns an array with each voting power.\nThe order in which each value is returned depends on the order in which strategies are added to the space on the [space settings](https://snapshot.org/#/snapshot.dcl.eth/settings)\n\n#### Current Strategies Order\n\n- WMANA\n- LAND\n- ESTATE\n- MANA\n- NAMES\n- DELEGATED\n- WEARABLE\n\n# Test\n\nTo run the tests you can do\n\n```bash\nnpm test\n```\n\nor create a run configuration in your IDE with `jest --no-cache --no-watchman --runInBand`\n\nAlso, you can try adding the `--verbose` option.\n\nThe `--runInBand` parameter runs the tests in a single thread, which is usually faster, but you can try without it\nand see what works best for you.\n\n# Run\n\nOnce you setup this project you can start it using the following command\n\n```bash\n  npm start\n```\n\n\u003e Note 1: this project run over `https`, if it is your first time you might need to run it with `sudo`\n\n\u003e Note 2: you can disabled `https` removing the `--https` flag in the `develop` script of your `package.json`\n\nthe app should be running at https://localhost:4000/\n\n\n# About\n### Routes\n\nThe routes are defined using `express` you can find each route in `src/routes` and those are imported at `src/server.ts`\n\n### Types and Utils\n\nTypes and Utils contain functions and types that will be useful across the whole project.\n\n### Proposals statuses\n\n- Proposals are created in pending, and automatically passed to active\n- After a voting period of 1 week, they are automatically marked as finished, passed, or rejected, depending on the kind of proposal and of the voting results.\n- If proposal is in finished status, a committee user can pass/reject it, with a comment.\n- Once passed, a proposal can be enacted by a committee user, with a comment.\n\n### Voting results\n\n- Voting results are calculated in two different ways, for different purposes:\n  - `Votes/utils.ts` calculates the results in a user-friendly way. These results are rounded up for clarity.\n  - `Proposal/jobs.ts` has a more exact calculation, and is used to evaluate the real result of the voting\n\n## Copyright \u0026 License\n\nThis repository is protected with a standard Apache 2 license. See the terms and conditions in the [LICENSE](LICENSE) file.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdecentraland%2Fgovernance","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdecentraland%2Fgovernance","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdecentraland%2Fgovernance/lists"}