# Building the project

## From source

### 1. Install Golang

On Ubuntu, the easiest way to keep up-to-date with the latest stable version of
Go is with snap:
```bash
sudo snap install go --classic
```
On other systems or in docker, use the directions here: https://go.dev/doc/install.
Summary for X86-64 Linux (update GO_VERSION below to the latest stable release):
```bash
GO_VERSION=1.20.5
wget "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz"
rm -rf /usr/local/go && tar -C /usr/local -xzf go${GO_VERSION}.linux-amd64.tar.gz
echo "export PATH=$PATH:/usr/local/go/bin" >> .profile
source .profile
```

### 2a. Build without cloning the repo (option 1)

If this is your first time testing the software and you don't have an up-to-date
installation of `monero-wallet-rpc` in your path, you may want to skip to 2b
(option 2), as the repo has a script, `scripts/install-monero-linux.sh`, for
installing the latest monero tools to a `monero-bin` subfolder.

Install the atomic swap binaries to a subfolder named `bin`. If you adjust the
install directory to something else, make sure to also adjust documented sample
commands accordingly:
```bash
GOBIN=${PWD}/bin go install -tags=prod github.com/athanorlabs/atomic-swap/cmd/...@latest
```

### 2b. Build from a cloned repo (option 2)

Clone the repo, put it on the commit hash of the most recent release, and build
the binaries:
```bash
git clone https://github.com/athanorlabs/atomic-swap.git
cd atomic-swap

# Check out the exact source code of the latest release
git checkout "$(git describe --abbrev=0 --tags)"

make build-release
```

Note that `build-release` always builds the latest tagged release, not the
currently checked out code, so the `git checkout` command above is not required
for the correct binaries. If you want to build the checked out code as-is, use
`make build` or `make build-all` (the latter includes the `bootnode`
executable), as you'll see in the next example.

If you wish to build the bleeding edge code that is not always compatible with
the previous release, do:
```bash
git checkout master && git pull
make build
```

## Docker

### 1. Ensure docker is installed on your machine.

For the purposes here, using `docker-ce` directly from Ubuntu's `apt`
repositories or from Docker's repositories will work equally well.

### 2. Build the docker image:
```bash
make docker-images
```

### 3. For an example of how to run `swapd` with docker on stagenet:
```bash
./scripts/docker-swapd/run-docker-image.sh
```

This runs `swapd` on stagenet. The container name is `swapd-stagenet`.

You can interact with it by running `swapcli` inside the container:
```bash
docker exec CONTAINER_NAME_OR_ID swapcli SUBCOMMAND ...
```

You can also set command line arguments with environment variables, eg. to run on mainnet:
```bash
SWAPD_ENV=mainnet SWAPD_ETH_ENDPOINT=your-eth-endpoint ./scripts/docker-swapd/run-docker-image.sh
```
