diff --git a/README.md b/README.md
index d72933ca..81fc2eb7 100644
--- a/README.md
+++ b/README.md
@@ -7,6 +7,6 @@ This is the monorepo containing the source code for all of our core projects:
- [`tauri`](src-tauri/) contains the tauri bindings between binaries and user interface
- and other crates we use in our binaries
-If you're just here for the software, head over to the [releases](https://github.com/UnstoppableSwap/xmr-btc-swap/releases/latest) tab and grab the binary for your operating system! If you're just looking for documentation, check out our [docs page](https://docs.unstoppableswap.net/) or our [github docs](docs/README.md).
+If you're just here for the software, head over to the [releases](https://github.com/UnstoppableSwap/xmr-btc-swap/releases/latest) tab and grab the binary for your operating system! If you're just looking for documentation, check out our [docs page](https://docs.unstoppableswap.net/) or our [github docs](dev-docs/README.md).
Join our [Matrix room](https://matrix.to/#/#unstoppableswap-core:matrix.org) to follow development more closely.
diff --git a/dev-docs/asb/README.md b/dev-docs/asb/README.md
index ccaa4279..66d08b3e 100644
--- a/dev-docs/asb/README.md
+++ b/dev-docs/asb/README.md
@@ -63,11 +63,11 @@ In particular, you may be interested in setting up your ASB to be reachable via
In order to understand the different components of the ASB and CLI better here is a component diagram showcasing the ASB and CLI setup using public Bitcoin and Monero infrastructure:
-
+
Contrary, here is a diagram that showcases a service provider running it's own blockchain infrastructure for the ASB:
-
+
The diagram shows that the `asb` group (representing the `asb` binary) consists of three components:
diff --git a/src-gui/src/renderer/components/pages/help/ExportDataBox.tsx b/src-gui/src/renderer/components/pages/help/ExportDataBox.tsx
index 60f47abd..55fa1e99 100644
--- a/src-gui/src/renderer/components/pages/help/ExportDataBox.tsx
+++ b/src-gui/src/renderer/components/pages/help/ExportDataBox.tsx
@@ -95,7 +95,7 @@ function WalletDescriptorModal({
For more information on what to do with the descriptor, see our
- {" "} documentation
+ {" "} documentation
diff --git a/swap/.sqlx/query-081c729a0f1ad6e4ff3e13d6702c946bc4d37d50f40670b4f51d2efcce595aa6.json b/swap/.sqlx/query-081c729a0f1ad6e4ff3e13d6702c946bc4d37d50f40670b4f51d2efcce595aa6.json
new file mode 100644
index 00000000..94b77425
--- /dev/null
+++ b/swap/.sqlx/query-081c729a0f1ad6e4ff3e13d6702c946bc4d37d50f40670b4f51d2efcce595aa6.json
@@ -0,0 +1,20 @@
+{
+ "db_name": "SQLite",
+ "query": "\n SELECT peer_id\n FROM peers\n WHERE swap_id = ?\n ",
+ "describe": {
+ "columns": [
+ {
+ "name": "peer_id",
+ "ordinal": 0,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": [
+ false
+ ]
+ },
+ "hash": "081c729a0f1ad6e4ff3e13d6702c946bc4d37d50f40670b4f51d2efcce595aa6"
+}
diff --git a/swap/.sqlx/query-0ab84c094964968e96a3f2bf590d9ae92227d057386921e0e57165b887de3c75.json b/swap/.sqlx/query-0ab84c094964968e96a3f2bf590d9ae92227d057386921e0e57165b887de3c75.json
new file mode 100644
index 00000000..f05e8f65
--- /dev/null
+++ b/swap/.sqlx/query-0ab84c094964968e96a3f2bf590d9ae92227d057386921e0e57165b887de3c75.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "\n insert into peer_addresses (\n peer_id,\n address\n ) values (?, ?);\n ",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 2
+ },
+ "nullable": []
+ },
+ "hash": "0ab84c094964968e96a3f2bf590d9ae92227d057386921e0e57165b887de3c75"
+}
diff --git a/swap/.sqlx/query-0d465a17ebbb5761421def759c73cad023c30705d5b41a1399ef79d8d2571d7c.json b/swap/.sqlx/query-0d465a17ebbb5761421def759c73cad023c30705d5b41a1399ef79d8d2571d7c.json
new file mode 100644
index 00000000..58fbb3f8
--- /dev/null
+++ b/swap/.sqlx/query-0d465a17ebbb5761421def759c73cad023c30705d5b41a1399ef79d8d2571d7c.json
@@ -0,0 +1,20 @@
+{
+ "db_name": "SQLite",
+ "query": "\n SELECT min(entered_at) as start_date\n FROM swap_states\n WHERE swap_id = ?\n ",
+ "describe": {
+ "columns": [
+ {
+ "name": "start_date",
+ "ordinal": 0,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": [
+ true
+ ]
+ },
+ "hash": "0d465a17ebbb5761421def759c73cad023c30705d5b41a1399ef79d8d2571d7c"
+}
diff --git a/swap/.sqlx/query-2a356078a41b321234adf2aa385b501749f907f7c422945a8bdda2b6274f5225.json b/swap/.sqlx/query-2a356078a41b321234adf2aa385b501749f907f7c422945a8bdda2b6274f5225.json
new file mode 100644
index 00000000..a42beda2
--- /dev/null
+++ b/swap/.sqlx/query-2a356078a41b321234adf2aa385b501749f907f7c422945a8bdda2b6274f5225.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "\n insert into peers (\n swap_id,\n peer_id\n ) values (?, ?);\n ",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 2
+ },
+ "nullable": []
+ },
+ "hash": "2a356078a41b321234adf2aa385b501749f907f7c422945a8bdda2b6274f5225"
+}
diff --git a/swap/.sqlx/query-50a5764546f69c118fa0b64120da50f51073d36257d49768de99ff863e3511e0.json b/swap/.sqlx/query-50a5764546f69c118fa0b64120da50f51073d36257d49768de99ff863e3511e0.json
new file mode 100644
index 00000000..f83a6884
--- /dev/null
+++ b/swap/.sqlx/query-50a5764546f69c118fa0b64120da50f51073d36257d49768de99ff863e3511e0.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "\n insert into monero_addresses (\n swap_id,\n address\n ) values (?, ?);\n ",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 2
+ },
+ "nullable": []
+ },
+ "hash": "50a5764546f69c118fa0b64120da50f51073d36257d49768de99ff863e3511e0"
+}
diff --git a/swap/.sqlx/query-5cc61dd0315571bc198401a354cd9431ee68360941f341386cbacf44ea598de8.json b/swap/.sqlx/query-5cc61dd0315571bc198401a354cd9431ee68360941f341386cbacf44ea598de8.json
new file mode 100644
index 00000000..7f58635f
--- /dev/null
+++ b/swap/.sqlx/query-5cc61dd0315571bc198401a354cd9431ee68360941f341386cbacf44ea598de8.json
@@ -0,0 +1,26 @@
+{
+ "db_name": "SQLite",
+ "query": "\n SELECT swap_id, state\n FROM (\n SELECT max(id), swap_id, state\n FROM swap_states\n GROUP BY swap_id\n )\n ",
+ "describe": {
+ "columns": [
+ {
+ "name": "swap_id",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "state",
+ "ordinal": 1,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 0
+ },
+ "nullable": [
+ true,
+ true
+ ]
+ },
+ "hash": "5cc61dd0315571bc198401a354cd9431ee68360941f341386cbacf44ea598de8"
+}
diff --git a/swap/.sqlx/query-88f761a4f7a0429cad1df0b1bebb1c0a27b2a45656549b23076d7542cfa21ecf.json b/swap/.sqlx/query-88f761a4f7a0429cad1df0b1bebb1c0a27b2a45656549b23076d7542cfa21ecf.json
new file mode 100644
index 00000000..b7429dcd
--- /dev/null
+++ b/swap/.sqlx/query-88f761a4f7a0429cad1df0b1bebb1c0a27b2a45656549b23076d7542cfa21ecf.json
@@ -0,0 +1,20 @@
+{
+ "db_name": "SQLite",
+ "query": "\n SELECT state\n FROM swap_states\n WHERE swap_id = ?\n ORDER BY id desc\n LIMIT 1;\n\n ",
+ "describe": {
+ "columns": [
+ {
+ "name": "state",
+ "ordinal": 0,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": [
+ false
+ ]
+ },
+ "hash": "88f761a4f7a0429cad1df0b1bebb1c0a27b2a45656549b23076d7542cfa21ecf"
+}
diff --git a/swap/.sqlx/query-98a8b7f4971e0eb4ab8f5aa688aa22e7fdc6b925de211f7784782f051c2dcd8c.json b/swap/.sqlx/query-98a8b7f4971e0eb4ab8f5aa688aa22e7fdc6b925de211f7784782f051c2dcd8c.json
new file mode 100644
index 00000000..5a5f8c4f
--- /dev/null
+++ b/swap/.sqlx/query-98a8b7f4971e0eb4ab8f5aa688aa22e7fdc6b925de211f7784782f051c2dcd8c.json
@@ -0,0 +1,20 @@
+{
+ "db_name": "SQLite",
+ "query": "SELECT DISTINCT address FROM monero_addresses",
+ "describe": {
+ "columns": [
+ {
+ "name": "address",
+ "ordinal": 0,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 0
+ },
+ "nullable": [
+ false
+ ]
+ },
+ "hash": "98a8b7f4971e0eb4ab8f5aa688aa22e7fdc6b925de211f7784782f051c2dcd8c"
+}
diff --git a/swap/.sqlx/query-b703032b4ddc627a1124817477e7a8e5014bdc694c36a14053ef3bb2fc0c69b0.json b/swap/.sqlx/query-b703032b4ddc627a1124817477e7a8e5014bdc694c36a14053ef3bb2fc0c69b0.json
new file mode 100644
index 00000000..79ade14e
--- /dev/null
+++ b/swap/.sqlx/query-b703032b4ddc627a1124817477e7a8e5014bdc694c36a14053ef3bb2fc0c69b0.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "\n insert into swap_states (\n swap_id,\n entered_at,\n state\n ) values (?, ?, ?);\n ",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 3
+ },
+ "nullable": []
+ },
+ "hash": "b703032b4ddc627a1124817477e7a8e5014bdc694c36a14053ef3bb2fc0c69b0"
+}
diff --git a/swap/.sqlx/query-ce270dd4a4b9615695a79864240c5401e2122077365e5e5a19408c068c7f9454.json b/swap/.sqlx/query-ce270dd4a4b9615695a79864240c5401e2122077365e5e5a19408c068c7f9454.json
new file mode 100644
index 00000000..4927cda6
--- /dev/null
+++ b/swap/.sqlx/query-ce270dd4a4b9615695a79864240c5401e2122077365e5e5a19408c068c7f9454.json
@@ -0,0 +1,20 @@
+{
+ "db_name": "SQLite",
+ "query": "\n SELECT address\n FROM monero_addresses\n WHERE swap_id = ?\n ",
+ "describe": {
+ "columns": [
+ {
+ "name": "address",
+ "ordinal": 0,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": [
+ false
+ ]
+ },
+ "hash": "ce270dd4a4b9615695a79864240c5401e2122077365e5e5a19408c068c7f9454"
+}
diff --git a/swap/.sqlx/query-d78acba5eb8563826dd190e0886aa665aae3c6f1e312ee444e65df1c95afe8b2.json b/swap/.sqlx/query-d78acba5eb8563826dd190e0886aa665aae3c6f1e312ee444e65df1c95afe8b2.json
new file mode 100644
index 00000000..cf0105e2
--- /dev/null
+++ b/swap/.sqlx/query-d78acba5eb8563826dd190e0886aa665aae3c6f1e312ee444e65df1c95afe8b2.json
@@ -0,0 +1,20 @@
+{
+ "db_name": "SQLite",
+ "query": "\n SELECT DISTINCT address\n FROM peer_addresses\n WHERE peer_id = ?\n ",
+ "describe": {
+ "columns": [
+ {
+ "name": "address",
+ "ordinal": 0,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": [
+ false
+ ]
+ },
+ "hash": "d78acba5eb8563826dd190e0886aa665aae3c6f1e312ee444e65df1c95afe8b2"
+}
diff --git a/swap/.sqlx/query-e05620f420f8c1022971eeb66a803323a8cf258cbebb2834e3f7cf8f812fa646.json b/swap/.sqlx/query-e05620f420f8c1022971eeb66a803323a8cf258cbebb2834e3f7cf8f812fa646.json
new file mode 100644
index 00000000..5eb6fef3
--- /dev/null
+++ b/swap/.sqlx/query-e05620f420f8c1022971eeb66a803323a8cf258cbebb2834e3f7cf8f812fa646.json
@@ -0,0 +1,20 @@
+{
+ "db_name": "SQLite",
+ "query": "\n SELECT state\n FROM swap_states\n WHERE swap_id = ?\n ",
+ "describe": {
+ "columns": [
+ {
+ "name": "state",
+ "ordinal": 0,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": [
+ false
+ ]
+ },
+ "hash": "e05620f420f8c1022971eeb66a803323a8cf258cbebb2834e3f7cf8f812fa646"
+}
diff --git a/swap/.sqlx/query-e36c287aa98ae80ad4b6bb6f7e4b59cced041406a9db71da827b09f0d3bacfd6.json b/swap/.sqlx/query-e36c287aa98ae80ad4b6bb6f7e4b59cced041406a9db71da827b09f0d3bacfd6.json
new file mode 100644
index 00000000..d836424a
--- /dev/null
+++ b/swap/.sqlx/query-e36c287aa98ae80ad4b6bb6f7e4b59cced041406a9db71da827b09f0d3bacfd6.json
@@ -0,0 +1,12 @@
+{
+ "db_name": "SQLite",
+ "query": "\n INSERT INTO buffered_transfer_proofs (\n swap_id,\n proof\n ) VALUES (?, ?);\n ",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Right": 2
+ },
+ "nullable": []
+ },
+ "hash": "e36c287aa98ae80ad4b6bb6f7e4b59cced041406a9db71da827b09f0d3bacfd6"
+}
diff --git a/swap/.sqlx/query-e9d422daf774d099fcbde6c4cda35821da948bd86cc57798b4d8375baf0b51ae.json b/swap/.sqlx/query-e9d422daf774d099fcbde6c4cda35821da948bd86cc57798b4d8375baf0b51ae.json
new file mode 100644
index 00000000..f375b6b6
--- /dev/null
+++ b/swap/.sqlx/query-e9d422daf774d099fcbde6c4cda35821da948bd86cc57798b4d8375baf0b51ae.json
@@ -0,0 +1,20 @@
+{
+ "db_name": "SQLite",
+ "query": "\n SELECT proof\n FROM buffered_transfer_proofs\n WHERE swap_id = ?\n ",
+ "describe": {
+ "columns": [
+ {
+ "name": "proof",
+ "ordinal": 0,
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Right": 1
+ },
+ "nullable": [
+ false
+ ]
+ },
+ "hash": "e9d422daf774d099fcbde6c4cda35821da948bd86cc57798b4d8375baf0b51ae"
+}
diff --git a/swap/tempdb b/swap/tempdb
new file mode 100644
index 00000000..959df155
Binary files /dev/null and b/swap/tempdb differ