# fixturenet-laconicd-stack

Instructions for running a laconicd fixturenet along with registry CLI and console

## Setup

* Clone the stack repos:

  ```bash
  laconic-so fetch-stack git.vdb.to/cerc-io/fixturenet-laconicd-stack
  laconic-so fetch-stack git.vdb.to/cerc-io/testnet-laconicd-stack
  ```

* Clone required repositories:

  ```bash
  # laconicd
  laconic-so --stack ~/cerc/fixturenet-laconicd-stack/stack-orchestrator/stacks/fixturenet-laconicd setup-repositories

  # laconic cli and console
  laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/laconic-console setup-repositories
  ```

* Build the container images:

  ```bash
  # laconicd
  laconic-so --stack ~/cerc/fixturenet-laconicd-stack/stack-orchestrator/stacks/fixturenet-laconicd build-containers

  # laconic cli and console
  laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/laconic-console build-containers
  ```

  This should create the following docker images locally:

  * `cerc/laconicd`
  * `cerc/laconic-registry-cli`
  * `cerc/webapp-base`
  * `cerc/laconic-console-host`

## Create a deployment

* Create spec files for the deployment:

  ```bash
  laconic-so --stack ~/cerc/fixturenet-laconicd-stack/stack-orchestrator/stacks/fixturenet-laconicd deploy init --output fixturenet-laconicd-spec.yml

  laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/laconic-console deploy init --output laconic-console-spec.yml
  ```

* Edit `network` in the spec file to map container ports to host ports as required:

  ```bash
  # fixturenet-laconicd-spec.yml
  ...
  network:
    ports:
      laconicd:
        - '6060:6060'
        - '26657:26657'
        - '26656:26656'
        - '9473:9473'
        - '9090:9090'
        - '1317:1317'

  # laconic-console-spec.yml
  ...
  network:
    ports:
      console:
        - '8080:80'
  ```

* Create deployment from the spec files:

  ```bash
  laconic-so --stack ~/cerc/fixturenet-laconicd-stack/stack-orchestrator/stacks/fixturenet-laconicd deploy create --spec-file fixturenet-laconicd-spec.yml --deployment-dir fixturenet-laconicd-deployment

  laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/laconic-console deploy create --spec-file laconic-console-spec.yml --deployment-dir laconic-console-deployment

  # Place them both in the same namespace (cluster)
  cp fixturenet-laconicd-deployment/deployment.yml laconic-console-deployment/deployment.yml
  ```

* (Optional) Copy over an existing genesis file (`.json`) to data directory in deployment (`fixturenet-laconicd-deployment/data/genesis-config`):

  ```bash
  # Example
  cp genesis.json fixturenet-laconicd-deployment/data/genesis-config/genesis.json
  ```

## Configuration

* Inside the `fixturenet-laconicd-deployment` deployment directory, open `config.env` file and set the following env variable:

  ```bash
  # Optional

  # Set to true to enable adding participants functionality of the onboarding module (default: false)
  ONBOARDING_ENABLED=

  # Staking amount to use for the default validator account (default: 1000000000000000)
  STAKING_AMOUNT=

  # Enable authority auctions (default: false)
  AUTHORITY_AUCTION_ENABLED=true

  # Authority auctions commits duration (in secs) (default: 24hrs)
  AUTHORITY_AUCTION_COMMITS_DURATION=3600

  # Authority auctions reveals duration (in secs) (default: 24hrs)
  AUTHORITY_AUCTION_REVEALS_DURATION=3600

  # Authority grace period (set bond to authority within this) (in secs) (default: 2 * 24hrs)
  AUTHORITY_GRACE_PERIOD=7200

  # Node moniker (default: "localtestnet")
  MONIKER=
  ```

* Inside the `laconic-console-deployment` deployment directory, open `config.env` file and set following env variables:

  ```bash
  # Optional CLI configuration

  # laconicd user private key for txs
  CERC_LACONICD_USER_KEY=

  # laconicd bond id for txs
  CERC_LACONICD_BOND_ID=

  # Gas limit for txs (default: 200000)
  CERC_LACONICD_GAS=

  # Max fees for txs (default: 200000alnt)
  CERC_LACONICD_FEES=
  ```

## Start the deployment

```bash
laconic-so deployment --dir fixturenet-laconicd-deployment start
laconic-so deployment --dir laconic-console-deployment start
```

## Check status

* To list down and monitor the running containers:

  ```bash
  # With status
  docker ps -a

  # Follow logs for laconicd container
  laconic-so deployment --dir fixturenet-laconicd-deployment logs laconicd -f
  ```

* View the laconic console at <http://localhost:8080>

* Use the cli service for registry CLI operations:

  ```bash
  # Example
  laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry status"
  ```

## Perform operations

* Example (bond creation):

  ```bash
  # Get the PK from your node
  ALICE_PK=$(echo y | laconic-so deployment --dir fixturenet-laconicd-deployment exec laconicd "laconicd keys export alice --unarmored-hex --unsafe")

  # Create a bond:
  laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry bond create --type alnt --quantity 1000000000000 --user-key $ALICE_PK" | jq -r '.bondId'
  ```

## Demo

* Follow the [records-demo](./records-demo.md) to try loading data into registry

## Clean up

* Stop all services running in the background:

  ```bash
  # Stop the docker containers
  laconic-so deployment --dir fixturenet-laconicd-deployment stop
  ```

* To stop all services and also delete data:

  ```bash
  # Stop the docker containers
  laconic-so deployment --dir fixturenet-laconicd-deployment stop --delete-volumes

  # Remove deployment directory (deployment will have to be recreated for a re-run)
  sudo rm -r fixturenet-laconicd-deployment
  ```