* add comment to ConfirmationListener * swap: always wrap monero::Wallet in tokio::sync::Mutex Before, monero::Wallet wrapped a Mutex<Client>, and locked the mutex on each operation. This meant releasing the lock in between operations, even though we rely on the operations being executed in order. To remedy this race condition, we wrap monero::Wallet itself in a mutex, requiring any caller to hold the lock for the duration of the operation, including any suboperations. * work on: releasing the lock while waiting for confirmations Due to the newly introduced thread safety, we are currently holding lock to the monero wallet while waiting for confirmations -- since this takes a lot of time, it starves all other tasks that do anything with the monero wallet. In this commit I start implementing a change that enables us to release the lock to the wallet while waiting for confirmations and only acquire it when necessary. This breaks with the current system of passing just a generic client which implements the MoneroWalletRpc trait (which we use to pass a dummy client for testing). This commit is the first step towards a small refactor to that system. * always pass Wallet instead of a MoneroWalletRpc client By always passing Arc<Mutex<Wallet>> instead of MoneroWalletRpc clients directly we can allow the wait_for_confirmations functions to lock the Mutex and access the client when they need to, while releasing the lock when waiting for the next tick. This stops the current starving of other tasks waiting for the lock. Since we use a dummy client for testing, this required adding a generic parameter to the Wallet. However, since we specify a default type, this doesn't actually require generic handling anywhere. * add warning comment to monero::wallet::Wallet::from_dummy * add timeout when waiting for monero lock during quote This commit adds a timeout after 60 seconds when trying to acquire the lock on the monero wallet while making a quote. Should a timout occur, we return an error. This makes sure that we get _some_ return value and that starvation is noticed. * fix lints, don't keep lock during loop body in wait_for_confirmations * always immediately drop lock in wait_for_transfer * fix clippy lints * open wallet instead of failing when we can't create from keys When we fail to create a monero wallet from keys, we will now try to open it instead. I also renamed the method to be more consistent with Wallet::open_or_create. These changes are mostly taken from #260. * improve documentation on monero::Wallet * use Wallet::open instead of Wallet::Client::open * use create_from_keys_and_sweep in bob's redeem_xmr This commit deduplicates logic by using create_from_keys_and_sweep_to in bob's redeem_xmr and also adds the create_from_keys_and_sweep_to method while making create_from_keys_and_sweep a wrapper around it. * add error context and improve logging * fix deadlock in wait_for_confirmation_with, add timout to test |
||
|---|---|---|
| .. | ||
| .sqlx | ||
| migrations | ||
| proptest-regressions/bitcoin | ||
| src | ||
| tests | ||
| build.rs | ||
| Cargo.toml | ||
| README.md | ||
| sqlite_dev_setup.sh | ||
| sqlx-data.json | ||
| tempdb | ||
XMR to BTC Atomic Swap
This repository hosts an MVP for atomically swapping BTC to XMR. It implements the protocol described in section 3 of this paper.
More information about the protocol in this presentation and this blog post.
Currently, swaps are only offered in one direction with the swap CLI on the buying side (send BTC, receive XMR).
We are working on implementing a protocol where XMR moves first, but are currently blocked by advances on Monero itself.
You can read this blogpost for more information.
Quick Start
- Download the latest
swapbinary release for your operating system. - Find a seller to swap with:
./swap --testnet list-sellers
- Swap with a seller:
./swap --testnet buy-xmr --receive-address <YOUR MONERO ADDRESS> --change-address <YOUR BITCOIN CHANGE ADDRESS> --seller <SELLER MULTIADDRESS>
For more detailed documentation on the CLI, see this README.
Becoming a market maker
Swapping of course needs two parties - and the CLI is only one of them: The taker that occasionally starts a swap with a market maker.
If you are interested in becoming a market maker you will want to run the second binary provided in this repository: asb - the Automated Swap Backend.
Detailed documentation for the asb can be found in this README.
Safety
This software is using cryptography that has not been formally audited. While we do our best to make it safe, it is up to the user to evaluate whether or not it is safe to use for their purposes. Please also see section 15 and 16 of the license.
Keep in mind that swaps are complex protocols, it is recommended to not do anything fancy when moving coins in and out. It is not recommended to bump fees when swapping because it can have unpredictable side effects.
Contributing
We encourage community contributions whether it be a bug fix or an improvement to the documentation. Please have a look at the contribution guidelines.
Rust Version Support
Please note that only the latest stable Rust toolchain is supported. All stable toolchains since 1.74 should work.
Contact
Feel free to reach out to us in the COMIT-Monero Matrix channel.