Dust devils are usually harmless, but can on rare occasions grow large enough to pose a threat to both people and property. They are comparable to tornadoes.
Problem
Users end up with “stuck” token dust in their old wallets when they deposit funds into tornado pools.
Example
You have 100.1 ETH in your wallet. You spend 0.05 ETH on gas to deposit 100 ETH into the 100 ETH tornado pool. You now have 0.05 ETH token dust left in your old wallet that you cannot move “safely.”
0.05 ETH = 200 DAI (at today’s ~$4k ETH prices)
Solution
DustDevil: a protocol to anonymize dust
Summary
- You have dust in your wallet
- You deposit your dust into a dust devil (pool)
- You are returned DUST - DUST is anonymously generated, like AP
- You have dust in another wallet
- You deposit your dust into a dust devil exchange for more DUST
- Eventually, you build up enough DUST that you can exchange it for a normal tornado pool deposit/withdraw (call this a dust bunny), such as 1k DAI
Technical Summary
Dust Devil
- When dust is deposited into a dust devil, it is exchanged via Uniswap for an existing tornado pool asset, such as DAI
- DAI pools up in the dust devil from all users’ deposits
User
- Users accrue DUST in their shielded account (imagine 1 DUST = 1 DAI)
- When a user has enough DUST to exchange it for, say, a 1k DAI deposit/withdraw, they generates a private note for the 1k DAI pool
Dust Bunny
- The user creates a hash of the private note and sends it to a relayer
- The relayer submits a tx to the dust devil contract with the private note hash
- Atomically, the following actions then take place:
- The relayer calls the dust devil contract
- The user’s DUST is debited from their shielded account for the correct amount (-1k DUST for a 1k DAI deposit)
- The relayer provides the private note hash to the dust devil
- The dust devil deposits 1k DAI into the 1k DAI tornado pool (along with the private note hash)
- The user pays a relayer fee (potentially debited from the user in DUST; the relayer would be able to withdraw DAI from the dust devil for the corresponding amount of DUST debited)
- The user now has a successfully deposited 1k DAI dust bunny, mixed into tornado like any other user deposit
Other Considerations
- I don’t believe there’s any way for a relayer to act maliciously here (just as there is no way for them to act maliciously when redeeming AP for users or swapping AP for TORN). However, I must admit I’m not as intimately familiar with shielded account functionality and may be missing something. Please let me know if you see a flaw in the design above
- While there could be multiple types of dust bunnies (eg, ETH dust bunnies, DAI dust bunnies, USDC dust bunnies, etc), starting out, it may be wise to force all liquidity through a single dust devil (so for example, only DAI dust bunnies are possible to start). Similarly, it may be wise to only begin with a single denomination dust bunny (ex: 1k DAI dust bunnies only)
- It may be possible to track initial dust devil deposits in order to link multiple dust-bearing addresses to a single owner when liquidity (anonymity set) is low. For example, if 5 different addresses all deposit 200 DAI into a dust devil, no other deposits take place, and then a 1k DAI dust bunny deposit is created; then it will be clear all 5 addresses were owned by the same user with their collectively accumulated DUST. This is another reason why Consideration #2 is worth, well… considering: to increase the anonymity set of dust bunnies
- This opens up a new revenue stream for tornado relayers
Closing Thoughts
I’ve been trying to solve this problem for myself for a while. Fear of losing dust forever actually prevents me from using tornado more actively. But if I could just perpetually accrue DUST between each and every tornado transaction, it would be a total game changer
Bonus: Whale Application
It’s also a great way for whales to, for example, mix together a bunch of 1+ ETH dust on their multiple 100+ ETH accounts to collectively save them up for a single 10 ETH dust bunny (cheaper in gas costs and relayer fees than mixing a bunch of 1 ETH deposits)
If you want to support this post and others like it, please consider using the torn.eth relayer