How to Exchange Bitcoin for Monero with Atomic Swaps
Florian Ludewig
Nov 10, 2021
While Monero is facing more and more regulations and thus is being removed by many exchanges, the COMIT team is working on cross chain atomic swaps. Their xmr-btc-swap project allows for a trustless, peer to peer exchange of Bitcoin for Monero (send BTC, receive XMR). This technology, which implements atomic swaps is fairly new and thus hasn't been audited yet. So make sure to test it with small amounts only and report any issues to the developers!
How atomic swaps work
Atomicity is a concept coined in computer science. It refers to multiple processes having only two possible outcomes:
- (1) Either all processes succeed,
- (2) or none of the processes succeeds.
In other words, atomicity can be described as: "All or nothing". For the context of a swap it means, that:
- (1) Either the seller receives your Bitcoin and you receive the sellers Monero,
- (2) or both parties keep their funds.
Prerequisites
- Monero wallet address
- Access to your Bitcoin wallet
- Basic command line interface (CLI) knowledge
1. Install swap
Download and unzip the latest stable swap
release for your operation system from the official xmr-btc-swap repository. In my case that's swap_0.9.0_Linux_x86_64.tar
.
Inside the archive is a binary called swap
. You can run ./swap --help
to see a list of all available commands.
2. Find a seller
Obviously a swap needs two sides: A buyer (you) and a seller. But finding a seller isn't easy. Especially because not many people are using this technology yet.
Sellers can be found by querying so-called rendezvous points. To do this you need to run the following command:
./swap list-sellers --rendezvous-point <endpoint>
Where <endpoint>
needs to be replaced. Here are a few websites on which you can find such endpoints:
I will also provide you with a list of rendezvous points that were online at the time of writing this blog post:
/dnsaddr/rendezvous.coblox.tech/p2p/12D3KooWQUt9DkNZxEn2R5ymJzWj15MpG6mTW84kyd8vDaRZi46o
/dnsaddr/battery.commitcri.me/p2p/12D3KooWCSJUBJ3DkxAdwE1rX5ejBWttexYWsgqGBTStX47rU71G
/dnsaddr/unstoppableswap.net/p2p/12D3KooWLHbHtkK53WoBA82Yht3PCCx6KXYxoJ6QqgXg1rSNtWhR
/dnsaddr/xmrswap.me/p2p/12D3KooWJz36p44uJAB8pL66Zj5o5QnbuU9G5ycSPL9KozeBVo7M
/dns4/eratosthen.es/tcp/7798/p2p/12D3KooWAh7EXXa2ZyegzLGdjvj1W4G3EXrTGrf6trraoT1MEobs
/dns4/rendezvous.xmr.radio/tcp/8888/p2p/12D3KooWN3n2MioS515ek6LoUBNwFKxtG2ribRpFkVwJufSr7ro7
/dns4/swap.sethforprivacy.com/tcp/8888/p2p/12D3KooWCULyZKuV9YEkb6BX8FuwajdvktSzmMg4U5ZX2uYZjHeu
The list-sellers
command will return a table with 5 columns:
PRICE
How much 1 XMR costs in BTC (compare here)MIN_QUANTITY
Minimum amount of BTC to sellMAX_QUANTITY
Maximum amount of BTC to sellSTATUS
Network status of peerADDRESS
Address of peer
There is also a bash script to find the best seller of a specific rendezvous point. It is located in xmr-btc-swap/docs/cli/discover_and_take.sh
.
If you want to become a seller yourself, you can read this article.
3. Swap Bitcoin for Monero
Once you have found an appropriate seller you can start a swap:
./swap buy-xmr \
--change-address <btc_refund_address> \
--receive-address <xmr_address> \
--seller <seller_address>
xmr_address
Your Monero wallet addressbtc_refund_address
Bitcoin refund address (in case the swap fails)seller_address
Address of the seller (from step #2)
A full buy-xmr
command might look like this:
./swap buy-xmr \
--change-address 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa \
--receive-address 862mLrhM6jQJDXPJ5pQHm9cYQXLESg4zXTFnRcvQeKAdXBJZBkTkajSQW3MXmeacCR9GZ3iNXXsn9jiTz5XNRe8C3fi3RmZ \
--seller /dnsaddr/xmrswap.me/p2p/12D3KooWJz36p44uJAB8pL66Zj5o5QnbuU9G5ycSPL9KozeBVo7M
Running this command can take a while, but after some time you should be prompted with a Bitcoin deposit_address
. Send the amount you want to swap to that Bitcoin address. Make sure to keep minimum and maximum in mind! Once the funds have been transacted the seller will automatically send the exchanged Monero. In case anything goes wrong you will be refunded.
Final words
The Monero community is already working on a GUI implementation for atomic swaps. Until then we have to rely on the proceess I've outlined in this post. Happy swapping!