Compare commits
8
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
18056fd877 | ||
|
|
8c672c0966 | ||
|
|
98e882bf28 | ||
|
|
5ce343566e | ||
|
|
9df6a71145 | ||
|
|
1a2024cde1 | ||
|
|
3b6985adb7 | ||
|
|
391dcb57b4 |
@@ -0,0 +1,2 @@
|
||||
*-deployment
|
||||
*-spec.yml
|
||||
@@ -6,7 +6,12 @@ Stacks to run a node for laconic testnet
|
||||
- [laconic-console stack documentation](stack-orchestrator/stacks/laconic-console/README.md) (to run laconic registry CLI and console standalone)
|
||||
- [laconic-faucet stack documentation](stack-orchestrator/stacks/laconic-faucet/README.md)
|
||||
|
||||
## Testnet onboarding demo
|
||||
## ops
|
||||
|
||||
Follow steps in [testnet-onboarding-demo.md](./testnet-onboarding-demo.md) to run demo for onboarding testnet participants in laconicd chain
|
||||
- [Update deployments after code changes](./ops/update-deployments.md)
|
||||
- [Halt stage0 and start stage1](./ops/stage0-to-stage1.md)
|
||||
- [Create deployments from scratch (for reference only)](./ops/deployments-from-scratch.md)
|
||||
|
||||
## Join LORO testnet
|
||||
|
||||
Follow steps in [testnet-onboarding-validator.md](./testnet-onboarding-validator.md) to onboard your participant and join as a validator on the LORO testnet
|
||||
|
||||
@@ -0,0 +1,678 @@
|
||||
# Create deployments from scratch (for reference only)
|
||||
|
||||
## Login
|
||||
|
||||
* Log in as `dev` user on the deployments VM
|
||||
|
||||
* All the deployments are placed in the `/srv` directory:
|
||||
|
||||
```bash
|
||||
cd /srv
|
||||
```
|
||||
|
||||
<details open>
|
||||
<summary>stage0 laconicd</summary>
|
||||
|
||||
## stage0 laconicd
|
||||
|
||||
* Stack: <https://git.vdb.to/cerc-io/fixturenet-laconicd-stack/src/branch/main/stack-orchestrator/stacks/fixturenet-laconicd>
|
||||
|
||||
* Source repo: <https://git.vdb.to/cerc-io/laconicd>
|
||||
|
||||
* Target dir: `/srv/laconicd/stage0-deployment`
|
||||
|
||||
* Cleanup an existing deployment if required:
|
||||
|
||||
```bash
|
||||
cd /srv/laconicd
|
||||
|
||||
# Stop the deployment
|
||||
laconic-so deployment --dir stage0-deployment stop --delete-volumes
|
||||
|
||||
# Remove the deployment dir
|
||||
sudo rm -rf stage0-deployment
|
||||
|
||||
# Remove the existing spec file
|
||||
rm stage0-spec.yml
|
||||
```
|
||||
|
||||
### Setup
|
||||
|
||||
* Clone the stack repo:
|
||||
|
||||
```bash
|
||||
laconic-so fetch-stack git.vdb.to/cerc-io/fixturenet-laconicd-stack --pull
|
||||
|
||||
# This should clone the fixturenet-laconicd-stack repo at `/home/dev/cerc/fixturenet-laconicd-stack`
|
||||
```
|
||||
|
||||
* Clone required repositories:
|
||||
|
||||
```bash
|
||||
laconic-so --stack ~/cerc/fixturenet-laconicd-stack/stack-orchestrator/stacks/fixturenet-laconicd setup-repositories --pull
|
||||
|
||||
# This should clone the laconicd repo at `/home/dev/cerc/laconicd`
|
||||
```
|
||||
|
||||
* Build the container images:
|
||||
|
||||
```bash
|
||||
laconic-so --stack ~/cerc/fixturenet-laconicd-stack/stack-orchestrator/stacks/fixturenet-laconicd build-containers --force-rebuild
|
||||
|
||||
# This should create the "cerc/laconicd" Docker image
|
||||
```
|
||||
|
||||
### Deployment
|
||||
|
||||
* Create a spec file for the deployment:
|
||||
|
||||
```bash
|
||||
cd /srv/laconicd
|
||||
|
||||
laconic-so --stack ~/cerc/fixturenet-laconicd-stack/stack-orchestrator/stacks/fixturenet-laconicd deploy init --output stage0-spec.yml
|
||||
```
|
||||
|
||||
* Edit network in the spec file to map container ports to host ports:
|
||||
|
||||
```bash
|
||||
# stage0-spec.yml
|
||||
network:
|
||||
ports:
|
||||
laconicd:
|
||||
- '6060'
|
||||
- '127.0.0.1:26657:26657'
|
||||
- '26656'
|
||||
- '127.0.0.1:9473:9473'
|
||||
- '127.0.0.1:9090:9090'
|
||||
- '127.0.0.1:1317:1317'
|
||||
```
|
||||
|
||||
* Create a deployment from the spec file:
|
||||
|
||||
```bash
|
||||
laconic-so --stack ~/cerc/fixturenet-laconicd-stack/stack-orchestrator/stacks/fixturenet-laconicd deploy create --spec-file stage0-spec.yml --deployment-dir stage0-deployment
|
||||
```
|
||||
|
||||
* Update the configuration:
|
||||
|
||||
```bash
|
||||
cat <<EOF > stage0-deployment/config.env
|
||||
# Set to true to enable adding participants functionality of the onboarding module
|
||||
ONBOARDING_ENABLED=true
|
||||
|
||||
# A custom human readable name for this node
|
||||
MONIKER=LaconicStage0
|
||||
EOF
|
||||
```
|
||||
|
||||
### Start
|
||||
|
||||
* Start the deployment:
|
||||
|
||||
```bash
|
||||
laconic-so deployment --dir stage0-deployment start
|
||||
```
|
||||
|
||||
* Check status:
|
||||
|
||||
```bash
|
||||
# List down the containers and check health status
|
||||
docker ps -a | grep laconicd
|
||||
|
||||
# Follow logs for laconicd container, check that new blocks are getting created
|
||||
laconic-so deployment --dir stage0-deployment logs laconicd -f
|
||||
```
|
||||
|
||||
* Verify that endpoint is now publicly accessible:
|
||||
|
||||
* <https://laconicd.laconic.com> is pointed to the node's RPC endpoint
|
||||
|
||||
* Check status query:
|
||||
|
||||
```bash
|
||||
curl https://laconicd.laconic.com/status | jq
|
||||
|
||||
# Expected output:
|
||||
# JSON with `node_info`, `sync_info` and `validator_info`
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<details open>
|
||||
<summary>faucet</summary>
|
||||
|
||||
## faucet
|
||||
|
||||
* Stack: <https://git.vdb.to/cerc-io/testnet-laconicd-stack/src/branch/main/stack-orchestrator/stacks/laconic-faucet>
|
||||
|
||||
* Source repo: <https://git.vdb.to/cerc-io/laconic-faucet>
|
||||
|
||||
* Target dir: `/srv/faucet/laconic-faucet-deployment`
|
||||
|
||||
* Cleanup an existing deployment if required:
|
||||
|
||||
```bash
|
||||
cd /srv/faucet
|
||||
|
||||
# Stop the deployment
|
||||
laconic-so deployment --dir laconic-faucet-deployment stop
|
||||
|
||||
# Remove the deployment dir
|
||||
sudo rm -rf laconic-faucet-deployment
|
||||
|
||||
# Remove the existing spec file
|
||||
rm laconic-faucet-spec.yml
|
||||
```
|
||||
|
||||
### Setup
|
||||
|
||||
* Clone the stack repo:
|
||||
|
||||
```bash
|
||||
laconic-so fetch-stack git.vdb.to/cerc-io/testnet-laconicd-stack --pull
|
||||
|
||||
# This should clone the testnet-laconicd-stack repo at `/home/dev/cerc/testnet-laconicd-stack`
|
||||
```
|
||||
|
||||
* Clone required repositories:
|
||||
|
||||
```bash
|
||||
laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/laconic-faucet setup-repositories --pull
|
||||
|
||||
# This should clone the laconicd repo at `/home/dev/cerc/laconic-faucet
|
||||
```
|
||||
|
||||
* Build the container images:
|
||||
|
||||
```bash
|
||||
laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/laconic-faucet build-containers --force-rebuild
|
||||
|
||||
# This should create the "cerc/laconic-faucet" Docker image
|
||||
```
|
||||
|
||||
### Deployment
|
||||
|
||||
* Create a spec file for the deployment:
|
||||
|
||||
```bash
|
||||
cd /srv/faucet
|
||||
|
||||
laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/laconic-faucet deploy init --output laconic-faucet-spec.yml
|
||||
```
|
||||
|
||||
* Edit network in the spec file to map container ports to host ports:
|
||||
|
||||
```bash
|
||||
# laconic-faucet-spec.yml
|
||||
network:
|
||||
ports:
|
||||
faucet:
|
||||
- '127.0.0.1:4000:3000'
|
||||
```
|
||||
|
||||
* Create a deployment from the spec file:
|
||||
|
||||
```bash
|
||||
laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/laconic-faucet deploy create --spec-file laconic-faucet-spec.yml --deployment-dir laconic-faucet-deployment
|
||||
|
||||
# Place in the same namespace as stage0
|
||||
cp /srv/laconicd/stage0-deployment/deployment.yml laconic-faucet-deployment/deployment.yml
|
||||
```
|
||||
|
||||
* Update the configuration:
|
||||
|
||||
```bash
|
||||
# Get the faucet account key from stage0 deployment
|
||||
export FAUCET_ACCOUNT_PK=$(laconic-so deployment --dir /srv/laconicd/stage0-deployment exec laconicd "echo y | laconicd keys export alice --keyring-backend test --unarmored-hex --unsafe")
|
||||
|
||||
cat <<EOF > laconic-faucet-deployment/config.env
|
||||
CERC_FAUCET_KEY=$FAUCET_ACCOUNT_PK
|
||||
EOF
|
||||
```
|
||||
|
||||
### Start
|
||||
|
||||
* Start the deployment:
|
||||
|
||||
```bash
|
||||
laconic-so deployment --dir laconic-faucet-deployment start
|
||||
```
|
||||
|
||||
* Check status:
|
||||
|
||||
```bash
|
||||
# List down the containers and check health status
|
||||
docker ps -a | grep faucet
|
||||
|
||||
# Check logs for faucet container
|
||||
laconic-so deployment --dir laconic-faucet-deployment logs faucet -f
|
||||
```
|
||||
|
||||
* Verify that endpoint is now publicly accessible:
|
||||
|
||||
* <https://faucet.laconic.com> is pointed to the faucet endpoint
|
||||
|
||||
* Check faucet:
|
||||
|
||||
```bash
|
||||
curl -X POST https://faucet.laconic.com/faucet
|
||||
|
||||
# Expected output:
|
||||
# {"error":"address is required"}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<details open>
|
||||
<summary>testnet-onboarding-app</summary>
|
||||
|
||||
## testnet-onboarding-app
|
||||
|
||||
* Stack: <https://git.vdb.to/cerc-io/testnet-onboarding-app-stack/src/branch/main/stack-orchestrator/stacks/onboarding-app>
|
||||
|
||||
* Source repo: <https://git.vdb.to/cerc-io/testnet-onboarding-app>
|
||||
|
||||
* Target dir: `/srv/app/onboarding-app-deployment`
|
||||
|
||||
* Cleanup an existing deployment if required:
|
||||
|
||||
```bash
|
||||
cd /srv/app
|
||||
|
||||
# Stop the deployment
|
||||
laconic-so deployment --dir onboarding-app-deployment
|
||||
|
||||
# Remove the deployment dir
|
||||
sudo rm -rf onboarding-app-deployment
|
||||
|
||||
# Remove the existing spec file
|
||||
rm onboarding-app-spec.yml
|
||||
```
|
||||
|
||||
### Setup
|
||||
|
||||
* Clone the stack repo:
|
||||
|
||||
```bash
|
||||
laconic-so fetch-stack git.vdb.to/cerc-io/testnet-onboarding-app-stack --pull
|
||||
|
||||
# This should clone the testnet-onboarding-app-stack repo at `/home/dev/cerc/testnet-onboarding-app-stack`
|
||||
```
|
||||
|
||||
* Clone required repositories:
|
||||
|
||||
```bash
|
||||
laconic-so --stack ~/cerc/testnet-onboarding-app-stack/stack-orchestrator/stacks/onboarding-app setup-repositories --pull
|
||||
|
||||
# This should clone the testnet-onboarding-app repo at `/home/dev/cerc/testnet-onboarding-app`
|
||||
```
|
||||
|
||||
* Build the container images:
|
||||
|
||||
```bash
|
||||
laconic-so --stack ~/cerc/testnet-onboarding-app-stack/stack-orchestrator/stacks/onboarding-app build-containers --force-rebuild
|
||||
|
||||
# This should create the Docker image "cerc/testnet-onboarding-app" locally
|
||||
```
|
||||
|
||||
### Deployment
|
||||
|
||||
* Create a spec file for the deployment:
|
||||
|
||||
```bash
|
||||
cd /srv/app
|
||||
|
||||
laconic-so --stack ~/cerc/testnet-onboarding-app-stack/stack-orchestrator/stacks/onboarding-app deploy init --output onboarding-app-spec.yml
|
||||
```
|
||||
|
||||
* Edit network in the spec file to map container ports to host ports:
|
||||
|
||||
```bash
|
||||
network:
|
||||
ports:
|
||||
testnet-onboarding-app:
|
||||
- '127.0.0.1:3000:80'
|
||||
```
|
||||
|
||||
* Create a deployment from the spec file:
|
||||
|
||||
```bash
|
||||
laconic-so --stack ~/cerc/testnet-onboarding-app-stack/stack-orchestrator/stacks/onboarding-app deploy create --spec-file onboarding-app-spec.yml --deployment-dir onboarding-app-deployment
|
||||
```
|
||||
|
||||
* Update the configuration:
|
||||
|
||||
```bash
|
||||
cat <<EOF > onboarding-app-deployment/config.env
|
||||
WALLET_CONNECT_ID=63...
|
||||
|
||||
CERC_REGISTRY_GQL_ENDPOINT="https://laconicd.laconic.com/api"
|
||||
CERC_LACONICD_RPC_ENDPOINT="https://laconicd.laconic.com"
|
||||
|
||||
CERC_FAUCET_ENDPOINT="https://faucet.laconic.com"
|
||||
|
||||
CERC_WALLET_META_URL="https://loro-signup.laconic.com"
|
||||
EOF
|
||||
```
|
||||
|
||||
### Start
|
||||
|
||||
* Start the deployment:
|
||||
|
||||
```bash
|
||||
laconic-so deployment --dir onboarding-app-deployment start
|
||||
```
|
||||
|
||||
* Check status:
|
||||
|
||||
```bash
|
||||
# List down the container
|
||||
docker ps -a | grep testnet-onboarding-app
|
||||
|
||||
# Follow logs for testnet-onboarding-app container, wait for the build to finish
|
||||
laconic-so deployment --dir onboarding-app-deployment logs testnet-onboarding-app -f
|
||||
```
|
||||
|
||||
* The onboarding app can now be viewed at <https://loro-signup.laconic.com>
|
||||
|
||||
</details>
|
||||
|
||||
<details open>
|
||||
<summary>laconic-wallet-web</summary>
|
||||
|
||||
## laconic-wallet-web
|
||||
|
||||
* Stack: <https://git.vdb.to/cerc-io/laconic-wallet-web/src/branch/main/stack/stack-orchestrator/stack/laconic-wallet-web>
|
||||
|
||||
* Source repo: <https://git.vdb.to/cerc-io/laconic-wallet-web>
|
||||
|
||||
* Target dir: `/srv/wallet/laconic-wallet-web-deployment`
|
||||
|
||||
* Cleanup an existing deployment if required:
|
||||
|
||||
```bash
|
||||
cd /srv/wallet
|
||||
|
||||
# Stop the deployment
|
||||
laconic-so deployment --dir laconic-wallet-web-deployment
|
||||
|
||||
# Remove the deployment dir
|
||||
sudo rm -rf laconic-wallet-web-deployment
|
||||
|
||||
# Remove the existing spec file
|
||||
rm laconic-wallet-web-spec.yml
|
||||
```
|
||||
|
||||
### Setup
|
||||
|
||||
* Clone the stack repo:
|
||||
|
||||
```bash
|
||||
laconic-so fetch-stack git.vdb.to/cerc-io/laconic-wallet-web --pull
|
||||
|
||||
# This should clone the laconic-wallet-web repo at `/home/dev/cerc/laconic-wallet-web`
|
||||
```
|
||||
|
||||
* Build the container images:
|
||||
|
||||
```bash
|
||||
laconic-so --stack ~/cerc/laconic-wallet-web/stack/stack-orchestrator/stack/laconic-wallet-web build-containers --force-rebuild
|
||||
|
||||
# This should create the Docker image "cerc/laconic-wallet-web" locally
|
||||
```
|
||||
|
||||
### Deployment
|
||||
|
||||
* Create a spec file for the deployment:
|
||||
|
||||
```bash
|
||||
cd /srv/wallet
|
||||
|
||||
laconic-so --stack ~/cerc/laconic-wallet-web/stack/stack-orchestrator/stack/laconic-wallet-web deploy init --output laconic-wallet-web-spec.yml
|
||||
```
|
||||
|
||||
* Edit network in the spec file to map container ports to host ports:
|
||||
|
||||
```bash
|
||||
network:
|
||||
ports:
|
||||
laconic-wallet-web:
|
||||
- '127.0.0.1:5000:80'
|
||||
```
|
||||
|
||||
* Create a deployment from the spec file:
|
||||
|
||||
```bash
|
||||
laconic-so --stack ~/cerc/laconic-wallet-web/stack/stack-orchestrator/stack/laconic-wallet-web deploy create --spec-file laconic-wallet-web-spec.yml --deployment-dir laconic-wallet-web-deployment
|
||||
```
|
||||
|
||||
* Update the configuration:
|
||||
|
||||
```bash
|
||||
cat <<EOF > laconic-wallet-web-deployment/config.env
|
||||
WALLET_CONNECT_ID=63...
|
||||
EOF
|
||||
```
|
||||
|
||||
### Start
|
||||
|
||||
* Start the deployment:
|
||||
|
||||
```bash
|
||||
laconic-so deployment --dir laconic-wallet-web-deployment start
|
||||
```
|
||||
|
||||
* Check status:
|
||||
|
||||
```bash
|
||||
# List down the container
|
||||
docker ps -a | grep laconic-wallet-web
|
||||
|
||||
# Follow logs for laconic-wallet-web container, wait for the build to finish
|
||||
laconic-so deployment --dir laconic-wallet-web-deployment logs laconic-wallet-web -f
|
||||
```
|
||||
|
||||
* The web wallet can now be viewed at <https://wallet.laconic.com>
|
||||
|
||||
</details>
|
||||
|
||||
<details open>
|
||||
<summary>stage1 laconicd</summary>
|
||||
|
||||
## stage1 laconicd
|
||||
|
||||
* Stack: <https://git.vdb.to/cerc-io/fixturenet-laconicd-stack/src/branch/main/stack-orchestrator/stacks/fixturenet-laconicd>
|
||||
|
||||
* Source repo: <https://git.vdb.to/cerc-io/laconicd>
|
||||
|
||||
* Target dir: `/srv/laconicd/stage1-deployment`
|
||||
|
||||
* Cleanup an existing deployment if required:
|
||||
|
||||
```bash
|
||||
cd /srv/laconicd
|
||||
|
||||
# Stop the deployment
|
||||
laconic-so deployment --dir stage1-deployment stop --delete-volumes
|
||||
|
||||
# Remove the deployment dir
|
||||
sudo rm -rf stage1-deployment
|
||||
|
||||
# Remove the existing spec file
|
||||
rm stage1-spec.yml
|
||||
```
|
||||
|
||||
### Setup
|
||||
|
||||
* Same as that for [stage0 laconicd](#setup), not required if already done for stage0
|
||||
|
||||
### Deployment
|
||||
|
||||
* Create a spec file for the deployment:
|
||||
|
||||
```bash
|
||||
cd /srv/laconicd
|
||||
|
||||
laconic-so --stack ~/cerc/fixturenet-laconicd-stack/stack-orchestrator/stacks/fixturenet-laconicd deploy init --output stage1-spec.yml
|
||||
```
|
||||
|
||||
* Edit network in the spec file to map container ports to host ports:
|
||||
|
||||
```bash
|
||||
# stage1-spec.yml
|
||||
network:
|
||||
ports:
|
||||
laconicd:
|
||||
- '6060'
|
||||
- '127.0.0.1:26657:26657'
|
||||
- '26656:26656'
|
||||
- '127.0.0.1:9473:9473'
|
||||
- '127.0.0.1:9090:9090'
|
||||
- '127.0.0.1:1317:1317'
|
||||
```
|
||||
|
||||
* Create a deployment from the spec file:
|
||||
|
||||
```bash
|
||||
laconic-so --stack ~/cerc/fixturenet-laconicd-stack/stack-orchestrator/stacks/fixturenet-laconicd deploy create --spec-file stage1-spec.yml --deployment-dir stage1-deployment
|
||||
```
|
||||
|
||||
* Update the configuration:
|
||||
|
||||
```bash
|
||||
cat <<EOF > stage1-deployment/config.env
|
||||
AUTHORITY_AUCTION_ENABLED=true
|
||||
AUTHORITY_AUCTION_COMMITS_DURATION=3600
|
||||
AUTHORITY_AUCTION_REVEALS_DURATION=3600
|
||||
AUTHORITY_GRACE_PERIOD=7200
|
||||
|
||||
MONIKER=LaconicStage1
|
||||
EOF
|
||||
```
|
||||
|
||||
### Start
|
||||
|
||||
* Follow [stage0-to-stage1.md](./stage0-to-stage1.md) to halt stage0 deployment, generate the genesis file for stage1 and start the stage1 deployment
|
||||
|
||||
</details>
|
||||
|
||||
<details open>
|
||||
<summary>laconic-console</summary>
|
||||
|
||||
## laconic-console
|
||||
|
||||
* Stack: <https://git.vdb.to/cerc-io/testnet-laconicd-stack/src/branch/main/stack-orchestrator/stacks/laconic-console>
|
||||
|
||||
* Source repos:
|
||||
* <https://git.vdb.to/cerc-io/laconic-registry-cli>
|
||||
* <https://git.vdb.to/cerc-io/laconic-console>
|
||||
|
||||
* Target dir: `/srv/console/laconic-console-deployment`
|
||||
|
||||
* Cleanup an existing deployment if required:
|
||||
|
||||
```bash
|
||||
cd /srv/console
|
||||
|
||||
# Stop the deployment
|
||||
laconic-so deployment --dir laconic-console-deployment stop --delete-volumes
|
||||
|
||||
# Remove the deployment dir
|
||||
sudo rm -rf laconic-console-deployment
|
||||
|
||||
# Remove the existing spec file
|
||||
rm laconic-console-spec.yml
|
||||
```
|
||||
|
||||
### Setup
|
||||
|
||||
* Clone the stack repo:
|
||||
|
||||
```bash
|
||||
laconic-so fetch-stack git.vdb.to/cerc-io/testnet-laconicd-stack --pull
|
||||
|
||||
# This should clone the testnet-laconicd-stack repo at `/home/dev/cerc/testnet-laconicd-stack`
|
||||
```
|
||||
|
||||
* Clone required repositories:
|
||||
|
||||
```bash
|
||||
laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/laconic-console setup-repositories --pull
|
||||
|
||||
# This should clone the laconic-registry-cli repo at `/home/dev/cerc/laconic-registry-cli`, laconic-console repo at `/home/dev/cerc/laconic-console`
|
||||
```
|
||||
|
||||
* Build the container images:
|
||||
|
||||
```bash
|
||||
laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/laconic-console build-containers --force-rebuild
|
||||
|
||||
# This should create the Docker images: "cerc/laconic-registry-cli", "cerc/webapp-base", "cerc/laconic-console-host"
|
||||
```
|
||||
|
||||
### Deployment
|
||||
|
||||
* Create a spec file for the deployment:
|
||||
|
||||
```bash
|
||||
cd /srv/console
|
||||
|
||||
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:
|
||||
|
||||
```bash
|
||||
network:
|
||||
ports:
|
||||
console:
|
||||
- '127.0.0.1:4001:80'
|
||||
```
|
||||
|
||||
* Create a deployment from the spec file:
|
||||
|
||||
```bash
|
||||
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
|
||||
```
|
||||
|
||||
* Update the configuration:
|
||||
|
||||
```bash
|
||||
cat <<EOF > laconic-console-deployment/config.env
|
||||
# Laconicd (hosted) GQL endpoint
|
||||
LACONIC_HOSTED_ENDPOINT=https://laconicd.laconic.com
|
||||
EOF
|
||||
```
|
||||
|
||||
### Start
|
||||
|
||||
* Start the deployment:
|
||||
|
||||
```bash
|
||||
laconic-so deployment --dir laconic-console-deployment start
|
||||
```
|
||||
|
||||
* Check status:
|
||||
|
||||
```bash
|
||||
# List down the container
|
||||
docker ps -a | grep console
|
||||
|
||||
# Follow logs for console container
|
||||
laconic-so deployment --dir laconic-console-deployment logs console -f
|
||||
```
|
||||
|
||||
* The laconic console can now be viewed at <https://loro-console.laconic.com>
|
||||
|
||||
</details>
|
||||
|
||||
## Domains / Port Mappings
|
||||
|
||||
```bash
|
||||
laconicd.laconic.com -> 26657
|
||||
laconicd.laconic.com/api -> 9473/api
|
||||
faucet.laconic.com -> 4000
|
||||
loro-signup.laconic.com -> 3000
|
||||
wallet.laconic.com -> 5000
|
||||
loro-console.laconic.com -> 4001
|
||||
```
|
||||
@@ -0,0 +1,85 @@
|
||||
# Run nitro-nodes
|
||||
|
||||
## Setup
|
||||
|
||||
- Follow the [installation guide](https://github.com/deep-stack/ops/blob/ag-run-l2/README.md#installation) to setup ansible on your machine
|
||||
|
||||
- Ensure laconic-so is installed
|
||||
|
||||
```bash
|
||||
laconic-so version
|
||||
```
|
||||
|
||||
- Clone the ops repo
|
||||
|
||||
```bash
|
||||
git clone git@github.com:deep-stack/ops.git
|
||||
cd ops
|
||||
git checkout ag-run-l2
|
||||
```
|
||||
|
||||
|
||||
## Run l1, l2 nitro nodes
|
||||
|
||||
- Navigate to the `vulcanize/nitro-node-setup` directory
|
||||
|
||||
```bash
|
||||
cd vulcanize/nitro-node-setup
|
||||
```
|
||||
|
||||
- Copy the `nitro-vars-example.yml` vars file
|
||||
|
||||
```bash
|
||||
cp nitro-vars-example.yml nitro-vars.yml
|
||||
```
|
||||
|
||||
<!-- TODO: Provide nitro environment variables to user -->
|
||||
- Edit [`nitro-vars.yml`](./nitro-vars.yml) and fill in the following values
|
||||
|
||||
```bash
|
||||
# URL endpoint of the L1 chain
|
||||
l1_nitro_chain_url: ""
|
||||
|
||||
# URL endpoint of the L2 chain
|
||||
l2_nitro_chain_url: ""
|
||||
|
||||
# Private key for your nitro address
|
||||
nitro_sc_pk: ""
|
||||
|
||||
# Private key of the account on chain that is used for funding channels in Nitro node
|
||||
nitro_chain_pk: ""
|
||||
|
||||
# Contract address of NitroAdjudicator
|
||||
na_address: ""
|
||||
|
||||
# Contract address of VirtualPaymentApp
|
||||
vpa_address: ""
|
||||
|
||||
# Contract address of ConsensusApp
|
||||
ca_address: ""
|
||||
|
||||
# Contract address of bridge
|
||||
bridge_address: ""
|
||||
|
||||
# IP address of the bridge node
|
||||
nitro_bridge_ip: ""
|
||||
|
||||
# Publically accessible IP address of your nitro node
|
||||
nitro_node_ip: ""
|
||||
```
|
||||
|
||||
- To run nitro nodes, execute the `run-nitro-node.yml` Ansible playbook by running the following command.
|
||||
|
||||
NOTE: By default, deployments are created in the `nitro-node-setup/out` directory. If you need to change this location, you can update the `nitro_directory` variable in the [setup-vars.yml](./setup-vars.yml) file.
|
||||
|
||||
```bash
|
||||
LANG=en_IN.utf8 ansible-playbook -i localhost, --connection=local run-nitro-node.yml --extra-vars='{ "target_host": "localhost"}' --user $USER
|
||||
```
|
||||
|
||||
- If you want to skip building the containers, set `"skip_container_build" : true` in the `--extra-vars` parameter:
|
||||
|
||||
```bash
|
||||
LANG=en_IN.utf8 ansible-playbook -i localhost, --connection=local run-nitro-node.yml --extra-vars='{ "target_host": "localhost", "skip_container_build": true }' --user $USER
|
||||
```
|
||||
|
||||
- Follow steps from [Demo](https://git.vdb.to/cerc-io/nitro-stack/src/branch/main/nitro-bridge-demo.md#demo) to create mirror channels on L2, create virtual channel and make payments
|
||||
@@ -0,0 +1,171 @@
|
||||
# Halt stage0 and start stage1
|
||||
|
||||
Once all the participants have completed their onboarding, stage0 laconicd chain can be halted and stage1 chain can be initialized and started
|
||||
|
||||
## Login
|
||||
|
||||
* Log in as `dev` user on the deployments VM
|
||||
|
||||
* All the deployments are placed in the `/srv` directory:
|
||||
|
||||
```bash
|
||||
cd /srv
|
||||
```
|
||||
|
||||
## Halt stage0
|
||||
|
||||
* Confirm the the currently running node is for stage0 chain:
|
||||
|
||||
```bash
|
||||
cd /srv/laconicd
|
||||
|
||||
laconic-so deployment --dir stage0-deployment logs laconicd -f --tail 30
|
||||
```
|
||||
|
||||
* Stop the stage0 deployment:
|
||||
|
||||
```bash
|
||||
laconic-so deployment --dir stage0-deployment stop
|
||||
```
|
||||
|
||||
## Start stage1
|
||||
|
||||
* Rebuild laconicd container with `>=v0.1.7` to enable `slashing` module:
|
||||
|
||||
```bash
|
||||
# laconicd source
|
||||
cd ~/cerc/laconicd
|
||||
|
||||
# Pull latest changes
|
||||
git pull
|
||||
|
||||
# Confirm the latest commit hash
|
||||
git log
|
||||
|
||||
# Rebuild the containers
|
||||
cd /srv/laconicd
|
||||
|
||||
laconic-so --stack ~/cerc/fixturenet-laconicd-stack/stack-orchestrator/stacks/fixturenet-laconicd build-containers --force-rebuild
|
||||
```
|
||||
|
||||
* Fetch the generated genesis file with stage1 participants and token allocations:
|
||||
|
||||
```bash
|
||||
# Place in stage1 deployment directory
|
||||
wget -O /srv/laconicd/stage1-deployment/data/genesis-config/genesis.json https://git.vdb.to/cerc-io/testnet-laconicd-stack/raw/branch/main/ops/stage1/genesis-accounts.json
|
||||
```
|
||||
|
||||
* Start the stage1 deployment:
|
||||
|
||||
```bash
|
||||
laconic-so deployment --dir stage1-deployment start
|
||||
```
|
||||
|
||||
* Check status of stage1 laconicd:
|
||||
|
||||
```bash
|
||||
# List down the container and check health status
|
||||
docker ps -a | grep laconicd
|
||||
|
||||
# Follow logs for laconicd container, check that new blocks are getting created
|
||||
laconic-so deployment --dir stage1-deployment logs laconicd -f
|
||||
```
|
||||
|
||||
* Query the list of registered participants in stage1 laconicd:
|
||||
|
||||
```bash
|
||||
laconic-so deployment --dir stage1-deployment exec laconicd "laconicd query onboarding list"
|
||||
|
||||
# Confirm that all onboarded participants on stage0 appear in the list
|
||||
```
|
||||
|
||||
* Get the node's peer adddress and stage1 genesis file to share with the participants:
|
||||
|
||||
* Get the node id:
|
||||
|
||||
```bash
|
||||
echo $(laconic-so deployment --dir stage1-deployment exec laconicd "laconicd cometbft show-node-id")@laconicd.laconic.com:26656
|
||||
```
|
||||
|
||||
* Get the genesis file:
|
||||
|
||||
```bash
|
||||
scp dev@<deployments-server-hostname>:/srv/laconicd/stage1-deployment/data/laconicd-data/config/genesis.json </path/to/local/directory>
|
||||
```
|
||||
|
||||
* Now users can follow the steps to [Join as a validator on stage1](https://git.vdb.to/cerc-io/testnet-laconicd-stack/src/branch/main/testnet-onboarding-validator.md#join-as-a-validator-on-stage1)
|
||||
|
||||
## Bank Transfer
|
||||
|
||||
* Transfer tokens to an address:
|
||||
|
||||
```bash
|
||||
cd /srv/laconicd
|
||||
|
||||
RECEIVER_ADDRESS=
|
||||
AMOUNT=
|
||||
|
||||
laconic-so deployment --dir stage1-deployment exec laconicd "laconicd tx bank send alice ${RECEIVER_ADDRESS} ${AMOUNT}alnt --from alice --fees 1000000alnt"
|
||||
```
|
||||
|
||||
* Check balance:
|
||||
|
||||
```bash
|
||||
laconic-so deployment --dir stage1-deployment exec laconicd "laconicd query bank balances ${RECEIVER_ADDRESS}"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Generating stage1 genesis
|
||||
|
||||
* Following steps to be run on a local machine
|
||||
|
||||
* Clone repos:
|
||||
|
||||
```bash
|
||||
git clone git@git.vdb.to:cerc-io/testnet-laconicd-stack.git
|
||||
|
||||
git clone git@git.vdb.to:cerc-io/fixturenet-laconicd-stack.git
|
||||
```
|
||||
|
||||
* Create stage1 participants and allocations using provided validators list:
|
||||
|
||||
* Prerequisite: `validators.csv` file with list of laconic addresses, example:
|
||||
|
||||
```csv
|
||||
laconic13ftz0c6cg6ttfda7ct4r6pf2j976zsey7l4wmj
|
||||
laconic1he4wjpfm5atwfvqurpg57ctp8chmxt9swf02dx
|
||||
laconic1wpsdkwz0t4ejdm7gcl7kn8989z88dd6wwy04np
|
||||
...
|
||||
```
|
||||
|
||||
* Build
|
||||
|
||||
```bash
|
||||
# Change to scripts dir
|
||||
cd testnet-laconicd-stack/scripts
|
||||
|
||||
# Install dependencies and build
|
||||
yarn && yarn build
|
||||
```
|
||||
|
||||
* Run script
|
||||
|
||||
```bash
|
||||
yarn participants-with-filtered-validators --validators-csv ./validators.csv --participant-alloc 200000000000 --validator-alloc 1000200000000000 --output stage1-participants-$(date +"%Y-%m-%dT%H%M%S").json --output-allocs stage1-allocs-$(date +"%Y-%m-%dT%H%M%S").json
|
||||
|
||||
# This should create two json files with stage1 participants and allocations
|
||||
```
|
||||
|
||||
* Create stage1 genesis file:
|
||||
|
||||
```bash
|
||||
# Change to fixturenet-laconicd stack dir
|
||||
cd fixturenet-laconicd-stack/stack-orchestrator/stacks/fixturenet-laconicd
|
||||
|
||||
# Generate genesis file
|
||||
# Provide absolute paths to generated stage1-participants and stage1-allocs files
|
||||
./scripts/generate-stage1-genesis-from-json.sh /path/to/testnet-laconicd-stack/scripts/stage1-participants.json /path/to/testnet-laconicd-stack/scripts/stage1-allocs.json
|
||||
|
||||
# This should generate the required genesis file at output/genesis.json
|
||||
```
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,256 @@
|
||||
# Update deployments after code changes
|
||||
|
||||
Instructions to reset / update the deployments
|
||||
|
||||
## Login
|
||||
|
||||
* Log in as `dev` user on the deployments VM
|
||||
|
||||
* All the deployments are placed in the `/srv` directory:
|
||||
|
||||
```bash
|
||||
cd /srv
|
||||
```
|
||||
|
||||
## stage0 laconicd
|
||||
|
||||
* Deployment dir: `/srv/laconicd/stage0-deployment`
|
||||
|
||||
* If code has changed, fetch and build with updated source code:
|
||||
|
||||
```bash
|
||||
# laconicd source
|
||||
cd ~/cerc/laconicd
|
||||
|
||||
# Pull latest changes, or checkout to the required branch
|
||||
git pull
|
||||
|
||||
# Confirm the latest commit hash
|
||||
git log
|
||||
|
||||
# Rebuild the containers
|
||||
cd /srv/laconicd
|
||||
|
||||
laconic-so --stack ~/cerc/fixturenet-laconicd-stack/stack-orchestrator/stacks/fixturenet-laconicd build-containers --force-rebuild
|
||||
```
|
||||
|
||||
* Optionally, reset the data directory (this will remove all stage0 data!):
|
||||
|
||||
```bash
|
||||
# Stop the deployment
|
||||
laconic-so deployment --dir stage0-deployment stop --delete-volumes
|
||||
|
||||
# Remove and recreate the required data dir
|
||||
sudo rm -rf stage0-deployment/data/laconicd-data
|
||||
mkdir stage0-deployment/data/laconicd-data
|
||||
```
|
||||
|
||||
* Start the deployment:
|
||||
|
||||
```bash
|
||||
laconic-so deployment --dir stage0-deployment start
|
||||
|
||||
# Follow logs for laconicd container, check that new blocks are getting created
|
||||
laconic-so deployment --dir stage0-deployment logs laconicd -f
|
||||
```
|
||||
|
||||
* If the stage0 laconicd chain has been reset, reset the faucet deployment too with new faucet key:
|
||||
|
||||
```bash
|
||||
cd /srv/faucet
|
||||
|
||||
export FAUCET_ACCOUNT_PK=$(laconic-so deployment --dir /srv/laconicd/stage0-deployment exec laconicd "echo y | laconicd keys export alice --keyring-backend test --unarmored-hex --unsafe")
|
||||
|
||||
cat <<EOF > laconic-faucet-deployment/config.env
|
||||
CERC_FAUCET_KEY=$FAUCET_ACCOUNT_PK
|
||||
EOF
|
||||
|
||||
# Stop the deployment
|
||||
laconic-so deployment --dir laconic-faucet-deployment stop --delete-volumes
|
||||
|
||||
# Remove and recreate the required data dir
|
||||
sudo rm -rf laconic-faucet-deployment/data/faucet-data
|
||||
mkdir laconic-faucet-deployment/data/faucet-data
|
||||
|
||||
# Start the deployment
|
||||
laconic-so deployment --dir laconic-faucet-deployment start
|
||||
```
|
||||
|
||||
## testnet-onboarding-app
|
||||
|
||||
* Deployment dir: `/srv/app/onboarding-app-deployment`
|
||||
|
||||
* If code has changed, fetch and build with updated source code:
|
||||
|
||||
```bash
|
||||
# testnet-onboarding-app source
|
||||
cd ~/cerc/testnet-onboarding-app
|
||||
|
||||
# Pull latest changes, or checkout to the required branch
|
||||
git pull
|
||||
|
||||
# Confirm the latest commit hash
|
||||
git log
|
||||
|
||||
# Rebuild the containers
|
||||
cd /srv/app
|
||||
|
||||
laconic-so --stack ~/cerc/testnet-onboarding-app-stack/stack-orchestrator/stacks/onboarding-app build-containers --force-rebuild
|
||||
```
|
||||
|
||||
* Update the configuration, if required in `onboarding-app-deployment/config.env`:
|
||||
|
||||
```bash
|
||||
WALLET_CONNECT_ID=63...
|
||||
|
||||
CERC_REGISTRY_GQL_ENDPOINT="https://laconicd.laconic.com/api"
|
||||
CERC_LACONICD_RPC_ENDPOINT="https://laconicd.laconic.com"
|
||||
|
||||
CERC_FAUCET_ENDPOINT="https://faucet.laconic.com"
|
||||
|
||||
CERC_WALLET_META_URL="https://loro-signup.laconic.com"
|
||||
|
||||
CERC_STAKING_AMOUNT=1000000000000000
|
||||
````
|
||||
|
||||
* Restart the deployment:
|
||||
|
||||
```bash
|
||||
laconic-so deployment --dir onboarding-app-deployment stop
|
||||
|
||||
laconic-so deployment --dir onboarding-app-deployment start
|
||||
|
||||
# Follow logs for testnet-onboarding-app container, wait for the build to finish
|
||||
laconic-so deployment --dir onboarding-app-deployment logs testnet-onboarding-app -f
|
||||
```
|
||||
|
||||
* The updated onboarding app can now be viewed at <https://loro-signup.laconic.com>
|
||||
|
||||
## laconic-wallet-web
|
||||
|
||||
* Deployment dir: `/srv/wallet/laconic-wallet-web-deployment`
|
||||
|
||||
* If code has changed, fetch and build with updated source code:
|
||||
|
||||
```bash
|
||||
# testnet-onboarding-app source
|
||||
cd ~/cerc/laconic-wallet-web
|
||||
|
||||
# Pull latest changes, or checkout to the required branch
|
||||
git pull
|
||||
|
||||
# Confirm the latest commit hash
|
||||
git log
|
||||
|
||||
# Rebuild the containers
|
||||
cd /srv/wallet
|
||||
|
||||
laconic-so --stack ~/cerc/laconic-wallet-web/stack/stack-orchestrator/stack/laconic-wallet-web build-containers --force-rebuild
|
||||
```
|
||||
|
||||
* Update the configuration, if required in `laconic-wallet-web-deployment/config.env`:
|
||||
|
||||
```bash
|
||||
WALLET_CONNECT_ID=63...
|
||||
```
|
||||
|
||||
* Restart the deployment:
|
||||
|
||||
```bash
|
||||
laconic-so deployment --dir laconic-wallet-web-deployment stop
|
||||
|
||||
laconic-so deployment --dir laconic-wallet-web-deployment start
|
||||
|
||||
# Follow logs for laconic-wallet-web container, wait for the build to finish
|
||||
laconic-so deployment --dir laconic-wallet-web-deployment logs laconic-wallet-web -f
|
||||
```
|
||||
|
||||
* The web wallet can now be viewed at <https://wallet.laconic.com>
|
||||
|
||||
## stage1 laconicd
|
||||
|
||||
* Deployment dir: `/srv/laconicd/stage1-deployment`
|
||||
|
||||
* If code has changed, fetch and build with updated source code:
|
||||
|
||||
```bash
|
||||
# laconicd source
|
||||
cd ~/cerc/laconicd
|
||||
|
||||
# Pull latest changes, or checkout to the required branch
|
||||
git pull
|
||||
|
||||
# Confirm the latest commit hash
|
||||
git log
|
||||
|
||||
# Rebuild the containers
|
||||
cd /srv/laconicd
|
||||
|
||||
laconic-so --stack ~/cerc/fixturenet-laconicd-stack/stack-orchestrator/stacks/fixturenet-laconicd build-containers --force-rebuild
|
||||
```
|
||||
|
||||
* Optionally, reset the data directory:
|
||||
|
||||
```bash
|
||||
# Stop the deployment
|
||||
laconic-so deployment --dir stage1-deployment stop --delete-volumes
|
||||
|
||||
# Remove and recreate the required data dirs
|
||||
sudo rm -rf stage1-deployment/data/laconicd-data stage1-deployment/data/genesis-config
|
||||
|
||||
mkdir stage1-deployment/data/laconicd-data
|
||||
mkdir stage1-deployment/data/genesis-config
|
||||
```
|
||||
|
||||
* Update the configuration, if required in `stage1-deployment/config.env`:
|
||||
|
||||
```bash
|
||||
AUTHORITY_AUCTION_ENABLED=true
|
||||
AUTHORITY_AUCTION_COMMITS_DURATION=3600
|
||||
AUTHORITY_AUCTION_REVEALS_DURATION=3600
|
||||
AUTHORITY_GRACE_PERIOD=7200
|
||||
```
|
||||
|
||||
* Follow [stage0-to-stage1.md](./stage0-to-stage1.md) to generate the genesis file for stage1 and start the deployment
|
||||
|
||||
## laconic-console
|
||||
|
||||
* Deployment dir: `/srv/console/laconic-console-deployment`
|
||||
|
||||
* If code has changed, fetch and build with updated source code:
|
||||
|
||||
```bash
|
||||
# testnet-onboarding-app source
|
||||
cd ~/cerc/laconic-console
|
||||
|
||||
# Pull latest changes, or checkout to the required branch
|
||||
git pull
|
||||
|
||||
# Confirm the latest commit hash
|
||||
git log
|
||||
|
||||
# Rebuild the containers
|
||||
cd /srv/console
|
||||
|
||||
laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/laconic-console build-containers --force-rebuild
|
||||
```
|
||||
|
||||
* Update the configuration, if required in `laconic-console-deployment/config.env`:
|
||||
|
||||
```bash
|
||||
# Laconicd (hosted) GQL endpoint
|
||||
LACONIC_HOSTED_ENDPOINT=https://laconicd.laconic.com
|
||||
```
|
||||
|
||||
* Restart the deployment:
|
||||
|
||||
```bash
|
||||
laconic-so deployment --dir laconic-console-deployment stop
|
||||
|
||||
laconic-so deployment --dir laconic-console-deployment start
|
||||
|
||||
# Follow logs for console container
|
||||
laconic-so deployment --dir laconic-console-deployment logs console -f
|
||||
```
|
||||
|
||||
* The laconic console can now be viewed at <https://loro-console.laconic.com>
|
||||
@@ -0,0 +1,8 @@
|
||||
# Default: https://laconicd.laconic.com/api
|
||||
LACONICD_GQL_ENDPOINT=
|
||||
|
||||
# Default: https://laconicd.laconic.com
|
||||
LACONICD_RPC_ENDPOINT=
|
||||
|
||||
# Default: laconic_9000-1
|
||||
LACONICD_CHAIN_ID=
|
||||
@@ -0,0 +1,3 @@
|
||||
node_modules
|
||||
dist
|
||||
.env
|
||||
@@ -0,0 +1 @@
|
||||
@cerc-io:registry=https://git.vdb.to/api/packages/cerc-io/npm/
|
||||
@@ -0,0 +1,45 @@
|
||||
# scripts
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- NodeJS >= `v18.17.x`
|
||||
|
||||
## Instructions
|
||||
|
||||
- Change to scripts dir:
|
||||
|
||||
```bash
|
||||
cd scripts
|
||||
```
|
||||
|
||||
- Install dependencies and build:
|
||||
|
||||
```bash
|
||||
yarn && yarn build
|
||||
```
|
||||
|
||||
- Create required env configuration:
|
||||
|
||||
```bash
|
||||
# Update the values as required
|
||||
# By default, live laconicd testnet (laconicd.laconic.com) endpoint is configured
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
- Generate a list of onboarded participants and allocations with given list of validators:
|
||||
|
||||
```bash
|
||||
yarn participants-with-filtered-validators --validators-csv <validators-csv-file> --participant-alloc <participant-alloc-amount> --validator-alloc <validator-alloc-amount> --output <output-json-file> --output-allocs <output-allocs-json-file>
|
||||
|
||||
# Example:
|
||||
# yarn participants-with-filtered-validators --validators-csv ./validators.csv --participant-alloc 200000000000 --validator-alloc 1000200000000000 --output stage1-participants-$(date +"%Y-%m-%dT%H%M%S").json --output-allocs stage1-allocs-$(date +"%Y-%m-%dT%H%M%S").json
|
||||
```
|
||||
|
||||
- Map subscribers to onboarded participants:
|
||||
|
||||
```bash
|
||||
yarn map-subscribers-to-participants --subscribers-csv <subscribers-csv-file> --output <output-csv-file>
|
||||
|
||||
# Example:
|
||||
# yarn map-subscribers-to-participants --subscribers-csv subscribers.csv --output result-$(date +"%Y-%m-%dT%H%M%S").csv
|
||||
```
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"name": "testnet-laconicd-stack",
|
||||
"version": "0.1.0",
|
||||
"main": "index.js",
|
||||
"repository": "git@git.vdb.to:cerc-io/testnet-laconicd-stack.git",
|
||||
"license": "UNLICENSED",
|
||||
"private": true,
|
||||
"devDependencies": {
|
||||
"@types/cli-progress": "^3.11.6",
|
||||
"@types/node": "^22.2.0",
|
||||
"@types/yargs": "^17.0.33",
|
||||
"typescript": "^5.5.4"
|
||||
},
|
||||
"dependencies": {
|
||||
"@cerc-io/registry-sdk": "^0.2.6",
|
||||
"@cosmjs/stargate": "^0.32.4",
|
||||
"csv-parse": "^5.5.6",
|
||||
"csv-parser": "^3.0.0",
|
||||
"csv-writer": "^1.6.0",
|
||||
"dotenv": "^16.4.5",
|
||||
"yargs": "^17.7.2"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"map-subscribers-to-participants": "node dist/map-subscribers-to-participants.js"
|
||||
},
|
||||
"packageManager": "yarn@1.22.19+sha1.4ba7fc5c6e704fce2066ecbfb0b0d8976fe62447"
|
||||
}
|
||||
@@ -0,0 +1,171 @@
|
||||
import * as fs from 'fs';
|
||||
import * as crypto from 'crypto';
|
||||
import * as path from 'path';
|
||||
import yargs from 'yargs';
|
||||
import { hideBin } from 'yargs/helpers';
|
||||
import { parse as csvParse } from 'csv-parse';
|
||||
import * as csvWriter from 'csv-writer';
|
||||
import dotenv from 'dotenv';
|
||||
|
||||
import { StargateClient } from '@cosmjs/stargate';
|
||||
import { Registry } from '@cerc-io/registry-sdk';
|
||||
import { decodeTxRaw, decodePubkey } from '@cosmjs/proto-signing';
|
||||
|
||||
dotenv.config();
|
||||
|
||||
const LACONICD_GQL_ENDPOINT = process.env.LACONICD_GQL_ENDPOINT || 'https://laconicd.laconic.com/api';
|
||||
const LACONICD_RPC_ENDPOINT = process.env.LACONICD_RPC_ENDPOINT || 'https://laconicd.laconic.com';
|
||||
const LACONICD_CHAIN_ID = process.env.LACONICD_CHAIN_ID || 'laconic_9000-1';
|
||||
|
||||
async function main(): Promise<void> {
|
||||
const argv = _getArgv();
|
||||
|
||||
const registry = new Registry(LACONICD_GQL_ENDPOINT, LACONICD_RPC_ENDPOINT, LACONICD_CHAIN_ID);
|
||||
const client = await StargateClient.connect(LACONICD_RPC_ENDPOINT);
|
||||
|
||||
console.time('time_taken_getParticipants');
|
||||
const participants = await registry.getParticipants();
|
||||
console.timeEnd('time_taken_getParticipants');
|
||||
|
||||
const subscribers = await readSubscribers(argv.subscribersCsv);
|
||||
console.log('Read subscribers, count:', subscribers.length);
|
||||
|
||||
await processSubscribers(client, participants, subscribers, argv.output);
|
||||
}
|
||||
|
||||
async function readSubscribers(subscribersCsvPath: string): Promise<any> {
|
||||
const fileContent = fs.readFileSync(path.resolve(subscribersCsvPath), { encoding: 'utf-8' });
|
||||
const headers = ['subscriber_id', 'email', 'status', 'premium?', 'created_at', 'api_subscription_id'];
|
||||
|
||||
return csvParse(fileContent, { delimiter: ',', columns: headers }).toArray();
|
||||
}
|
||||
|
||||
function hashSubscriberId(subscriberId: string): string {
|
||||
return '0x' + crypto.createHash('sha256').update(subscriberId).digest('hex');
|
||||
}
|
||||
|
||||
async function processSubscribers(client: StargateClient, participants: any[], subscribers: any[], outputPath: string) {
|
||||
// Map kyc_id to participant data
|
||||
const kycMap: Record<string, any> = {};
|
||||
participants.forEach((participant: any) => {
|
||||
kycMap[participant.kycId] = participant;
|
||||
});
|
||||
|
||||
const onboardingTxsHeightMap: Record<string, { txHeight: number, pubkey: string }> = {};
|
||||
console.time('time_taken_searchTx');
|
||||
const onboardingTxs = await client.searchTx(`message.action='/cerc.onboarding.v1.MsgOnboardParticipant'`);
|
||||
console.timeEnd('time_taken_searchTx');
|
||||
|
||||
console.log('Fetched onboardingTxs, count:', onboardingTxs.length);
|
||||
|
||||
console.time('time_taken_decodingTxs');
|
||||
onboardingTxs.forEach(onboardingTx => {
|
||||
const rawPubkey = decodeTxRaw(onboardingTx.tx).authInfo.signerInfos[0].publicKey;
|
||||
if (!rawPubkey) {
|
||||
console.error('pubkey not found in tx', onboardingTx.hash);
|
||||
return;
|
||||
}
|
||||
|
||||
const pubkey = decodePubkey(rawPubkey).value;
|
||||
|
||||
// Determine sender
|
||||
const onboardParticipantEvent = onboardingTx.events.find(event => event.type === 'onboard_participant');
|
||||
if (!onboardParticipantEvent) {
|
||||
console.error('onboard_participant event not found in tx', onboardingTx.hash);
|
||||
return;
|
||||
}
|
||||
|
||||
const sender = onboardParticipantEvent.attributes.find(attr => attr.key === 'signer')?.value;
|
||||
if (!sender) {
|
||||
console.error('sender not found in onboard_participant event for tx', onboardingTx.hash)
|
||||
return;
|
||||
}
|
||||
|
||||
// Update if already exists
|
||||
let latesTxHeight = onboardingTx.height;
|
||||
if (onboardingTxsHeightMap[sender]) {
|
||||
latesTxHeight = latesTxHeight > onboardingTxsHeightMap[sender].txHeight ? latesTxHeight : onboardingTxsHeightMap[sender].txHeight;
|
||||
}
|
||||
|
||||
onboardingTxsHeightMap[sender] = { txHeight: latesTxHeight, pubkey };
|
||||
});
|
||||
console.timeEnd('time_taken_decodingTxs');
|
||||
|
||||
const onboardedSubscribers: any[] = [];
|
||||
for (let i = 0; i < subscribers.length; i++) {
|
||||
const subscriber = subscribers[i];
|
||||
|
||||
const hashedSubscriberId = hashSubscriberId(subscriber['subscriber_id']);
|
||||
const participant = kycMap[hashedSubscriberId];
|
||||
if (!participant) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const participantAddresss = participant['cosmosAddress'];
|
||||
|
||||
// Skip participant if an onboarding tx not found
|
||||
if (!onboardingTxsHeightMap[participantAddresss]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const onboardedSubscriber = {
|
||||
subscriber_id: subscriber['subscriber_id'],
|
||||
email: subscriber['email'],
|
||||
status: subscriber['status'],
|
||||
'premium?': subscriber['premium?'],
|
||||
created_at: subscriber['created_at'],
|
||||
laconic_address: participantAddresss,
|
||||
nitro_address: participant['nitroAddress'],
|
||||
role: participant['role'],
|
||||
hashed_subscriber_id: participant['kycId'],
|
||||
laconic_pubkey: onboardingTxsHeightMap[participantAddresss].pubkey,
|
||||
onboarding_height: onboardingTxsHeightMap[participantAddresss].txHeight
|
||||
};
|
||||
|
||||
onboardedSubscribers.push(onboardedSubscriber);
|
||||
}
|
||||
|
||||
const writer = csvWriter.createObjectCsvWriter({
|
||||
path: path.resolve(outputPath),
|
||||
header: [
|
||||
{ id: 'subscriber_id', title: 'subscriber_id' },
|
||||
{ id: 'email', title: 'email' },
|
||||
{ id: 'status', title: 'status' },
|
||||
{ id: 'premium?', title: 'premium?' },
|
||||
{ id: 'created_at', title: 'created_at' },
|
||||
{ id: 'laconic_address', title: 'laconic_address' },
|
||||
{ id: 'nitro_address', title: 'nitro_address' },
|
||||
{ id: 'role', title: 'role' },
|
||||
{ id: 'hashed_subscriber_id', title: 'hashed_subscriber_id' },
|
||||
{ id: 'laconic_pubkey', title: 'laconic_pubkey' },
|
||||
{ id: 'onboarding_height', title: 'onboarding_height' },
|
||||
],
|
||||
alwaysQuote: true
|
||||
});
|
||||
|
||||
await writer.writeRecords(onboardedSubscribers);
|
||||
|
||||
console.log(`Data has been written to ${path.resolve(outputPath)}`);
|
||||
}
|
||||
|
||||
function _getArgv (): any {
|
||||
return yargs(hideBin(process.argv))
|
||||
.option('subscribersCsv', {
|
||||
alias: 's',
|
||||
type: 'string',
|
||||
demandOption: true,
|
||||
describe: 'Path to the subscribers CSV file',
|
||||
})
|
||||
.option('output', {
|
||||
alias: 'o',
|
||||
type: 'string',
|
||||
demandOption: true,
|
||||
describe: 'Path to the output CSV file',
|
||||
})
|
||||
.help()
|
||||
.argv;
|
||||
}
|
||||
|
||||
main().catch(err => {
|
||||
console.log(err);
|
||||
});
|
||||
@@ -0,0 +1,114 @@
|
||||
import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
import yargs from 'yargs';
|
||||
import { hideBin } from 'yargs/helpers';
|
||||
import dotenv from 'dotenv';
|
||||
|
||||
import { Registry } from '@cerc-io/registry-sdk';
|
||||
|
||||
dotenv.config();
|
||||
|
||||
const LACONICD_GQL_ENDPOINT = process.env.LACONICD_GQL_ENDPOINT || 'https://laconicd.laconic.com/api';
|
||||
const LACONICD_RPC_ENDPOINT = process.env.LACONICD_RPC_ENDPOINT || 'https://laconicd.laconic.com';
|
||||
const LACONICD_CHAIN_ID = process.env.LACONICD_CHAIN_ID || 'laconic_9000-1';
|
||||
|
||||
async function main(): Promise<void> {
|
||||
const argv = _getArgv();
|
||||
|
||||
const registry = new Registry(LACONICD_GQL_ENDPOINT, LACONICD_RPC_ENDPOINT, LACONICD_CHAIN_ID);
|
||||
|
||||
console.time('time_taken_getParticipants');
|
||||
const participants = await registry.getParticipants();
|
||||
console.log('Fetched participants, count:', participants.length);
|
||||
console.timeEnd('time_taken_getParticipants');
|
||||
|
||||
let validators: Array<string> = await readValidators(argv.validatorsCsv);
|
||||
console.log('Read validators, count:', validators.length);
|
||||
|
||||
let stage1Allocations: Array<{ 'cosmos_address': string, balance: string }> = [];
|
||||
|
||||
const stage1Participants = participants.map((participant: any) => {
|
||||
const outputParticipant: any = {
|
||||
'cosmos_address': participant.cosmosAddress,
|
||||
'nitro_address': participant.nitroAddress,
|
||||
'kyc_id': participant.kycId
|
||||
};
|
||||
|
||||
if (validators.includes(participant.cosmosAddress)) {
|
||||
outputParticipant.role = 'validator';
|
||||
|
||||
stage1Allocations.push({
|
||||
cosmos_address: participant.cosmosAddress,
|
||||
balance: argv.validatorAlloc
|
||||
});
|
||||
|
||||
// Remove processed participant from validators list
|
||||
validators = validators.filter(val => val !== participant.cosmosAddress);
|
||||
} else {
|
||||
outputParticipant.role = 'participant';
|
||||
|
||||
stage1Allocations.push({
|
||||
cosmos_address: participant.cosmosAddress,
|
||||
balance: argv.participantAlloc
|
||||
});
|
||||
}
|
||||
|
||||
return outputParticipant;
|
||||
});
|
||||
|
||||
// Provide allocs for remaining validators
|
||||
validators.forEach(val => {
|
||||
stage1Allocations.push({
|
||||
cosmos_address: val,
|
||||
balance: argv.validatorAlloc
|
||||
});
|
||||
});
|
||||
|
||||
const participantsOutputFilePath = path.resolve(argv.output);
|
||||
fs.writeFileSync(participantsOutputFilePath, JSON.stringify(stage1Participants, null, 2));
|
||||
console.log(`Onboarded participants with filtered validators written to ${participantsOutputFilePath}`);
|
||||
|
||||
const allocsOutputFilePath = path.resolve(argv.outputAllocs);
|
||||
fs.writeFileSync(allocsOutputFilePath, JSON.stringify(stage1Allocations, null, 2));
|
||||
console.log(`Stage1 allocations written to ${allocsOutputFilePath}`);
|
||||
}
|
||||
|
||||
async function readValidators(subscribersCsvPath: string): Promise<any> {
|
||||
const fileContent = fs.readFileSync(path.resolve(subscribersCsvPath), { encoding: 'utf-8' });
|
||||
return fileContent.split('\r\n').map(address => address.trim());
|
||||
}
|
||||
|
||||
function _getArgv (): any {
|
||||
return yargs(hideBin(process.argv))
|
||||
.option('validatorsCsv', {
|
||||
type: 'string',
|
||||
demandOption: true,
|
||||
describe: 'Path to a CSV file with validators list',
|
||||
})
|
||||
.option('participantAlloc', {
|
||||
type: 'string',
|
||||
demandOption: true,
|
||||
describe: 'Participant stage1 balance allocation',
|
||||
})
|
||||
.option('validatorAlloc', {
|
||||
type: 'string',
|
||||
demandOption: true,
|
||||
describe: 'Validator stage1 balance allocation',
|
||||
})
|
||||
.option('output', {
|
||||
type: 'string',
|
||||
demandOption: true,
|
||||
describe: 'Path to the output JSON file',
|
||||
})
|
||||
.option('outputAllocs', {
|
||||
type: 'string',
|
||||
demandOption: true,
|
||||
describe: 'Path to the output JSON file with allocs',
|
||||
})
|
||||
.help()
|
||||
.argv;
|
||||
}
|
||||
|
||||
main().catch(err => {
|
||||
console.log(err);
|
||||
});
|
||||
@@ -0,0 +1,110 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
/* Visit https://aka.ms/tsconfig to read more about this file */
|
||||
|
||||
/* Projects */
|
||||
// "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
|
||||
// "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
|
||||
// "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */
|
||||
// "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */
|
||||
// "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
|
||||
// "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
|
||||
|
||||
/* Language and Environment */
|
||||
"target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
|
||||
// "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
|
||||
// "jsx": "preserve", /* Specify what JSX code is generated. */
|
||||
// "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */
|
||||
// "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
|
||||
// "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
|
||||
// "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
|
||||
// "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
|
||||
// "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
|
||||
// "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
|
||||
// "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
|
||||
// "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */
|
||||
|
||||
/* Modules */
|
||||
"module": "commonjs", /* Specify what module code is generated. */
|
||||
// "rootDir": "./", /* Specify the root folder within your source files. */
|
||||
// "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */
|
||||
// "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
|
||||
// "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
|
||||
// "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
|
||||
// "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */
|
||||
// "types": [], /* Specify type package names to be included without being referenced in a source file. */
|
||||
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
|
||||
// "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */
|
||||
// "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */
|
||||
// "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */
|
||||
// "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */
|
||||
// "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */
|
||||
"resolveJsonModule": true, /* Enable importing .json files. */
|
||||
// "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */
|
||||
// "noResolve": true, /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */
|
||||
|
||||
/* JavaScript Support */
|
||||
// "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
|
||||
// "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
|
||||
// "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
|
||||
|
||||
/* Emit */
|
||||
"declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
|
||||
// "declarationMap": true, /* Create sourcemaps for d.ts files. */
|
||||
// "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
|
||||
"sourceMap": true, /* Create source map files for emitted JavaScript files. */
|
||||
// "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
|
||||
// "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
|
||||
"outDir": "dist", /* Specify an output folder for all emitted files. */
|
||||
// "removeComments": true, /* Disable emitting comments. */
|
||||
// "noEmit": true, /* Disable emitting files from a compilation. */
|
||||
// "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
|
||||
// "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
|
||||
// "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
|
||||
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
|
||||
// "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
|
||||
// "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
|
||||
// "newLine": "crlf", /* Set the newline character for emitting files. */
|
||||
// "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
|
||||
// "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */
|
||||
// "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
|
||||
// "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */
|
||||
// "declarationDir": "./", /* Specify the output directory for generated declaration files. */
|
||||
|
||||
/* Interop Constraints */
|
||||
// "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
|
||||
// "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */
|
||||
// "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */
|
||||
// "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
|
||||
"esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
|
||||
// "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
|
||||
"forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
|
||||
|
||||
/* Type Checking */
|
||||
"strict": true, /* Enable all strict type-checking options. */
|
||||
// "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */
|
||||
// "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */
|
||||
// "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
|
||||
// "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
|
||||
// "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
|
||||
// "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */
|
||||
// "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */
|
||||
// "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
|
||||
// "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */
|
||||
// "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */
|
||||
// "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
|
||||
// "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
|
||||
// "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
|
||||
// "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */
|
||||
// "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
|
||||
// "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */
|
||||
// "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
|
||||
// "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
|
||||
|
||||
/* Completeness */
|
||||
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
|
||||
"skipLibCheck": true /* Skip type checking all .d.ts files. */
|
||||
},
|
||||
"include": ["src"],
|
||||
"exclude": ["dist"],
|
||||
}
|
||||
+1999
File diff suppressed because it is too large
Load Diff
@@ -13,7 +13,7 @@ services:
|
||||
registry:
|
||||
rpcEndpoint: ${CERC_LACONICD_RPC_ENDPOINT}
|
||||
gqlEndpoint: ${CERC_LACONICD_GQL_ENDPOINT}
|
||||
userKey: ${CERC_LACONICD_USER_KEY}
|
||||
userKey: "${CERC_LACONICD_USER_KEY}"
|
||||
bondId: ${CERC_LACONICD_BOND_ID}
|
||||
chainId: ${CERC_LACONICD_CHAIN_ID}
|
||||
gas: ${CERC_LACONICD_GAS}
|
||||
|
||||
@@ -222,7 +222,7 @@ laconic-so deployment --dir laconic-console-deployment start
|
||||
# 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 > <your-node-moniker>-validator.json
|
||||
laconic-so deployment --dir testnet-laconicd-deployment exec laconicd 'cat <<EOF > my-validator.json
|
||||
{
|
||||
"pubkey": $(laconicd cometbft show-validator),
|
||||
"amount": "900000000alnt",
|
||||
@@ -238,13 +238,13 @@ laconic-so deployment --dir laconic-console-deployment start
|
||||
* Create a validator:
|
||||
|
||||
```bash
|
||||
laconic-so deployment --dir testnet-laconicd-deployment exec laconicd 'laconicd tx staking create-validator <your-node-moniker>-validator.json \
|
||||
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 staking validators:
|
||||
* View validators:
|
||||
|
||||
```bash
|
||||
laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd query staking validators"
|
||||
@@ -266,7 +266,7 @@ laconic-so deployment --dir laconic-console-deployment start
|
||||
# services:
|
||||
# registry:
|
||||
# ...
|
||||
# userKey: <your-private-key>
|
||||
# userKey: "<your-private-key>"
|
||||
# ...
|
||||
|
||||
# Note: any changes made to the config will be lost when the cli Docker container is brought down
|
||||
@@ -277,7 +277,7 @@ laconic-so deployment --dir laconic-console-deployment start
|
||||
|
||||
```bash
|
||||
# Example
|
||||
laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry bond create --type photon --quantity 1000000000000"
|
||||
laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry bond create --type alnt --quantity 1000000000000"
|
||||
```
|
||||
|
||||
## Clean up
|
||||
|
||||
@@ -985,7 +985,7 @@
|
||||
- Send transaction request to the wallet
|
||||
- From wallet, approve and send transaction to laconicd chain
|
||||
- Repeat onboarding for other (Charlies's) account by clicking on the web app header "Testnet Onboarding"
|
||||
- List the participants on stage 1 (run in the directory where laconicd deployment was created):
|
||||
- List the participants on stage 0 (run in the directory where laconicd deployment was created):
|
||||
|
||||
```bash
|
||||
laconic-so deployment --dir stage0-deployment exec laconicd "laconicd query onboarding list"
|
||||
|
||||
@@ -0,0 +1,285 @@
|
||||
# testnet-onboarding-validator
|
||||
|
||||
## Onboard as a participant / validator on stage0
|
||||
|
||||
* Visit <https://wallet.laconic.com/> and click on `Create wallet`
|
||||
* Save the mnemonic for further usage
|
||||
|
||||
* Register your laconic address as a participant using the [Onboarding App](https://loro-signup.laconic.com)
|
||||
|
||||
* Read and accept the `Terms and Conditions`
|
||||
|
||||
* On next page, enter your email to register to join the LORO testnet
|
||||
|
||||
* Visit the confirmation link sent on the registered email (email delivery might take a few minutes)
|
||||
|
||||
* It should take you to the `Testnet Onboarding` app
|
||||
|
||||
* Note: The confirmation link will only work the first time, visit <https://loro-signup.laconic.com/sign-with-nitro-key> for further attempts if required
|
||||
|
||||
* Connect testnet-onboarding app to the wallet:
|
||||
|
||||
* Click on `CONNECT WALLET` button on the testnet-onboarding app
|
||||
|
||||
* Click on the WalletConnect icon on the top right corner in the wallet
|
||||
|
||||
* If using the wallet website, enter WalletConnect URI for pairing
|
||||
|
||||
* In the onboarding app, choose your nitro and laconicd account to onboard
|
||||
|
||||
* Sign using the nitro key
|
||||
|
||||
* Approve sign request on Wallet
|
||||
|
||||
* Select the desired participant role (`Validator` or `Participant`) and accept the onboarding terms and conditions
|
||||
|
||||
* In the next step, fund your laconic account by clicking on the `REQUEST TOKENS FROM FAUCET` button; ensure that the displayed balance is updated
|
||||
|
||||
* Send transaction request to the wallet
|
||||
|
||||
* From wallet, approve and send transaction to stage0 laconicd chain
|
||||
|
||||
## Join as a validator on stage1
|
||||
|
||||
### Prerequisites
|
||||
|
||||
* Minimum hardware requirements:
|
||||
|
||||
```bash
|
||||
RAM: 8-16GB
|
||||
Disk space: 200GB
|
||||
CPU: 2 cores
|
||||
```
|
||||
|
||||
* Testnet genesis file and peer node address
|
||||
|
||||
* Mnemonic from the [wallet](https://wallet.laconic.com)
|
||||
|
||||
* Participant onboarded on stage0
|
||||
|
||||
### Setup
|
||||
|
||||
* Clone the stack repo:
|
||||
|
||||
```bash
|
||||
laconic-so fetch-stack git.vdb.to/cerc-io/testnet-laconicd-stack
|
||||
```
|
||||
|
||||
* Clone required repositories:
|
||||
|
||||
```bash
|
||||
laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/testnet-laconicd 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
|
||||
laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/testnet-laconicd build-containers
|
||||
```
|
||||
|
||||
This should create the following docker images locally:
|
||||
|
||||
* `cerc/laconicd`
|
||||
|
||||
### 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
|
||||
```
|
||||
|
||||
* Edit `network` in the spec file 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'
|
||||
```
|
||||
|
||||
* Create the deployment from the spec file:
|
||||
|
||||
```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
|
||||
```
|
||||
|
||||
* 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@laconicd.laconic.com:26656"
|
||||
# Use the provided node id
|
||||
CERC_PEERS=""
|
||||
|
||||
# A custom human readable name for this node
|
||||
CERC_MONIKER=
|
||||
```
|
||||
|
||||
### Start the deployment
|
||||
|
||||
```bash
|
||||
laconic-so deployment --dir testnet-laconicd-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
|
||||
```
|
||||
|
||||
* After the node has caught up, view current list of validators:
|
||||
|
||||
```bash
|
||||
laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd query staking validators"
|
||||
```
|
||||
|
||||
* Confirm that in the list of validators, your node moniker does not exist
|
||||
|
||||
### Join as testnet validator
|
||||
|
||||
* Open the wallet: <https://wallet.laconic.com/>
|
||||
|
||||
* Create a validator from the onboarding app:
|
||||
|
||||
* Visit the [validator creation](https://loro-signup.laconic.com/validator) page
|
||||
|
||||
* If required, connect testnet-onboarding app to the wallet with which onboarding was done on stage0
|
||||
|
||||
* Select the Laconic account (same as the one used while onboarding) using which you wish to send the create validator request
|
||||
|
||||
* This should display the details of your onboarded participant
|
||||
|
||||
* You can proceed if the participant has `validator` role
|
||||
|
||||
* Enter your node's moniker (use the same one used while [configuring](#configuration) the `testnet-laconicd-deployment`)
|
||||
|
||||
* Fetch and enter your validator's pubkey:
|
||||
|
||||
```bash
|
||||
laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd cometbft show-validator" | jq -r .key
|
||||
```
|
||||
|
||||
* Send the transaction request to wallet
|
||||
|
||||
* From wallet, approve and send transaction to stage1 laconicd chain
|
||||
|
||||
* Alternatively, create a validator using the laconicd CLI:
|
||||
|
||||
* Import a key pair:
|
||||
|
||||
```bash
|
||||
KEY_NAME=alice
|
||||
|
||||
# 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"
|
||||
```
|
||||
|
||||
* 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": "1000000000000000alnt",
|
||||
"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
|
||||
|
||||
* View validator set:
|
||||
|
||||
```bash
|
||||
laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd query consensus comet validator-set"
|
||||
```
|
||||
|
||||
### 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)
|
||||
sudo rm -r testnet-laconicd-deployment
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
* If you face any issues in the onboarding app or the web-wallet, clear your browser cache and reload
|
||||
Reference in New Issue
Block a user