Welter is a dApp optimized to run on any major scaling solution with low fees and fast transaction settlements. We believe it is important for people to be able to freely send and receive money, but not everyone is able to spend $300+ just to send $1000, which is currently the case on L1. By bringing private transactions to L2, we can both increase privacy and exponentially decrease fees.
So, how does that work abstractly? Welter is built around two primary functions: depositing Ether (for Hidden Ether) and sending Hidden Ether (for Ether).
Depositing Ether is fairly straightforward - the user enters the arbitrary amount of Ether they would like to deposit (such as 10 ETH), and that deposit gets mixed in with all of the other deposits. The Ether inside the contract is referred to as "Hidden Ether", because no one knows which Ether within the contract belongs to which depositer. When users make a deposit, a new "ZKP Key" will be generated, which provides read and write access to their Hidden Ether balance. If they already have an existing key, they can enter it with their deposit amount. The new key that will be generated will reflect their old transactions and new Hidden Ether balance.
Sending Hidden Ether are fairly simple and take three parameters: the withdrawal amount, the recipient address, and the ZKP key. If the Hidden Ether balance correlated with the entered ZKP key is equal to or less than the provided key, the withdrawal will go through. Users can do this themselves at the expense of anonymity or pass their three parameters to a relayer service. When sending Hidden Ether to a recipient address, it just goes straight to real Ether automatically. The receiver doesn't even need to use Welter themselves to receive the funds. Again, Hidden Ether is just our term for Ether stored in the contract - it's not actually its own token or anything.
Some other nuances: Minimum amounts for deposits and withdrawals are currently 0.01 ETH, not including gas. ETH is the only supported token at this time.
Technical implementation will be detailed in the following field.
Ok, so Welter was initially built with security in mind first, implementing zk-SNARKs and working backwards, but we kept running into issues with the circuits that were wasting time. So we then started building with functionality in mind with plans to gradually increase security over time. Right now, we just want to validate the idea and have a working MVP, even if not fully secure or anonymized yet. Besides, this is all on testnets right now anyway.
Anyway, we have two repositories as of now: one is for the router that handles withdrawals, and the other is stores both the contracts and the front-end. The front-end is made from scratch with no libraries, so it's quite fast, and is built with Parcel. The two primary functions of the front-end are forms that allow the user to deposit Ether and send Hidden Ether. Input sanitization is ultimately all in the contracts, but these forms help reduce user mistakes. Speaking of the contracts, they're compiled and deployed locally for testing via Hardhat. No circuits/zk-SNARKs are being used in production yet, again functionality is the priority for us at this time. We're still researching different data structures and implementations on the cryptography side to determine what is most optimized for our protocol.
Currently, we're playing around with deploying our contracts on Arbitrum, which we really like, though again we are L2-agnostic.
Please feel free to play around with our progress so far at the provided URL; once we pick out a domain name, it will canonicalize to that name automatically.
Have any questions or suggestions about any of this? Please don't hesitate reach out to either of us!