{"id":49097158,"url":"https://github.com/scopelift/umbra-protocol","last_synced_at":"2026-06-15T23:00:45.666Z","repository":{"id":37236774,"uuid":"260485665","full_name":"ScopeLift/umbra-protocol","owner":"ScopeLift","description":"🌕🌑 Privacy Preserving Shielded Payments On The Ethereum Blockchain","archived":false,"fork":false,"pushed_at":"2026-05-18T15:45:32.000Z","size":13670,"stargazers_count":395,"open_issues_count":34,"forks_count":98,"subscribers_count":6,"default_branch":"master","last_synced_at":"2026-05-18T17:37:03.990Z","etag":null,"topics":["defi","ethereum","privacy","smart-contracts"],"latest_commit_sha":null,"homepage":"https://app.umbra.cash","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ScopeLift.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":"funding.json","license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"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},"funding":{}},"created_at":"2020-05-01T14:57:08.000Z","updated_at":"2026-05-13T14:26:18.000Z","dependencies_parsed_at":"2023-10-25T16:10:11.260Z","dependency_job_id":"f52a5ca3-277a-472f-a303-d805cf22259a","html_url":"https://github.com/ScopeLift/umbra-protocol","commit_stats":null,"previous_names":["scopelift/umbra"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/ScopeLift/umbra-protocol","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ScopeLift%2Fumbra-protocol","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ScopeLift%2Fumbra-protocol/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ScopeLift%2Fumbra-protocol/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ScopeLift%2Fumbra-protocol/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ScopeLift","download_url":"https://codeload.github.com/ScopeLift/umbra-protocol/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ScopeLift%2Fumbra-protocol/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34383468,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-15T02:00:07.085Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["defi","ethereum","privacy","smart-contracts"],"created_at":"2026-04-20T21:06:39.681Z","updated_at":"2026-06-15T23:00:45.650Z","avatar_url":"https://github.com/ScopeLift.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\t\u003cimg width=\"400\" src=\"readme/umbra-logo-words.png\" alt=\"Umbra Logo\"\u003e\n\t\u003cbr /\u003e\n\t\u003cbr /\u003e\n\u003c/div\u003e\n\n\u003cp align=\"center\"\u003e\n\t\u003cb\u003ePrivacy Preserving Stealth Payments for EVM Blockchain Networks.\u003c/b\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\t🚀 \u003ca href=\"https://app.umbra.cash\"\u003eapp.umbra.cash\u003c/a\u003e\n\t🐦 \u003ca href=\"https://twitter.com/umbracash\"\u003e@UmbraCash\u003c/a\u003e\n\t💬 \u003ca href=\"https://discord.com/invite/uw4y5J2p7C\"\u003eDiscord\u003c/a\u003e\n\t🤑 \u003ca href=\"https://explorer.gitcoin.co/#/round/1/0x12bb5bbbfe596dbc489d209299b8302c3300fa40/0x12bb5bbbfe596dbc489d209299b8302c3300fa40-22\"\u003eGitcoin\u003c/a\u003e\n\t🏗️ \u003ca href=\"https://twitter.com/scopelift\"\u003e@ScopeLift\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cdiv align=\"center\"\u003e\n\t\u003cimg width=\"150\" src=\"readme/ethereum-badge-light.png\" alt=\"Umbra Logo\"\u003e\n\t\u003cbr /\u003e\n\u003c/div\u003e\n\n## About\n\nUmbra is a protocol for stealth payments on EVM blockchain networks. It enables privacy preserving transactions where **the receiver's identity is only known to the sender and receiver**.\n\n\u003cdiv align=\"center\"\u003e\n\t\u003cbr /\u003e\n\t\u003cimg width=\"650\" src=\"readme/umbra-diagram.png\" alt=\"Diagram showing how Umbra provides privacy.\"\u003e\n\u003c/div\u003e\n\n### FAQ\n\n#### What is Umbra?\n\nUmbra is a stealth address protocol for EVM networks. That means it allows a payer to send funds to a fresh address. That address is controlled by the intended receiver, but only the payer and the receiver know that.\n\nOne way to think of Umbra is this: before anyone sent you funds, you sent them a brand new, never before used address. Only the sender would know you control that address, which adds a layer of privacy to your payment. Payments via Umbra work similarly, but are non-interactive—you don’t need to give someone a fresh address, the sender can just generate one they know only you will be able to access.\n\n#### Can you walk me through an example?\n\nAlice owns a business and hires Bob to subcontract for her. She agrees to pay Bob 1,000 Dai/week for his work. Bob owns the ENS address bob.eth. If Alice sent the funds each week to bob.eth, anyone looking at the chain could trivially know that Alice is paying Bob 1,000 Dai each week.\n\nInstead, Bob and Alice will use Umbra for private payments. The first time Bob visits the Umbra app, he sets up his account, enabling anyone to privately pay him via Umbra using the name bob.eth, or his normal Ethereum address. Alice then uses Umbra to send 1,000 Dai to Bob each week— she only needs to know his ENS name.\n\nOn chain, we see Alice pays 1,000 Dai to a new empty address each week. Behind the scenes, Bob controls the keys to each of these addresses via Umbra, but nobody except Alice and Bob knows this.\n\nBob uses Umbra to withdraw his 1,000 Dai each week. He only needs to provide an address to send it to. It’s best for him to use an address that’s not tied to his identity. He usually chooses to send it straight to an exchange, where he sells it for fiat as needed. Importantly, this means **Bob's exchange now knows this payment went to him**. To the casual chain observer— one without access to proprietary centralized exchange data— the fact that Alice's payment went to Bob is obscured.\n\nConsider another example: Liza runs a website that asks for donations. If everyone donated by directly sending her funds, everyone would know how much Liza received in donations. If donations were sent with Umbra instead, each donation would be sent to a different address, and only Liza would know the total amount of donations she received.\n\n#### How does it work?\n\n1. When setting up your Umbra account, users sign a message. The hash of this message is used to generate two private keys—a \"spending key\" and a \"viewing key\".\n2. The corresponding public keys are both published on-chain as records associated with your address.\n3. A payer uses your address, ENS, or CNS name to look up your two public keys. Separately, the payer generates a random number.\n4. The random number is used with the spending public key to generate a \"stealth address\" to send funds to. The viewing public key is used to encrypt the random number.\n5. Using the Umbra contract, the payer sends funds to the stealth address and the stealth address and encrypted random number are emitted as an Announcement event.\n6. The receiver scans all Announcement events from the Umbra contract. For each, they use their viewing private key to decrypt the random number, then multiply that number by their spending private key to generate the stealth private key. If the stealth private key controls the stealth address emitted in the Announcement, this payment was for the receiver\n7. The receiver can now use the spending private key to either directly send the transaction required to withdraw funds to another address, or sign a meta-transaction to have the withdrawal request processed by a relayer.\n\nSee the [Technical Details: How does it work?](https://app.umbra.cash/faq#how-does-it-work-technical) for more details.\n\n#### How private is Umbra?\n\nUmbra offers a limited set of privacy guarantees and it’s important to understand them before using the protocol. Umbra does not offer \"full\" privacy like Aztec or Zcash. It simply makes it impossible for any outside observers (i.e. anyone who is not the sender or the receiver) to know who the sender paid by looking at the receiving address.\n\nIt’s important to understand that poor hygiene by the receiver— for example, sending the funds directly to a publicly known address— reduces the privacy benefits for both the sender and receiver.\n\nThe privacy properties of Umbra can also be diminished if an observer can narrow down the set of potential recipients for a given transaction. Any valid public key can be used as a recipient, and anyone who has sent a transaction on Ethereum has a publicly available public key. Therefore, by default, the \"anonymity set\"—the set of potential recipients of a transaction—is anyone who has ever sent an Ethereum transaction!\n\nIn practice this isn’t necessarily the case, and an observer may be able to narrow down the list of recipients in a few ways:\n\n1. Most users will use ENS names to send funds, so the recipient most likely has published keys under an ENS name\n2. Poor hygiene when withdrawing funds from your stealth addresses can reduce or entirely remove the privacy properties provided by Umbra. See [Which addresses are safe for withdrawing funds?](https://app.umbra.cash/faq#what-addresses-are-safe-for-withdrawing-funds-to) for more details. Always use caution when withdrawing!\n\n#### Is Umbra a mixer?\n\nNo. Umbra is not a mixer and does not use zero knowledge proofs. Instead, Umbra is based on ordinary elliptic curve cryptography. It’s meant for payments between two entities, and comes with a different set of privacy tradeoffs. Rather than breaking the link between sending and receiving address, like a mixer, Umbra makes that link meaningless. Everyone can see who sent the funds, and everyone can see the address funds were sent to, but that receiving address has never been seen on-chain so it’s impossible for any outside observers to know who controls it.\n\n#### Where can I learn more?\n\nCheck out the [full FAQ](https://app.umbra.cash/faq) to get more details about Umbra.\n\n## Development\n\nThis repository uses [yarn](https://yarnpkg.com/) for package management and [volta](https://volta.sh/) for dev tool version management. Both are prerequisites for setting up your development environment. The repository also requires [foundry](https://github.com/gakonst/foundry) for development of periphery smart contracts.\n\n### Components\n\nUmbra is a monorepo consisting of 4 packages:\n\n* [frontend](frontend/) — Frontend web3 app for setting up and using Umbra, deployed at [app.umbra.cash](https://app.umbra.cash)\n* [contracts-core](contracts-core/) — Solidity contracts used in the Umbra Protocol.\n* [contracts-periphery](contracts-periphery/) — Solidity contracts used by the Umbra frontend to add features and improve UX.\n* [umbra-js](umbra-js/) — A TypeScript library for building Umbra-enabled web3 apps in node.js or in the browser.\n\nThe monorepo structure simplifies the development workflow.\n\n### Instructions\n\nTo get started, clone this repo, then follow these instructions:\n\n```sh\n# run these commands from workspace root!\ncp contracts-core/.env.example contracts-core/.env # please edit the .env with your own environment variable values\ncp frontend/.env.example frontend/.env # please edit the .env with your own environment variable values\ncp umbra-js/.env.example umbra-js/.env # please edit the .env with your own environment variable values\ncurl -L https://foundry.paradigm.xyz | bash # install foundryup binary\nfoundryup # install Foundry\nyarn install # installs dependencies for each of the 3 packages. Also builds umbra-js.\nyarn test # runs the test suite for each package\n\n# Additional commands also available from the workspace root:\nyarn build # builds each of the 3 packages\nyarn clean # removes build artifacts for each of the 3 packages\nyarn lint # lints each of the 3 packages\nyarn prettier # runs formatting on each of the 3 packages\nyarn test # runs tests for each of the 3 packages\n```\n\nNote: If you want to be more precise with your command (e.g. just building, cleaning, or testing 1 package), simply run any above command from the package directory. For example, if you were just working on the contract code, you might:\n\n```sh\ncd contracts-core # move into the contracts-core sub directory\nyarn build # build only the contracts\nyarn clean # remove only the contract build artifacts\nyarn test # run only the contract tests\n```\n\n### Contract Deployments\n\nUmbra contracts are deployed at the same address on each network where Umbra resides. Below is a list of addresses for the contracts currently in use.\n\n|Contract          |Type     |Address|\n|------------------|---------|-------|\n|Umbra             |Core     |[0xFb2dc580Eed955B528407b4d36FfaFe3da685401](https://blockscan.com/address/0xfb2dc580eed955b528407b4d36ffafe3da685401)|\n|StealthKeyRegistry|Core     |[0x31fe56609C65Cd0C510E7125f051D440424D38f3](https://blockscan.com/address/0x31fe56609c65cd0c510e7125f051d440424d38f3)|\n|UmbraBatchSend    |Periphery|[0xDbD0f5EBAdA6632Dde7d47713ea200a7C2ff91EB](https://blockscan.com/address/0xDbD0f5EBAdA6632Dde7d47713ea200a7C2ff91EB)|\n\n### Contributions\n\nContributions to Umbra are welcome! Fork the project, create a new branch from master, and open a PR. Ensure the project can be fast-forward merged by rebasing if necessary.\n\n## License\n\nUmbra is available under the [MIT](LICENSE.txt) license.\n\nCopyright (c) 2023 ScopeLift\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscopelift%2Fumbra-protocol","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fscopelift%2Fumbra-protocol","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscopelift%2Fumbra-protocol/lists"}