Private DeFi transactions using Layer 2 - Learning Crypto

What am I doing here?

I first heard about Aztec through the Bankless podcast, and have been patiently waiting for the latest release on ever since. Now that it’s out, I wanted to test out a use simple case that makes total sense for me: Privately sending ETH from one DeFi wallet to another.

Why would I want to do this?

I like to use Coinbase as an easy fiat onramp, sending to one of my DeFi wallets when I want to actually use or take ownership of my crypto assets. Because Coinbase is centralized, the sender address doesn’t directly identify my sender account on chain. That’s fantastic! However, the moment I send assets between two DeFi wallets, say MetaMask and Ledger, that trail is fully visible to the world. 

I believe the underlying technologies of web3 will be the rails for future global digital economies & communities. In that future world, privacy tools will be paramount. So while all of this is still incredibly early, I love to be an early adopter of something I believe has legs and position myself ahead of the curve. For today, I would simply love to easily move assets between my DeFi wallets without every detail living on a public ledger.

Here’s exactly how I just did that with Aztec from start to finish:

Buy 1 ETH (I'm using Coinbase)

There’s a reason I’m starting with exactly 1 ETH here, and I’ll get into that later. Also, I’m using Coinbase specifically here for 2 reasons. First, the ancillary benefit of having privacy on the sender address is the same reason I’m intrigued by Aztec today and not just in the future. Second, I’m already accustomed to this onramp approach, and already have 1 ETH on Coinbase that I wanted to send to my wallet anyway. So let’s gooo!

Send ETH from Coinbase to MetaMask

It’s time to go from the centralized exchange to my DeFi wallet on Layer 1 Ethereum. 

First, I’ll initialize the send on Coinbase

Sending 1 ETH to MetaMask

Once confirmed, my ETH is in my MetaMask wallet

Receiving a transaction in MetaMask

Now that I have custody of my ETH, I can do DeFi things like stake, borrow, lend, swap, etc. Since the sender address is Coinbase’s CEX, there’s no way for the general public to identify that sender as me.

Etherscan showing sender address as Coinbase

But here’s where you lose your privacy. At some point I’ll want to send ETH from this wallet into my Ledger hardware wallet. Or pay someone for cutting my grass. Or make a donation. Or send a gift. Or any one of the million things I can do with my regular money without the whole world knowing all of the details. That’s exactly where Aztec comes in. With Aztec, I can do that wallet-to-wallet send with the same level of privacy I just had when going from Coinbase to MetaMask.

Shield my ETH in Aztec

This is where it gets fun: I’m headed to Layer 2. First, I’ll create an account on with my MetaMask wallet.

Signing up at ZK money with MetaMask

Then I’ll set up my account alias. Will pick something easy to remember ;) 

Setting up Aztec account alias

Then I’ll “Shield” my 1 ETH, which also completes my registration.

 Shielding 1 ETH on Aztec

Now my ETH is shielded in Aztec! Once the rollup transaction settles, I’m able to transact within their Layer 2 with full privacy. They have some interesting private DeFi things I can do, such as stake on Lido, but I’m simply interested in sending my ETH back to a different wallet on Layer 1. 

ETH shielded on Aztec

Sending ETH from Aztec’s Layer 2 back to Layer 1

I’ve waited for the rollup to settle back to Layer 1, which means my ETH is available to do with as I please within Aztec’s Layer 2. Time to send it off to my hardware wallet.

ETH showing available in Aztec dashboard

From here I click Send, which allows me to either send within Aztec’s L2 or withdraw to L1. I’m withdrawing to L1, so I’ll enter the public address of the wallet I have tied to my Ledger.

(NOTE: Make sure to have enough ETH shielded to cover the nominal gas fee of withdrawing back to Layer 1. I neglected to do this on my first go around and had to shield a small amount of ETH in a separate transaction so I could withdraw exactly 1 ETH.

Sending ETH from Aztec to Ledger

Once the rollup transaction with my send settles, the ETH is back on Layer 1 and in my wallet! Looking at the sender address on Etherscan, a typical wallet-to-wallet transaction without Aztec in the middle would have shown my personal wallet. But since I went through Aztec’s Layer 2, that’s the sender instead!

Etherscan showing sender address as Aztec’s Layer 2

The beauty of this transaction is that it’s privacy-equivalent to sending from Coinbase straight to Ledger — one of the reasons I actually like using the centralized exchange as a fiat onramp.

So wait, why did I send exactly 1 ETH?

Because it adds one more layer of privacy. If I were to have sent and received something like $100 worth of ETH instead, it would amount to exactly xxxx ETH (at the time of writing). That creates a very unique transaction amount, making it easier for someone reverse engineer my transaction history and link those two transactions & wallets together. This is a best practice in Aztec's docs when doing a transaction like this, where the amount is consistent from end to end.


To me, Aztec has just solved a piece of the privacy puzzle. A big CEX benefit is that you can do non-public sending and receiving, but you must be comfortable with a company controlling that privacy. The non-crypto metaphor here is Venmo. It's the same thing. Not every digital transaction I make should have all of the details posted in public for the world to see. Maybe I just want everyone to see an eggplant emoji. It's not about being shady (hard to hide behind seanconnelly.eth). I just want to be able to give my road trip buddy 20 bucks in gas money without a public ledger involved. Aztec has shown me there is a near-future world where I can send and receive crypto assets just like that while retaining that, but without relying on a corporate black box to be the custodian of that privacy.

Main image and thumbnail image credit to