{"id":21503280,"url":"https://github.com/numtel/wrap-on-privacy","last_synced_at":"2025-10-16T20:47:51.385Z","repository":{"id":263022824,"uuid":"889073013","full_name":"numtel/wrap-on-privacy","owner":"numtel","description":"Privacy wrapper for ERC20 tokens","archived":false,"fork":false,"pushed_at":"2025-03-06T19:43:27.000Z","size":14462,"stargazers_count":1,"open_issues_count":3,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-17T13:48:32.503Z","etag":null,"topics":["circom","erc20","ethereum","privacy"],"latest_commit_sha":null,"homepage":"https://numtel.github.io/wrap-on-privacy/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/numtel.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2024-11-15T15:00:20.000Z","updated_at":"2025-03-06T19:43:30.000Z","dependencies_parsed_at":"2024-12-26T19:25:44.120Z","dependency_job_id":"10fe56df-7a42-4188-9bbc-5385847c748e","html_url":"https://github.com/numtel/wrap-on-privacy","commit_stats":null,"previous_names":["numtel/wrap-on-privacy"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/numtel/wrap-on-privacy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/numtel%2Fwrap-on-privacy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/numtel%2Fwrap-on-privacy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/numtel%2Fwrap-on-privacy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/numtel%2Fwrap-on-privacy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/numtel","download_url":"https://codeload.github.com/numtel/wrap-on-privacy/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/numtel%2Fwrap-on-privacy/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278444552,"owners_count":25987790,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-05T02:00:06.059Z","response_time":54,"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":["circom","erc20","ethereum","privacy"],"created_at":"2024-11-23T18:21:01.798Z","updated_at":"2025-10-05T11:19:02.432Z","avatar_url":"https://github.com/numtel.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Wrap on Privacy\n\n*This project has not been audited and should not be used in production!*\n\nTransaction notes encrypted using [post-quantum NTRU algorithm](https://github.com/numtel/ntru-circom)\n\nBuy a coffee without exposing your entire financial history!\n\n* [Deployed on Github](https://numtel.github.io/wrap-on-privacy/) (so you can trust its source to be unmodified)\n* [Protocol Documentation](PROTOCOL.md)\n* [Project started at ETHGlobal Bangkok 2024](https://ethglobal.com/showcase/wrap-on-privacy-ryuw6)\n\n## Installation\n\nRequires Node.js, Circom, and Foundry installed\n\n\u003e [Circuitscan CLI](https://github.com/circuitscan/cli) required to deploy and verify circuits\n\n```sh\n$ npm install\n\n# Test circuits\n$ npm run test:libraries\n# Compile and test contracts\n$ npm run test:contracts\n\n# Compile circuits before attempting to deploy them\n$ npm run compile:circuit\n\n# Deploy the circuit verifier on chain\n$ circuitscan login \u003capiKey\u003e\n$ npm run deploy:circuit\n\n# Generate the build artifacts for the contracts\n# Contracts deployment transactions sent from the frontend in \"Deploy New Pool...\"\n$ npm run deploy:contracts\n\n# Run frontend locally\n$ npm run dev\n```\n\n## Transfer Types\n\n\u0026nbsp;| Public Source | Private Source\n----|---------------|------------------\nPublic Recipient | Standard ERC20 Transfer | Burn out of privacy pool\nPrivate Recipient | Mint into privacy pool | Send within pool\n\nMint proof must be sent by the account holding the ERC20 tokens but burn proofs and sending within the pool can be sent by any account.\n\n### Relayers\n\nThere is no system to \"relay\" proofs built into Wrap on Privacy. There are no added fees for sending privately. There is no way to profit from someone else's transactions.\n\nIn this system, the recipient and amount sent are obscured. While it will still be public that your account is making transactions, the contents of those transactions will be private.\n\nProperty | Public | Private\n---------|--------|------------------\nSource account | :white_check_mark: | \u0026nbsp;\nToken Type | \u0026nbsp; | :white_check_mark:\nTransaction Amount | \u0026nbsp; | :white_check_mark:\nRecipient account | \u0026nbsp; | :white_check_mark:\n\nAlso, there is no public distinction between sending and receiving an incoming transaction since they use the same proof.\n\n\u003e [!IMPORTANT]\n\u003e Token type is pseudonymous hash `poseidon2([private key, token address])`\n\u003e\n\u003e A public transaction on an account (mint or burn) will reveal the link between token type and the hash so don't use the same account if you want that privacy quality.\n\n\n## Login vs Connect Wallet\n\nTo be usable, Wrap on Privacy requires both logging into a private session as well as connecting a wallet.\n\nThe connected wallet is for submitting transactions and for public balances.\n\nThe private session is for decrypting private balances and incoming transactions as well as providing the public key by which incoming transactions are encrypted.\n\nAn incoming transaction will only decrypt successfully by the intended recipient. The client attempts to decrypt every encrypted transaction, displaying only those which successfully decrypt by the private key in your private session.\n\n## Key Registry\n\nIn order to allow receiving privately on a standard Ethereum address or ENS name, public keys are stored on-chain in a key registry.\n\nYou may update your public key as often as needed.\n\nThe status bar will display a green check if your key is registered at the current address.\n\n## Pool Manager\n\nDeploy compatible `PrivacyToken` and `KeyRegistry` contracts to any EVM chain then load your pool in the Pool Manager.\n\nThe base contract in this repository that is deployed on Sepolia allows anyone access to the pool for any ERC20 token but you could add rules and change the configuration for your pool.\n\n## References\n\n* [Control as Liability by Vitalik Buterin](https://vitalik.eth.limo/general/2019/05/09/control_as_liability.html)\n\n    This philosophy directs the shape of Wrap on Privacy\n\n* [Blockchain privacy and regulatory compliance: Towards a practical equilibrium](https://www.sciencedirect.com/science/article/pii/S2096720923000519)\n\n    How to integrate ASPs into Wrap on Privacy? Is there more than just adding a second merkle tree calculation to the proof that is not verified by the contract?\n\n## License\n\nMIT\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnumtel%2Fwrap-on-privacy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnumtel%2Fwrap-on-privacy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnumtel%2Fwrap-on-privacy/lists"}