# Ark
Welcome to the Ark monorepo.
In this repository you can find:
- [`server`](./server/) always-on daemon that serves as the Ark Service Provider (ASP)
- [`client`](./client/) single-key wallet as command-line interface (CLI) to interact with the ASP
Refer to the README in each directory for more information about development.
## Run the Ark Service Provider
| | Covenant-less | Covenant |
|---------|------------------------|----------------------------------------|
| Network | Bitcoin (regtest only)
⚠️ *Mainnet & Testnet coming soon* | Liquid, Liquid testnet, Liquid regtest |
| Wallet | Embedded [lnwallet](https://pkg.go.dev/github.com/lightningnetwork/lnd/lnwallet/btcwallet) in `arkd` | [Ocean](https://github.com/vulpemventures/ocean) wallet |
> The covenant version of Ark requires [special tapscript opcodes](https://github.com/ElementsProject/elements/blob/master/doc/tapscript_opcodes.md) only available on Liquid Network.
### Covenant-less Ark
#### Run the daemon (regtest)
Run locally with [Docker](https://docs.docker.com/engine/install/) and [Nigiri](https://nigiri.vulpem.com/).
```
nigiri start
docker compose -f ./docker-compose.clark.regtest.yml up -d
```
the compose file will start a `clarkd` container exposing Ark API on localhost:6000.
#### Fund the embedded wallet
The ASP needs funds to operate. the `v1/admin/address` allows to generate a new address. This endpoint is protected by Basic Authorization token.
```
curl http://localhost:6000/v1/admin/address -H 'Authorization: Basic YWRtaW46YWRtaW4='
```
> This exemple is using the default USER/PASSWORD credentials. You can customize them by setting the `ARK_AUTH_USER` and `ARK_AUTH_PASS` variables.
Faucet the address using nigiri
```
nigiri faucet
```
### Ark with covenants (Liquid only)
#### Setup the Ocean wallet
Run locally with Docker on Liquid Testnet. It uses `docker-compose` to build the `arkd` docker image from `server` and run the it as container, together with the `oceand` container.
Start `oceand` in Liquid Testnet:
```bash
docker compose up -d oceand
```
Setup `oceand`:
```bash
alias ocean='docker exec oceand ocean'
ocean config init --no-tls
ocean wallet create --password
ocean wallet unlock --password
```
#### Run `arkd` connected to Ocean
Start the ASP
```bash
docker compose up -d arkd
```
**Note:** On startup `arkd` will create an account `ark` on oceand.
Get an address from Ocean to add funds to the ASP:
```bash
ocean account derive --account-name ark
```
Fund the resulting address with [Liquid testnet faucet](https://liquidtestnet.com/faucet).
Check the balance of the `ark` account:
```bash
ocean account --account-name=ark balance
```
### Ark client
Inside the `arkd` container is shipped the `ark` CLI. You can submit payment to the ASP using the `ark` CLI.
```bash
alias ark='docker exec -it arkd ark'
ark init --password --ark-url localhost:8080
```
This will add a `state.json` file to the following directory:
- POSIX (Linux/BSD): ~/.Ark-cli
- Mac OS: $HOME/Library/Application Support/Ark-cli
- Windows: %LOCALAPPDATA%\Ark-cli
- Plan 9: $home/Ark-cli
**Note:** you can use a different datadir by exporting the env var `ARK_WALLET_DATADIR` like:
```bash
export ARK_WALLET_DATADIR=path/to/custom
ark init --password --ark-url localhost:8080 --network testnet
```
Add funds to the ark wallet:
```bash
ark receive
{
"offchain_address": ,
"onchain_address":
}
```
Fund the `onchain_address` with https://liquidtestnet.com/faucet.
Onboard the ark:
```bash
ark onboard --amount 21000
```
After confirmation, ark wallet will be funded and ready to spend offchain.
In **another tab**, setup another ark wallet with:
```bash
export ARK_WALLET_DATADIR=./datadir
alias ark2=$(pwd)/build/ark--
ark2 init --password --ark-url localhost:8080 --network testnet
```
**Note:** `ark2` should always run in the second tab.
### Make payments
You can now make ark payments between the 2 ark wallets:
```bash
ark2 receive
{
"offchain_address": ,
"onchain_address": ,
"relays": ["localhost:8080"]
}
```
```bash
ark send --to --amount 2100
```
Both balances should reflect the payment:
```bash
ark balance
{
"offchain_balance": 18900,
"onchain_balance": 0
}
```
```bash
ark2 balance
{
"offchain_balance": 2100,
"onchain_balance": 0
}
```
### Exiting
User `ark` can leave the ark collaboratively (i.e. ASP needs to collaborate):
```bash
ark redeem --address --amount 12100
```
In the case of the ASP is not responding, you can leave the ark unilaterally (`--amount` is not necessary since `--force` will redeem all funds):
```bash
ark redeem --force
```
### Help
You can see all available commands with `help`:
```bash
ark help
```