Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

docs: add maker documentation #242

Merged
merged 11 commits into from
Jan 21, 2025
1 change: 1 addition & 0 deletions docs/pages/_meta.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@
"getting_started": "Getting Started",
"usage": "Usage",
"advanced": "Advanced",
"becoming_a_maker": "Becoming a Maker",
"donate": "Donate"
}
22 changes: 14 additions & 8 deletions docs/pages/advanced/swap_on_testnet.mdx
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
# Swapping on Testnet

Swapping on the testnet is a great way to test out the swap functionality without risking your mainnet assets. The testnet is a separate network from the mainnet, and the assets on the testnet are worthless.
To be exact, `testnet3` bitcoin will be swapped for `stagenet` Monero. You will need to set up two wallets to perform a swap:
Swapping on testnet is a great way to test out the swap functionality without risking your mainnet assets.
The _testnet_ is a separate network from the _mainnet_, only used for testing the blockchains.
The assets on testnet are worthless.
When we talk about "testnet", what we actually mean is the `Testnet3` network for Bitcoin and the `Stagenet` network for Monero.
You will need a wallet in each of these networks to perform a swap.

- A Testnet3 Electrum Wallet (Bitcoin)
- A Stagenet Monero GUI Wallet
Here are the steps to set up the wallets using Electrum and Monero GUI.

## Electrum

Expand All @@ -24,19 +26,22 @@ import { Tabs, Tab } from 'nextra/components'
```
</Tab>
<Tab>
If you install Electrum on Windows, you will have two programs you can start. One of them is called "Electrum Testnet".
Open the `Electrum Testnet` program from your start menu.
</Tab>
</Tabs>

To get some free Testnet coins visit a faucet like [this](https://testnet-faucet.mempool.co) one.

## Monero

If you use the `monero-wallet-cli` you simply need to start it with the `--stagenet` flag. If you use the GUI you can follow [this](https://www.youtube.com/watch?v=5E4aO3UAqJo) tutorial. A list of stagenet remote nodes can be found [here](https://monero.fail/?chain=monero&network=stagenet).
If you use `monero-wallet-cli` you simply need to start it with the `--stagenet` flag.
If you use the GUI you can follow [this](https://www.youtube.com/watch?v=5E4aO3UAqJo) tutorial.
A list of stagenet remote nodes can be found [here](https://monero.fail/?chain=monero&network=stagenet).

## Launching the GUI

View the [Installation Instructions](../getting_started/install_instructions) if you haven't already installed the GUI. Then start the GUI in testnet mode.
View the [Installation Instructions](../getting_started/install_instructions) if you haven't already installed the GUI.
Then start the GUI in testnet mode.

<Tabs items={['Linux', 'macOS']}>
<Tab>
Expand All @@ -51,4 +56,5 @@ View the [Installation Instructions](../getting_started/install_instructions) if
</Tab>
</Tabs>

From here on you can follow the [Complete your first swap](../usage/first_swap) guide with the difference that you will be using the testnet wallets. The process is the same, but you will be using the testnet wallets instead of the mainnet wallets.
From here on you can follow the [Complete your first swap](../usage/first_swap) guide.
The process is the same, but you will be using the testnet wallets instead of the mainnet wallets.
3 changes: 3 additions & 0 deletions docs/pages/becoming_a_maker/_meta.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"overview": "Overview"
}
274 changes: 274 additions & 0 deletions docs/pages/becoming_a_maker/overview.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,274 @@
import { Callout } from 'nextra/components'

## An Overview of Becoming a Maker

Makers run an automated swap backend (`asb`), which users can connect to and swap with.
The `asb` accepts Bitcoin and sells Monero, for a fee.

The `asb` needs to communicate with the Bitcoin and Monero blockchains.
For this, it uses `monero-wallet-rpc` for Monero and `electrs` for Bitcoin.

It's also strongly recommended to run your own Monero and Bitcoin nodes.

## Docker Compose setup

We maintain a Docker Compose configuration ([link](https://github.com/UnstoppableSwap/asb-docker-compose)) that automatically starts and manages these services:

- `asb` (the maker service, connecting to `monero-wallet-rpc` and `electrs`)
- `monero-wallet-rpc` (an RPC server, managing the Monero wallet and connecting to `monerod`)
- `electrs` (a Bitcoin blockchain indexer, connecting to `bitcoind`)
- `monerod` (a Monero node, connecting to the Monero blockchain)
- `bitcoind` (a Bitcoin node, connecting to the Bitcoin blockchain)

To run this setup you'll need Docker and Docker Compose installed.

### Getting started

Now you can clone the configuration repo and `cd` into it.
We're going to setup an asb on mainnet.
If you want to setup for testnet, go into the `testnet` directory instead.
All other steps remain the same.

```bash
git clone https://github.com/UnstoppableSwap/asb-docker-compose.git
cd asb-docker-compose/mainnet
```

The directory contains three files: the docker compose file, the enviroment variables file and the asb configuration file.
The directory structure looks like this:

```bash
asb-docker-compose/mainnet/
├─ config_mainnet.toml # asb configuration
├─ docker-compose.yml # docker compose configuration
├─ .env # port configuration for docker compose
```

The `docker-compose.yml` and `.env` files are part of the docker compose setup.
We will prioritize the asb configuration file in this guide, because you probably don't want to change the docker compose setup.

### Usage and commands

_This list is also available in the [repository](https://github.com/UnstoppableSwap/asb-docker-compose/), including variations for testnet._

First, make sure you're in the directory with the `docker-compose.yml` file:

```bash copy
cd asb-docker-compose/mainnet
```

If you aren't familiar with docker compose, here are the most important commands:

| Command | Description |
| --- | --- |
| `docker compose up -d` | Start all services. |
| `docker compose down` | Stop all services. |
| `docker compose pull` | Pull the latest images for all services. You need to run `docker compose up -d` after this to actually update the services. |
| `docker compose logs -f` | Access the logs of all services. To only see the last e.g. 100 lines, use `docker compose logs -f | tail -n 100`. |
Einliterflasche marked this conversation as resolved.
Show resolved Hide resolved

You can also execute `asb` commands, to get the history of swaps for example:

```bash copy
docker compose exec mainnet_asb asb --config=/asb-data/config_mainnet.toml history
```

Below is a list of asb commands you can use.
Some of them require access to some resources, in which case you'll need to stop the asb first and then resume afterwards:

```bash copy
docker compose down
docker compose exec mainnet_asb asb --config=/asb-data/config_mainnet.toml <command>
docker compose up -d
```

| Command | Description |
| --- | --- |
| `help` | Prints a list of available options and commands (under _subcommands_). |
| `history` | Prints a list of all previous and current swaps. |
| `start` | Starts the asb. This is automatically done when you run `docker compose up -d`. |
| `config` | Prints the current configuration. |
| `export-bitcoin-wallet` | Prints the internal bitcoin wallet descriptor which can be used to access the asb's bitcoin wallet. |
| `withdraw-btc --address` | Withdraws Bitcoin from the internal wallet into a specified address. |
Einliterflasche marked this conversation as resolved.
Show resolved Hide resolved

### Asb Configuration

Let's have a look at the asb configuration file.
It is used to configure the behaviour of the asb.
It uses the TOML language ([docs](https://toml.io/)).

The file has different sections, each with different configuration options:

- `maker`: specifies the core behaviour of the asb
- `bitcoin`: specifies the Bitcoin configuration
- `monero`: specifies the Monero configuration
- `tor`: specifies the Tor configuration
- `data`: specifies the data directory
- `network`: specifies the networking configuration


#### Maker Section

The most important section is the `[maker]` section, which specifies the core behaviour of the asb.
This is what a standard maker section looks like:

```toml filename="config_mainnet.toml"
[maker]
min_buy_btc = 0.001
max_buy_btc = 0.1
ask_spread = 0.02
price_ticker_ws_url = "wss://ws.kraken.com/"

# ...
```

Below an explanation of what each option does:

| Option | Description |
| --- | --- |
| `min_buy_btc` | The minimum amount of Bitcoin the asb will buy from takers, in BTC. |
| `max_buy_btc` | The maximum amount of Bitcoin the asb will buy from takers, in BTC. |
| `ask_spread` | The markup the asb will charge compared to the market price, as a factor. The market price is fetched via the `price_ticker_ws_url`. A value of `0.02` means the asb will charge 2% more than the market price. |
| `price_ticker_ws_url` | The URL of a websocket that provides the market price. The default is the Kraken API, but you can build your own websocket server which mimics the Kraken API. |

### Bitcoin Section

The `bitcoin` section specifies a few details about the asb's interaction with the Bitcoin blockchain.
We do not recommend changing these settings, however we document them for completeness sake.

```toml filename="config_mainnet.toml"
# ...

[bitcoin]
target_block = 1
electrum_rpc_url = "tcp://mainnet_electrs:50001"
network = "Mainnet"

# ...
```

| Option | Description |
| --- | --- |
| `target_block` | This determines the block height that the asb will try to get it's Bitcoin transactions confirmed at. The default value of `1` means the asb will try to get it's transactions confirmed in the next block. |
| `electrum_rpc_url` | The URL of the _electrs_ server the asb will connect to. The _electrs_ server is is used to interact with the Bitcoin blockchain. The default URL points to the docker-hosted _electrs_ server. |
| `network` | The Bitcoin network the asb will connect to. |

### Monero Section

The `monero` section specifies a few details about the asb's interaction with the Monero blockchain.
We do not recommend changing these settings, however we document them for completeness sake.

```toml filename="config_mainnet.toml"
# ...

[monero]
wallet_rpc_url = "http://mainnet_monero-wallet-rpc:18083/json_rpc"
network = "Mainnet"

# ...
```

| Option | Description |
| --- | --- |
| `wallet_rpc_url` | The URL of the _monero-wallet-rpc_ server the asb will connect to. The _monero-wallet-rpc_ server is is used to interact with the Monero blockchain. The default URL points to the docker-hosted _monero-wallet-rpc_ server. |
| `network` | The Monero network the asb will connect to. |

### Tor Section

The `tor` section specifies the asb's onion service (hidden service) configuration.
An onion service can be used to make the asb publicly accessible without exposing the server's IP address or requiring an opened port ([further reading](https://community.torproject.org/onion-services/overview/)).

```toml filename="config_mainnet.toml"
# ...

[tor]
register_hidden_service = true
hidden_service_num_intro_points = 5

# ...
```

| Option | Description |
| --- | --- |
| `register_hidden_service` | Whether the asb should register an onion service. |
| `hidden_service_num_intro_points` | If the asb registers an onion service, this specifies the number of introduction points the asb will use. |


### Network Section

The `network` section specifies the asb's networking configuration.
This includes:
- which rendezvous points the asb will connect to,
- on which port, and
- external addresses the asb will advertise to the rendezvous points.

<Callout type="info">
These addresses are specified using the multiaddr format ([link](https://multiformats.io/multiaddr)).
A multiaddr combines all necessary information into a single string.

For example, the first rendezvous point's multiaddr specifies the rendezvous point at the DNS address `discover.unstoppableswap.net`, on port `8888` with the peer ID `12D3KooWA6cnqJpVnreBVnoro8midDL9Lpzmg8oJPoAGi7YYaamE`.
</Callout>

```toml filename="config_mainnet.toml"
# ...

[network]
# the ip and port the asb will listen on
listen = ["/ip4/0.0.0.0/tcp/9939"]

# the rendezvous points the asb will connect to (address, port and peer id)
rendezvous_point = [
"/dns4/discover.unstoppableswap.net/tcp/8888/p2p/12D3KooWA6cnqJpVnreBVnoro8midDL9Lpzmg8oJPoAGi7YYaamE",
"/dns4/eratosthen.es/tcp/7798/p2p/12D3KooWAh7EXXa2ZyegzLGdjvj1W4G3EXrTGrf6trraoT1MEobs"
]

# the external addresses the asb will advertise to the rendezvous points (only address)
external_addresses = [
# e.g. "/dns4/your.domain.com"
Einliterflasche marked this conversation as resolved.
Show resolved Hide resolved
]
```

| Option | Description | Format |
| --- | --- | --- |
| `listen` | The ip and port the asb will listen on. The IP address `0.0.0.0` means the asb will listen on all IP addresses. Remember that the asb service is running in a docker container. Make sure the port is the same as in the `.env` file. | This multiaddr should only include an IP address and a port number. |
| `rendezvous_point` | A list of rendezvous points the asb will connect to. | These multiaddrs should include an address (e.g. IPv4, IPv6, DNS), a port number and a peer ID. |
| `external_addresses` | A list of external addresses the asb will advertise to the rendezvous points. If you registered a domain, you can add it here. If you enabled the onion service, it will be included automatically, so you don't need to specify the onion address. | These multiaddrs should only include an address (e.g. IPv4, IPv6, DNS). |


Et, voilà!
You've successfully configured your asb.

### Default Configuration

This is what the default configuration might look like.

```toml filename="config_mainnet.toml" copy
[maker]
min_buy_btc = 0.001
max_buy_btc = 0.1
ask_spread = 0.02
price_ticker_ws_url = "wss://ws.kraken.com/"

[bitcoin]
electrum_rpc_url = "tcp://mainnet_electrs:50001"
target_block = 1
network = "Mainnet"

[monero]
wallet_rpc_url = "http://mainnet_monero-wallet-rpc:18083/json_rpc"
network = "Mainnet"

[tor]
register_hidden_service = true
hidden_service_num_intro_points = 5

[data]
dir = "/asb-data/"

[network]
listen = ["/ip4/0.0.0.0/tcp/9939"]
rendezvous_point = [
"/dns4/discover.unstoppableswap.net/tcp/8888/p2p/12D3KooWA6cnqJpVnreBVnoro8midDL9Lpzmg8oJPoAGi7YYaamE",
"/dns4/eratosthen.es/tcp/7798/p2p/12D3KooWAh7EXXa2ZyegzLGdjvj1W4G3EXrTGrf6trraoT1MEobs"
Einliterflasche marked this conversation as resolved.
Show resolved Hide resolved
]
external_addresses = []
```
31 changes: 30 additions & 1 deletion docs/pages/getting_started/install_instructions.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,14 @@ import { Tabs } from 'nextra/components'

# Installation

To install the app you can either download ready-to-use binaries or build it from source.
Unless you know what you're doing, you probably want to use the precompiled binaries.

## Precompiled binaries

Precompiled binaries of the _GUI_ are available for most platforms. Simply download the appropriate binary for your system and follow the instructions.

<Tabs items={['Windows', 'macOS (Silicon)', 'macOS (Intel)', 'Linux (x86_64)']}>
<Tabs items={['Windows', 'macOS (Silicon)', 'macOS (Intel)', 'Linux (x86_64)', 'Linux (arm64)']}>
<Tabs.Tab>
1. Download the latest release from GitHub [here](https://github.com/UnstoppableSwap/core/releases/download/1.0.0-rc.4/UnstoppableSwap_1.0.0-rc.4_x64-setup.exe)
2. Open the downloaded `.exe` installer
Expand Down Expand Up @@ -32,4 +37,28 @@ Precompiled binaries of the _GUI_ are available for most platforms. Simply downl
./UnstoppableSwap_1.0.0-rc.4_amd64.AppImage
```
</Tabs.Tab>
<Tabs.Tab>
Due to limitations with our CI pipeline, we currently can't provide precompiled binaries for arm64 linux systems.
</Tabs.Tab>
</Tabs>

## Building from source

If you want to build the application from source you'll need to have the following tools installed:

- `cargo` ([installation](https://www.rust-lang.org/tools/install)) and `cargo tauri` ([installation](https://v2.tauri.app/reference/cli/) and [prerequisites](https://v2.tauri.app/start/prerequisites/))
- `node` ([installation](https://nodejs.org/en/download/)) and `yarn` (version 1.22, not 4.x)
- `dprint` (`cargo install [email protected]`)
- `typeshare` (`cargo install typeshare-cli`)

After that you only need to clone the repository and run the following commands:

```bash
git clone https://github.com/UnstoppableSwap/core.git
cd core/src-tauri
cargo tauri build # may take a while
```

This will create the `core/target/release/bundle` folder which contains the executable in a platform specific folder.
By default this will compile the binary the platform you are currently on.
You can configure this using options for the `cargo tauri build` command ([docs](https://v2.tauri.app/reference/cli/#build)).
Loading
Loading