{"id":15755114,"url":"https://github.com/triplespeeder/web3inheritance","last_synced_at":"2025-09-16T17:32:41.395Z","repository":{"id":44010125,"uuid":"233242843","full_name":"TripleSpeeder/web3Inheritance","owner":"TripleSpeeder","description":null,"archived":false,"fork":false,"pushed_at":"2023-01-24T01:13:48.000Z","size":18260,"stargazers_count":4,"open_issues_count":13,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-10-05T08:07:12.255Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","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/TripleSpeeder.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":null,"support":null}},"created_at":"2020-01-11T14:16:52.000Z","updated_at":"2023-03-10T12:05:02.000Z","dependencies_parsed_at":"2023-01-27T07:31:38.191Z","dependency_job_id":null,"html_url":"https://github.com/TripleSpeeder/web3Inheritance","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TripleSpeeder%2Fweb3Inheritance","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TripleSpeeder%2Fweb3Inheritance/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TripleSpeeder%2Fweb3Inheritance/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TripleSpeeder%2Fweb3Inheritance/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TripleSpeeder","download_url":"https://codeload.github.com/TripleSpeeder/web3Inheritance/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":221386313,"owners_count":16810341,"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","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":[],"created_at":"2024-10-04T08:07:31.872Z","updated_at":"2025-09-16T17:32:36.295Z","avatar_url":"https://github.com/TripleSpeeder.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# web3 inheritance\n## Introduction\nThis is my entry to the Gitcoin [\"Take back the web\"](https://gitcoin.co/hackathon/take-back-the-web) hackathon.\nBounty: https://gitcoin.co/issue/sablierhq/sablier/30/3874\n\n## Demo\nDemo site is hosted on github pages at https://triplespeeder.github.io/web3Inheritance/.\n\n## Bounty description:\nFrom https://gitcoin.co/issue/sablierhq/sablier/30/3874:\n\u003e Leaving inheritance is a complicated process and many parents would rather not shower their kids with riches, but they would neither fancy burning the money.\n\u003e  \n\u003e  Sablier enables this alternative:\n\u003e  \n\u003e  1. Create a new web3 wallet\n\u003e  2. Throw your wealth in there\n\u003e  3. Use all money to create a stream with a long duration\n\u003e  4. Burn the private key\n\n## Implementation\n### Backend\nI deviated from the original description, as i did not feel comfortable with\ntransfering substantial amounts of money to a temporary wallet. Instead i created\na thin proxy contract [SealedSablier.sol](contracts/SealedSablier.sol) for creating streams. \n#### Proxy contract workflow:\n1. User approves SealedSablier contract to spend desired amount of tokens\n1. User calls SealedSablier createStream() function. This function does in one transaction:\n    1. transfer amount of tokens approved previously to itself\n    1. approve Sablier contract to spend tokens that are now owned by SealedSablier contract\n    1. also approve msg.sender to spend tokens (See below why this is necessary)\n    1. calls createStream() on Sablier contract. Sablier contract does:\n       1. create stream where SealedSablier contract is the sender\n       1. transfer previously approved tokens from SealedSablier contract to Sablier\n\n#### Result:\n - A new stream for recipient is created, with the SealedSablier contract as sender\n - Since the user is not the Sender he can not cancel or modify the stream anymore\n\n##### Benefits:\n - No risk of losing funds in temporary wallet due to browser/system crash or similar\n - No need to have the user transfer both ETH (to pay gas) and Token into temporary \n wallet to create a stream\n\n##### Risk:\nSablier streams can be cancelled both by sender or recipient. When a stream is cancelled,\nremaining funds will be transferred back to the sender.\n\nIn this scenario the creator can not cancel the stream, but the receiver could still do it.\nThis means the funds will be sent back to the SealedSablier contract, where they will be\nlocked forever.\n\nTo enable the stream creator to salvage these returned funds SealedSablier is approving the\nsender to spend any funds that end up in this contract - See \"Escape hatch\" notice in SealedSablier.sol.\n\nHowever this approach still will fail if streams created by different senders with the same token\nget cancelled - In this case each sender will able to to transfer *all* tokens, including the cancelled tokens\nfrom other sender's streams!\n\nPossibly a better way to fullfill the requirement of creating unchangeable heritage streams would be to add\na \"seal\" method to the original Sablier contract, which effectively locks the stream so no one can\ncancel it. \n \n### Frontend\nThe frontend is built using truffle and React. \nThe user can\n- Create new streams\n- View incoming streams\n- Withdraw from incoming streams\n\n### Contract addresses\nSealedSablier.sol is deployed on:\n- Ropsten: https://ropsten.etherscan.io/address/0x954a503cF5Ac998eE9B8E2e13597A577C2FFECbB\n- Kovan: https://kovan.etherscan.io/address/0xf9d0DF7231beCA54Ff87300376679060855Eb2AA\n- Rinkeby: https://rinkeby.etherscan.io/address/0xe02a163e390FeBE6Ba3e8dA87C6bD012401DC38c\n- Goerli: https://goerli.etherscan.io/address/0xFbc007cEFC9F2d77e1D20396e62ec97904A172ed\n\n## Development\nFor local development with e.g. ganache run `truffle migrate`. This will deploy\nlocal instances of Sablier, CTokenManager, SealedSablier and ERC20Mock, so you\nhave everything available to play around.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftriplespeeder%2Fweb3inheritance","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftriplespeeder%2Fweb3inheritance","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftriplespeeder%2Fweb3inheritance/lists"}