Last week a privacy coin had a bad few days. On October 14, Pirate Chain found an exploit that let an attacker mint about 39.8 million ARRR out of thin air, roughly a fifth of the supply. The new coins went straight into the shielded pool, where the chain's mandatory privacy makes them impossible to fully trace. The team dropped its rollback plan and asked exchanges and pools to pause.
That's the dramatic version of a trade-off every privacy chain lives with. Privacy hides the user, and it can also hide the problem.
Most people will never touch an exploit like that. What they do touch is a much more boring moment: moving value out of a private chain and into a public one. Swapping Monero for Ether is the most common example. If you build wallets, payment flows or anything with a "Send" button, that boundary has its own timing, its own costs and a couple of states that most interfaces never show.
Here's what happens inside it.
Two ledgers with opposite defaults
Monero hides the sender, the receiver and the amount by default. Ethereum shows all three to anyone with a block explorer.
So an XMR to ETH swap is a one-way door. Whatever happens on the Monero side stays fairly private. Whatever happens after the ETH lands is public forever: the receiving address, every transfer it makes afterward, and every contract it touches.
I wrote earlier about what a public crypto wallet can reveal. The short version applies here too. If the ETH address is already linked to your name through an exchange account or an ENS name, the swapped ETH is linked to you as well. Privacy on the way in doesn't carry over.
Where the time goes
People expect the swap itself to be the slow part. It isn't. Most of the waiting happens on the Monero side, before any exchange runs.
Three things set the clock:
- Your own balance. Monero locks newly received coins for 10 blocks before they can be spent. If you got the XMR twenty minutes ago, you may not be able to send it yet.
- Block pace. Monero produces a block about every 2 minutes.
- The service's threshold. Each swap service decides how many confirmations it waits for before accepting a deposit. Five confirmations is about ten minutes. Twenty is forty minutes or more. Large or unusual orders often get a higher threshold.
The Ethereum side rarely slows anything down. Ethereum runs on 12-second slots, so once the payout is sent, it shows up quickly.
For builders, this has a simple consequence: a spinner is the wrong UI here. Users wait more calmly when they see "3 of 5 confirmations" than when they stare at a loading animation for twelve minutes with no idea whether anything is happening.
Where the money goes
There's no single fee in an XMR to ETH swap. There are four:
- the Monero network fee on your deposit, which you pay from your own wallet;
- the provider's trading costs with its liquidity partners;
- the spread, the gap between the market price and the rate you're offered;
- the Ethereum network fee on the payout.
On most instant swap services, only the first one is visible to you as a separate charge. The rest is folded into the quote. This breakdown of XMR to ETH exchange fees puts it well: the number worth comparing is the ETH you actually receive, not the headline rate.
A few details from the protocol docs are worth knowing.
Monero wallets offer four fee priority levels. The fee depends on congestion and transaction size, not on how much XMR you send.
On Ethereum, the fee is gas used times the base fee plus a priority fee. A plain ETH transfer uses 21,000 gas, and the base fee can move by up to 12.5% per block as demand changes (ethereum.org). That's why the same swap can cost more to pay out on a busy afternoon.
Then there's the minimum amount. Network costs are roughly fixed per transaction, so on a tiny swap they eat a large share. Near the minimum, the ETH you receive can look noticeably worse than the market rate.
The choice between fixed and floating rates is a trade-off too. A fixed rate locks the amount for a short window, and the provider usually builds a small buffer into it for price swings. A floating rate follows the market until execution and can land a bit above or below the estimate. On a volatile day, the certainty may be worth the buffer. On a calm day, often it isn't.
For builders: show the final received amount as the main number. Show the rate second. If your quote is an estimate, say so in plain words, right next to the figure.
The state nobody designs for
Every swap flow has the happy path: waiting for deposit, confirming, exchanging, sending, done. Most also have a state that rarely shows up in mockups: on hold for a compliance review.
"No account" and "no checks" are not the same thing. Account-free services still run risk-based reviews. Reports of stolen funds, unusual transactions or local law can trigger identity verification, and in some countries verification is required before any order at all.
The wider rules are getting tighter, and they differ a lot by country. Dubai banned privacy coin activity in February 2023. Kraken ended Monero trading and deposits for clients in the European Economic Area in October 2024. And from July 10, 2027, Article 79 of the EU's Anti-Money Laundering Regulation bars regulated crypto service providers from keeping accounts that allow anonymised transactions, including through anonymity-enhancing coins.
Read that last one carefully. It applies to providers. It doesn't stop individuals from holding XMR in their own wallets. If you want the country-by-country picture, this overview of whether it's safe and legal to exchange Monero for Ethereum collects the main rules in one table.
For builders, the lesson is to treat "verification requested" as a first-class state. Say what triggered it, what the user needs to do, and how long the request stays open. A held order with a clear explanation is annoying. A held order with no explanation feels like a scam, and users will treat it like one.
A short checklist if you're building this flow
- Show confirmation progress as a count, not a spinner.
- Lead with the amount the user will receive. Put the rate second.
- Label estimates as estimates, and say what's already included.
- Warn when the amount is close to the minimum, where fees weigh most.
- Make the payout network impossible to miss. Mainnet, Base and Arbitrum addresses look identical.
- Design the compliance-hold screen before you need it.
- Give the user an order ID they can save, and a status page that works with nothing else.
And if you're on the user side: send already-unlocked XMR, compare the full ETH address character by character, and assume the receiving address will be public for good. Because it will be.
Top comments (0)