# testnet-laconicd

Instructions for running a laconicd testnet full node and joining as a validator

## Prerequisites

* Minimum hardware requirements:

  ```bash
  RAM: 8-16GB
  Disk space: 200GB
  CPU: 2 cores
  ```

* Testnet genesis file (file or an URL) and peer node addresses

## Setup

* Clone the stack repo:

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

* Clone required repositories:

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

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

  # If this throws an error as a result of being already checked out to a branch/tag in a repo, remove the repositories and re-run the command
  ```

* Build the container images:

  ```bash
  # laconicd
  laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/testnet-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 a spec file for the deployment:

  ```bash
  laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/testnet-laconicd deploy init --output testnet-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 both the spec files to map container ports to host ports as required:

  ```bash
  # testnet-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 deployments from the spec files:

  ```bash
  laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/testnet-laconicd deploy create --spec-file testnet-laconicd-spec.yml --deployment-dir testnet-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 testnet-laconicd-deployment/deployment.yml laconic-console-deployment/deployment.yml
  ```

* Copy over the published testnet genesis file (`.json`) to data directory in deployment (`testnet-laconicd-deployment/data/laconicd-data/tmp`):

  ```bash
  # Example
  mkdir -p testnet-laconicd-deployment/data/laconicd-data/tmp
  cp genesis.json testnet-laconicd-deployment/data/laconicd-data/tmp/genesis.json
  ```

## Configuration

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

  ```bash
  # Comma separated list of nodes to keep persistent connections to
  # Example: "node-1-id@node-1-host:26656,node-2-id@node-2-host:26656"
  CERC_PEERS=""

  # Optional

  # A custom human readable name for this node (default: TestnetNode)
  CERC_MONIKER=

  # Network chain ID (default: laconic_9000-1)
  CERC_CHAIN_ID=

  # Output log level (default: info)
  CERC_LOGLEVEL=

  # Minimum gas price in alnt to accept for transactions (default: "0.001")
  MIN_GAS_PRICE
  ```

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

  ```bash
  # All optional

  # CLI configuration

  # laconicd chain id (default: laconic_9000-1)
  CERC_LACONICD_CHAIN_ID=

  # 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: 200alnt)
  CERC_LACONICD_FEES=

  # Gas price to use for txs (default: 0.001alnt)
  # Use for auto fees calculation, gas and fees not required to be set in that case
  # Reference: https://git.vdb.to/cerc-io/laconic-registry-cli#gas-and-fees
  CERC_LACONICD_GASPRICE=

  # Console configuration

  # Laconicd (hosted) GQL endpoint (default: http://localhost:9473)
  LACONIC_HOSTED_ENDPOINT=
  ```

  Note: Use `host.docker.internal` as host to access ports on the host machine

## Start the deployments

```bash
laconic-so deployment --dir testnet-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 testnet-laconicd-deployment logs laconicd -f
  ```

* Check the sync status of your node:

  ```bash
  laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd status | jq .sync_info"

  # `catching_up: false` indicates that node is completely synced
  ```

* 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"
  ```

## Join as testnet validator

* Create / import a new key pair:

  ```bash
  # Create new keypair
  laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd keys add <key-name>"

  # OR
  # Restore existing key with mnemonic seed phrase
  # You will be prompted to enter mnemonic seed
  laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd keys add <key-name> --recover"

  # Query the keystore for your account's address
  laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd keys show <key-name> -a"
  ```

* Request tokens from the testnet faucet for your account if required

* Check balance for your account:

  ```bash
  laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd query bank balances <account-address>"
  ```

* Create required validator configuration:

  ```bash
  # Note:
  # Edit the staking amount and other fields as required
  # Replace <your-node-moniker> with your node's moniker in command below

  laconic-so deployment --dir testnet-laconicd-deployment exec laconicd 'cat <<EOF > my-validator.json
  {
    "pubkey": $(laconicd cometbft show-validator),
    "amount": "900000000alnt",
    "moniker": "<your-node-moniker>",
    "commission-rate": "0.1",
    "commission-max-rate": "0.2",
    "commission-max-change-rate": "0.01",
    "min-self-delegation": "1"
  }
  EOF'
  ```

* Create a validator:

  ```bash
  laconic-so deployment --dir testnet-laconicd-deployment exec laconicd 'laconicd tx staking create-validator my-validator.json \
  --fees 500000alnt \
  --chain-id=laconic_9000-1 \
  --from <key-name>'
  ```

* View validators:

  ```bash
  laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd query staking validators"
  ```

  * Check that in the list of validators `<your-node-moniker>` exists

## Perform operations

* To perform txs against the chain using registry CLI, set your private key in config in the CLI container:

  ```bash
  # (Optional) Get the PK from your node
  laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd keys export <key-name> --unarmored-hex --unsafe"

  # Set your PK as 'userKey' in the config file
  laconic-so deployment --dir laconic-console-deployment exec cli "nano config.yml"

  # services:
  # registry:
  #   ...
  #   userKey: "<your-private-key>"
  #   ...

  # Note: any changes made to the config will be lost when the cli Docker container is brought down
  # So set / update the values in 'laconic-console-deployment/config.env' accordingly before restarting
  ```

* Adjust / set other config values (`bondId`, `gas`, `fees`) as required and perform txs:

  ```bash
  # Example
  laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry bond create --type alnt --quantity 1000000000000"
  ```

## Clean up

* Stop all `testnet-laconicd` services running in the background:

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

* To stop all services and also delete data:

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

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

* For `laconic-console`, see [laconic-console clean up](../laconic-console/README.md#clean-up)
