# Chain services

> L0vd.com is a team of experienced PoS blockchain validators with a passion for cryptocurrency and a deep understanding of IT. We are committed to supporting the blockchain ecosystem through technical contributions and providing high-quality chain services.\
> Our team members are highly skilled in their areas of expertise, with a wealth of knowledge and experience in blockchain development, infrastructure management, and network security.

## :heart: Cosmos Mainnet Support

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/archway.svg" alt="" data-size="line"> [Archway](/mainnets/archway)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/axelar.svg" alt="" data-size="line"> [Axelar](/mainnets/axelar)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/berachain.png" alt="" data-size="line"> [Berachain](https://github.com/L0vd/chain-services/blob/main/mainnets/berachain/README.md)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/bitcanna.png" alt="" data-size="line"> [Bitcanna](/mainnets/bitcanna)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/composable.png" alt="" data-size="line"> [Composable](/mainnets/composable)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/cosmos.png" alt="" data-size="line"> [Cosmos Hub](/mainnets/cosmoshub)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/gitopia.png" alt="" data-size="line"> [Gitopia](/mainnets/gitopia)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/haqq.svg" alt="" data-size="line"> [HAQQ](/mainnets/haqq)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/iris.png" alt="" data-size="line"> [Iris](/mainnets/iris)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/juno.svg" alt="" data-size="line"> [Juno](/mainnets/juno)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/namada.svg" alt="" data-size="line"> [Namada](/mainnets/namada)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/nois.svg" alt="" data-size="line"> [Nois](/mainnets/nois)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/osmosis.svg" alt="" data-size="line"> [Osmosis](/mainnets/osmosis)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/stride.png" alt="" data-size="line"> [Stride](/mainnets/stride)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/umee.svg" alt="" data-size="line"> [Umee](/mainnets/umee)

## :heart: Cosmos Testnet Support

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/andromeda.png" alt="" data-size="line"> [Andromeda](/testnets/andromeda)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/archway.svg" alt="" data-size="line"> [Archway](/testnets/archway)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/artela.png" alt="" data-size="line"> [Artela](/testnets/artela)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/babylon.png" alt="" data-size="line"> [Babylon](/testnets/babylon)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/berachain.png" alt="" data-size="line"> [Berachain\_v2](/testnets/berachain_v2)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/bitcanna.png" alt="" data-size="line"> [Bitcanna](/mainnets/bitcanna)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/bonusblock.jpg" alt="" data-size="line"> [BonusBlock](/testnets/bonusblock)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/composable.png" alt="" data-size="line"> [Composable](/testnets/composable)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/defund.svg" alt="" data-size="line"> [Defund](/testnets/defund)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/empower.png" alt="" data-size="line"> [Empower](/testnets/empower)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/entangle.png" alt="" data-size="line"> [Entangle](/testnets/entangle)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/haqq.svg" alt="" data-size="line"> [HAQQ](/testnets/haqq)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/humans.png" alt="" data-size="line"> [Humans](/testnets/humans)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/lava.svg" alt="" data-size="line"> [Lava](/testnets/lava)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/namada.svg" alt="" data-size="line"> [Namada](/testnets/namada)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/nois.svg" alt="" data-size="line"> [Nois](/testnets/nois)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/noria.png" alt="" data-size="line"> [Noria](/testnets/noria)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/ojo.png" alt="" data-size="line"> [Ojo](/testnets/ojo)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/ollo.png" alt="" data-size="line"> [Ollo](/testnets/ollo)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/pryzm.png" alt="" data-size="line"> [Pryzm](/testnets/pryzm)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/source.png" alt="" data-size="line"> [Source](https://github.com/L0vd/chain-services/blob/main/testnets/source/README.md)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/umee.svg" alt="" data-size="line"> [Umee](/testnets/umee)

<img src="https://raw.githubusercontent.com/L0vd/image-content/main/gitbook-logos/union.svg" alt="" data-size="line"> [Union](/testnets/union)


# Archway

**Overview**

Archway is an incentivized smart contract chain for the Cosmos ecosystem that allows developers to deploy high-performance dapps and get rewarded for the value they contribute to the network.

**Official links**

[Website](https://archway.io/) | [Twitter](https://twitter.com/archwayhq) | [Discord](https://discord.gg/archwayhq) | [Github](https://github.com/archway-network)

**Chain info**

|                |          |
| -------------- | -------- |
| Chain-id       |          |
| Binary name    | archwayd |
| Binary version | v        |

**Explorer**

<https://explorers.l0vd.com/archway-mainnet>

**Public Endpoints**

RPC <https://archway-mainnet.rpc.l0vd.com>

API <https://archway-mainnet.api.l0vd.com>

GRPC

```
archway-mainnet.grpc.l0vd.com:80
```

PEER

```
@archway-mainnet.peers.l0vd.com:
```


# Installation

If you want to setup Archway fullnode manually follow the steps below

## Update and upgrade

```
sudo apt update && sudo apt upgrade -y
```

## Install GO

```
if ! [ -x "$(command -v go)" ]; then
  ver="1.19.3"
  cd $HOME
  wget "https://golang.org/dl/go$ver.linux-amd64.tar.gz"
  sudo rm -rf /usr/local/go
  sudo tar -C /usr/local -xzf "go$ver.linux-amd64.tar.gz"
  rm "go$ver.linux-amd64.tar.gz"
  echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> ~/.bash_profile
  source ~/.bash_profile
fi
```

## Install node

```
cd $HOME
rm -rf archway
git clone https://github.com/archway-network/archway.git
cd archway
git checkout v
make install
```

## Setting up vars

You should replace values in <>\
\<YOUR\_MONIKER> Here you should put name of your moniker (validator) that will be visible in explorer\
\<YOUR\_WALLET> Here you shoud put the name of your wallet

```
ARCHWAY_WALLET="<YOUR_WALLET_NAME>"
ARCHWAY_NODENAME="<YOUR_MONIKER>"
ARCHWAY_CHAIN_ID=""
```

```
echo "
export ARCHWAY_WALLET=${ARCHWAY_WALLET}
export ARCHWAY_NODENAME=${ARCHWAY_NODENAME}
export ARCHWAY_CHAIN_ID=${ARCHWAY_CHAIN_ID}
" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

## Configure your node

```
archwayd config chain-id ${ARCHWAY_CHAIN_ID}
```

## Initialize your node

```
archwayd init ${ARCHWAY_NODENAME} --chain-id ${ARCHWAY_CHAIN_ID}
```

## Download genesis & addrbook

```
curl -Ls "https://snapshots.l0vd.com/archway-mainnet/genesis.json" > $HOME/.archway/config/genesis.json
curl -Ls "https://snapshots.l0vd.com/archway-mainnet/addrbook.json" > $HOME/.archway/config/addrbook.json
```

## (OPTIONAL) Set custom ports

### If you want to use non-default ports

```
ARCHWAY_PORT=<SET_CUSTOM_PORT> #Example: ARCHWAY_PORT=56 (numbers from 1 to 64)
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${ARCHWAY_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${ARCHWAY_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${ARCHWAY_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${ARCHWAY_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${ARCHWAY_PORT}660\"%" /$HOME/.archway/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${ARCHWAY_PORT}317\"%; s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${ARCHWAY_PORT}317\"%; s%^address = \":8080\"%address = \":${ARCHWAY_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${ARCHWAY_PORT}090\"%; s%^address = \"localhost:9090\"%address = \"localhost:${ARCHWAY_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${ARCHWAY_PORT}091\"%; s%^address = \"localhost:9091\"%address = \"localhost:${ARCHWAY_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${ARCHWAY_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${ARCHWAY_PORT}546\"%" /$HOME/.archway/config/app.toml
```

```
archwayd config node tcp://localhost:${ARCHWAY_PORT}657
```

## Set seeds and peers

```
PEERS="@archway-mainnet.peers.l0vd.com:"
sed -i -e "s/^seeds *=.*/seeds = \"$SEEDS\"/; s/^persistent_peers *=.*/persistent_peers = \"$PEERS\"/" $HOME/.archway/config/config.toml
```

## Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="50"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.archway/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.archway/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.archway/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.archway/config/app.toml
```

## Set minimum gas price and null indexer

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"1000000000000aarch\"/" $HOME/.archway/config/app.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.archway/config/config.toml
```

## Create Service

```
sudo tee /etc/systemd/system/archwayd.service > /dev/null <<EOF
[Unit]
Description=Archway mainnet
After=network-online.target

[Service]
User=$USER
ExecStart=$(which archwayd) start
Restart=on-failure
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF
```

## Reset blockchain info and restart your node

```
sudo systemctl daemon-reload
sudo systemctl enable archwayd
archwayd tendermint unsafe-reset-all --home $HOME/.archway --keep-addr-book
sudo systemctl restart archwayd && sudo journalctl -u archwayd -f -o cat
```

## (OPTIONAL) Use State Sync

### [State Sync](/mainnets/archway/installation-guide)

## Starting a validator

### 1. Add a new key

```
archwayd keys add ${ARCHWAY_WALLET}
```

#### (OR)

### 1. Recover your key

```
archwayd keys add ${ARCHWAY_WALLET} --recover
```

```
ARCHWAY_WALLET_ADDR=$(archwayd keys show ${ARCHWAY_WALLET} -a)
echo "export ARCHWAY_WALLET_ADDR=${ARCHWAY_WALLET_ADDR}" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

## 2. Create validator

{% hint style="info" %}
Wait until the node is synchronized.
{% endhint %}

```
archwayd tx staking create-validator \
--amount 1000000aarch \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--details "" \
--pubkey $(archwayd tendermint show-validator) \
--moniker ${ARCHWAY_NODENAME} \
--chain-id ${ARCHWAY_CHAIN_ID} \
--from ${ARCHWAY_WALLET_ADDR} \
--gas-prices 1000000000000aarch \
--gas-adjustment 1.5 \
--gas auto \
--yes
```


# Snapshot

## Updates every 4 hours

## Install dependencies, if needed

```
sudo apt update
sudo apt install lz4 -y
```

## Sync from Snapshot

| Height  | Size   | Pruning         | Indexer | Creation Time (UTC+3) |
| ------- | ------ | --------------- | ------- | --------------------- |
| 5632851 | 1.63GB | custom/100/0/10 | null    | 2024-07-24T20:08:26   |

```
sudo systemctl stop archwayd

cp $HOME/.archway/data/priv_validator_state.json $HOME/.archway/priv_validator_state.json.backup
${BINARY_NAME} tendermint unsafe-reset-all --home $HOME/.archway --keep-addr-book

rm -rf $HOME/.archway/data 

SNAP_NAME=$(curl -s https://snapshots.l0vd.com/mainnets/archway/archway-1/ | egrep -o ">archway-1.*\.tar.lz4" | tr -d ">")
curl https://snapshots.l0vd.com/mainnets/archway/archway-1/${SNAP_NAME} | lz4 -dc - | tar -xf - -C $HOME/.archway/data

mv $HOME/.archway/priv_validator_state.json.backup $HOME/.archway/data/priv_validator_state.json

sudo systemctl restart archwayd
sudo journalctl -u archwayd -f --no-hostname -o cat
```


# State sync

### Info

**Public RPC endpoint:** [**https://archway-mainnet.rpc.l0vd.com**](https://archway-mainnet.rpc.l0vd.com)

**Public API:** [**https://archway-mainnet.api.l0vd.com**](https://archway-mainnet.api.l0vd.com)

### Guide to sync your node using State Sync:

#### Copy the entire command

```
sudo systemctl stop archwayd
SNAP_RPC="https://archway-mainnet.rpc.l0vd.com:443"; \
LATEST_HEIGHT=$(curl -s $SNAP_RPC/block | jq -r .result.block.header.height); \
BLOCK_HEIGHT=$((LATEST_HEIGHT - 2000)); \
TRUST_HASH=$(curl -s "$SNAP_RPC/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash); \
echo $LATEST_HEIGHT $BLOCK_HEIGHT $TRUST_HASH

sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \
s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"$SNAP_RPC,$SNAP_RPC\"| ; \
s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; \
s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"|" $HOME/.archway/config/config.toml

peers="@archway-mainnet.peers.l0vd.com:" \
&& sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.archway/config/config.toml 

archwayd tendermint unsafe-reset-all --home ~/.archway && sudo systemctl restart archwayd && journalctl -u archwayd -f --output cat
```

#### Turn off State Sync Mode after synchronization

```
sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1false|" $HOME/.archway/config/config.toml
```


# Useful commands

{% hint style="info" %}
Please note that the values in <> must be changed to your own values
{% endhint %}

### Keys

#### Add new key

```
archwayd keys add <key_name>
```

#### Recover keys from seed

```
archwayd keys add <key_name> --recover
```

#### Show all keys

```
archwayd keys list
```

#### Delete key

```
archwayd keys delete <key_name>
```

### Node configuration

#### Set custom port

*port 56 was taken as an example, you can use numbers from 1 to 64 to set custom node port*

```
ARCHWAY_PORT=56
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${ARCHWAY_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${ARCHWAY_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${ARCHWAY_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${ARCHWAY_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${ARCHWAY_PORT}660\"%" /$HOME/.archway/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${ARCHWAY_PORT}317\"%; s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${ARCHWAY_PORT}317\"%; s%^address = \":8080\"%address = \":${ARCHWAY_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${ARCHWAY_PORT}090\"%; s%^address = \"localhost:9090\"%address = \"localhost:${ARCHWAY_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${ARCHWAY_PORT}091\"%; s%^address = \"localhost:9091\"%address = \"localhost:${ARCHWAY_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${ARCHWAY_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${ARCHWAY_PORT}546\"%" /$HOME/.archway/config/app.toml
```

#### Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="10"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.archway/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.archway/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.archway/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.archway/config/app.toml
```

#### Disable indexing

```
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.archway/config/config.toml
```

#### Set minimum gas prices

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"1000000000000aarch\"/" $HOME/.archway/config/app.toml
```

### Validator configuration

#### Create validator

```
archwayd tx staking create-validator \
--amount 1000000aarch \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--pubkey $(archwayd tendermint show-validator) \
--moniker <ARCHWAY_NODENAME> \
--chain-id  \
--from <ARCHWAY_WALLET> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--gas-prices 1000000000000aarch \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### Edit validator

```
archwayd tx staking edit-validator \
--new-moniker <ARCHWAY_NODENAME> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--chain-id  \
--commission-rate 0.05 \
--from <ARCHWAY_WALLET> \
--gas-prices 1000000000000aarch \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### View validator info

```
archwayd q staking validator $(archwayd keys show <ARCHWAY_WALLET> --bech val -a)
```

#### Unjail validator

```
archwayd tx slashing unjail --from <ARCHWAY_WALLET> --chain-id  --gas-prices 1000000000000aarch --gas-adjustment 1.5 --gas auto --yes 
```

#### Signing info

```
archwayd query slashing signing-info $(archwayd tendermint show-validator)
```

### Token operations

#### Send tokens

```
archwayd tx bank send wallet <DEST_WALLET_ADDRESS> 100aarch --from <ARCHWAY_WALLET> --chain-id  --gas-prices 1000000000000aarch --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to your validator

```
archwayd tx staking delegate $(archwayd keys show <ARCHWAY_WALLET> --bech val -a) 100aarch --from <ARCHWAY_WALLET> --chain-id  --gas-prices 1000000000000aarch --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to another validator

```
archwayd tx staking delegate <VALOPER_ADDRESS> 100aarch --from <ARCHWAY_WALLET> --chain-id  --gas-prices 1000000000000aarch --gas-adjustment 1.5 --gas auto --yes
```

#### Redelegate tokens to another validator

```
archwayd tx staking redelegate $(archwayd keys show <ARCHWAY_WALLET> --bech val -a) <TO_VALOPER_ADDRESS> 100aarch --from <ARCHWAY_WALLET> --chain-id  --gas-prices 1000000000000aarch --gas-adjustment 1.5 --gas auto --yes
```

#### Unbond tokens from staking

```
archwayd tx staking unbond $(archwayd keys show <ARCHWAY_WALLET> --bech val -a) 100aarch --from <ARCHWAY_WALLET> --chain-id  --gas-prices 1000000000000aarch --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw all rewards from staking

```
archwayd tx distribution withdraw-all-rewards --from <ARCHWAY_WALLET> --chain-id  --gas-prices 1000000000000aarch --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw validator rewards and comission

```
archwayd tx distribution withdraw-rewards $(archwayd keys show <ARCHWAY_WALLET> --bech val -a) --commission --from wallet --chain-id  --gas-adjustment 1.5 --gas auto --gas-prices 1000000000000aarch -y

```

### Governance

#### Vote "YES"

```
archwayd tx gov vote <proposal_id> yes --from <ARCHWAY_WALLET> --chain-id  --gas-prices 1000000000000aarch --gas-adjustment 1.5 --gas auto --yes
```

#### Vote "NO"

```
archwayd tx gov vote <proposal_id> no --from <ARCHWAY_WALLET> --chain-id  --gas-prices 1000000000000aarch --gas-adjustment 1.5 --gas auto --yes
```

#### Abstain from voting

```
archwayd tx gov vote <proposal_id> abstain --from <ARCHWAY_WALLET> --chain-id  --gas-adjustment 1.5 --gas auto --gas-prices 1000000000000aarch -y
```

### General commands

#### Check node status

```
archwayd status | jq
```

#### Check service status

```
sudo systemctl status archwayd
```

#### Check logs

```
sudo journalctl -u archwayd -f --no-hostname -o cat
```

#### Restart service

```
sudo systemctl restart archwayd
```

#### Stop service

```
sudo systemctl stop archwayd
```

#### Start service

```
sudo systemctl start archwayd
```

#### Disable service

```
sudo systemctl disable archwayd
```

#### Enable service

```
sudo systemctl enable archwayd
```

#### Reload service after changes

```
sudo systemctl daemon-reload
```


# Monitoring

## Monitoring

Advantages of using our free service:

* Our monitoring service is working on dedicated server (24/7 online)
* No need to install database (InfluxDB)
* No need to install and configure Grafana Dashboard
* On Grafana dashboard you will find all necessary metrics of your node (we use this monitoring service by ourselves, so we've configured dashboard properly)

## One line installation:

```
. <(wget -qO- https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/archway/monitoring/archway-monitoring-install.sh)
```

## OR Manual installation of telegraf and monitoring script

Install telegraf

```
sudo apt update
sudo apt -y install curl jq bc

# install telegraf
wget https://dl.influxdata.com/telegraf/releases/telegraf_1.14.1-1_amd64.deb
dpkg -i telegraf_*.deb

sudo systemctl enable --now telegraf
sudo systemctl is-enabled telegraf

# make the telegraf user sudo and adm to be able to execute scripts as archway user
sudo adduser telegraf sudo
sudo adduser telegraf adm
sudo -- bash -c 'echo "telegraf ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers'
```

You can check telegraf service status:

```
sudo systemctl status telegraf
```

Status can be not ok with default Telegraf's config. Next steps will fix it.

Get files from this project repo and copy variable script template

```
cd $HOME
mkdir archway-mainnet-monitoring
cd archway-mainnet-monitoring
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/archway/monitoring/monitor.sh
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/archway/monitoring/telegraf.conf
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/archway/monitoring/variables.sh
```

```
nano variables.sh
```

Insert your parameters to **variables.sh**:

* full path to archway binary to COS\_BIN\_NAME ( check `which archwayd`)
* node PRC port to COS\_PORT\_RPC ( check in file `path_to_archway_node_config/config/config.toml`)
* node validator address to COS\_VALOPER ( like `archwayvaloper********`)

Save changes in variables.sh and enable execution permissions:

```
chmod +x monitor.sh variables.sh
```

Create telegraf service for archway-mainnet-node monitoring

```
cat > /etc/systemd/system/telegraf_archway_mainnet.service <<EOL
[Unit]
Description=The plugin-driven server agent for reporting metrics into InfluxDB
Documentation=https://github.com/influxdata/telegraf
After=network.target
[Service]
EnvironmentFile=-/etc/default/telegraf
User=telegraf
ExecStart=/usr/bin/telegraf -config /etc/telegraf/telegraf_archway_mainnet.conf -config-directory /etc/telegraf/telegraf.d $TELEGRAF_OPTS
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartForceExitStatus=SIGPIPE
KillMode=control-group
[Install]
WantedBy=multi-user.target
EOL
```

Edit telegraf configuration

```
sudo mv /etc/telegraf/telegraf.conf /etc/telegraf/telegraf.conf.orig
sudo mv telegraf_archway_mainnet.conf /etc/telegraf/telegraf_archway_mainnet.conf
```

Restart telegraf service

```
sudo systemctl daemon-reload
sudo systemctl enable telegraf_archway_mainnet
sudo systemctl restart telegraf_archway_mainnet
```

### Dashboard interface

Dashboard has main cosmos-based node information and common system metrics. There is a description for each metric.

Go to our comunity dashboard and select you node from the server list:

### [Dashboard link](https://monitoring-dashboards.l0vd.com/d/Archway_mainnet/archway-mainnet-monitoring-by-l0vd?orgId=1\&refresh=30s\&from=now-1h\&to=now)

![Screenshot\_1](https://user-images.githubusercontent.com/43213686/169405751-8ff53124-e128-4078-8d68-229a18ea4e25.png) ![Screenshot\_2](https://user-images.githubusercontent.com/43213686/169405777-eb9965a5-9fe8-4ecf-944b-4482c41c019b.png)

#### Mon health

Complex parameter can show problem concerning receiving metrics from node. Normal value is "OK"

#### Sync status

Node catching\_up parameter

#### Block height

Latest blockheight of node

#### Time since latest block

Time interval in seconds between taking the metric and node latest block time. Value greater 15s may indicate some kind of synchronization problem.

#### Peers

Number of connected peers

#### Jailed status

Validator jailed status.

#### Missed blocks

Number of missed blocks in 10000 blocks running window. If the validator misses more than 500 blocks, it will end up in jail.

#### Bonded status

Validator stake bonded info

#### Voting power

Validator voting power. If the value of this parameter is zero, your node isn't in the active pool of validators

#### Delegated tokens

Number of delegated tokens

#### Version

Version of archwayd binary

#### Vali Rank

Your node stake rank

#### Active validator numbers

Total number of active validators

#### Other common system metrics: CPU/RAM/FS load, etc.

No comments needed


# Wallet bot

<https://t.me/L0vdBot>

## Telegram Bot

The bot does several useful things.

1. Automatically adds validators you staked in to your watch list
2. Bot which will be useful for people who are using mobile devices and don't have access to Keplr to check the amount of tokens they have in differenet states (Delegated, Unbonding, Rewards, etc.)
3. Aggregates CONST token info and provides brief highlights regarding the token.
4. Shows all active validators, their comission and stake.
5. Shows latest proposals with current status.

To get started, add your wallet address. After that, you will be able to see the number of tokens in different states. In addition, the bot will automatically add validators that you delegated your tokens earlier to the Watchlist.

**Here is the full list of available commands:**\
/start - start working with bot (select Archway from network list)\
/menu - call menu buttons\
/help - list of commands

**List of available buttons in the menu:**\
💎 Token Info - Highlights of $CONST token\
💰 Balances - Shows the number of tokens for watchlist accounts\
➕ Add - Add account or validator to watchlist\
➖ Delete - Delete account or validator from watchlist\
🔍 Watchlist - List of your accounts and validators\
👷 Validators - List of active validators\
📢 Proposals - List of proposals\
📂 Help - List of commands\
📚 Menu - Call menu buttons

## Screenshots

**Start**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/nois/start.png)\
**Token Info**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/nois/token_info.png?raw=true)\
**Balance Mode**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/nois/balance.png?raw=true)\
**Watchlist Mode**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/nois/watchlist.png?raw=true) **Validators Mode**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/nois/validators.png)\
**Proposals Mode**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/nois/proposals.png?raw=true)\
**Help**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/nois/help.png?raw=true)


# Axelar

**Overview**

Axelar delivers secure cross-chain communication for Web3. Axelar infrastructure enables dApp users to interact with any asset or application, on any chain, with one click.

**Official links**

[Website](https://axelar.network/) | [Twitter](https://twitter.com/axelarcore) | [Discord](https://discord.gg/axelar) | [Github](https://github.com/axelarnetwork)

**Chain info**

|                |   |
| -------------- | - |
| Chain-id       |   |
| Binary name    | d |
| Binary version | v |

**Explorer**

<https://explorers.l0vd.com/axelar-mainnet>

**Public Endpoints**

RPC <https://axelar-mainnet.rpc.l0vd.com>

API <https://axelar-mainnet.api.l0vd.com>

GRPC

```
axelar-mainnet.grpc.l0vd.com:80
```

PEER

```
@axelar-mainnet.peers.l0vd.com:
```


# Installation

If you want to setup Axelar fullnode manually follow the steps below

## Update and upgrade

```
sudo apt update && sudo apt upgrade -y
```

## Install GO

```
if ! [ -x "$(command -v go)" ]; then
  ver="1.19.3"
  cd $HOME
  wget "https://golang.org/dl/go$ver.linux-amd64.tar.gz"
  sudo rm -rf /usr/local/go
  sudo tar -C /usr/local -xzf "go$ver.linux-amd64.tar.gz"
  rm "go$ver.linux-amd64.tar.gz"
  echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> ~/.bash_profile
  source ~/.bash_profile
fi
```

## Install node

```
cd $HOME
rm -rf axelar-core
git clone https://github.com/axelarnetwork/axelar-core.git
cd axelar-core
git checkout v
make install
```

## Setting up vars

You should replace values in <>\
\<YOUR\_MONIKER> Here you should put name of your moniker (validator) that will be visible in explorer\
\<YOUR\_WALLET> Here you shoud put the name of your wallet

```
AXELAR_WALLET="<YOUR_WALLET_NAME>"
AXELAR_NODENAME="<YOUR_MONIKER>"
AXELAR_CHAIN_ID=""
```

```
echo "
export AXELAR_WALLET=${AXELAR_WALLET}
export AXELAR_NODENAME=${AXELAR_NODENAME}
export AXELAR_CHAIN_ID=${AXELAR_CHAIN_ID}
" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

## Configure your node

```
d config chain-id ${AXELAR_CHAIN_ID}
```

## Initialize your node

```
d init ${AXELAR_NODENAME} --chain-id ${AXELAR_CHAIN_ID}
```

## Download genesis & addrbook

```
curl -Ls "https://snapshots.l0vd.com/axelar-mainnet/genesis.json" > $HOME/.axelar/config/genesis.json
curl -Ls "https://snapshots.l0vd.com/axelar-mainnet/addrbook.json" > $HOME/.axelar/config/addrbook.json
```

## (OPTIONAL) Set custom ports

### If you want to use non-default ports

```
AXELAR_PORT=<SET_CUSTOM_PORT> #Example: AXELAR_PORT=56 (numbers from 1 to 64)
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${AXELAR_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${AXELAR_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${AXELAR_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${AXELAR_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${AXELAR_PORT}660\"%" /$HOME/.axelar/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${AXELAR_PORT}317\"%; s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${AXELAR_PORT}317\"%; s%^address = \":8080\"%address = \":${AXELAR_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${AXELAR_PORT}090\"%; s%^address = \"localhost:9090\"%address = \"localhost:${AXELAR_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${AXELAR_PORT}091\"%; s%^address = \"localhost:9091\"%address = \"localhost:${AXELAR_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${AXELAR_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${AXELAR_PORT}546\"%" /$HOME/.axelar/config/app.toml
```

```
d config node tcp://localhost:${AXELAR_PORT}657
```

## Set seeds and peers

```
PEERS="@axelar-mainnet.peers.l0vd.com:"
sed -i -e "s/^seeds *=.*/seeds = \"$SEEDS\"/; s/^persistent_peers *=.*/persistent_peers = \"$PEERS\"/" $HOME/.axelar/config/config.toml
```

## Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="50"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.axelar/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.axelar/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.axelar/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.axelar/config/app.toml
```

## Set minimum gas price and null indexer

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.007uaxl\"/" $HOME/.axelar/config/app.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.axelar/config/config.toml
```

## Create Service

```
sudo tee /etc/systemd/system/d.service > /dev/null <<EOF
[Unit]
Description=Axelar mainnet
After=network-online.target

[Service]
User=$USER
ExecStart=$(which d) start
Restart=on-failure
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF
```

## Reset blockchain info and restart your node

```
sudo systemctl daemon-reload
sudo systemctl enable d
d tendermint unsafe-reset-all --home $HOME/.axelar --keep-addr-book
sudo systemctl restart d && sudo journalctl -u d -f -o cat
```

## (OPTIONAL) Use State Sync

### [State Sync](/mainnets/axelar/installation-guide)

## Starting a validator

### 1. Add a new key

```
d keys add ${AXELAR_WALLET}
```

#### (OR)

### 1. Recover your key

```
d keys add ${AXELAR_WALLET} --recover
```

```
AXELAR_WALLET_ADDR=$(d keys show ${AXELAR_WALLET} -a)
echo "export AXELAR_WALLET_ADDR=${AXELAR_WALLET_ADDR}" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

## 2. Create validator

{% hint style="info" %}
Wait until the node is synchronized.
{% endhint %}

```
d tx staking create-validator \
--amount 1000000uaxl \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--details "" \
--pubkey $(d tendermint show-validator) \
--moniker ${AXELAR_NODENAME} \
--chain-id ${AXELAR_CHAIN_ID} \
--from ${AXELAR_WALLET_ADDR} \
--gas-prices 0.007uaxl \
--gas-adjustment 1.5 \
--gas auto \
--yes
```


# Snapshot


# State sync

### Info

**Public RPC endpoint:** [**https://axelar-mainnet.rpc.l0vd.com**](https://axelar-mainnet.rpc.l0vd.com)

**Public API:** [**https://axelar-mainnet.api.l0vd.com**](https://axelar-mainnet.api.l0vd.com)

### Guide to sync your node using State Sync:

#### Copy the entire command

```
sudo systemctl stop d
SNAP_RPC="https://axelar-mainnet.rpc.l0vd.com:443"; \
LATEST_HEIGHT=$(curl -s $SNAP_RPC/block | jq -r .result.block.header.height); \
BLOCK_HEIGHT=$((LATEST_HEIGHT - 2000)); \
TRUST_HASH=$(curl -s "$SNAP_RPC/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash); \
echo $LATEST_HEIGHT $BLOCK_HEIGHT $TRUST_HASH

sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \
s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"$SNAP_RPC,$SNAP_RPC\"| ; \
s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; \
s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"|" $HOME/.axelar/config/config.toml

peers="@axelar-mainnet.peers.l0vd.com:" \
&& sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.axelar/config/config.toml 

d tendermint unsafe-reset-all --home ~/.axelar && sudo systemctl restart d && journalctl -u d -f --output cat
```

#### Turn off State Sync Mode after synchronization

```
sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1false|" $HOME/.axelar/config/config.toml
```


# Useful commands

{% hint style="info" %}
Please note that the values in <> must be changed to your own values
{% endhint %}

### Keys

#### Add new key

```
d keys add <key_name>
```

#### Recover keys from seed

```
d keys add <key_name> --recover
```

#### Show all keys

```
d keys list
```

#### Delete key

```
d keys delete <key_name>
```

### Node configuration

#### Set custom port

*port 56 was taken as an example, you can use numbers from 1 to 64 to set custom node port*

```
AXELAR_PORT=56
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${AXELAR_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${AXELAR_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${AXELAR_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${AXELAR_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${AXELAR_PORT}660\"%" /$HOME/.axelar/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${AXELAR_PORT}317\"%; s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${AXELAR_PORT}317\"%; s%^address = \":8080\"%address = \":${AXELAR_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${AXELAR_PORT}090\"%; s%^address = \"localhost:9090\"%address = \"localhost:${AXELAR_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${AXELAR_PORT}091\"%; s%^address = \"localhost:9091\"%address = \"localhost:${AXELAR_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${AXELAR_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${AXELAR_PORT}546\"%" /$HOME/.axelar/config/app.toml
```

#### Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="10"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.axelar/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.axelar/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.axelar/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.axelar/config/app.toml
```

#### Disable indexing

```
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.axelar/config/config.toml
```

#### Set minimum gas prices

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.007uaxl\"/" $HOME/.axelar/config/app.toml
```

### Validator configuration

#### Create validator

```
d tx staking create-validator \
--amount 1000000uaxl \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--pubkey $(d tendermint show-validator) \
--moniker <AXELAR_NODENAME> \
--chain-id  \
--from <AXELAR_WALLET> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--gas-prices 0.007uaxl \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### Edit validator

```
d tx staking edit-validator \
--new-moniker <AXELAR_NODENAME> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--chain-id  \
--commission-rate 0.05 \
--from <AXELAR_WALLET> \
--gas-prices 0.007uaxl \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### View validator info

```
d q staking validator $(d keys show <AXELAR_WALLET> --bech val -a)
```

#### Unjail validator

```
d tx slashing unjail --from <AXELAR_WALLET> --chain-id  --gas-prices 0.007uaxl --gas-adjustment 1.5 --gas auto --yes 
```

#### Signing info

```
d query slashing signing-info $(d tendermint show-validator)
```

### Token operations

#### Send tokens

```
d tx bank send wallet <DEST_WALLET_ADDRESS> 100uaxl --from <AXELAR_WALLET> --chain-id  --gas-prices 0.007uaxl --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to your validator

```
d tx staking delegate $(d keys show <AXELAR_WALLET> --bech val -a) 100uaxl --from <AXELAR_WALLET> --chain-id  --gas-prices 0.007uaxl --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to another validator

```
d tx staking delegate <VALOPER_ADDRESS> 100uaxl --from <AXELAR_WALLET> --chain-id  --gas-prices 0.007uaxl --gas-adjustment 1.5 --gas auto --yes
```

#### Redelegate tokens to another validator

```
d tx staking redelegate $(d keys show <AXELAR_WALLET> --bech val -a) <TO_VALOPER_ADDRESS> 100uaxl --from <AXELAR_WALLET> --chain-id  --gas-prices 0.007uaxl --gas-adjustment 1.5 --gas auto --yes
```

#### Unbond tokens from staking

```
d tx staking unbond $(d keys show <AXELAR_WALLET> --bech val -a) 100uaxl --from <AXELAR_WALLET> --chain-id  --gas-prices 0.007uaxl --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw all rewards from staking

```
d tx distribution withdraw-all-rewards --from <AXELAR_WALLET> --chain-id  --gas-prices 0.007uaxl --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw validator rewards and comission

```
d tx distribution withdraw-rewards $(d keys show <AXELAR_WALLET> --bech val -a) --commission --from wallet --chain-id  --gas-adjustment 1.5 --gas auto --gas-prices 0.007uaxl -y

```

### Governance

#### Vote "YES"

```
d tx gov vote <proposal_id> yes --from <AXELAR_WALLET> --chain-id  --gas-prices 0.007uaxl --gas-adjustment 1.5 --gas auto --yes
```

#### Vote "NO"

```
d tx gov vote <proposal_id> no --from <AXELAR_WALLET> --chain-id  --gas-prices 0.007uaxl --gas-adjustment 1.5 --gas auto --yes
```

#### Abstain from voting

```
d tx gov vote <proposal_id> abstain --from <AXELAR_WALLET> --chain-id  --gas-adjustment 1.5 --gas auto --gas-prices 0.007uaxl -y
```

### General commands

#### Check node status

```
d status | jq
```

#### Check service status

```
sudo systemctl status d
```

#### Check logs

```
sudo journalctl -u d -f --no-hostname -o cat
```

#### Restart service

```
sudo systemctl restart d
```

#### Stop service

```
sudo systemctl stop d
```

#### Start service

```
sudo systemctl start d
```

#### Disable service

```
sudo systemctl disable d
```

#### Enable service

```
sudo systemctl enable d
```

#### Reload service after changes

```
sudo systemctl daemon-reload
```


# Monitoring

## Monitoring

Advantages of using our free service:

* Our monitoring service is working on dedicated server (24/7 online)
* No need to install database (InfluxDB)
* No need to install and configure Grafana Dashboard
* On Grafana dashboard you will find all necessary metrics of your node (we use this monitoring service by ourselves, so we've configured dashboard properly)

## One line installation:

```
. <(wget -qO- https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/axelar/monitoring/axelar-monitoring-install.sh)
```

## OR Manual installation of telegraf and monitoring script

Install telegraf

```
sudo apt update
sudo apt -y install curl jq bc

# install telegraf
wget https://dl.influxdata.com/telegraf/releases/telegraf_1.14.1-1_amd64.deb
dpkg -i telegraf_*.deb

sudo systemctl enable --now telegraf
sudo systemctl is-enabled telegraf

# make the telegraf user sudo and adm to be able to execute scripts as axelar user
sudo adduser telegraf sudo
sudo adduser telegraf adm
sudo -- bash -c 'echo "telegraf ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers'
```

You can check telegraf service status:

```
sudo systemctl status telegraf
```

Status can be not ok with default Telegraf's config. Next steps will fix it.

Get files from this project repo and copy variable script template

```
cd $HOME
mkdir axelar-mainnet-monitoring
cd axelar-mainnet-monitoring
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/axelar/monitoring/monitor.sh
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/axelar/monitoring/telegraf.conf
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/axelar/monitoring/variables.sh
```

```
nano variables.sh
```

Insert your parameters to **variables.sh**:

* full path to axelar binary to COS\_BIN\_NAME ( check `which d`)
* node PRC port to COS\_PORT\_RPC ( check in file `path_to_axelar_node_config/config/config.toml`)
* node validator address to COS\_VALOPER ( like `axelarvaloper********`)

Save changes in variables.sh and enable execution permissions:

```
chmod +x monitor.sh variables.sh
```

Create telegraf service for axelar-mainnet-node monitoring

```
cat > /etc/systemd/system/telegraf_axelar_mainnet.service <<EOL
[Unit]
Description=The plugin-driven server agent for reporting metrics into InfluxDB
Documentation=https://github.com/influxdata/telegraf
After=network.target
[Service]
EnvironmentFile=-/etc/default/telegraf
User=telegraf
ExecStart=/usr/bin/telegraf -config /etc/telegraf/telegraf_axelar_mainnet.conf -config-directory /etc/telegraf/telegraf.d $TELEGRAF_OPTS
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartForceExitStatus=SIGPIPE
KillMode=control-group
[Install]
WantedBy=multi-user.target
EOL
```

Edit telegraf configuration

```
sudo mv /etc/telegraf/telegraf.conf /etc/telegraf/telegraf.conf.orig
sudo mv telegraf_axelar_mainnet.conf /etc/telegraf/telegraf_axelar_mainnet.conf
```

Restart telegraf service

```
sudo systemctl daemon-reload
sudo systemctl enable telegraf_axelar_mainnet
sudo systemctl restart telegraf_axelar_mainnet
```

### Dashboard interface

Dashboard has main cosmos-based node information and common system metrics. There is a description for each metric.

Go to our comunity dashboard and select you node from the server list:

### [Dashboard link](https://monitoring-dashboards.l0vd.com/d/Axelar_mainnet/axelar-mainnet-monitoring-by-l0vd?orgId=1\&refresh=30s\&from=now-1h\&to=now)

![Screenshot\_1](https://user-images.githubusercontent.com/43213686/169405751-8ff53124-e128-4078-8d68-229a18ea4e25.png) ![Screenshot\_2](https://user-images.githubusercontent.com/43213686/169405777-eb9965a5-9fe8-4ecf-944b-4482c41c019b.png)

#### Mon health

Complex parameter can show problem concerning receiving metrics from node. Normal value is "OK"

#### Sync status

Node catching\_up parameter

#### Block height

Latest blockheight of node

#### Time since latest block

Time interval in seconds between taking the metric and node latest block time. Value greater 15s may indicate some kind of synchronization problem.

#### Peers

Number of connected peers

#### Jailed status

Validator jailed status.

#### Missed blocks

Number of missed blocks in 10000 blocks running window. If the validator misses more than 500 blocks, it will end up in jail.

#### Bonded status

Validator stake bonded info

#### Voting power

Validator voting power. If the value of this parameter is zero, your node isn't in the active pool of validators

#### Delegated tokens

Number of delegated tokens

#### Version

Version of d binary

#### Vali Rank

Your node stake rank

#### Active validator numbers

Total number of active validators

#### Other common system metrics: CPU/RAM/FS load, etc.

No comments needed


# Berachain

**Overview**

Berachain is a high-performance EVM-compatible blockchain built on Proof-of-Liquidity consensus.

**Official links**

[Website](https://www.berachain.com/) | [Twitter](https://x.com/berachain) | [Discord](https://discord.com/invite/berachain) | [Github](https://github.com/berachain)

**Chain info**

|                             |                      |
| --------------------------- | -------------------- |
| Chain-id                    | mainnet-beacon-80094 |
| Binary name                 | beacond              |
| CL Binary version (beacond) | v1.1.1               |
| EL Binary version (reth)    | 1.1.5                |

**Explorer**

<https://berascan.com/>

**Public Endpoints**

Consensus layer RPC <https://berachain-mainnet-eu-cl-1.rpc.l0vd.com/>

Beacon Endpoint <https://berachain-mainnet-eu-beacon-1.rpc.l0vd.com/>

Execution layer RPC [https://berachain-mainnet-eu-el-1.rpc.l0vd.com/](https://github.com/L0vd/chain-services/blob/main/mainnets/berachain/berachain-mainnet-eu-el-1.rpc.l0vd.com)


# Snapshot

## Snapshot

### Updates every 4 hours

### Install dependencies, if needed

```
sudo apt update
sudo apt install lz4 -y
```

### Sync from Snapshot ⚠️ (Pebbledb)

| Height   | Size     | Pruning | Indexer | Creation Time (UTC+3) |
| -------- | -------- | ------- | ------- | --------------------- |
| 19108642 | 290.14GB | 1000    | kv      | 2026-04-03T16:15:05   |

```
sudo systemctl stop beacond

cp $HOME/.beacond_mainnet_public/data/priv_validator_state.json $HOME/.beacond_mainnet_public/priv_validator_state.json.backup
${BINARY_NAME} tendermint unsafe-reset-all --home $HOME/.beacond_mainnet_public --keep-addr-book

rm -rf $HOME/.beacond_mainnet_public/data 

SNAP_NAME=$(curl -s https://bera-snapshots.l0vd.com/mainnets/berachain/mainnet-beacon-80094/ | egrep -o ">mainnet-beacon-80094.*\.tar.lz4" | tr -d ">")
curl https://bera-snapshots.l0vd.com/mainnets/berachain/mainnet-beacon-80094/${SNAP_NAME} | lz4 -dc - | tar -xf - -C $HOME/.beacond_mainnet_public

mv $HOME/.beacond_mainnet_public/priv_validator_state.json.backup $HOME/.beacond_mainnet_public/data/priv_validator_state.json

sudo systemctl restart beacond
sudo journalctl -u beacond -f --no-hostname -o cat
```

## Reth Snapshot

### Updates every 4 hours

### Install dependencies, if needed

```
sudo apt update
sudo apt install lz4 -y
```

### Sync from Snapshot

| Height   | Size     | State | Txs | Creation Time (UTC+3) |
| -------- | -------- | ----- | --- | --------------------- |
| 19109094 | 237.76GB | all   | all | 2026-07-11T08:12:08   |

```
mkdir $HOME/geth_snapshot
SNAP_NAME=$(curl -s https://bera-snapshots.l0vd.com/mainnets/berachain/80094/ | egrep -o ">80094.*\.tar.lz4" | tr -d ">")
curl https://bera-snapshots.l0vd.com/mainnets/berachain/80094/${SNAP_NAME} | lz4 -dc - | tar -xf - -C $HOME/reth_snapshot
```


# Bitcanna

**Overview**

BitCanna provides a decentralized payment network and supply chain for the legal cannabis industry.

**Official links**

[Website](https://www.bitcanna.io/) | [Twitter](https://twitter.com/BitcannaGlobal) | [Discord](https://discord.gg/97wUcHqxxE) | [Github](https://github.com/BitCannaGlobal)

**Chain info**

|                |   |
| -------------- | - |
| Chain-id       |   |
| Binary name    | d |
| Binary version | v |

**Explorer**

<https://explorers.l0vd.com/bitcanna-mainnet>

**Public Endpoints**

RPC <https://bitcanna-mainnet.rpc.l0vd.com>

API <https://bitcanna-mainnet.api.l0vd.com>

GRPC

```
bitcanna-mainnet.grpc.l0vd.com:80
```

PEER

```
@bitcanna-mainnet.peers.l0vd.com:
```


# Installation

If you want to setup Bitcanna fullnode manually follow the steps below

## Update and upgrade

```
sudo apt update && sudo apt upgrade -y
```

## Install GO

```
if ! [ -x "$(command -v go)" ]; then
  ver="1.19.3"
  cd $HOME
  wget "https://golang.org/dl/go$ver.linux-amd64.tar.gz"
  sudo rm -rf /usr/local/go
  sudo tar -C /usr/local -xzf "go$ver.linux-amd64.tar.gz"
  rm "go$ver.linux-amd64.tar.gz"
  echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> ~/.bash_profile
  source ~/.bash_profile
fi
```

## Install node

```
cd $HOME
rm -rf bcna
git clone https://github.com/BitCannaGlobal/bcna.git
cd bcna
git checkout v
make install
```

## Setting up vars

You should replace values in <>\
\<YOUR\_MONIKER> Here you should put name of your moniker (validator) that will be visible in explorer\
\<YOUR\_WALLET> Here you shoud put the name of your wallet

```
BITCANNA_WALLET="<YOUR_WALLET_NAME>"
BITCANNA_NODENAME="<YOUR_MONIKER>"
BITCANNA_CHAIN_ID=""
```

```
echo "
export BITCANNA_WALLET=${BITCANNA_WALLET}
export BITCANNA_NODENAME=${BITCANNA_NODENAME}
export BITCANNA_CHAIN_ID=${BITCANNA_CHAIN_ID}
" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

## Configure your node

```
d config chain-id ${BITCANNA_CHAIN_ID}
```

## Initialize your node

```
d init ${BITCANNA_NODENAME} --chain-id ${BITCANNA_CHAIN_ID}
```

## Download genesis & addrbook

```
curl -Ls "https://snapshots.l0vd.com/bitcanna-mainnet/genesis.json" > $HOME/.bcna/config/genesis.json
curl -Ls "https://snapshots.l0vd.com/bitcanna-mainnet/addrbook.json" > $HOME/.bcna/config/addrbook.json
```

## (OPTIONAL) Set custom ports

### If you want to use non-default ports

```
BITCANNA_PORT=<SET_CUSTOM_PORT> #Example: BITCANNA_PORT=56 (numbers from 1 to 64)
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${BITCANNA_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${BITCANNA_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${BITCANNA_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${BITCANNA_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${BITCANNA_PORT}660\"%" /$HOME/.bcna/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${BITCANNA_PORT}317\"%; s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${BITCANNA_PORT}317\"%; s%^address = \":8080\"%address = \":${BITCANNA_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${BITCANNA_PORT}090\"%; s%^address = \"localhost:9090\"%address = \"localhost:${BITCANNA_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${BITCANNA_PORT}091\"%; s%^address = \"localhost:9091\"%address = \"localhost:${BITCANNA_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${BITCANNA_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${BITCANNA_PORT}546\"%" /$HOME/.bcna/config/app.toml
```

```
d config node tcp://localhost:${BITCANNA_PORT}657
```

## Set seeds and peers

```
PEERS="@bitcanna-mainnet.peers.l0vd.com:"
sed -i -e "s/^seeds *=.*/seeds = \"$SEEDS\"/; s/^persistent_peers *=.*/persistent_peers = \"$PEERS\"/" $HOME/.bcna/config/config.toml
```

## Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="50"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.bcna/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.bcna/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.bcna/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.bcna/config/app.toml
```

## Set minimum gas price and null indexer

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0\"/" $HOME/.bcna/config/app.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.bcna/config/config.toml
```

## Create Service

```
sudo tee /etc/systemd/system/d.service > /dev/null <<EOF
[Unit]
Description=Bitcanna mainnet
After=network-online.target

[Service]
User=$USER
ExecStart=$(which d) start
Restart=on-failure
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF
```

## Reset blockchain info and restart your node

```
sudo systemctl daemon-reload
sudo systemctl enable d
d tendermint unsafe-reset-all --home $HOME/.bcna --keep-addr-book
sudo systemctl restart d && sudo journalctl -u d -f -o cat
```

## (OPTIONAL) Use State Sync

### [State Sync](/mainnets/bitcanna/installation-guide)

## Starting a validator

### 1. Add a new key

```
d keys add ${BITCANNA_WALLET}
```

#### (OR)

### 1. Recover your key

```
d keys add ${BITCANNA_WALLET} --recover
```

```
BITCANNA_WALLET_ADDR=$(d keys show ${BITCANNA_WALLET} -a)
echo "export BITCANNA_WALLET_ADDR=${BITCANNA_WALLET_ADDR}" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

## 2. Create validatorWait until the node is synchronized.

```
d tx staking create-validator \
--amount 1000000 \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--details "" \
--pubkey $(d tendermint show-validator) \
--moniker ${BITCANNA_NODENAME} \
--chain-id ${BITCANNA_CHAIN_ID} \
--from ${BITCANNA_WALLET_ADDR} \
--gas-prices 0 \
--gas-adjustment 1.5 \
--gas auto \
--yes
```


# Snapshot

## Updates every 4 hours

## Install dependencies, if needed

```
sudo apt update
sudo apt install lz4 -y
```

## Sync from Snapshot

| Height   | Size   | Pruning         | Indexer | Creation Time (UTC+3) |
| -------- | ------ | --------------- | ------- | --------------------- |
| 14946159 | 0.55GB | custom/100/0/10 | null    | 2024-07-24T20:10:38   |

```
sudo systemctl stop bcnad

cp $HOME/.bcna/data/priv_validator_state.json $HOME/.bcna/priv_validator_state.json.backup
${BINARY_NAME} tendermint unsafe-reset-all --home $HOME/.bcna --keep-addr-book

rm -rf $HOME/.bcna/data 

SNAP_NAME=$(curl -s https://snapshots.l0vd.com/mainnets/bitcanna/bitcanna-1/ | egrep -o ">bitcanna-1.*\.tar.lz4" | tr -d ">")
curl https://snapshots.l0vd.com/mainnets/bitcanna/bitcanna-1/${SNAP_NAME} | lz4 -dc - | tar -xf - -C $HOME/.bcna/data

mv $HOME/.bcna/priv_validator_state.json.backup $HOME/.bcna/data/priv_validator_state.json

sudo systemctl restart bcnad
sudo journalctl -u bcnad -f --no-hostname -o cat
```


# State sync

### Info

**Public RPC endpoint:** [**https://bitcanna-mainnet.rpc.l0vd.com**](https://bitcanna-mainnet.rpc.l0vd.com)

**Public API:** [**https://bitcanna-mainnet.api.l0vd.com**](https://bitcanna-mainnet.api.l0vd.com)

### Guide to sync your node using State Sync:

#### Copy the entire command

```
sudo systemctl stop d
SNAP_RPC="https://bitcanna-mainnet.rpc.l0vd.com:443"; \
LATEST_HEIGHT=$(curl -s $SNAP_RPC/block | jq -r .result.block.header.height); \
BLOCK_HEIGHT=$((LATEST_HEIGHT - 2000)); \
TRUST_HASH=$(curl -s "$SNAP_RPC/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash); \
echo $LATEST_HEIGHT $BLOCK_HEIGHT $TRUST_HASH

sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \
s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"$SNAP_RPC,$SNAP_RPC\"| ; \
s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; \
s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"|" $HOME/.bcna/config/config.toml

peers="@bitcanna-mainnet.peers.l0vd.com:" \
&& sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.bcna/config/config.toml 

d tendermint unsafe-reset-all --home ~/.bcna && sudo systemctl restart d && journalctl -u d -f --output cat
```

#### Turn off State Sync Mode after synchronization

```
sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1false|" $HOME/.bcna/config/config.toml
```


# Useful commands

{% hint style="info" %}
Please note that the values in <> must be changed to your own values
{% endhint %}

### Keys

#### Add new key

```
d keys add <key_name>
```

#### Recover keys from seed

```
d keys add <key_name> --recover
```

#### Show all keys

```
d keys list
```

#### Delete key

```
d keys delete <key_name>
```

### Node configuration

#### Set custom port

*port 56 was taken as an example, you can use numbers from 1 to 64 to set custom node port*

```
BITCANNA_PORT=56
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${BITCANNA_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${BITCANNA_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${BITCANNA_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${BITCANNA_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${BITCANNA_PORT}660\"%" /$HOME/.bcna/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${BITCANNA_PORT}317\"%; s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${BITCANNA_PORT}317\"%; s%^address = \":8080\"%address = \":${BITCANNA_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${BITCANNA_PORT}090\"%; s%^address = \"localhost:9090\"%address = \"localhost:${BITCANNA_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${BITCANNA_PORT}091\"%; s%^address = \"localhost:9091\"%address = \"localhost:${BITCANNA_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${BITCANNA_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${BITCANNA_PORT}546\"%" /$HOME/.bcna/config/app.toml
```

#### Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="10"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.bcna/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.bcna/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.bcna/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.bcna/config/app.toml
```

#### Disable indexing

```
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.bcna/config/config.toml
```

#### Set minimum gas prices

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0\"/" $HOME/.bcna/config/app.toml
```

### Validator configuration

#### Create validator

```
d tx staking create-validator \
--amount 1000000 \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--pubkey $(d tendermint show-validator) \
--moniker <BITCANNA_NODENAME> \
--chain-id  \
--from <BITCANNA_WALLET> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--gas-prices 0 \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### Edit validator

```
d tx staking edit-validator \
--new-moniker <BITCANNA_NODENAME> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--chain-id  \
--commission-rate 0.05 \
--from <BITCANNA_WALLET> \
--gas-prices 0 \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### View validator info

```
d q staking validator $(d keys show <BITCANNA_WALLET> --bech val -a)
```

#### Unjail validator

```
d tx slashing unjail --from <BITCANNA_WALLET> --chain-id  --gas-prices 0 --gas-adjustment 1.5 --gas auto --yes 
```

#### Signing info

```
d query slashing signing-info $(d tendermint show-validator)
```

### Token operations

#### Send tokens

```
d tx bank send wallet <DEST_WALLET_ADDRESS> 100 --from <BITCANNA_WALLET> --chain-id  --gas-prices 0 --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to your validator

```
d tx staking delegate $(d keys show <BITCANNA_WALLET> --bech val -a) 100 --from <BITCANNA_WALLET> --chain-id  --gas-prices 0 --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to another validator

```
d tx staking delegate <VALOPER_ADDRESS> 100 --from <BITCANNA_WALLET> --chain-id  --gas-prices 0 --gas-adjustment 1.5 --gas auto --yes
```

#### Redelegate tokens to another validator

```
d tx staking redelegate $(d keys show <BITCANNA_WALLET> --bech val -a) <TO_VALOPER_ADDRESS> 100 --from <BITCANNA_WALLET> --chain-id  --gas-prices 0 --gas-adjustment 1.5 --gas auto --yes
```

#### Unbond tokens from staking

```
d tx staking unbond $(d keys show <BITCANNA_WALLET> --bech val -a) 100 --from <BITCANNA_WALLET> --chain-id  --gas-prices 0 --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw all rewards from staking

```
d tx distribution withdraw-all-rewards --from <BITCANNA_WALLET> --chain-id  --gas-prices 0 --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw validator rewards and comission

```
d tx distribution withdraw-rewards $(d keys show <BITCANNA_WALLET> --bech val -a) --commission --from wallet --chain-id  --gas-adjustment 1.5 --gas auto --gas-prices 0 -y

```

### Governance

#### Vote "YES"

```
d tx gov vote <proposal_id> yes --from <BITCANNA_WALLET> --chain-id  --gas-prices 0 --gas-adjustment 1.5 --gas auto --yes
```

#### Vote "NO"

```
d tx gov vote <proposal_id> no --from <BITCANNA_WALLET> --chain-id  --gas-prices 0 --gas-adjustment 1.5 --gas auto --yes
```

#### Abstain from voting

```
d tx gov vote <proposal_id> abstain --from <BITCANNA_WALLET> --chain-id  --gas-adjustment 1.5 --gas auto --gas-prices 0 -y
```

### General commands

#### Check node status

```
d status | jq
```

#### Check service status

```
sudo systemctl status d
```

#### Check logs

```
sudo journalctl -u d -f --no-hostname -o cat
```

#### Restart service

```
sudo systemctl restart d
```

#### Stop service

```
sudo systemctl stop d
```

#### Start service

```
sudo systemctl start d
```

#### Disable service

```
sudo systemctl disable d
```

#### Enable service

```
sudo systemctl enable d
```

#### Reload service after changes

```
sudo systemctl daemon-reload
```


# Monitoring

## Monitoring

Advantages of using our free service:

* Our monitoring service is working on dedicated server (24/7 online)
* No need to install database (InfluxDB)
* No need to install and configure Grafana Dashboard
* On Grafana dashboard you will find all necessary metrics of your node (we use this monitoring service by ourselves, so we've configured dashboard properly)

## One line installation:

```
. <(wget -qO- https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/bitcanna/monitoring/bitcanna-monitoring-install.sh)
```

## OR Manual installation of telegraf and monitoring script

Install telegraf

```
sudo apt update
sudo apt -y install curl jq bc

# install telegraf
wget https://dl.influxdata.com/telegraf/releases/telegraf_1.14.1-1_amd64.deb
dpkg -i telegraf_*.deb

sudo systemctl enable --now telegraf
sudo systemctl is-enabled telegraf

# make the telegraf user sudo and adm to be able to execute scripts as bitcanna user
sudo adduser telegraf sudo
sudo adduser telegraf adm
sudo -- bash -c 'echo "telegraf ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers'
```

You can check telegraf service status:

```
sudo systemctl status telegraf
```

Status can be not ok with default Telegraf's config. Next steps will fix it.

Get files from this project repo and copy variable script template

```
cd $HOME
mkdir bitcanna-mainnet-monitoring
cd bitcanna-mainnet-monitoring
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/bitcanna/monitoring/monitor.sh
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/bitcanna/monitoring/telegraf.conf
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/bitcanna/monitoring/variables.sh
```

```
nano variables.sh
```

Insert your parameters to **variables.sh**:

* full path to bitcanna binary to COS\_BIN\_NAME ( check `which d`)
* node PRC port to COS\_PORT\_RPC ( check in file `path_to_bitcanna_node_config/config/config.toml`)
* node validator address to COS\_VALOPER ( like `valoper********`)

Save changes in variables.sh and enable execution permissions:

```
chmod +x monitor.sh variables.sh
```

Create telegraf service for bitcanna-mainnet-node monitoring

```
cat > /etc/systemd/system/telegraf_bitcanna_mainnet.service <<EOL
[Unit]
Description=The plugin-driven server agent for reporting metrics into InfluxDB
Documentation=https://github.com/influxdata/telegraf
After=network.target
[Service]
EnvironmentFile=-/etc/default/telegraf
User=telegraf
ExecStart=/usr/bin/telegraf -config /etc/telegraf/telegraf_bitcanna_mainnet.conf -config-directory /etc/telegraf/telegraf.d $TELEGRAF_OPTS
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartForceExitStatus=SIGPIPE
KillMode=control-group
[Install]
WantedBy=multi-user.target
EOL
```

Edit telegraf configuration

```
sudo mv /etc/telegraf/telegraf.conf /etc/telegraf/telegraf.conf.orig
sudo mv telegraf_bitcanna_mainnet.conf /etc/telegraf/telegraf_bitcanna_mainnet.conf
```

Restart telegraf service

```
sudo systemctl daemon-reload
sudo systemctl enable telegraf_bitcanna_mainnet
sudo systemctl restart telegraf_bitcanna_mainnet
```

### Dashboard interface

Dashboard has main cosmos-based node information and common system metrics. There is a description for each metric.

Go to our comunity dashboard and select you node from the server list:

### [Dashboard link](https://monitoring-dashboards.l0vd.com/d/Bitcanna_mainnet/bitcanna-mainnet-monitoring-by-l0vd?orgId=1\&refresh=30s\&from=now-1h\&to=now)

![Screenshot\_1](https://user-images.githubusercontent.com/43213686/169405751-8ff53124-e128-4078-8d68-229a18ea4e25.png) ![Screenshot\_2](https://user-images.githubusercontent.com/43213686/169405777-eb9965a5-9fe8-4ecf-944b-4482c41c019b.png)

#### Mon health

Complex parameter can show problem concerning receiving metrics from node. Normal value is "OK"

#### Sync status

Node catching\_up parameter

#### Block height

Latest blockheight of node

#### Time since latest block

Time interval in seconds between taking the metric and node latest block time. Value greater 15s may indicate some kind of synchronization problem.

#### Peers

Number of connected peers

#### Jailed status

Validator jailed status.

#### Missed blocks

Number of missed blocks in 10000 blocks running window. If the validator misses more than 500 blocks, it will end up in jail.

#### Bonded status

Validator stake bonded info

#### Voting power

Validator voting power. If the value of this parameter is zero, your node isn't in the active pool of validators

#### Delegated tokens

Number of delegated tokens

#### Version

Version of d binary

#### Vali Rank

Your node stake rank

#### Active validator numbers

Total number of active validators

#### Other common system metrics: CPU/RAM/FS load, etc.

No comments needed


# Composable

**Overview**

The complete infrastructure for cross-chain smart contracts, applications, and modular functionality.

**Official links**

[Website](https://www.composable.finance/) | [Twitter](https://twitter.com/ComposableFin) | [Discord](https://github.com/notional-labs/composable-networks) | [Github](https://github.com/notional-labs)

**Chain info**

|                |   |
| -------------- | - |
| Chain-id       |   |
| Binary name    |   |
| Binary version |   |

**Explorer**

<https://explorers.l0vd.com/composable-mainnet>

**Public Endpoints**

RPC <https://composable-mainnet.rpc.l0vd.com>

API <https://composable-mainnet.api.l0vd.com>

GRPC

```
composable-mainnet.grpc.l0vd.com:80
```

PEER

```
@composable-mainnet.peers.l0vd.com:
```


# Installation

If you want to setup Composable fullnode manually follow the steps below

## Update and upgrade

```
sudo apt update && sudo apt upgrade -y
```

## Install GO

```
if ! [ -x "$(command -v go)" ]; then
  ver="1.19.3"
  cd $HOME
  wget "https://golang.org/dl/go$ver.linux-amd64.tar.gz"
  sudo rm -rf /usr/local/go
  sudo tar -C /usr/local -xzf "go$ver.linux-amd64.tar.gz"
  rm "go$ver.linux-amd64.tar.gz"
  echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> ~/.bash_profile
  source ~/.bash_profile
fi
```

## Install node

```
cd $HOME
rm -rf composable-centauri
git clone https://github.com/notional-labs/composable-centauri.git
cd composable-centauri
git checkout 
make install
```

## Setting up vars

You should replace values in <>\
\<YOUR\_MONIKER> Here you should put name of your moniker (validator) that will be visible in explorer\
\<YOUR\_WALLET> Here you shoud put the name of your wallet

```
COMPOSABLE_WALLET="<YOUR_WALLET_NAME>"
COMPOSABLE_NODENAME="<YOUR_MONIKER>"
COMPOSABLE_CHAIN_ID=""
```

```
echo "
export COMPOSABLE_WALLET=${COMPOSABLE_WALLET}
export COMPOSABLE_NODENAME=${COMPOSABLE_NODENAME}
export COMPOSABLE_CHAIN_ID=${COMPOSABLE_CHAIN_ID}
" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

## Configure your node

```
 config chain-id ${COMPOSABLE_CHAIN_ID}
```

## Initialize your node

```
 init ${COMPOSABLE_NODENAME} --chain-id ${COMPOSABLE_CHAIN_ID}
```

## Download genesis & addrbook

```
curl -Ls "https://snapshots.l0vd.com/composable-mainnet/genesis.json" > $HOME/.banksy/config/genesis.json
curl -Ls "https://snapshots.l0vd.com/composable-mainnet/addrbook.json" > $HOME/.banksy/config/addrbook.json
```

## (OPTIONAL) Set custom ports

### If you want to use non-default ports

```
COMPOSABLE_PORT=<SET_CUSTOM_PORT> #Example: COMPOSABLE_PORT=56 (numbers from 1 to 64)
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${COMPOSABLE_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${COMPOSABLE_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${COMPOSABLE_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${COMPOSABLE_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${COMPOSABLE_PORT}660\"%" /$HOME/.banksy/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${COMPOSABLE_PORT}317\"%; s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${COMPOSABLE_PORT}317\"%; s%^address = \":8080\"%address = \":${COMPOSABLE_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${COMPOSABLE_PORT}090\"%; s%^address = \"localhost:9090\"%address = \"localhost:${COMPOSABLE_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${COMPOSABLE_PORT}091\"%; s%^address = \"localhost:9091\"%address = \"localhost:${COMPOSABLE_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${COMPOSABLE_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${COMPOSABLE_PORT}546\"%" /$HOME/.banksy/config/app.toml
```

```
 config node tcp://localhost:${COMPOSABLE_PORT}657
```

## Set seeds and peers

```
PEERS="@composable-mainnet.peers.l0vd.com:"
sed -i -e "s/^seeds *=.*/seeds = \"$SEEDS\"/; s/^persistent_peers *=.*/persistent_peers = \"$PEERS\"/" $HOME/.banksy/config/config.toml
```

## Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="50"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.banksy/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.banksy/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.banksy/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.banksy/config/app.toml
```

## Set minimum gas price and null indexer

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0\"/" $HOME/.banksy/config/app.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.banksy/config/config.toml
```

## Create Service

```
sudo tee /etc/systemd/system/.service > /dev/null <<EOF
[Unit]
Description=Composable mainnet
After=network-online.target

[Service]
User=$USER
ExecStart=$(which ) start
Restart=on-failure
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF
```

## Reset blockchain info and restart your node

```
sudo systemctl daemon-reload
sudo systemctl enable 
 tendermint unsafe-reset-all --home $HOME/.banksy --keep-addr-book
sudo systemctl restart  && sudo journalctl -u  -f -o cat
```

## (OPTIONAL) Use State Sync

### [State Sync](/mainnets/composable/installation-guide)

## Starting a validator

### 1. Add a new key

```
 keys add ${COMPOSABLE_WALLET}
```

#### (OR)

### 1. Recover your key

```
 keys add ${COMPOSABLE_WALLET} --recover
```

```
COMPOSABLE_WALLET_ADDR=$( keys show ${COMPOSABLE_WALLET} -a)
echo "export COMPOSABLE_WALLET_ADDR=${COMPOSABLE_WALLET_ADDR}" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

## 2. Create validator

{% hint style="info" %}
Wait until the node is synchronized.
{% endhint %}

```
 tx staking create-validator \
--amount 1000000 \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--details "" \
--pubkey $( tendermint show-validator) \
--moniker ${COMPOSABLE_NODENAME} \
--chain-id ${COMPOSABLE_CHAIN_ID} \
--from ${COMPOSABLE_WALLET_ADDR} \
--gas-prices 0 \
--gas-adjustment 1.5 \
--gas auto \
--yes
```


# Snapshot

## Updates every 4 hours

## Install dependencies, if needed

```
sudo apt update
sudo apt install lz4 -y
```

## Sync from Snapshot

| Height  | Size  | Pruning         | Indexer | Creation Time (UTC+3) |
| ------- | ----- | --------------- | ------- | --------------------- |
| 5717033 | 0.0GB | custom/100/0/10 | null    | 2024-06-19T17:25:20   |

```
sudo systemctl stop picad

cp $HOME/.picad/data/priv_validator_state.json $HOME/.picad/priv_validator_state.json.backup
${BINARY_NAME} tendermint unsafe-reset-all --home $HOME/.picad --keep-addr-book

rm -rf $HOME/.picad/data 

SNAP_NAME=$(curl -s https://snapshots.l0vd.com/mainnets/composable/centauri-1/ | egrep -o ">centauri-1.*\.tar.lz4" | tr -d ">")
curl https://snapshots.l0vd.com/mainnets/composable/centauri-1/${SNAP_NAME} | lz4 -dc - | tar -xf - -C $HOME/.picad

mv $HOME/.picad/priv_validator_state.json.backup $HOME/.picad/data/priv_validator_state.json

sudo systemctl restart picad
sudo journalctl -u picad -f --no-hostname -o cat
```

## Wasm

```
curl https://snapshots.l0vd.com/mainnets/composable/centauri-1/wasm_client_data.tar.lz4 | lz4 -dc - | tar -xf - -C $HOME/.picad/wasm_client_data
```


# State sync

### Info

**Public RPC endpoint:** [**https://composable-mainnet.rpc.l0vd.com**](https://composable-mainnet.rpc.l0vd.com)

**Public API:** [**https://composable-mainnet.api.l0vd.com**](https://composable-mainnet.api.l0vd.com)

### Guide to sync your node using State Sync:

#### Copy the entire command

```
sudo systemctl stop 
SNAP_RPC="https://composable-mainnet.rpc.l0vd.com:443"; \
LATEST_HEIGHT=$(curl -s $SNAP_RPC/block | jq -r .result.block.header.height); \
BLOCK_HEIGHT=$((LATEST_HEIGHT - 2000)); \
TRUST_HASH=$(curl -s "$SNAP_RPC/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash); \
echo $LATEST_HEIGHT $BLOCK_HEIGHT $TRUST_HASH

sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \
s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"$SNAP_RPC,$SNAP_RPC\"| ; \
s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; \
s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"|" $HOME/.banksy/config/config.toml

peers="@composable-mainnet.peers.l0vd.com:" \
&& sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.banksy/config/config.toml 

 tendermint unsafe-reset-all --home ~/.banksy && sudo systemctl restart  && journalctl -u  -f --output cat
```

#### Turn off State Sync Mode after synchronization

```
sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1false|" $HOME/.banksy/config/config.toml
```


# Useful commands

{% hint style="info" %}
Please note that the values in <> must be changed to your own values
{% endhint %}

### Keys

#### Add new key

```
 keys add <key_name>
```

#### Recover keys from seed

```
 keys add <key_name> --recover
```

#### Show all keys

```
 keys list
```

#### Delete key

```
 keys delete <key_name>
```

### Node configuration

#### Set custom port

*port 56 was taken as an example, you can use numbers from 1 to 64 to set custom node port*

```
COMPOSABLE_PORT=56
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${COMPOSABLE_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${COMPOSABLE_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${COMPOSABLE_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${COMPOSABLE_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${COMPOSABLE_PORT}660\"%" /$HOME/.banksy/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${COMPOSABLE_PORT}317\"%; s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${COMPOSABLE_PORT}317\"%; s%^address = \":8080\"%address = \":${COMPOSABLE_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${COMPOSABLE_PORT}090\"%; s%^address = \"localhost:9090\"%address = \"localhost:${COMPOSABLE_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${COMPOSABLE_PORT}091\"%; s%^address = \"localhost:9091\"%address = \"localhost:${COMPOSABLE_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${COMPOSABLE_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${COMPOSABLE_PORT}546\"%" /$HOME/.banksy/config/app.toml
```

#### Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="10"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.banksy/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.banksy/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.banksy/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.banksy/config/app.toml
```

#### Disable indexing

```
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.banksy/config/config.toml
```

#### Set minimum gas prices

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0\"/" $HOME/.banksy/config/app.toml
```

### Validator configuration

#### Create validator

```
 tx staking create-validator \
--amount 1000000 \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--pubkey $( tendermint show-validator) \
--moniker <COMPOSABLE_NODENAME> \
--chain-id  \
--from <COMPOSABLE_WALLET> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--gas-prices 0 \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### Edit validator

```
 tx staking edit-validator \
--new-moniker <COMPOSABLE_NODENAME> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--chain-id  \
--commission-rate 0.05 \
--from <COMPOSABLE_WALLET> \
--gas-prices 0 \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### View validator info

```
 q staking validator $( keys show <COMPOSABLE_WALLET> --bech val -a)
```

#### Unjail validator

```
 tx slashing unjail --from <COMPOSABLE_WALLET> --chain-id  --gas-prices 0 --gas-adjustment 1.5 --gas auto --yes 
```

#### Signing info

```
 query slashing signing-info $( tendermint show-validator)
```

### Token operations

#### Send tokens

```
 tx bank send wallet <DEST_WALLET_ADDRESS> 100 --from <COMPOSABLE_WALLET> --chain-id  --gas-prices 0 --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to your validator

```
 tx staking delegate $( keys show <COMPOSABLE_WALLET> --bech val -a) 100 --from <COMPOSABLE_WALLET> --chain-id  --gas-prices 0 --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to another validator

```
 tx staking delegate <VALOPER_ADDRESS> 100 --from <COMPOSABLE_WALLET> --chain-id  --gas-prices 0 --gas-adjustment 1.5 --gas auto --yes
```

#### Redelegate tokens to another validator

```
 tx staking redelegate $( keys show <COMPOSABLE_WALLET> --bech val -a) <TO_VALOPER_ADDRESS> 100 --from <COMPOSABLE_WALLET> --chain-id  --gas-prices 0 --gas-adjustment 1.5 --gas auto --yes
```

#### Unbond tokens from staking

```
 tx staking unbond $( keys show <COMPOSABLE_WALLET> --bech val -a) 100 --from <COMPOSABLE_WALLET> --chain-id  --gas-prices 0 --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw all rewards from staking

```
 tx distribution withdraw-all-rewards --from <COMPOSABLE_WALLET> --chain-id  --gas-prices 0 --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw validator rewards and comission

```
 tx distribution withdraw-rewards $( keys show <COMPOSABLE_WALLET> --bech val -a) --commission --from wallet --chain-id  --gas-adjustment 1.5 --gas auto --gas-prices 0 -y

```

### Governance

#### Vote "YES"

```
 tx gov vote <proposal_id> yes --from <COMPOSABLE_WALLET> --chain-id  --gas-prices 0 --gas-adjustment 1.5 --gas auto --yes
```

#### Vote "NO"

```
 tx gov vote <proposal_id> no --from <COMPOSABLE_WALLET> --chain-id  --gas-prices 0 --gas-adjustment 1.5 --gas auto --yes
```

#### Abstain from voting

```
 tx gov vote <proposal_id> abstain --from <COMPOSABLE_WALLET> --chain-id  --gas-adjustment 1.5 --gas auto --gas-prices 0 -y
```

### General commands

#### Check node status

```
 status | jq
```

#### Check service status

```
sudo systemctl status 
```

#### Check logs

```
sudo journalctl -u  -f --no-hostname -o cat
```

#### Restart service

```
sudo systemctl restart 
```

#### Stop service

```
sudo systemctl stop 
```

#### Start service

```
sudo systemctl start 
```

#### Disable service

```
sudo systemctl disable 
```

#### Enable service

```
sudo systemctl enable 
```

#### Reload service after changes

```
sudo systemctl daemon-reload
```


# Monitoring

## Monitoring

Advantages of using our free service:

* Our monitoring service is working on dedicated server (24/7 online)
* No need to install database (InfluxDB)
* No need to install and configure Grafana Dashboard
* On Grafana dashboard you will find all necessary metrics of your node (we use this monitoring service by ourselves, so we've configured dashboard properly)

## One line installation:

```
. <(wget -qO- https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/composable/monitoring/composable-monitoring-install.sh)
```

## OR Manual installation of telegraf and monitoring script

Install telegraf

```
sudo apt update
sudo apt -y install curl jq bc

# install telegraf
wget https://dl.influxdata.com/telegraf/releases/telegraf_1.14.1-1_amd64.deb
dpkg -i telegraf_*.deb

sudo systemctl enable --now telegraf
sudo systemctl is-enabled telegraf

# make the telegraf user sudo and adm to be able to execute scripts as composable user
sudo adduser telegraf sudo
sudo adduser telegraf adm
sudo -- bash -c 'echo "telegraf ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers'
```

You can check telegraf service status:

```
sudo systemctl status telegraf
```

Status can be not ok with default Telegraf's config. Next steps will fix it.

Get files from this project repo and copy variable script template

```
cd $HOME
mkdir composable-mainnet-monitoring
cd composable-mainnet-monitoring
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/composable/monitoring/monitor.sh
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/composable/monitoring/telegraf.conf
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/composable/monitoring/variables.sh
```

```
nano variables.sh
```

Insert your parameters to **variables.sh**:

* full path to composable binary to COS\_BIN\_NAME ( check `which centaurid`)
* node PRC port to COS\_PORT\_RPC ( check in file `path_to_composable_node_config/config/config.toml`)
* node validator address to COS\_VALOPER ( like `centaurivaloper********`)

Save changes in variables.sh and enable execution permissions:

```
chmod +x monitor.sh variables.sh
```

Create telegraf service for composable-mainnet-node monitoring

```
cat > /etc/systemd/system/telegraf_composable_mainnet.service <<EOL
[Unit]
Description=The plugin-driven server agent for reporting metrics into InfluxDB
Documentation=https://github.com/influxdata/telegraf
After=network.target
[Service]
EnvironmentFile=-/etc/default/telegraf
User=telegraf
ExecStart=/usr/bin/telegraf -config /etc/telegraf/telegraf_composable_mainnet.conf -config-directory /etc/telegraf/telegraf.d $TELEGRAF_OPTS
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartForceExitStatus=SIGPIPE
KillMode=control-group
[Install]
WantedBy=multi-user.target
EOL
```

Edit telegraf configuration

```
sudo mv /etc/telegraf/telegraf.conf /etc/telegraf/telegraf.conf.orig
sudo mv telegraf_composable_mainnet.conf /etc/telegraf/telegraf_composable_mainnet.conf
```

Restart telegraf service

```
sudo systemctl daemon-reload
sudo systemctl enable telegraf_composable_mainnet
sudo systemctl restart telegraf_composable_mainnet
```

### Dashboard interface

Dashboard has main cosmos-based node information and common system metrics. There is a description for each metric.

Go to our comunity dashboard and select you node from the server list:

### [Dashboard link](https://monitoring-dashboards.l0vd.com/d/Composable_mainnet/composable-mainnet-monitoring-by-l0vd?orgId=1\&refresh=30s\&from=now-1h\&to=now)

![Screenshot\_1](https://user-images.githubusercontent.com/43213686/169405751-8ff53124-e128-4078-8d68-229a18ea4e25.png) ![Screenshot\_2](https://user-images.githubusercontent.com/43213686/169405777-eb9965a5-9fe8-4ecf-944b-4482c41c019b.png)

#### Mon health

Complex parameter can show problem concerning receiving metrics from node. Normal value is "OK"

#### Sync status

Node catching\_up parameter

#### Block height

Latest blockheight of node

#### Time since latest block

Time interval in seconds between taking the metric and node latest block time. Value greater 15s may indicate some kind of synchronization problem.

#### Peers

Number of connected peers

#### Jailed status

Validator jailed status.

#### Missed blocks

Number of missed blocks in 10000 blocks running window. If the validator misses more than 500 blocks, it will end up in jail.

#### Bonded status

Validator stake bonded info

#### Voting power

Validator voting power. If the value of this parameter is zero, your node isn't in the active pool of validators

#### Delegated tokens

Number of delegated tokens

#### Version

Version of centaurid binary

#### Vali Rank

Your node stake rank

#### Active validator numbers

Total number of active validators

#### Other common system metrics: CPU/RAM/FS load, etc.

No comments needed


# Cosmos Hub

**Overview**

The Cosmos Hub is the first of thousands of interconnected blockchains that will eventually comprise the Cosmos Network.

**Official links**

[Website](https://hub.cosmos.network/) | [Twitter](https://twitter.com/cosmoshub) | [Discord](https://discord.gg/cosmosnetwork) | [Github](https://github.com/cosmos)

**Chain info**

|                |             |
| -------------- | ----------- |
| Chain-id       | cosmoshub-4 |
| Binary name    | gaiad       |
| Binary version | v25.3.0     |

**Explorer**

<https://explorers.l0vd.com/cosmoshub-mainnet>

**Public Endpoints**

RPC <https://cosmoshub.rpc.kjnodes.com>

API <https://cosmoshub.api.kjnodes.com>

GRPC

```
cosmoshub-mainnet.grpc.l0vd.com:80
```

PEER

```
d9bfa29e0cf9c4ce0cc9c26d98e5d97228f93b0b@cosmoshub-mainnet.peers.l0vd.com:13456
```


# Installation

If you want to setup Cosmoshub fullnode manually follow the steps below

## Update and upgrade

```
sudo apt update && sudo apt upgrade -y
```

## Install GO

```
if ! [ -x "$(command -v go)" ]; then
  ver="1.19.3"
  cd $HOME
  wget "https://golang.org/dl/go$ver.linux-amd64.tar.gz"
  sudo rm -rf /usr/local/go
  sudo tar -C /usr/local -xzf "go$ver.linux-amd64.tar.gz"
  rm "go$ver.linux-amd64.tar.gz"
  echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> ~/.bash_profile
  source ~/.bash_profile
fi
```

## Install node

```
cd $HOME
rm -rf gaia
git clone https://github.com/cosmos/gaia.git
cd gaia
git checkout v25.3.0
make install
```

## Setting up vars

You should replace values in <>\
\<YOUR\_MONIKER> Here you should put name of your moniker (validator) that will be visible in explorer\
\<YOUR\_WALLET> Here you shoud put the name of your wallet

```
COSMOSHUB_WALLET="<YOUR_WALLET_NAME>"
COSMOSHUB_NODENAME="<YOUR_MONIKER>"
COSMOSHUB_CHAIN_ID="cosmoshub-4"
```

```
echo "
export COSMOSHUB_WALLET=${COSMOSHUB_WALLET}
export COSMOSHUB_NODENAME=${COSMOSHUB_NODENAME}
export COSMOSHUB_CHAIN_ID=${COSMOSHUB_CHAIN_ID}
" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

## Configure your node

```
gaiad config chain-id ${COSMOSHUB_CHAIN_ID}
```

## Initialize your node

```
gaiad init ${COSMOSHUB_NODENAME} --chain-id ${COSMOSHUB_CHAIN_ID}
```

## Download genesis & addrbook

```
curl -Ls "https://snapshots.l0vd.com/cosmoshub-mainnet/genesis.json" > $HOME/.gaia/config/genesis.json
curl -Ls "https://snapshots.l0vd.com/cosmoshub-mainnet/addrbook.json" > $HOME/.gaia/config/addrbook.json
```

## (OPTIONAL) Set custom ports

### If you want to use non-default ports

```
COSMOSHUB_PORT=<SET_CUSTOM_PORT> #Example: COSMOSHUB_PORT=56 (numbers from 1 to 64)
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${COSMOSHUB_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${COSMOSHUB_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${COSMOSHUB_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${COSMOSHUB_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${COSMOSHUB_PORT}660\"%" /$HOME/.gaia/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${COSMOSHUB_PORT}317\"%; s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${COSMOSHUB_PORT}317\"%; s%^address = \":8080\"%address = \":${COSMOSHUB_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${COSMOSHUB_PORT}090\"%; s%^address = \"localhost:9090\"%address = \"localhost:${COSMOSHUB_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${COSMOSHUB_PORT}091\"%; s%^address = \"localhost:9091\"%address = \"localhost:${COSMOSHUB_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${COSMOSHUB_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${COSMOSHUB_PORT}546\"%" /$HOME/.gaia/config/app.toml
```

```
gaiad config node tcp://localhost:${COSMOSHUB_PORT}657
```

## Set seeds and peers

```
PEERS="d9bfa29e0cf9c4ce0cc9c26d98e5d97228f93b0b@cosmoshub-mainnet.peers.l0vd.com:13456"
sed -i -e "s/^seeds *=.*/seeds = \"$SEEDS\"/; s/^persistent_peers *=.*/persistent_peers = \"$PEERS\"/" $HOME/.gaia/config/config.toml
```

## Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="50"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.gaia/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.gaia/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.gaia/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.gaia/config/app.toml
```

## Set minimum gas price and null indexer

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0uatom\"/" $HOME/.gaia/config/app.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.gaia/config/config.toml
```

## Create Service

```
sudo tee /etc/systemd/system/gaiad.service > /dev/null <<EOF
[Unit]
Description=Cosmoshub mainnet
After=network-online.target

[Service]
User=$USER
ExecStart=$(which gaiad) start
Restart=on-failure
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF
```

## Reset blockchain info and restart your node

```
sudo systemctl daemon-reload
sudo systemctl enable gaiad
gaiad tendermint unsafe-reset-all --home $HOME/.gaia --keep-addr-book
sudo systemctl restart gaiad && sudo journalctl -u gaiad -f -o cat
```

## (OPTIONAL) Use State Sync

### [State Sync](/mainnets/cosmoshub/installation-guide)

## Starting a validator

### 1. Add a new key

```
gaiad keys add ${COSMOSHUB_WALLET}
```

#### (OR)

### 1. Recover your key

```
gaiad keys add ${COSMOSHUB_WALLET} --recover
```

```
COSMOSHUB_WALLET_ADDR=$(gaiad keys show ${COSMOSHUB_WALLET} -a)
echo "export COSMOSHUB_WALLET_ADDR=${COSMOSHUB_WALLET_ADDR}" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

## 2. Create validatorWait until the node is synchronized.

```
gaiad tx staking create-validator \
--amount 1000000uatom \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--details "" \
--pubkey $(gaiad tendermint show-validator) \
--moniker ${COSMOSHUB_NODENAME} \
--chain-id ${COSMOSHUB_CHAIN_ID} \
--from ${COSMOSHUB_WALLET_ADDR} \
--gas-prices 0uatom \
--gas-adjustment 1.5 \
--gas auto \
--yes
```


# Snapshot

## Updates every 4 hours

## Install dependencies, if needed

```
sudo apt update
sudo apt install lz4 -y
```

## Sync from Snapshot

| Height   | Size   | Pruning         | Indexer | Creation Time (UTC+3) |
| -------- | ------ | --------------- | ------- | --------------------- |
| 18774355 | 8.1 GB | custom/100/0/10 | null    | 2024-01-18\_15:42:25  |

```
sudo systemctl stop gaiad

cp $HOME/.gaia/data/priv_validator_state.json $HOME/.gaia/priv_validator_state.json.backup
gaiad tendermint unsafe-reset-all --home $HOME/.gaia --keep-addr-book

rm -rf $HOME/.gaia/data 

SNAP_NAME=$(curl -s https://snapshots.l0vd.com/cosmoshub-mainnet/ | egrep -o ">cosmoshub-4.*\.tar.lz4" | tr -d ">")
curl https://snapshots.l0vd.com/cosmoshub-mainnet/${SNAP_NAME} | lz4 -dc - | tar -xf - -C $HOME/.gaia

mv $HOME/.gaia/priv_validator_state.json.backup $HOME/.gaia/data/priv_validator_state.json

sudo systemctl restart gaiad
sudo journalctl -u gaiad -f --no-hostname -o cat
```


# State sync

### Info

**Public RPC endpoint:** [**https://cosmoshub.rpc.kjnodes.com**](https://cosmoshub.rpc.kjnodes.com)

**Public API:** [**https://cosmoshub.api.kjnodes.com**](https://cosmoshub.api.kjnodes.com)

### Guide to sync your node using State Sync:

#### Copy the entire command

```
sudo systemctl stop gaiad
SNAP_RPC="https://cosmoshub.rpc.kjnodes.com:443"; \
LATEST_HEIGHT=$(curl -s $SNAP_RPC/block | jq -r .result.block.header.height); \
BLOCK_HEIGHT=$((LATEST_HEIGHT - 2000)); \
TRUST_HASH=$(curl -s "$SNAP_RPC/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash); \
echo $LATEST_HEIGHT $BLOCK_HEIGHT $TRUST_HASH

sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \
s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"$SNAP_RPC,$SNAP_RPC\"| ; \
s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; \
s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"|" $HOME/.gaia/config/config.toml

peers="d9bfa29e0cf9c4ce0cc9c26d98e5d97228f93b0b@cosmoshub-mainnet.peers.l0vd.com:13456" \
&& sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.gaia/config/config.toml 

gaiad tendermint unsafe-reset-all --home ~/.gaia && sudo systemctl restart gaiad && journalctl -u gaiad -f --output cat
```

#### Turn off State Sync Mode after synchronization

```
sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1false|" $HOME/.gaia/config/config.toml
```


# Useful commands

{% hint style="info" %}
Please note that the values in <> must be changed to your own values
{% endhint %}

### Keys

#### Add new key

```
gaiad keys add <key_name>
```

#### Recover keys from seed

```
gaiad keys add <key_name> --recover
```

#### Show all keys

```
gaiad keys list
```

#### Delete key

```
gaiad keys delete <key_name>
```

### Node configuration

#### Set custom port

*port 56 was taken as an example, you can use numbers from 1 to 64 to set custom node port*

```
COSMOSHUB_PORT=56
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${COSMOSHUB_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${COSMOSHUB_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${COSMOSHUB_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${COSMOSHUB_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${COSMOSHUB_PORT}660\"%" /$HOME/.gaia/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${COSMOSHUB_PORT}317\"%; s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${COSMOSHUB_PORT}317\"%; s%^address = \":8080\"%address = \":${COSMOSHUB_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${COSMOSHUB_PORT}090\"%; s%^address = \"localhost:9090\"%address = \"localhost:${COSMOSHUB_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${COSMOSHUB_PORT}091\"%; s%^address = \"localhost:9091\"%address = \"localhost:${COSMOSHUB_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${COSMOSHUB_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${COSMOSHUB_PORT}546\"%" /$HOME/.gaia/config/app.toml
```

#### Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="10"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.gaia/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.gaia/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.gaia/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.gaia/config/app.toml
```

#### Disable indexing

```
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.gaia/config/config.toml
```

#### Set minimum gas prices

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0uatom\"/" $HOME/.gaia/config/app.toml
```

### Validator configuration

#### Create validator

```
gaiad tx staking create-validator \
--amount 1000000uatom \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--pubkey $(gaiad tendermint show-validator) \
--moniker <COSMOSHUB_NODENAME> \
--chain-id cosmoshub-4 \
--from <COSMOSHUB_WALLET> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--gas-prices 0uatom \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### Edit validator

```
gaiad tx staking edit-validator \
--new-moniker <COSMOSHUB_NODENAME> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--chain-id cosmoshub-4 \
--commission-rate 0.05 \
--from <COSMOSHUB_WALLET> \
--gas-prices 0uatom \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### View validator info

```
gaiad q staking validator $(gaiad keys show <COSMOSHUB_WALLET> --bech val -a)
```

#### Unjail validator

```
gaiad tx slashing unjail --from <COSMOSHUB_WALLET> --chain-id cosmoshub-4 --gas-prices 0uatom --gas-adjustment 1.5 --gas auto --yes 
```

#### Signing info

```
gaiad query slashing signing-info $(gaiad tendermint show-validator)
```

### Token operations

#### Send tokens

```
gaiad tx bank send wallet <DEST_WALLET_ADDRESS> 100uatom --from <COSMOSHUB_WALLET> --chain-id cosmoshub-4 --gas-prices 0uatom --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to your validator

```
gaiad tx staking delegate $(gaiad keys show <COSMOSHUB_WALLET> --bech val -a) 100uatom --from <COSMOSHUB_WALLET> --chain-id cosmoshub-4 --gas-prices 0uatom --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to another validator

```
gaiad tx staking delegate <VALOPER_ADDRESS> 100uatom --from <COSMOSHUB_WALLET> --chain-id cosmoshub-4 --gas-prices 0uatom --gas-adjustment 1.5 --gas auto --yes
```

#### Redelegate tokens to another validator

```
gaiad tx staking redelegate $(gaiad keys show <COSMOSHUB_WALLET> --bech val -a) <TO_VALOPER_ADDRESS> 100uatom --from <COSMOSHUB_WALLET> --chain-id cosmoshub-4 --gas-prices 0uatom --gas-adjustment 1.5 --gas auto --yes
```

#### Unbond tokens from staking

```
gaiad tx staking unbond $(gaiad keys show <COSMOSHUB_WALLET> --bech val -a) 100uatom --from <COSMOSHUB_WALLET> --chain-id cosmoshub-4 --gas-prices 0uatom --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw all rewards from staking

```
gaiad tx distribution withdraw-all-rewards --from <COSMOSHUB_WALLET> --chain-id cosmoshub-4 --gas-prices 0uatom --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw validator rewards and comission

```
gaiad tx distribution withdraw-rewards $(gaiad keys show <COSMOSHUB_WALLET> --bech val -a) --commission --from wallet --chain-id cosmoshub-4 --gas-adjustment 1.5 --gas auto --gas-prices 0uatom -y

```

### Governance

#### Vote "YES"

```
gaiad tx gov vote <proposal_id> yes --from <COSMOSHUB_WALLET> --chain-id cosmoshub-4 --gas-prices 0uatom --gas-adjustment 1.5 --gas auto --yes
```

#### Vote "NO"

```
gaiad tx gov vote <proposal_id> no --from <COSMOSHUB_WALLET> --chain-id cosmoshub-4 --gas-prices 0uatom --gas-adjustment 1.5 --gas auto --yes
```

#### Abstain from voting

```
gaiad tx gov vote <proposal_id> abstain --from <COSMOSHUB_WALLET> --chain-id cosmoshub-4 --gas-adjustment 1.5 --gas auto --gas-prices 0uatom -y
```

### General commands

#### Check node status

```
gaiad status | jq
```

#### Check service status

```
sudo systemctl status gaiad
```

#### Check logs

```
sudo journalctl -u gaiad -f --no-hostname -o cat
```

#### Restart service

```
sudo systemctl restart gaiad
```

#### Stop service

```
sudo systemctl stop gaiad
```

#### Start service

```
sudo systemctl start gaiad
```

#### Disable service

```
sudo systemctl disable gaiad
```

#### Enable service

```
sudo systemctl enable gaiad
```

#### Reload service after changes

```
sudo systemctl daemon-reload
```


# Monitoring

## Monitoring

Advantages of using our free service:

* Our monitoring service is working on dedicated server (24/7 online)
* No need to install database (InfluxDB)
* No need to install and configure Grafana Dashboard
* On Grafana dashboard you will find all necessary metrics of your node (we use this monitoring service by ourselves, so we've configured dashboard properly)

## One line installation:

```
. <(wget -qO- https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/cosmoshub/monitoring/cosmoshub-monitoring-install.sh)
```

## OR Manual installation of telegraf and monitoring script

Install telegraf

```
sudo apt update
sudo apt -y install curl jq bc

# install telegraf
wget https://dl.influxdata.com/telegraf/releases/telegraf_1.14.1-1_amd64.deb
dpkg -i telegraf_*.deb

sudo systemctl enable --now telegraf
sudo systemctl is-enabled telegraf

# make the telegraf user sudo and adm to be able to execute scripts as cosmoshub user
sudo adduser telegraf sudo
sudo adduser telegraf adm
sudo -- bash -c 'echo "telegraf ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers'
```

You can check telegraf service status:

```
sudo systemctl status telegraf
```

Status can be not ok with default Telegraf's config. Next steps will fix it.

Get files from this project repo and copy variable script template

```
cd $HOME
mkdir cosmoshub-mainnet-monitoring
cd cosmoshub-mainnet-monitoring
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/cosmoshub/monitoring/monitor.sh
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/cosmoshub/monitoring/telegraf.conf
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/cosmoshub/monitoring/variables.sh
```

```
nano variables.sh
```

Insert your parameters to **variables.sh**:

* full path to cosmoshub binary to COS\_BIN\_NAME ( check `which gaiad`)
* node PRC port to COS\_PORT\_RPC ( check in file `path_to_cosmoshub_node_config/config/config.toml`)
* node validator address to COS\_VALOPER ( like `cosmosvaloper********`)

Save changes in variables.sh and enable execution permissions:

```
chmod +x monitor.sh variables.sh
```

Create telegraf service for cosmoshub-mainnet-node monitoring

```
cat > /etc/systemd/system/telegraf_cosmoshub_mainnet.service <<EOL
[Unit]
Description=The plugin-driven server agent for reporting metrics into InfluxDB
Documentation=https://github.com/influxdata/telegraf
After=network.target
[Service]
EnvironmentFile=-/etc/default/telegraf
User=telegraf
ExecStart=/usr/bin/telegraf -config /etc/telegraf/telegraf_cosmoshub_mainnet.conf -config-directory /etc/telegraf/telegraf.d $TELEGRAF_OPTS
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartForceExitStatus=SIGPIPE
KillMode=control-group
[Install]
WantedBy=multi-user.target
EOL
```

Edit telegraf configuration

```
sudo mv /etc/telegraf/telegraf.conf /etc/telegraf/telegraf.conf.orig
sudo mv telegraf_cosmoshub_mainnet.conf /etc/telegraf/telegraf_cosmoshub_mainnet.conf
```

Restart telegraf service

```
sudo systemctl daemon-reload
sudo systemctl enable telegraf_cosmoshub_mainnet
sudo systemctl restart telegraf_cosmoshub_mainnet
```

### Dashboard interface

Dashboard has main cosmos-based node information and common system metrics. There is a description for each metric.

Go to our comunity dashboard and select you node from the server list:

### [Dashboard link](https://monitoring-dashboards.l0vd.com/d/Cosmoshub_mainnet/cosmoshub-mainnet-monitoring-by-l0vd?orgId=1\&refresh=30s\&from=now-1h\&to=now)

![Screenshot\_1](https://user-images.githubusercontent.com/43213686/169405751-8ff53124-e128-4078-8d68-229a18ea4e25.png) ![Screenshot\_2](https://user-images.githubusercontent.com/43213686/169405777-eb9965a5-9fe8-4ecf-944b-4482c41c019b.png)

#### Mon health

Complex parameter can show problem concerning receiving metrics from node. Normal value is "OK"

#### Sync status

Node catching\_up parameter

#### Block height

Latest blockheight of node

#### Time since latest block

Time interval in seconds between taking the metric and node latest block time. Value greater 15s may indicate some kind of synchronization problem.

#### Peers

Number of connected peers

#### Jailed status

Validator jailed status.

#### Missed blocks

Number of missed blocks in 10000 blocks running window. If the validator misses more than 500 blocks, it will end up in jail.

#### Bonded status

Validator stake bonded info

#### Voting power

Validator voting power. If the value of this parameter is zero, your node isn't in the active pool of validators

#### Delegated tokens

Number of delegated tokens

#### Version

Version of gaiad binary

#### Vali Rank

Your node stake rank

#### Active validator numbers

Total number of active validators

#### Other common system metrics: CPU/RAM/FS load, etc.

No comments needed


# Wallet bot

<https://t.me/L0vdBot>

## Telegram Bot

The bot does several useful things.

1. Automatically adds validators you staked in to your watch list
2. Bot which will be useful for people who are using mobile devices and don't have access to Keplr to check the amount of tokens they have in differenet states (Delegated, Unbonding, Rewards, etc.)
3. Aggregates ATOM token info and provides brief highlights regarding the token.
4. Shows all active validators, their comission and stake.
5. Shows latest proposals with current status.

To get started, add your wallet address. After that, you will be able to see the number of tokens in different states. In addition, the bot will automatically add validators that you delegated your tokens earlier to the Watchlist.

**Here is the full list of available commands:**\
/start - start working with bot\
/menu - call menu buttons\
/help - list of commands

**List of available buttons in the menu:**\
💎 Token Info - Highlights of ATOM token\
💰 Balances - Shows the number of tokens for watchlist accounts\
➕ Add - Add account or validator to watchlist\
➖ Delete - Delete account or validator from watchlist\
🔍 Watchlist - List of your accounts and validators\
👷 Validators - List of active validators\
📢 Proposals - List of proposals\
📂 Help - List of commands\
📚 Menu - Call menu buttons

## Screenshots

**Start**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/ollo/start.png?raw=true)\
**Token Info**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/ollo/token_info.png?raw=true)\
**Balance Mode**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/ollo/balance.png?raw=true)\
**Validators Mode**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/ollo/validators.png?raw=true)\
**Proposals Mode**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/ollo/proposals.png?raw=true)\
**Help**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/ollo/help.png?raw=true)


# Gitopia

**Overview**

Gitopia is the next-generation Decentralized Code Collaboration Platform fueled by a decentralized network and interactive token economy. It is designed to optimize the open source software development process through collaboration, transparency, and incentivization.

**Official links**

[Website](https://gitopia.com/) | [Twitter](https://twitter.com/gitopiaDAO) | [Discord](https://discord.com/invite/aqsKW3hUHD) | [Github](https://github.com/gitopia-network)

**Chain info**

|                |   |
| -------------- | - |
| Chain-id       |   |
| Binary name    | d |
| Binary version | v |

**Explorer**

<https://explorers.l0vd.com/gitopia-mainnet>

**Public Endpoints**

RPC <https://gitopia-mainnet.rpc.l0vd.com>

API <https://gitopia-mainnet.api.l0vd.com>

GRPC

```
gitopia-mainnet.grpc.l0vd.com:80
```

PEER

```
@gitopia-mainnet.peers.l0vd.com:
```


# Installation

If you want to setup Gitopia fullnode manually follow the steps below

## Update and upgrade

```
sudo apt update && sudo apt upgrade -y
```

## Install GO

```
if ! [ -x "$(command -v go)" ]; then
  ver="1.19.3"
  cd $HOME
  wget "https://golang.org/dl/go$ver.linux-amd64.tar.gz"
  sudo rm -rf /usr/local/go
  sudo tar -C /usr/local -xzf "go$ver.linux-amd64.tar.gz"
  rm "go$ver.linux-amd64.tar.gz"
  echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> ~/.bash_profile
  source ~/.bash_profile
fi
```

## Install node

```
cd $HOME
rm -rf gitopia
git clone https://github.com/gitopia-network/gitopia.git
cd gitopia
git checkout v
make install
```

## Setting up vars

You should replace values in <>\
\<YOUR\_MONIKER> Here you should put name of your moniker (validator) that will be visible in explorer\
\<YOUR\_WALLET> Here you shoud put the name of your wallet

```
GITOPIA_WALLET="<YOUR_WALLET_NAME>"
GITOPIA_NODENAME="<YOUR_MONIKER>"
GITOPIA_CHAIN_ID=""
```

```
echo "
export GITOPIA_WALLET=${GITOPIA_WALLET}
export GITOPIA_NODENAME=${GITOPIA_NODENAME}
export GITOPIA_CHAIN_ID=${GITOPIA_CHAIN_ID}
" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

## Configure your node

```
d config chain-id ${GITOPIA_CHAIN_ID}
```

## Initialize your node

```
d init ${GITOPIA_NODENAME} --chain-id ${GITOPIA_CHAIN_ID}
```

## Download genesis & addrbook

```
curl -Ls "https://snapshots.l0vd.com/gitopia-mainnet/genesis.json" > $HOME/.gitopia/config/genesis.json
curl -Ls "https://snapshots.l0vd.com/gitopia-mainnet/addrbook.json" > $HOME/.gitopia/config/addrbook.json
```

## (OPTIONAL) Set custom ports

### If you want to use non-default ports

```
GITOPIA_PORT=<SET_CUSTOM_PORT> #Example: GITOPIA_PORT=56 (numbers from 1 to 64)
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${GITOPIA_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${GITOPIA_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${GITOPIA_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${GITOPIA_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${GITOPIA_PORT}660\"%" /$HOME/.gitopia/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${GITOPIA_PORT}317\"%; s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${GITOPIA_PORT}317\"%; s%^address = \":8080\"%address = \":${GITOPIA_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${GITOPIA_PORT}090\"%; s%^address = \"localhost:9090\"%address = \"localhost:${GITOPIA_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${GITOPIA_PORT}091\"%; s%^address = \"localhost:9091\"%address = \"localhost:${GITOPIA_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${GITOPIA_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${GITOPIA_PORT}546\"%" /$HOME/.gitopia/config/app.toml
```

```
d config node tcp://localhost:${GITOPIA_PORT}657
```

## Set seeds and peers

```
PEERS="@gitopia-mainnet.peers.l0vd.com:"
sed -i -e "s/^seeds *=.*/seeds = \"$SEEDS\"/; s/^persistent_peers *=.*/persistent_peers = \"$PEERS\"/" $HOME/.gitopia/config/config.toml
```

## Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="50"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.gitopia/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.gitopia/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.gitopia/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.gitopia/config/app.toml
```

## Set minimum gas price and null indexer

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.001\"/" $HOME/.gitopia/config/app.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.gitopia/config/config.toml
```

## Create Service

```
sudo tee /etc/systemd/system/d.service > /dev/null <<EOF
[Unit]
Description=Gitopia mainnet
After=network-online.target

[Service]
User=$USER
ExecStart=$(which d) start
Restart=on-failure
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF
```

## Reset blockchain info and restart your node

```
sudo systemctl daemon-reload
sudo systemctl enable d
d tendermint unsafe-reset-all --home $HOME/.gitopia --keep-addr-book
sudo systemctl restart d && sudo journalctl -u d -f -o cat
```

## (OPTIONAL) Use State Sync

### [State Sync](/mainnets/gitopia/installation-guide)

## Starting a validator

### 1. Add a new key

```
d keys add ${GITOPIA_WALLET}
```

#### (OR)

### 1. Recover your key

```
d keys add ${GITOPIA_WALLET} --recover
```

```
GITOPIA_WALLET_ADDR=$(d keys show ${GITOPIA_WALLET} -a)
echo "export GITOPIA_WALLET_ADDR=${GITOPIA_WALLET_ADDR}" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

## 2. Create validator

{% hint style="info" %}
Wait until the node is synchronized.
{% endhint %}

```
d tx staking create-validator \
--amount 1000000 \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--details "" \
--pubkey $(d tendermint show-validator) \
--moniker ${GITOPIA_NODENAME} \
--chain-id ${GITOPIA_CHAIN_ID} \
--from ${GITOPIA_WALLET_ADDR} \
--gas-prices 0.001 \
--gas-adjustment 1.5 \
--gas auto \
--yes
```


# Snapshot

## Updates every 4 hours

## Install dependencies, if needed

```
sudo apt update
sudo apt install lz4 -y
```

## Sync from Snapshot

| Height   | Size   | Pruning         | Indexer | Creation Time (UTC+3) |
| -------- | ------ | --------------- | ------- | --------------------- |
| 17247734 | 2.1 GB | custom/100/0/10 | null    | 2024-04-20\_01:13:15  |

```
sudo systemctl stop gitopiad

cp $HOME/.gitopia/data/priv_validator_state.json $HOME/.gitopia/priv_validator_state.json.backup
gitopiad tendermint unsafe-reset-all --home $HOME/.gitopia --keep-addr-book

rm -rf $HOME/.gitopia/data 

SNAP_NAME=$(curl -s https://snapshots.l0vd.com/gitopia-mainnet/ | egrep -o ">gitopia.*\.tar.lz4" | tr -d ">")
curl https://snapshots.l0vd.com/gitopia-mainnet/${SNAP_NAME} | lz4 -dc - | tar -xf - -C $HOME/.gitopia

mv $HOME/.gitopia/priv_validator_state.json.backup $HOME/.gitopia/data/priv_validator_state.json

sudo systemctl restart gitopiad
sudo journalctl -u gitopiad -f --no-hostname -o cat
```


# State sync

### Info

**Public RPC endpoint:** [**https://gitopia-mainnet.rpc.l0vd.com**](https://gitopia-mainnet.rpc.l0vd.com)

**Public API:** [**https://gitopia-mainnet.api.l0vd.com**](https://gitopia-mainnet.api.l0vd.com)

### Guide to sync your node using State Sync:

#### Copy the entire command

```
sudo systemctl stop d
SNAP_RPC="https://gitopia-mainnet.rpc.l0vd.com:443"; \
LATEST_HEIGHT=$(curl -s $SNAP_RPC/block | jq -r .result.block.header.height); \
BLOCK_HEIGHT=$((LATEST_HEIGHT - 2000)); \
TRUST_HASH=$(curl -s "$SNAP_RPC/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash); \
echo $LATEST_HEIGHT $BLOCK_HEIGHT $TRUST_HASH

sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \
s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"$SNAP_RPC,$SNAP_RPC\"| ; \
s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; \
s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"|" $HOME/.gitopia/config/config.toml

peers="@gitopia-mainnet.peers.l0vd.com:" \
&& sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.gitopia/config/config.toml 

d tendermint unsafe-reset-all --home ~/.gitopia && sudo systemctl restart d && journalctl -u d -f --output cat
```

#### Turn off State Sync Mode after synchronization

```
sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1false|" $HOME/.gitopia/config/config.toml
```


# Useful commands

{% hint style="info" %}
Please note that the values in <> must be changed to your own values
{% endhint %}

### Keys

#### Add new key

```
d keys add <key_name>
```

#### Recover keys from seed

```
d keys add <key_name> --recover
```

#### Show all keys

```
d keys list
```

#### Delete key

```
d keys delete <key_name>
```

### Node configuration

#### Set custom port

*port 56 was taken as an example, you can use numbers from 1 to 64 to set custom node port*

```
GITOPIA_PORT=56
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${GITOPIA_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${GITOPIA_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${GITOPIA_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${GITOPIA_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${GITOPIA_PORT}660\"%" /$HOME/.gitopia/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${GITOPIA_PORT}317\"%; s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${GITOPIA_PORT}317\"%; s%^address = \":8080\"%address = \":${GITOPIA_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${GITOPIA_PORT}090\"%; s%^address = \"localhost:9090\"%address = \"localhost:${GITOPIA_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${GITOPIA_PORT}091\"%; s%^address = \"localhost:9091\"%address = \"localhost:${GITOPIA_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${GITOPIA_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${GITOPIA_PORT}546\"%" /$HOME/.gitopia/config/app.toml
```

#### Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="10"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.gitopia/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.gitopia/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.gitopia/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.gitopia/config/app.toml
```

#### Disable indexing

```
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.gitopia/config/config.toml
```

#### Set minimum gas prices

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.001\"/" $HOME/.gitopia/config/app.toml
```

### Validator configuration

#### Create validator

```
d tx staking create-validator \
--amount 1000000 \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--pubkey $(d tendermint show-validator) \
--moniker <GITOPIA_NODENAME> \
--chain-id  \
--from <GITOPIA_WALLET> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--gas-prices 0.001 \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### Edit validator

```
d tx staking edit-validator \
--new-moniker <GITOPIA_NODENAME> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--chain-id  \
--commission-rate 0.05 \
--from <GITOPIA_WALLET> \
--gas-prices 0.001 \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### View validator info

```
d q staking validator $(d keys show <GITOPIA_WALLET> --bech val -a)
```

#### Unjail validator

```
d tx slashing unjail --from <GITOPIA_WALLET> --chain-id  --gas-prices 0.001 --gas-adjustment 1.5 --gas auto --yes 
```

#### Signing info

```
d query slashing signing-info $(d tendermint show-validator)
```

### Token operations

#### Send tokens

```
d tx bank send wallet <DEST_WALLET_ADDRESS> 100 --from <GITOPIA_WALLET> --chain-id  --gas-prices 0.001 --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to your validator

```
d tx staking delegate $(d keys show <GITOPIA_WALLET> --bech val -a) 100 --from <GITOPIA_WALLET> --chain-id  --gas-prices 0.001 --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to another validator

```
d tx staking delegate <VALOPER_ADDRESS> 100 --from <GITOPIA_WALLET> --chain-id  --gas-prices 0.001 --gas-adjustment 1.5 --gas auto --yes
```

#### Redelegate tokens to another validator

```
d tx staking redelegate $(d keys show <GITOPIA_WALLET> --bech val -a) <TO_VALOPER_ADDRESS> 100 --from <GITOPIA_WALLET> --chain-id  --gas-prices 0.001 --gas-adjustment 1.5 --gas auto --yes
```

#### Unbond tokens from staking

```
d tx staking unbond $(d keys show <GITOPIA_WALLET> --bech val -a) 100 --from <GITOPIA_WALLET> --chain-id  --gas-prices 0.001 --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw all rewards from staking

```
d tx distribution withdraw-all-rewards --from <GITOPIA_WALLET> --chain-id  --gas-prices 0.001 --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw validator rewards and comission

```
d tx distribution withdraw-rewards $(d keys show <GITOPIA_WALLET> --bech val -a) --commission --from wallet --chain-id  --gas-adjustment 1.5 --gas auto --gas-prices 0.001 -y

```

### Governance

#### Vote "YES"

```
d tx gov vote <proposal_id> yes --from <GITOPIA_WALLET> --chain-id  --gas-prices 0.001 --gas-adjustment 1.5 --gas auto --yes
```

#### Vote "NO"

```
d tx gov vote <proposal_id> no --from <GITOPIA_WALLET> --chain-id  --gas-prices 0.001 --gas-adjustment 1.5 --gas auto --yes
```

#### Abstain from voting

```
d tx gov vote <proposal_id> abstain --from <GITOPIA_WALLET> --chain-id  --gas-adjustment 1.5 --gas auto --gas-prices 0.001 -y
```

### General commands

#### Check node status

```
d status | jq
```

#### Check service status

```
sudo systemctl status d
```

#### Check logs

```
sudo journalctl -u d -f --no-hostname -o cat
```

#### Restart service

```
sudo systemctl restart d
```

#### Stop service

```
sudo systemctl stop d
```

#### Start service

```
sudo systemctl start d
```

#### Disable service

```
sudo systemctl disable d
```

#### Enable service

```
sudo systemctl enable d
```

#### Reload service after changes

```
sudo systemctl daemon-reload
```


# Monitoring

## Monitoring

Advantages of using our free service:

* Our monitoring service is working on dedicated server (24/7 online)
* No need to install database (InfluxDB)
* No need to install and configure Grafana Dashboard
* On Grafana dashboard you will find all necessary metrics of your node (we use this monitoring service by ourselves, so we've configured dashboard properly)

## One line installation:

```
. <(wget -qO- https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/gitopia/monitoring/gitopia-monitoring-install.sh)
```

## OR Manual installation of telegraf and monitoring script

Install telegraf

```
sudo apt update
sudo apt -y install curl jq bc

# install telegraf
wget https://dl.influxdata.com/telegraf/releases/telegraf_1.14.1-1_amd64.deb
dpkg -i telegraf_*.deb

sudo systemctl enable --now telegraf
sudo systemctl is-enabled telegraf

# make the telegraf user sudo and adm to be able to execute scripts as gitopia user
sudo adduser telegraf sudo
sudo adduser telegraf adm
sudo -- bash -c 'echo "telegraf ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers'
```

You can check telegraf service status:

```
sudo systemctl status telegraf
```

Status can be not ok with default Telegraf's config. Next steps will fix it.

Get files from this project repo and copy variable script template

```
cd $HOME
mkdir gitopia-mainnet-monitoring
cd gitopia-mainnet-monitoring
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/gitopia/monitoring/monitor.sh
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/gitopia/monitoring/telegraf.conf
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/gitopia/monitoring/variables.sh
```

```
nano variables.sh
```

Insert your parameters to **variables.sh**:

* full path to gitopia binary to COS\_BIN\_NAME ( check `which d`)
* node PRC port to COS\_PORT\_RPC ( check in file `path_to_gitopia_node_config/config/config.toml`)
* node validator address to COS\_VALOPER ( like `valoper********`)

Save changes in variables.sh and enable execution permissions:

```
chmod +x monitor.sh variables.sh
```

Create telegraf service for gitopia-mainnet-node monitoring

```
cat > /etc/systemd/system/telegraf_gitopia_mainnet.service <<EOL
[Unit]
Description=The plugin-driven server agent for reporting metrics into InfluxDB
Documentation=https://github.com/influxdata/telegraf
After=network.target
[Service]
EnvironmentFile=-/etc/default/telegraf
User=telegraf
ExecStart=/usr/bin/telegraf -config /etc/telegraf/telegraf_gitopia_mainnet.conf -config-directory /etc/telegraf/telegraf.d $TELEGRAF_OPTS
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartForceExitStatus=SIGPIPE
KillMode=control-group
[Install]
WantedBy=multi-user.target
EOL
```

Edit telegraf configuration

```
sudo mv /etc/telegraf/telegraf.conf /etc/telegraf/telegraf.conf.orig
sudo mv telegraf_gitopia_mainnet.conf /etc/telegraf/telegraf_gitopia_mainnet.conf
```

Restart telegraf service

```
sudo systemctl daemon-reload
sudo systemctl enable telegraf_gitopia_mainnet
sudo systemctl restart telegraf_gitopia_mainnet
```

### Dashboard interface

Dashboard has main cosmos-based node information and common system metrics. There is a description for each metric.

Go to our comunity dashboard and select you node from the server list:

### [Dashboard link](https://monitoring-dashboards.l0vd.com/d/Gitopia_mainnet/gitopia-mainnet-monitoring-by-l0vd?orgId=1\&refresh=30s\&from=now-1h\&to=now)

![Screenshot\_1](https://user-images.githubusercontent.com/43213686/169405751-8ff53124-e128-4078-8d68-229a18ea4e25.png) ![Screenshot\_2](https://user-images.githubusercontent.com/43213686/169405777-eb9965a5-9fe8-4ecf-944b-4482c41c019b.png)

#### Mon health

Complex parameter can show problem concerning receiving metrics from node. Normal value is "OK"

#### Sync status

Node catching\_up parameter

#### Block height

Latest blockheight of node

#### Time since latest block

Time interval in seconds between taking the metric and node latest block time. Value greater 15s may indicate some kind of synchronization problem.

#### Peers

Number of connected peers

#### Jailed status

Validator jailed status.

#### Missed blocks

Number of missed blocks in 10000 blocks running window. If the validator misses more than 500 blocks, it will end up in jail.

#### Bonded status

Validator stake bonded info

#### Voting power

Validator voting power. If the value of this parameter is zero, your node isn't in the active pool of validators

#### Delegated tokens

Number of delegated tokens

#### Version

Version of d binary

#### Vali Rank

Your node stake rank

#### Active validator numbers

Total number of active validators

#### Other common system metrics: CPU/RAM/FS load, etc.

No comments needed


# HAQQ

**Overview**

Haqq Blockchain — Haqq (Arabic for truth) is a Proof of Stake blockchain network compatible with the existing ecosystem of Blockchain tools and developer instruments (primarily, Ethereum and Cosmos) and meeting modern industry requirements, with fast-finality and high transactions throughput.

**Official links**

[Website](https://islamiccoin.net/) | [Twitter](https://twitter.com/islamiccoin_net) | [Discord](https://discord.gg/islamic-coin) | [Github](https://github.com/haqq-network)

**Chain info**

|                |               |
| -------------- | ------------- |
| Chain-id       | haqq\_11235-1 |
| Binary name    | d             |
| Binary version | v             |

**Explorer**

<https://explorers.l0vd.com/haqq-mainnet>

**Public Endpoints**

RPC <https://rpc.tm.haqq.network:443>

API <https://haqq-mainnet.api.l0vd.com>

GRPC

```
haqq-mainnet.grpc.l0vd.com:80
```

PEER

```
dbd7fd3b114fae47a8754f2dbe920f7af585d733@haqq-mainnet.peers.l0vd.com:26656
```


# Installation

If you want to setup Haqq fullnode manually follow the steps below

## Update and upgrade

```
sudo apt update && sudo apt upgrade -y
```

## Install GO

```
if ! [ -x "$(command -v go)" ]; then
  ver="1.19.3"
  cd $HOME
  wget "https://golang.org/dl/go$ver.linux-amd64.tar.gz"
  sudo rm -rf /usr/local/go
  sudo tar -C /usr/local -xzf "go$ver.linux-amd64.tar.gz"
  rm "go$ver.linux-amd64.tar.gz"
  echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> ~/.bash_profile
  source ~/.bash_profile
fi
```

## Install node

```
cd $HOME
rm -rf haqq
git clone https://github.com/haqq-network/haqq.git
cd haqq
git checkout v
make install
```

## Setting up vars

You should replace values in <>\
\<YOUR\_MONIKER> Here you should put name of your moniker (validator) that will be visible in explorer\
\<YOUR\_WALLET> Here you shoud put the name of your wallet

```
HAQQ_WALLET="<YOUR_WALLET_NAME>"
HAQQ_NODENAME="<YOUR_MONIKER>"
HAQQ_CHAIN_ID="haqq_11235-1"
```

```
echo "
export HAQQ_WALLET=${HAQQ_WALLET}
export HAQQ_NODENAME=${HAQQ_NODENAME}
export HAQQ_CHAIN_ID=${HAQQ_CHAIN_ID}
" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

## Configure your node

```
d config chain-id ${HAQQ_CHAIN_ID}
```

## Initialize your node

```
d init ${HAQQ_NODENAME} --chain-id ${HAQQ_CHAIN_ID}
```

## Download genesis & addrbook

```
curl -Ls "https://snapshots.l0vd.com/haqq-mainnet/genesis.json" > $HOME/.haqqd/config/genesis.json
curl -Ls "https://snapshots.l0vd.com/haqq-mainnet/addrbook.json" > $HOME/.haqqd/config/addrbook.json
```

## (OPTIONAL) Set custom ports

### If you want to use non-default ports

```
HAQQ_PORT=<SET_CUSTOM_PORT> #Example: HAQQ_PORT=56 (numbers from 1 to 64)
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${HAQQ_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${HAQQ_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${HAQQ_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${HAQQ_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${HAQQ_PORT}660\"%" /$HOME/.haqqd/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${HAQQ_PORT}317\"%; s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${HAQQ_PORT}317\"%; s%^address = \":8080\"%address = \":${HAQQ_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${HAQQ_PORT}090\"%; s%^address = \"localhost:9090\"%address = \"localhost:${HAQQ_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${HAQQ_PORT}091\"%; s%^address = \"localhost:9091\"%address = \"localhost:${HAQQ_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${HAQQ_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${HAQQ_PORT}546\"%" /$HOME/.haqqd/config/app.toml
```

```
d config node tcp://localhost:${HAQQ_PORT}657
```

## Set seeds and peers

```
PEERS="dbd7fd3b114fae47a8754f2dbe920f7af585d733@haqq-mainnet.peers.l0vd.com:26656"
sed -i -e "s/^seeds *=.*/seeds = \"$SEEDS\"/; s/^persistent_peers *=.*/persistent_peers = \"$PEERS\"/" $HOME/.haqqd/config/config.toml
```

## Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="50"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.haqqd/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.haqqd/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.haqqd/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.haqqd/config/app.toml
```

## Set minimum gas price and null indexer

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0aISLM\"/" $HOME/.haqqd/config/app.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.haqqd/config/config.toml
```

## Create Service

```
sudo tee /etc/systemd/system/d.service > /dev/null <<EOF
[Unit]
Description=Haqq mainnet
After=network-online.target

[Service]
User=$USER
ExecStart=$(which d) start
Restart=on-failure
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF
```

## Reset blockchain info and restart your node

```
sudo systemctl daemon-reload
sudo systemctl enable d
d tendermint unsafe-reset-all --home $HOME/.haqqd --keep-addr-book
sudo systemctl restart d && sudo journalctl -u d -f -o cat
```

## (OPTIONAL) Use State Sync

### [State Sync](/mainnets/haqq/installation-guide)

## Starting a validator

### 1. Add a new key

```
d keys add ${HAQQ_WALLET}
```

#### (OR)

### 1. Recover your key

```
d keys add ${HAQQ_WALLET} --recover
```

```
HAQQ_WALLET_ADDR=$(d keys show ${HAQQ_WALLET} -a)
echo "export HAQQ_WALLET_ADDR=${HAQQ_WALLET_ADDR}" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

## 2. Create validatorWait until the node is synchronized.

```
d tx staking create-validator \
--amount 1000000aISLM \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--details "" \
--pubkey $(d tendermint show-validator) \
--moniker ${HAQQ_NODENAME} \
--chain-id ${HAQQ_CHAIN_ID} \
--from ${HAQQ_WALLET_ADDR} \
--gas-prices 0.25aISLM \
--gas-adjustment 1.5 \
--gas auto \
--yes
```


# Snapshot

## Updates every 4 hours

## Install dependencies, if needed

```
sudo apt update
sudo apt install lz4 -y
```

## Sync from Snapshot

| Height  | Size    | Pruning         | Indexer | Creation Time (UTC+3) |
| ------- | ------- | --------------- | ------- | --------------------- |
| 8618419 | 10.6 GB | custom/100/0/10 | null    | 2023-11-23\_16:52:27  |

```
sudo systemctl stop haqqd

cp $HOME/.haqqd/data/priv_validator_state.json $HOME/.haqqd/priv_validator_state.json.backup
haqqd tendermint unsafe-reset-all --home $HOME/.haqqd --keep-addr-book

rm -rf $HOME/.haqqd/data 

SNAP_NAME=$(curl -s https://snapshots.l0vd.com/haqq-mainnet/ | egrep -o ">haqq_11235-1.*\.tar.lz4" | tr -d ">")
curl https://snapshots.l0vd.com/haqq-mainnet/${SNAP_NAME} | lz4 -dc - | tar -xf - -C $HOME/.haqqd

mv $HOME/.haqqd/priv_validator_state.json.backup $HOME/.haqqd/data/priv_validator_state.json

sudo systemctl restart haqqd
sudo journalctl -u haqqd -f --no-hostname -o cat
```


# State sync

### Info

**Public RPC endpoint:** [**https://rpc.tm.haqq.network:443**](https://rpc.tm.haqq.network:443)

**Public API:** [**https://haqq-mainnet.api.l0vd.com**](https://haqq-mainnet.api.l0vd.com)

### Guide to sync your node using State Sync:

#### Copy the entire command

```
sudo systemctl stop d
SNAP_RPC="https://rpc.tm.haqq.network:443:443"; \
LATEST_HEIGHT=$(curl -s $SNAP_RPC/block | jq -r .result.block.header.height); \
BLOCK_HEIGHT=$((LATEST_HEIGHT - 2000)); \
TRUST_HASH=$(curl -s "$SNAP_RPC/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash); \
echo $LATEST_HEIGHT $BLOCK_HEIGHT $TRUST_HASH

sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \
s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"$SNAP_RPC,$SNAP_RPC\"| ; \
s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; \
s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"|" $HOME/.haqqd/config/config.toml

peers="79f6601c5bf3a0c9c0bdacfeae3c7cd7e69cab96@haqq-mainnet.peers.l0vd.com:26656" \
&& sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.haqqd/config/config.toml 

d tendermint unsafe-reset-all --home ~/.haqqd && sudo systemctl restart d && journalctl -u d -f --output cat
```

#### Turn off State Sync Mode after synchronization

```
sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1false|" $HOME/.haqqd/config/config.toml
```


# Useful commands

{% hint style="info" %}
Please note that the values in <> must be changed to your own values
{% endhint %}

### Keys

#### Add new key

```
d keys add <key_name>
```

#### Recover keys from seed

```
d keys add <key_name> --recover
```

#### Show all keys

```
d keys list
```

#### Delete key

```
d keys delete <key_name>
```

### Node configuration

#### Set custom port

*port 56 was taken as an example, you can use numbers from 1 to 64 to set custom node port*

```
HAQQ_PORT=56
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${HAQQ_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${HAQQ_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${HAQQ_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${HAQQ_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${HAQQ_PORT}660\"%" /$HOME/.haqqd/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${HAQQ_PORT}317\"%; s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${HAQQ_PORT}317\"%; s%^address = \":8080\"%address = \":${HAQQ_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${HAQQ_PORT}090\"%; s%^address = \"localhost:9090\"%address = \"localhost:${HAQQ_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${HAQQ_PORT}091\"%; s%^address = \"localhost:9091\"%address = \"localhost:${HAQQ_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${HAQQ_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${HAQQ_PORT}546\"%" /$HOME/.haqqd/config/app.toml
```

#### Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="10"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.haqqd/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.haqqd/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.haqqd/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.haqqd/config/app.toml
```

#### Disable indexing

```
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.haqqd/config/config.toml
```

#### Set minimum gas prices

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.25aISLM\"/" $HOME/.haqqd/config/app.toml
```

### Validator configuration

#### Create validator

```
d tx staking create-validator \
--amount 1000000aISLM \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--pubkey $(d tendermint show-validator) \
--moniker <HAQQ_NODENAME> \
--chain-id haqq_11235-1 \
--from <HAQQ_WALLET> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--gas-prices 0.25aISLM \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### Edit validator

```
d tx staking edit-validator \
--new-moniker <HAQQ_NODENAME> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--chain-id haqq_11235-1 \
--commission-rate 0.05 \
--from <HAQQ_WALLET> \
--gas-prices 0.25aISLM \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### View validator info

```
d q staking validator $(d keys show <HAQQ_WALLET> --bech val -a)
```

#### Unjail validator

```
d tx slashing unjail --from <HAQQ_WALLET> --chain-id haqq_11235-1 --gas-prices 0.25aISLM --gas-adjustment 1.5 --gas auto --yes 
```

#### Signing info

```
d query slashing signing-info $(d tendermint show-validator)
```

### Token operations

#### Send tokens

```
d tx bank send wallet <DEST_WALLET_ADDRESS> 100aISLM --from <HAQQ_WALLET> --chain-id haqq_11235-1 --gas-prices 0.25aISLM --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to your validator

```
d tx staking delegate $(d keys show <HAQQ_WALLET> --bech val -a) 100aISLM --from <HAQQ_WALLET> --chain-id haqq_11235-1 --gas-prices 0.25aISLM --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to another validator

```
d tx staking delegate <VALOPER_ADDRESS> 100aISLM --from <HAQQ_WALLET> --chain-id haqq_11235-1 --gas-prices 0.25aISLM --gas-adjustment 1.5 --gas auto --yes
```

#### Redelegate tokens to another validator

```
d tx staking redelegate $(d keys show <HAQQ_WALLET> --bech val -a) <TO_VALOPER_ADDRESS> 100aISLM --from <HAQQ_WALLET> --chain-id haqq_11235-1 --gas-prices 0.25aISLM --gas-adjustment 1.5 --gas auto --yes
```

#### Unbond tokens from staking

```
d tx staking unbond $(d keys show <HAQQ_WALLET> --bech val -a) 100aISLM --from <HAQQ_WALLET> --chain-id haqq_11235-1 --gas-prices 0.25aISLM --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw all rewards from staking

```
d tx distribution withdraw-all-rewards --from <HAQQ_WALLET> --chain-id haqq_11235-1 --gas-prices 0.25aISLM --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw validator rewards and comission

```
d tx distribution withdraw-rewards $(d keys show <HAQQ_WALLET> --bech val -a) --commission --from wallet --chain-id haqq_11235-1 --gas-adjustment 1.5 --gas auto --gas-prices 0.25aISLM -y

```

### Governance

#### Vote "YES"

```
d tx gov vote <proposal_id> yes --from <HAQQ_WALLET> --chain-id haqq_11235-1 --gas-prices 0.25aISLM --gas-adjustment 1.5 --gas auto --yes
```

#### Vote "NO"

```
d tx gov vote <proposal_id> no --from <HAQQ_WALLET> --chain-id haqq_11235-1 --gas-prices 0.25aISLM --gas-adjustment 1.5 --gas auto --yes
```

#### Abstain from voting

```
d tx gov vote <proposal_id> abstain --from <HAQQ_WALLET> --chain-id haqq_11235-1 --gas-adjustment 1.5 --gas auto --gas-prices 0.25aISLM -y
```

### General commands

#### Check node status

```
d status | jq
```

#### Check service status

```
sudo systemctl status d
```

#### Check logs

```
sudo journalctl -u d -f --no-hostname -o cat
```

#### Restart service

```
sudo systemctl restart d
```

#### Stop service

```
sudo systemctl stop d
```

#### Start service

```
sudo systemctl start d
```

#### Disable service

```
sudo systemctl disable d
```

#### Enable service

```
sudo systemctl enable d
```

#### Reload service after changes

```
sudo systemctl daemon-reload
```


# Monitoring

## Monitoring

Advantages of using our free service:

* Our monitoring service is working on dedicated server (24/7 online)
* No need to install database (InfluxDB)
* No need to install and configure Grafana Dashboard
* On Grafana dashboard you will find all necessary metrics of your node (we use this monitoring service by ourselves, so we've configured dashboard properly)

## One line installation:

```
. <(wget -qO- https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/haqq/monitoring/haqq-monitoring-install.sh)
```

## OR Manual installation of telegraf and monitoring script

Install telegraf

```
sudo apt update
sudo apt -y install curl jq bc

# install telegraf
wget https://dl.influxdata.com/telegraf/releases/telegraf_1.14.1-1_amd64.deb
dpkg -i telegraf_*.deb

sudo systemctl enable --now telegraf
sudo systemctl is-enabled telegraf

# make the telegraf user sudo and adm to be able to execute scripts as haqq user
sudo adduser telegraf sudo
sudo adduser telegraf adm
sudo -- bash -c 'echo "telegraf ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers'
```

You can check telegraf service status:

```
sudo systemctl status telegraf
```

Status can be not ok with default Telegraf's config. Next steps will fix it.

Get files from this project repo and copy variable script template

```
cd $HOME
mkdir haqq-mainnet-monitoring
cd haqq-mainnet-monitoring
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/haqq/monitoring/monitor.sh
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/haqq/monitoring/telegraf.conf
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/haqq/monitoring/variables.sh
```

```
nano variables.sh
```

Insert your parameters to **variables.sh**:

* full path to haqq binary to COS\_BIN\_NAME ( check `which d`)
* node PRC port to COS\_PORT\_RPC ( check in file `path_to_haqq_node_config/config/config.toml`)
* node validator address to COS\_VALOPER ( like `haqqvaloper********`)

Save changes in variables.sh and enable execution permissions:

```
chmod +x monitor.sh variables.sh
```

Create telegraf service for haqq-mainnet-node monitoring

```
cat > /etc/systemd/system/telegraf_haqq_mainnet.service <<EOL
[Unit]
Description=The plugin-driven server agent for reporting metrics into InfluxDB
Documentation=https://github.com/influxdata/telegraf
After=network.target
[Service]
EnvironmentFile=-/etc/default/telegraf
User=telegraf
ExecStart=/usr/bin/telegraf -config /etc/telegraf/telegraf_haqq_mainnet.conf -config-directory /etc/telegraf/telegraf.d $TELEGRAF_OPTS
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartForceExitStatus=SIGPIPE
KillMode=control-group
[Install]
WantedBy=multi-user.target
EOL
```

Edit telegraf configuration

```
sudo mv /etc/telegraf/telegraf.conf /etc/telegraf/telegraf.conf.orig
sudo mv telegraf_haqq_mainnet.conf /etc/telegraf/telegraf_haqq_mainnet.conf
```

Restart telegraf service

```
sudo systemctl daemon-reload
sudo systemctl enable telegraf_haqq_mainnet
sudo systemctl restart telegraf_haqq_mainnet
```

### Dashboard interface

Dashboard has main cosmos-based node information and common system metrics. There is a description for each metric.

Go to our comunity dashboard and select you node from the server list:

### [Dashboard link](https://monitoring-dashboards.l0vd.com/d/Haqq_mainnet/haqq-mainnet-monitoring-by-l0vd?orgId=1\&refresh=30s\&from=now-1h\&to=now)

![Screenshot\_1](https://user-images.githubusercontent.com/43213686/169405751-8ff53124-e128-4078-8d68-229a18ea4e25.png) ![Screenshot\_2](https://user-images.githubusercontent.com/43213686/169405777-eb9965a5-9fe8-4ecf-944b-4482c41c019b.png)

#### Mon health

Complex parameter can show problem concerning receiving metrics from node. Normal value is "OK"

#### Sync status

Node catching\_up parameter

#### Block height

Latest blockheight of node

#### Time since latest block

Time interval in seconds between taking the metric and node latest block time. Value greater 15s may indicate some kind of synchronization problem.

#### Peers

Number of connected peers

#### Jailed status

Validator jailed status.

#### Missed blocks

Number of missed blocks in 10000 blocks running window. If the validator misses more than 500 blocks, it will end up in jail.

#### Bonded status

Validator stake bonded info

#### Voting power

Validator voting power. If the value of this parameter is zero, your node isn't in the active pool of validators

#### Delegated tokens

Number of delegated tokens

#### Version

Version of d binary

#### Vali Rank

Your node stake rank

#### Active validator numbers

Total number of active validators

#### Other common system metrics: CPU/RAM/FS load, etc.

No comments needed


# Iris

**Overview**

IRISnet (a.k.a IRIS Hub) is designed to be the foundation for the next generation distributed applications. Built with Cosmos-SDK, IRIS Hub enables cross-chain interoperability through a unified service model, while providing a variety of modules to support DeFi applications.

**Official links**

[Website](https://www.irisnet.org/) | [Twitter](https://twitter.com/irisnetwork) | [Discord](https://discord.gg/ggRSyCJsQk) | [Github](https://github.com/irisnet)

**Chain info**

|                |      |
| -------------- | ---- |
| Chain-id       |      |
| Binary name    | iris |
| Binary version | v    |

**Explorer**

<https://explorers.l0vd.com/iris-mainnet>

**Public Endpoints**

RPC <https://iris-mainnet.rpc.l0vd.com>

API <https://iris-mainnet.api.l0vd.com>

GRPC

```
iris-mainnet.grpc.l0vd.com:80
```

PEER

```
3ddf22082bda8607289bd94b649e0e2595f1fffd@iris-mainnet.peers.l0vd.com:19656
```


# Installation

If you want to setup Iris fullnode manually follow the steps below

## Update and upgrade

```
sudo apt update && sudo apt upgrade -y
```

## Install GO

```
if ! [ -x "$(command -v go)" ]; then
  ver="1.19.3"
  cd $HOME
  wget "https://golang.org/dl/go$ver.linux-amd64.tar.gz"
  sudo rm -rf /usr/local/go
  sudo tar -C /usr/local -xzf "go$ver.linux-amd64.tar.gz"
  rm "go$ver.linux-amd64.tar.gz"
  echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> ~/.bash_profile
  source ~/.bash_profile
fi
```

## Install node

```
cd $HOME
rm -rf irishub
git clone https://github.com/irisnet/irishub.git
cd irishub
git checkout v
make install
```

## Setting up vars

You should replace values in <>\
\<YOUR\_MONIKER> Here you should put name of your moniker (validator) that will be visible in explorer\
\<YOUR\_WALLET> Here you shoud put the name of your wallet

```
IRIS_WALLET="<YOUR_WALLET_NAME>"
IRIS_NODENAME="<YOUR_MONIKER>"
IRIS_CHAIN_ID=""
```

```
echo "
export IRIS_WALLET=${IRIS_WALLET}
export IRIS_NODENAME=${IRIS_NODENAME}
export IRIS_CHAIN_ID=${IRIS_CHAIN_ID}
" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

## Configure your node

```
iris config chain-id ${IRIS_CHAIN_ID}
```

## Initialize your node

```
iris init ${IRIS_NODENAME} --chain-id ${IRIS_CHAIN_ID}
```

## Download genesis & addrbook

```
curl -Ls "https://snapshots.l0vd.com/archway-mainnet/genesis.json" > $HOME/.iris/config/genesis.json
curl -Ls "https://snapshots.l0vd.com/archway-mainnet/addrbook.json" > $HOME/.iris/config/addrbook.json
```

## (OPTIONAL) Set custom ports

### If you want to use non-default ports

```
IRIS_PORT=<SET_CUSTOM_PORT> #Example: IRIS_PORT=56 (numbers from 1 to 64)
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${IRIS_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${IRIS_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${IRIS_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${IRIS_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${IRIS_PORT}660\"%" /$HOME/.iris/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${IRIS_PORT}317\"%; s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${IRIS_PORT}317\"%; s%^address = \":8080\"%address = \":${IRIS_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${IRIS_PORT}090\"%; s%^address = \"localhost:9090\"%address = \"localhost:${IRIS_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${IRIS_PORT}091\"%; s%^address = \"localhost:9091\"%address = \"localhost:${IRIS_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${IRIS_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${IRIS_PORT}546\"%" /$HOME/.iris/config/app.toml
```

```
iris config node tcp://localhost:${IRIS_PORT}657
```

## Set seeds and peers

```
PEERS="3ddf22082bda8607289bd94b649e0e2595f1fffd@iris-mainnet.peers.l0vd.com:19656"
sed -i -e "s/^seeds *=.*/seeds = \"$SEEDS\"/; s/^persistent_peers *=.*/persistent_peers = \"$PEERS\"/" $HOME/.iris/config/config.toml
```

## Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="50"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.iris/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.iris/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.iris/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.iris/config/app.toml
```

## Set minimum gas price and null indexer

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.025uiris\"/" $HOME/.iris/config/app.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.iris/config/config.toml
```

## Create Service

```
sudo tee /etc/systemd/system/iris.service > /dev/null <<EOF
[Unit]
Description=Iris mainnet
After=network-online.target

[Service]
User=$USER
ExecStart=$(which iris) start
Restart=on-failure
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF
```

## Reset blockchain info and restart your node

```
sudo systemctl daemon-reload
sudo systemctl enable iris
iris tendermint unsafe-reset-all --home $HOME/.iris --keep-addr-book
sudo systemctl restart iris && sudo journalctl -u iris -f -o cat
```

## (OPTIONAL) Use State Sync

### [State Sync](/mainnets/iris/installation-guide)

## Starting a validator

### 1. Add a new key

```
iris keys add ${IRIS_WALLET}
```

#### (OR)

### 1. Recover your key

```
iris keys add ${IRIS_WALLET} --recover
```

```
IRIS_WALLET_ADDR=$(iris keys show ${IRIS_WALLET} -a)
echo "export IRIS_WALLET_ADDR=${IRIS_WALLET_ADDR}" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

## 2. Create validator

{% hint style="info" %}
Wait until the node is synchronized.
{% endhint %}

```
iris tx staking create-validator \
--amount 1000000uiris \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--details "" \
--pubkey $(iris tendermint show-validator) \
--moniker ${IRIS_NODENAME} \
--chain-id ${IRIS_CHAIN_ID} \
--from ${IRIS_WALLET_ADDR} \
--gas-prices 0.025uiris \
--gas-adjustment 1.5 \
--gas auto \
--yes
```


# Snapshot

## Updates every 4 hours

## Install dependencies, if needed

```
sudo apt update
sudo apt install lz4 -y
```

## Sync from Snapshot

| Height   | Size | Pruning         | Indexer | Creation Time (UTC+3) |
| -------- | ---- | --------------- | ------- | --------------------- |
| 22200748 | GB   | custom/100/0/10 | null    | 2023-10-29\_15:23:28  |

```
sudo systemctl stop iris

cp $HOME/.iris/data/priv_validator_state.json $HOME/.iris/priv_validator_state.json.backup
iris tendermint unsafe-reset-all --home $HOME/.iris --keep-addr-book

rm -rf $HOME/.iris/data 

SNAP_NAME=$(curl -s https://snapshots.l0vd.com/iris-mainnet/ | egrep -o ">irishub-1.*\.tar.lz4" | tr -d ">")
curl https://snapshots.l0vd.com/iris-mainnet/${SNAP_NAME} | lz4 -dc - | tar -xf - -C $HOME/.iris

mv $HOME/.iris/priv_validator_state.json.backup $HOME/.iris/data/priv_validator_state.json

sudo systemctl restart iris
sudo journalctl -u iris -f --no-hostname -o cat
```


# State sync

### Info

**Public RPC endpoint:** [**https://iris-mainnet.rpc.l0vd.com**](https://iris-mainnet.rpc.l0vd.com)

**Public API:** [**https://iris-mainnet.api.l0vd.com**](https://iris-mainnet.api.l0vd.com)

### Guide to sync your node using State Sync:

#### Copy the entire command

```
sudo systemctl stop iris
SNAP_RPC="https://iris-mainnet.rpc.l0vd.com:443"; \
LATEST_HEIGHT=$(curl -s $SNAP_RPC/block | jq -r .result.block.header.height); \
BLOCK_HEIGHT=$((LATEST_HEIGHT - 2000)); \
TRUST_HASH=$(curl -s "$SNAP_RPC/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash); \
echo $LATEST_HEIGHT $BLOCK_HEIGHT $TRUST_HASH

sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \
s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"$SNAP_RPC,$SNAP_RPC\"| ; \
s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; \
s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"|" $HOME/.iris/config/config.toml

peers="@iris-mainnet.peers.l0vd.com:" \
&& sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.iris/config/config.toml 

iris tendermint unsafe-reset-all --home ~/.iris && sudo systemctl restart iris && journalctl -u iris -f --output cat
```

#### Turn off State Sync Mode after synchronization

```
sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1false|" $HOME/.iris/config/config.toml
```


# Useful commands

{% hint style="info" %}
Please note that the values in <> must be changed to your own values
{% endhint %}

### Keys

#### Add new key

```
iris keys add <key_name>
```

#### Recover keys from seed

```
iris keys add <key_name> --recover
```

#### Show all keys

```
iris keys list
```

#### Delete key

```
iris keys delete <key_name>
```

### Node configuration

#### Set custom port

*port 56 was taken as an example, you can use numbers from 1 to 64 to set custom node port*

```
IRIS_PORT=56
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${IRIS_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${IRIS_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${IRIS_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${IRIS_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${IRIS_PORT}660\"%" /$HOME/.iris/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${IRIS_PORT}317\"%; s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${IRIS_PORT}317\"%; s%^address = \":8080\"%address = \":${IRIS_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${IRIS_PORT}090\"%; s%^address = \"localhost:9090\"%address = \"localhost:${IRIS_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${IRIS_PORT}091\"%; s%^address = \"localhost:9091\"%address = \"localhost:${IRIS_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${IRIS_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${IRIS_PORT}546\"%" /$HOME/.iris/config/app.toml
```

#### Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="10"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.iris/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.iris/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.iris/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.iris/config/app.toml
```

#### Disable indexing

```
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.iris/config/config.toml
```

#### Set minimum gas prices

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.025uiris\"/" $HOME/.iris/config/app.toml
```

### Validator configuration

#### Create validator

```
iris tx staking create-validator \
--amount 1000000uiris \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--pubkey $(iris tendermint show-validator) \
--moniker <IRIS_NODENAME> \
--chain-id  \
--from <IRIS_WALLET> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--gas-prices 0.025uiris \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### Edit validator

```
iris tx staking edit-validator \
--new-moniker <IRIS_NODENAME> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--chain-id  \
--commission-rate 0.05 \
--from <IRIS_WALLET> \
--gas-prices 0.025uiris \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### View validator info

```
iris q staking validator $(iris keys show <IRIS_WALLET> --bech val -a)
```

#### Unjail validator

```
iris tx slashing unjail --from <IRIS_WALLET> --chain-id  --gas-prices 0.025uiris --gas-adjustment 1.5 --gas auto --yes 
```

#### Signing info

```
iris query slashing signing-info $(iris tendermint show-validator)
```

### Token operations

#### Send tokens

```
iris tx bank send wallet <DEST_WALLET_ADDRESS> 100uiris --from <IRIS_WALLET> --chain-id  --gas-prices 0.025uiris --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to your validator

```
iris tx staking delegate $(iris keys show <IRIS_WALLET> --bech val -a) 100uiris --from <IRIS_WALLET> --chain-id  --gas-prices 0.025uiris --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to another validator

```
iris tx staking delegate <VALOPER_ADDRESS> 100uiris --from <IRIS_WALLET> --chain-id  --gas-prices 0.025uiris --gas-adjustment 1.5 --gas auto --yes
```

#### Redelegate tokens to another validator

```
iris tx staking redelegate $(iris keys show <IRIS_WALLET> --bech val -a) <TO_VALOPER_ADDRESS> 100uiris --from <IRIS_WALLET> --chain-id  --gas-prices 0.025uiris --gas-adjustment 1.5 --gas auto --yes
```

#### Unbond tokens from staking

```
iris tx staking unbond $(iris keys show <IRIS_WALLET> --bech val -a) 100uiris --from <IRIS_WALLET> --chain-id  --gas-prices 0.025uiris --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw all rewards from staking

```
iris tx distribution withdraw-all-rewards --from <IRIS_WALLET> --chain-id  --gas-prices 0.025uiris --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw validator rewards and comission

```
iris tx distribution withdraw-rewards $(iris keys show <IRIS_WALLET> --bech val -a) --commission --from wallet --chain-id  --gas-adjustment 1.5 --gas auto --gas-prices 0.025uiris -y

```

### Governance

#### Vote "YES"

```
iris tx gov vote <proposal_id> yes --from <IRIS_WALLET> --chain-id  --gas-prices 0.025uiris --gas-adjustment 1.5 --gas auto --yes
```

#### Vote "NO"

```
iris tx gov vote <proposal_id> no --from <IRIS_WALLET> --chain-id  --gas-prices 0.025uiris --gas-adjustment 1.5 --gas auto --yes
```

#### Abstain from voting

```
iris tx gov vote <proposal_id> abstain --from <IRIS_WALLET> --chain-id  --gas-adjustment 1.5 --gas auto --gas-prices 0.025uiris -y
```

### General commands

#### Check node status

```
iris status | jq
```

#### Check service status

```
sudo systemctl status iris
```

#### Check logs

```
sudo journalctl -u iris -f --no-hostname -o cat
```

#### Restart service

```
sudo systemctl restart iris
```

#### Stop service

```
sudo systemctl stop iris
```

#### Start service

```
sudo systemctl start iris
```

#### Disable service

```
sudo systemctl disable iris
```

#### Enable service

```
sudo systemctl enable iris
```

#### Reload service after changes

```
sudo systemctl daemon-reload
```


# Monitoring

## Monitoring

Advantages of using our free service:

* Our monitoring service is working on dedicated server (24/7 online)
* No need to install database (InfluxDB)
* No need to install and configure Grafana Dashboard
* On Grafana dashboard you will find all necessary metrics of your node (we use this monitoring service by ourselves, so we've configured dashboard properly)

## One line installation:

```
. <(wget -qO- https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/iris/monitoring/iris-monitoring-install.sh)
```

## OR Manual installation of telegraf and monitoring script

Install telegraf

```
sudo apt update
sudo apt -y install curl jq bc

# install telegraf
wget https://dl.influxdata.com/telegraf/releases/telegraf_1.14.1-1_amd64.deb
dpkg -i telegraf_*.deb

sudo systemctl enable --now telegraf
sudo systemctl is-enabled telegraf

# make the telegraf user sudo and adm to be able to execute scripts as iris user
sudo adduser telegraf sudo
sudo adduser telegraf adm
sudo -- bash -c 'echo "telegraf ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers'
```

You can check telegraf service status:

```
sudo systemctl status telegraf
```

Status can be not ok with default Telegraf's config. Next steps will fix it.

Get files from this project repo and copy variable script template

```
cd $HOME
mkdir iris-mainnet-monitoring
cd iris-mainnet-monitoring
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/iris/monitoring/monitor.sh
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/iris/monitoring/telegraf.conf
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/iris/monitoring/variables.sh
```

```
nano variables.sh
```

Insert your parameters to **variables.sh**:

* full path to iris binary to COS\_BIN\_NAME ( check `which irisd`)
* node PRC port to COS\_PORT\_RPC ( check in file `path_to_iris_node_config/config/config.toml`)
* node validator address to COS\_VALOPER ( like `iaavaloper********`)

Save changes in variables.sh and enable execution permissions:

```
chmod +x monitor.sh variables.sh
```

Create telegraf service for iris-mainnet-node monitoring

```
cat > /etc/systemd/system/telegraf_iris_mainnet.service <<EOL
[Unit]
Description=The plugin-driven server agent for reporting metrics into InfluxDB
Documentation=https://github.com/influxdata/telegraf
After=network.target
[Service]
EnvironmentFile=-/etc/default/telegraf
User=telegraf
ExecStart=/usr/bin/telegraf -config /etc/telegraf/telegraf_iris_mainnet.conf -config-directory /etc/telegraf/telegraf.d $TELEGRAF_OPTS
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartForceExitStatus=SIGPIPE
KillMode=control-group
[Install]
WantedBy=multi-user.target
EOL
```

Edit telegraf configuration

```
sudo mv /etc/telegraf/telegraf.conf /etc/telegraf/telegraf.conf.orig
sudo mv telegraf_iris_mainnet.conf /etc/telegraf/telegraf_iris_mainnet.conf
```

Restart telegraf service

```
sudo systemctl daemon-reload
sudo systemctl enable telegraf_iris_mainnet
sudo systemctl restart telegraf_iris_mainnet
```

### Dashboard interface

Dashboard has main cosmos-based node information and common system metrics. There is a description for each metric.

Go to our comunity dashboard and select you node from the server list:

### [Dashboard link](https://monitoring-dashboards.l0vd.com/d/Iris_mainnet/iris-mainnet-monitoring-by-l0vd?orgId=1\&refresh=30s\&from=now-1h\&to=now)

![Screenshot\_1](https://user-images.githubusercontent.com/43213686/169405751-8ff53124-e128-4078-8d68-229a18ea4e25.png) ![Screenshot\_2](https://user-images.githubusercontent.com/43213686/169405777-eb9965a5-9fe8-4ecf-944b-4482c41c019b.png)

#### Mon health

Complex parameter can show problem concerning receiving metrics from node. Normal value is "OK"

#### Sync status

Node catching\_up parameter

#### Block height

Latest blockheight of node

#### Time since latest block

Time interval in seconds between taking the metric and node latest block time. Value greater 15s may indicate some kind of synchronization problem.

#### Peers

Number of connected peers

#### Jailed status

Validator jailed status.

#### Missed blocks

Number of missed blocks in 10000 blocks running window. If the validator misses more than 500 blocks, it will end up in jail.

#### Bonded status

Validator stake bonded info

#### Voting power

Validator voting power. If the value of this parameter is zero, your node isn't in the active pool of validators

#### Delegated tokens

Number of delegated tokens

#### Version

Version of irisd binary

#### Vali Rank

Your node stake rank

#### Active validator numbers

Total number of active validators

#### Other common system metrics: CPU/RAM/FS load, etc.

No comments needed


# Wallet bot

<https://t.me/L0vdBot>

## Telegram Bot

The bot does several useful things.

1. Automatically adds validators you staked in to your watch list
2. Bot which will be useful for people who are using mobile devices and don't have access to Keplr to check the amount of tokens they have in differenet states (Delegated, Unbonding, Rewards, etc.)
3. Aggregates OSMO token info and provides brief highlights regarding the token.
4. Shows all active validators, their comission and stake.
5. Shows latest proposals with current status.

To get started, add your wallet address. After that, you will be able to see the number of tokens in different states. In addition, the bot will automatically add validators that you delegated your tokens earlier to the Watchlist.

**Here is the full list of available commands:**\
/start - start working with bot\
/menu - call menu buttons\
/help - list of commands

**List of available buttons in the menu:**\
💎 Token Info - Highlights of OSMO token\
💰 Balances - Shows the number of tokens for watchlist accounts\
➕ Add - Add account or validator to watchlist\
➖ Delete - Delete account or validator from watchlist\
🔍 Watchlist - List of your accounts and validators\
👷 Validators - List of active validators\
📢 Proposals - List of proposals\
📂 Help - List of commands\
📚 Menu - Call menu buttons

## Screenshots

**Start**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/ollo/start.png?raw=true)\
**Token Info**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/ollo/token_info.png?raw=true)\
**Balance Mode**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/ollo/balance.png?raw=true)\
**Validators Mode**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/ollo/validators.png?raw=true)\
**Proposals Mode**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/ollo/proposals.png?raw=true)\
**Help**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/ollo/help.png?raw=true)


# Juno

**Overview**

Juno is a global, open source, permission-less network for decentralized interoperable applications. Anyone can create & use inter-chain applications on Juno. The ecosystem is pioneering CosmWasm development and adoption, allowing developers to deploy secure & robust inter-chain smart contracts in Rust.

**Official links**

[Website](https://www.junonetwork.io/) | [Twitter](https://twitter.com/JunoNetwork) | [Discord](https://www.discord.gg/Juno) | [Github](https://github.com/CosmosContracts)

**Chain info**

|                |         |
| -------------- | ------- |
| Chain-id       | juno-1  |
| Binary version | v14.0.0 |

**Explorer**

<https://explorers.l0vd.com/juno-mainnet>

**Public Endpoints**

RPC\
<https://juno-mainnet.rpc.l0vd.com/>\
API\
<https://juno-mainnet.api.l0vd.com/>\
GRPC

```
juno-mainnet.grpc.l0vd.com:80
```

Peer

```
0f4b18e968875583857baab9a506d7735bfd4596@juno-mainnet.peers.l0vd.com:14656
```


# State sync

### Info

**Public RPC endpoint:** [**https://juno-mainnet.rpc.l0vd.com**](https://juno-mainnet.rpc.l0vd.com)

**Public API:** [**https://juno-mainnet.api.l0vd.com**](https://juno-mainnet.api.l0vd.com)

### Guide to sync your node using State Sync:

#### Copy the entire command

```
sudo systemctl stop junod
SNAP_RPC="https://juno-mainnet.rpc.l0vd.com:443"; \
LATEST_HEIGHT=$(curl -s $SNAP_RPC/block | jq -r .result.block.header.height); \
BLOCK_HEIGHT=$((LATEST_HEIGHT - 2000)); \
TRUST_HASH=$(curl -s "$SNAP_RPC/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash); \
echo $LATEST_HEIGHT $BLOCK_HEIGHT $TRUST_HASH

sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \
s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"$SNAP_RPC,$SNAP_RPC\"| ; \
s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; \
s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"|" $HOME/.juno/config/config.toml

peers="0f4b18e968875583857baab9a506d7735bfd4596@juno-mainnet.peers.l0vd.com:14656" \
&& sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.juno/config/config.toml 

junod tendermint unsafe-reset-all --home ~/.juno && sudo systemctl restart junod && journalctl -u junod -f --output cat
```

#### Turn off State Sync Mode after synchronization

```
sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1false|" $HOME/.juno/config/config.toml
```


# Namada

**Overview**

Namada delivers an unparalleled layer of privacy across assets, decentralized applications, and entire blockchain networks.

**Official links**

[Website](https://namada.net/) | [Twitter](https://twitter.com/namada) | [Discord](https://discord.com/invite/namada) | [Github](https://github.com/anoma/namada)

**Chain info**

|                |                                |
| -------------- | ------------------------------ |
| Chain-id       | namada.5f5de2dd1b88cba30586420 |
| Binary name    | namadad                        |
| Binary version | v1.0.0                         |

**Explorers**

[Explorers](https://namada.net/apps#explorers)

**Public Endpoints**

RPC\
<https://namada-mainnet.rpc.l0vd.com/>

Indexer\
<https://namada-mainnet-indexer.rpc.l0vd.com/>

MASP-Indexer\
[https://namada-mainnet-masp-indexer.rpc.l0vd.com/](https://namada-mainnet-masp-indexer.rpc.l0vd.com)

Namadillo\
<https://namadillo.l0vd.com/>

**Other services**

[Installation-guide](/mainnets/namada/installation-guide)\
[Snapshot](/mainnets/namada/snapshot)\
[Staking-guide](/mainnets/namada/staking-guide)\
[Useful commands](/mainnets/namada/useful-commands)


# Installation

### Full Node Setup

#### 1. System requirements

{% hint style="info" %}
Ubuntu must be 22.04 or newer.
{% endhint %}

| Node           | RAM  | DRIVE | CPU    |
| -------------- | ---- | ----- | ------ |
| Validator node | 16GB | 1TB   | 4cores |
| Full node      | 8GB  | 1TB   | 2cores |

#### 2. Manual installation

**2.1 Set up variables**

```
CHAIN_ID="namada.5f5de2dd1b88cba30586420"
WALLET_ALIAS="<SET YOUR WALLET ALIAS>"
VALIDATOR_ALIAS="<SET YOUR VALIDATOR ALIAS>"
```

Export variables:

```
echo "export WALLET_ALIAS="$WALLET_ALIAS"" >> $HOME/.bash_profile
echo "export VALIDATOR_ALIAS="$VALIDATOR_ALIAS"" >> $HOME/.bash_profile
echo "export WORKING_DIR="$HOME/.local/share/namada"" >> $HOME/.bash_profile
echo "export PUBLIC_IP=$(wget -qO- eth0.me)" >> $HOME/.bash_profile
echo "export CHAIN_ID="$CHAIN_ID"" >> $HOME/.bash_profile
source $HOME/.bash_profile
```

**2.2 Install prerequisites**

Update packages and install dependencies:

```
sudo apt update && sudo apt upgrade -y
sudo apt-get install -y curl git jq lz4 make git-core libssl-dev pkg-config libclang-12-dev build-essential protobuf-compiler
```

Install Go:

```
sudo rm -rf /usr/local/go
curl -Ls https://go.dev/dl/go1.20.10.linux-amd64.tar.gz | sudo tar -xzf - -C /usr/local
eval $(echo 'export PATH=$PATH:/usr/local/go/bin' | sudo tee /etc/profile.d/golang.sh)
eval $(echo 'export PATH=$PATH:$HOME/go/bin' | tee -a $HOME/.profile)

```

Install Rust:

```
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
source $HOME/.cargo/env
```

Install CometBFT:

```
cd $HOME
rm -rf cometbft
git clone https://github.com/cometbft/cometbft.git
cd cometbft
git checkout v0.37.11
make build
sudo cp $HOME/cometbft/build/cometbft /usr/local/bin/
cometbft version
```

**2.3 Install Namada binary**

```
cd $HOME
rm -rf namada
git clone https://github.com/anoma/namada
cd namada
wget https://github.com/anoma/namada/releases/download/v1.0.0/namada-v1.0.0-Linux-x86_64.tar.gz
tar -xvf namada-v1.0.0-Linux-x86_64.tar.gz
rm namada-v1.0.0-Linux-x86_64.tar.gz
cd namada-v1.0.0-Linux-x86_64
sudo mv namad* /usr/local/bin/
if [ ! -d "$WORKING_DIR" ]; then
    mkdir -p "$WORKING_DIR"
fi
```

Check namada version:

```
namada --version
```

**2.4 Initialize the chain configuration**

For genesis validators:

```
namada client utils join-network --chain-id $CHAIN_ID --genesis-validator $VALIDATOR_ALIAS
```

For post-genesis validators and Full nodes:

```
namada client utils join-network --chain-id $CHAIN_ID
```

Check everything works fine :

```
namadac epoch
```

Output should be like: "Last committed epoch: 150"

**2.5 Create service file**

```
sudo tee /etc/systemd/system/namadad.service > /dev/null <<EOF
[Unit]
Description=namada
After=network-online.target

[Service]
User=$USER
WorkingDirectory=$WORKING_DIR
Environment=TM_LOG_LEVEL=p2p:none,pex:error
Environment=NAMADA_CMT_STDOUT=true
Environment=NAMADA_LOG=info
ExecStart=$(which namada) node ledger run
StandardOutput=syslog
StandardError=syslog
Restart=always
RestartSec=10
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF
```

**2.6 Start a node**

```
sudo systemctl daemon-reload
sudo systemctl enable namadad
sudo systemctl restart namadad && sudo journalctl -u namadad -f
```

### 3. Adding wallets

#### 3.1 Add new keypair (or restore)

```
namada wallet gen --alias $WALLET_ALIAS
```

or restore:

```
namada wallet derive --alias $WALLET_ALIAS --hd-path default
```

#### 3.2 Check keys

```
namada wallet find --alias $WALLET_ALIAS
```

{% hint style="info" %}
Wait until the node is synchronized.
{% endhint %}

Command to check your node status ("latest\_block\_height" should be not 0 and "catching up" - false):

```
curl localhost:26657/status | jq 
```

#### 3.3 Check key balance

```
namada client balance --owner $WALLET_ALIAS
```

### 4. Validator Setup

{% hint style="info" %}
Following validator setup is optional for Crew Members. Wait until your node is synced!
{% endhint %}

Command to check your node status ("latest\_block\_height" should be not 0 and "catching up" - false):

```
curl localhost:26657/status | jq 
```

#### 4.1 Create validator

```
namada client init-validator \
 --alias $VALIDATOR_ALIAS \
 --account-keys $WALLET_ALIAS \
 --signing-keys $WALLET_ALIAS \
 --commission-rate 0.1 \
 --max-commission-rate-change 0.1 \
 --email <ENTER YOUR EMAIL>
```

#### 4.2 Restart your node

```
systemctl restart namadad
```

#### 4.3 Stake (bond) your validator

```
namada client bond --source $WALLET_ALIAS  --validator $VALIDATOR_ALIAS  --amount 100
```

{% hint style="info" %}
Wait > 2 epochs and then check bond status.
{% endhint %}

#### 4.4 Check your validator status

```
namada client bonds --owner $WALLET_ALIAS
```


# Staking

You can complete this with or without running your own node.

## 1. Running own Full node

Install and sync your node using our guide [here](/mainnets/namada/installation-guide#full-node-setup) then move to step [Task: Delegating stake](#task-delegating-stake)

## 2. Using Namada Client and Public RPC

If you have a VPS/VDS with Linux you can use namada client to delegate (bond) tokens. You are not required to run your own RPC node here, as all txs can be executed via public RPC.

If you don't have a VPS/VDS with Linux, you can rent a cheap server here: [Contabo](https://contabo.com/en/), [PQ](https://pq.hosting/), [Mevspace](https://mevspace.com/ru/vps).

{% hint style="info" %}
Cheap VPS/VDS might not meet system requirements to run Full node, so if you want to run Full node, see system requirements \[here]\(<https://docs.namada.net/operators/hardware>)
{% endhint %}

### 2. Namada CLI installation

#### System requirements

{% hint style="info" %}
Ubuntu must be 22.04 or newer.
{% endhint %}

#### 2.1 Install prerequisites

Update packages and install dependencies:

```
sudo apt update && sudo apt upgrade -y
sudo apt-get install -y make git-core libssl-dev pkg-config libclang-12-dev build-essential protobuf-compiler
```

Install Go:

```
sudo rm -rf /usr/local/go
curl -Ls https://go.dev/dl/go1.20.10.linux-amd64.tar.gz | sudo tar -xzf - -C /usr/local
eval $(echo 'export PATH=$PATH:/usr/local/go/bin' | sudo tee /etc/profile.d/golang.sh)
eval $(echo 'export PATH=$PATH:$HOME/go/bin' | tee -a $HOME/.profile)
```

Install Rust:

```
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
source $HOME/.cargo/env
```

Install CometBFT:

```
cd $HOME
rm -rf cometbft
git clone https://github.com/cometbft/cometbft.git
cd cometbft
git checkout v0.37.11
make build
sudo cp $HOME/cometbft/build/cometbft /usr/local/bin/
cometbft version
```

#### 2.2 Install Namada binary

```
cd $HOME
rm -rf namada
git clone https://github.com/anoma/namada
cd namada
wget https://github.com/anoma/namada/releases/download/v1.0.0/namada-v1.0.0-Linux-x86_64.tar.gz
tar -xvf namada-v1.0.0-Linux-x86_64.tar.gz
rm namada-v1.0.0-Linux-x86_64.tar.gz
cd namada-v1.0.0-Linux-x86_64
sudo mv namad* /usr/local/bin/
if [ ! -d "$WORKING_DIR" ]; then
    mkdir -p "$WORKING_DIR"
fi
```

Check namada version:

```
namadac --version
```

#### 2.3 Initialize the chain configuration

```
namada client utils join-network --chain-id "shielded-expedition.88f17d1d14"
```

Check everything works fine (flag --node needs to be added after any transaction):

```
namadac epoch --node https://namada-mainnet.rpc.l0vd.com:443
```

Output should be like: "Last committed epoch: 150"

### 3. Adding wallets

```
WALLET_ALIAS="<SET YOUR WALLET ALIAS>" # Name of your key
VALIDATOR_ALIAS="L0vd" # Name of validator you want to stake to.
```

:heart: If you found the guide helpful, please delegate to us, we appreciate it greatly

Export variables:

```
echo "export WALLET_ALIAS="$WALLET_ALIAS"" >> $HOME/.bash_profile
echo "export VALIDATOR_ALIAS="$VALIDATOR_ALIAS"" >> $HOME/.bash_profile
source $HOME/.bash_profile
```

#### 3.1 Add new keypair (or restore)

```
namada wallet gen --alias $WALLET_ALIAS
```

or

```
namada wallet restore --alias $WALLET_ALIAS --hd-path default
```

#### 3.2 Check keys and balance

```
namada wallet find --alias $WALLET_ALIAS
```

```
namada client balance --owner $WALLET_ALIAS --node https://namada-mainnet.rpc.l0vd.com:443
```

### Task: Delegating stake

#### 3.1 Stake (bond) validator

```
namadac bond --source $WALLET_ALIAS --validator $VALIDATOR_ALIAS --amount 1000 --node https://namada-mainnet.rpc.l0vd.com:443
```

#### 3.2 Check bond status

{% hint style="info" %}
Wait > 2 epochs and then check bond status.
{% endhint %}

```
namada client bonds --owner $WALLET_ALIAS --node https://namada-mainnet.rpc.l0vd.com:443
```

### Task: Withdrawing rewards

#### 3.3 Withdraw rewards

```
namada client claim-rewards --validator $VALIDATOR_ALIAS --node https://namada-mainnet.rpc.l0vd.com:443
```


# Snapshot

## Updates every 4 hours

## Install dependencies, if needed

```
sudo apt update
sudo apt install lz4 -y
```

## Sync from Snapshot

| Height  | Size     | Creation Time (UTC+3) |
| ------- | -------- | --------------------- |
| 4514500 | 101.6 GB | 2026-01-30\_07:11:30  |

```
sudo systemctl stop namadad

cp $HOME/.local/share/namada/namada.5f5de2dd1b88cba30586420/cometbft/data/priv_validator_state.json $HOME/.local/share/namada/namada.5f5de2dd1b88cba30586420/priv_validator_state_backup.json

rm -rf $HOME/.local/share/namada/namada.5f5de2dd1b88cba30586420/db
rm -rf $HOME/.local/share/namada/namada.5f5de2dd1b88cba30586420/tx_wasm_cache
rm -rf $HOME/.local/share/namada/namada.5f5de2dd1b88cba30586420/vp_wasm_cache
rm -rf $HOME/.local/share/namada/namada.5f5de2dd1b88cba30586420/cometbft/data

SNAP_NAME=$(curl -s https://snapshots.l0vd.com/mainnets/namada/namada.5f5de2dd1b88cba30586420/ | egrep -o ">namada.5f5de2dd1b88cba30586420.*\.tar.lz4" | tr -d ">")
curl https://snapshots.l0vd.com/mainnets/namada/namada.5f5de2dd1b88cba30586420/${SNAP_NAME} | lz4 -dc - | tar -xf - -C $HOME/.local/share/namada/namada.5f5de2dd1b88cba30586420

mv $HOME/.local/share/namada/namada.5f5de2dd1b88cba30586420/priv_validator_state_backup.json $HOME/.local/share/namada/namada.5f5de2dd1b88cba30586420/cometbft/priv_validator_state.json

sudo systemctl restart namadad
sudo journalctl -u namadad -f --no-hostname -o cat
```


# Useful commands

{% hint style="info" %}
Please note that the values in <> must be changed to your own values
{% endhint %}

### Validator configuration

#### Create validator

```
namadac init-validator \
 --alias "<NAMADA_NODENAME>" \
 --account-keys "<NAMADA_WALLET>" \
 --signing-keys "<NAMADA_WALLET>" \
 --commission-rate 0.5 \
 --max-commission-rate-change 0.05 \
 --email "<EMAIL>"
```

#### View validator state

```
namadac validator-state --validator <NAMADA_NODENAME>
```

#### Unjail validator

```
namadac unjail-validator --validator <NAMADA_NODENAME>
```

### Token operations

#### Check balance

```
namadac balance --token NAM --owner <NAMADA_NODENAME>
```

#### Delegate token

```
namadac bond --source <NAMADA_WALLET> --validator <NAMADA_NODENAME> --amount 100
```

#### Undelegate tokens from staking

```
namadac unbond --source <NAMADA_WALLET>  --validator <NAMADA_NODENAME> --amount 100
```

#### Withdraw tokens

```
namadac withdraw --source <NAMADA_WALLET> --validator <NAMADA_NODENAME>
```

#### Claim rewards

```
namadac claim-rewards --validator <NAMADA_NODENAME>
```

### Governance

#### Vote "YES"

```
namadac vote-proposal --proposal-id 0 --vote yay --signing-keys <NAMADA_WALLET> 
```

#### Vote "NO"

```
namadac vote-proposal --proposal-id 0 --vote nay --signing-keys <NAMADA_WALLET> 
```

### General commands

#### Check node status

```
namadad status | jq
```

#### Check service status

```
sudo systemctl status namadad
```

#### Check logs

```
sudo journalctl -u namadad -f --no-hostname -o cat
```

#### Restart service

```
sudo systemctl restart namadad
```

#### Stop service

```
sudo systemctl stop namadad
```

#### Start service

```
sudo systemctl start namadad
```

#### Disable service

```
sudo systemctl disable namadad
```

#### Enable service

```
sudo systemctl enable namadad
```

#### Reload service after changes

```
sudo systemctl daemon-reload
```


# Nois

**Overview**

Nois is a Proof of Stake blockchain protocol that allows developers to use secure, unbiased and cost efficient randomness via IBC.

**Official links**

[Website](https://nois.network/) | [Twitter](https://twitter.com/NoisRNG) |[Discord](https://chat.nois.network/) | [Github](https://github.com/noislabs)

**Chain info**

|                |        |
| -------------- | ------ |
| Chain-id       | nois-1 |
| Binary version | v1.0.1 |

**Explorer**

<https://explorers.l0vd.com/nois-mainnet>

**Public Endpoints**

RPC\
<https://nois-mainnet.rpc.l0vd.com>\
API\
[https://nois-mainnet.api.l0vd.com](https://nois-mainnet.rpc.l0vd.com)<br>

GRPC

```
nois-mainnet.grpc.l0vd.com:9090
```

PEER

```
71fc7fe398550a8b56e6b24fe595e8c1431d8876@nois-mainnet.peers.l0vd.com:13656
```


# Installation


# Snapshot


# State sync

### Info

**Public RPC endpoint:** [**https://nois-mainnet.rpc.l0vd.com**](https://nois-mainnet.rpc.l0vd.com)

**Public API:** [**https://nois-mainnet.api.l0vd.com**](https://nois-mainnet.api.l0vd.com)

### Guide to sync your node using State Sync:

#### Copy the entire command

```
sudo systemctl stop noisd
SNAP_RPC="https://nois-mainnet.rpc.l0vd.com:443"; \
LATEST_HEIGHT=$(curl -s $SNAP_RPC/block | jq -r .result.block.header.height); \
BLOCK_HEIGHT=$((LATEST_HEIGHT - 2000)); \
TRUST_HASH=$(curl -s "$SNAP_RPC/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash); \
echo $LATEST_HEIGHT $BLOCK_HEIGHT $TRUST_HASH

sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \
s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"$SNAP_RPC,$SNAP_RPC\"| ; \
s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; \
s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"|" $HOME/.noisd/config/config.toml

peers="71fc7fe398550a8b56e6b24fe595e8c1431d8876@nois-mainnet.peers.l0vd.com:13656" \
&& sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.noisd/config/config.toml 

noisd tendermint unsafe-reset-all --home ~/.noisd && sudo systemctl restart noisd && journalctl -u noisd -f --output cat
```

#### Turn off State Sync Mode after synchronization

```
sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1false|" $HOME/.noisd/config/config.toml
```


# Useful commands

{% hint style="info" %}
Please note that the values in <> must be changed to your own values
{% endhint %}

### Keys

#### Add new key

```
noisd keys add <key_name>
```

#### Recover keys from seed

```
noisd keys add <key_name> --recover
```

#### Show all keys

```
noisd keys list
```

#### Delete key

```
noisd keys delete <key_name>
```

### Node configuration

#### Set custom port

*port 56 was taken as an example, you can use numbers from 1 to 64 to set custom node port*

```
NOIS_PORT=56
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${NOIS_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${NOIS_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${NOIS_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${NOIS_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${NOIS_PORT}660\"%" $HOME/.noisd/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${NOIS_PORT}317\"%; s%^address = \":8080\"%address = \":${NOIS_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${NOIS_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${NOIS_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${NOIS_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${NOIS_PORT}546\"%" $HOME/.noisd/config/app.toml
```

#### Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="50"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.noisd/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.noisd/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.noisd/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.noisd/config/app.toml
```

#### Disable indexing

```
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.noisd/config/config.toml
```

#### Set minimum gas prices

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.1unois\"/" $HOME/.noisd/config/app.toml
```

### Validator configuration

#### Create validator

```
noisd tx staking create-validator \
--amount 1000000unois \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--pubkey=$(noisd tendermint show-validator) \
--moniker <NOIS_NODENAME> \
--chain-id nois-1 \
--from <NOIS_WALLET> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--gas-prices 0.1unois \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### Edit validator

```
noisd tx staking edit-validator \
--new-moniker <NOIS_NODENAME> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--chain-id nois-1 \
--commission-rate 0.05 \
--from <NOIS_WALLET> \
--gas-prices 0.1unois \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### View validator info

```
noisd q staking validator $(noisd keys show <NOIS_WALLET> --bech val -a)
```

#### Unjail validator

```
noisd tx slashing unjail --from <NOIS_WALLET> --chain-id nois-1 --gas-prices 0.1unois --gas-adjustment 1.5 --gas auto --yes 
```

#### Signing info

```
noisd query slashing signing-info $(noisd tendermint show-validator)
```

### Token operations

#### Send tokens

```
noisd tx bank send wallet <DEST_WALLET_ADDRESS> 100unois --from <NOIS_WALLET> --chain-id nois-1 --gas-prices 0.1unois --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to your validator

```
noisd tx staking delegate $(noisd keys show <NOIS_WALLET> --bech val -a) 100unois --from <NOIS_WALLET> --chain-id nois-1 --gas-prices 0.1unois --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to another validator

```
noisd tx staking delegate <VALOPER_ADDRESS> 100unois --from <NOIS_WALLET> --chain-id nois-1 --gas-prices 0.1unois --gas-adjustment 1.5 --gas auto --yes
```

#### Redelegate tokens to another validator

```
noisd tx staking redelegate <FROM_VALOPER_ADDRESS> <TO_VALOPER_ADDRESS> 100unois --from <NOIS_WALLET> --chain-id nois-1 --gas-prices 0.1unois --gas-adjustment 1.5 --gas auto --yes
```

#### Unbond tokens from staking

```
noisd tx staking unbond <VALOPER_ADDRESS> 100unois --from <NOIS_WALLET> --chain-id nois-1 --gas-prices 0.1unois --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw all rewards from staking

```
noisd tx distribution withdraw-all-rewards --from <NOIS_WALLET> --chain-id nois-1 --gas-prices 0.1unois --gas-adjustment 1.5 --gas auto --yes
```

### Governance

#### Vote "YES"

```
noisd tx gov vote <proposal_id> yes --from <NOIS_WALLET> --chain-id nois-1 --gas-prices 0.1unois --gas-adjustment 1.5 --gas auto --yes
```

#### Vote "NO"

```
noisd tx gov vote <proposal_id> no --from <NOIS_WALLET> --chain-id nois-1 --gas-prices 0.1unois --gas-adjustment 1.5 --gas auto --yes
```

#### Abstain from voting

```
noisd tx gov vote <proposal_id> abstain --from <NOIS_WALLET> --chain-id nois-1 --gas-adjustment 1.5 --gas auto --gas-prices 0.1unois -y
```

### General commands

#### Check node status

```
noisd status | jq
```

#### Check service status

```
sudo systemctl status noisd
```

#### Check logs

```
sudo journalctl -u noisd -f --no-hostname -o cat
```

#### Restart service

```
sudo systemctl restart noisd
```

#### Stop service

```
sudo systemctl stop noisd
```

#### Start service

```
sudo systemctl start noisd
```

#### Disable service

```
sudo systemctl disable noisd
```

#### Enable service

```
sudo systemctl enable noisd
```

#### Reload service after changes

```
sudo systemctl daemon-reload
```


# Monitoring


# Osmosis

**Overview**

Osmosis (OSMO) is a decentralized exchange (DEX) for Cosmos, an ecosystem of sovereign, interoperable blockchains all connected trustlessly over IBC, the Inter-Blockchain Communication Protocol.

**Official links**

[Website](https://osmosis.zone) | [Twitter](https://twitter.com/osmosiszone) | [Discord](https://discord.gg/osmosis) | [Github](https://github.com/osmosis-labs)

**Chain info**

|                |           |
| -------------- | --------- |
| Chain-id       | osmosis-1 |
| Binary name    | d         |
| Binary version | v         |

**Explorer**

<https://explorers.l0vd.com/osmosis-mainnet>

**Public Endpoints**

RPC<https://osmosis.rpc.stakin-nodes.com>

API<https://api-osmosis-ia.cosmosia.notional.ventures>

GRPC

```
osmosis-mainnet.grpc.l0vd.com:80
```

PEER

```
2b34890f069e93e1459870200e0e72623dca4ffe@osmosis-mainnet.peers.l0vd.com:26655
```


# Installation

If you want to setup Osmosis fullnode manually follow the steps below

## Update and upgrade

```
sudo apt update && sudo apt upgrade -y
```

## Install GO

```
if ! [ -x "$(command -v go)" ]; then
  ver="1.19.3"
  cd $HOME
  wget "https://golang.org/dl/go$ver.linux-amd64.tar.gz"
  sudo rm -rf /usr/local/go
  sudo tar -C /usr/local -xzf "go$ver.linux-amd64.tar.gz"
  rm "go$ver.linux-amd64.tar.gz"
  echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> ~/.bash_profile
  source ~/.bash_profile
fi
```

## Install node

```
cd $HOME
rm -rf osmosis
git clone https://github.com/osmosis-labs/osmosis.git
cd osmosis
git checkout v
make install
```

## Setting up vars

You should replace values in <>\
\<YOUR\_MONIKER> Here you should put name of your moniker (validator) that will be visible in explorer\
\<YOUR\_WALLET> Here you shoud put the name of your wallet

```
OSMOSIS_WALLET="<YOUR_WALLET_NAME>"
OSMOSIS_NODENAME="<YOUR_MONIKER>"
OSMOSIS_CHAIN_ID=""
```

```
echo "
export OSMOSIS_WALLET=${OSMOSIS_WALLET}
export OSMOSIS_NODENAME=${OSMOSIS_NODENAME}
export OSMOSIS_CHAIN_ID=${OSMOSIS_CHAIN_ID}
" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

## Configure your node

```
d config chain-id ${OSMOSIS_CHAIN_ID}
```

## Initialize your node

```
d init ${OSMOSIS_NODENAME} --chain-id ${OSMOSIS_CHAIN_ID}
```

## Download genesis & addrbook

```
curl -Ls "https://snapshots.l0vd.com/osmosis-mainnet/genesis.json" > $HOME/.osmosisd/config/genesis.json
curl -Ls "https://snapshots.l0vd.com/osmosis-mainnet/addrbook.json" > $HOME/.osmosisd/config/addrbook.json
```

## (OPTIONAL) Set custom ports

### If you want to use non-default ports

```
OSMOSIS_PORT=<SET_CUSTOM_PORT> #Example: OSMOSIS_PORT=56 (numbers from 1 to 64)
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${OSMOSIS_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${OSMOSIS_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${OSMOSIS_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${OSMOSIS_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${OSMOSIS_PORT}660\"%" /$HOME/.osmosisd/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${OSMOSIS_PORT}317\"%; s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${OSMOSIS_PORT}317\"%; s%^address = \":8080\"%address = \":${OSMOSIS_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${OSMOSIS_PORT}090\"%; s%^address = \"localhost:9090\"%address = \"localhost:${OSMOSIS_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${OSMOSIS_PORT}091\"%; s%^address = \"localhost:9091\"%address = \"localhost:${OSMOSIS_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${OSMOSIS_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${OSMOSIS_PORT}546\"%" /$HOME/.osmosisd/config/app.toml
```

```
d config node tcp://localhost:${OSMOSIS_PORT}657
```

## Set seeds and peers

```
PEERS="2b34890f069e93e1459870200e0e72623dca4ffe@osmosis-mainnet.peers.l0vd.com:26655"
sed -i -e "s/^seeds *=.*/seeds = \"$SEEDS\"/; s/^persistent_peers *=.*/persistent_peers = \"$PEERS\"/" $HOME/.osmosisd/config/config.toml
```

## Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="50"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.osmosisd/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.osmosisd/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.osmosisd/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.osmosisd/config/app.toml
```

## Set minimum gas price and null indexer

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.0025uosmo\"/" $HOME/.osmosisd/config/app.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.osmosisd/config/config.toml
```

## Create Service

```
sudo tee /etc/systemd/system/d.service > /dev/null <<EOF
[Unit]
Description=Osmosis mainnet
After=network-online.target

[Service]
User=$USER
ExecStart=$(which d) start
Restart=on-failure
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF
```

## Reset blockchain info and restart your node

```
sudo systemctl daemon-reload
sudo systemctl enable d
d tendermint unsafe-reset-all --home $HOME/.osmosisd --keep-addr-book
sudo systemctl restart d && sudo journalctl -u d -f -o cat
```

## (OPTIONAL) Use State Sync

### [State Sync](/mainnets/osmosis/installation-guide)

## Starting a validator

### 1. Add a new key

```
d keys add ${OSMOSIS_WALLET}
```

#### (OR)

### 1. Recover your key

```
d keys add ${OSMOSIS_WALLET} --recover
```

```
OSMOSIS_WALLET_ADDR=$(d keys show ${OSMOSIS_WALLET} -a)
echo "export OSMOSIS_WALLET_ADDR=${OSMOSIS_WALLET_ADDR}" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

## 2. Create validatorWait until the node is synchronized.

```
d tx staking create-validator \
--amount 1000000uosmo \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--details "" \
--pubkey $(d tendermint show-validator) \
--moniker ${OSMOSIS_NODENAME} \
--chain-id ${OSMOSIS_CHAIN_ID} \
--from ${OSMOSIS_WALLET_ADDR} \
--gas-prices 0.0025uosmo \
--gas-adjustment 1.5 \
--gas auto \
--yes
```


# Snapshot


# State sync

### Info

**Public RPC endpoint:** [**https://osmosis.rpc.stakin-nodes.com**](https://osmosis.rpc.stakin-nodes.com)

**Public API:** [**https://api-osmosis-ia.cosmosia.notional.ventures**](https://api-osmosis-ia.cosmosia.notional.ventures)

### Guide to sync your node using State Sync:

#### Copy the entire command

```
sudo systemctl stop d
SNAP_RPC="https://osmosis.rpc.stakin-nodes.com:443"; \
LATEST_HEIGHT=$(curl -s $SNAP_RPC/block | jq -r .result.block.header.height); \
BLOCK_HEIGHT=$((LATEST_HEIGHT - 2000)); \
TRUST_HASH=$(curl -s "$SNAP_RPC/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash); \
echo $LATEST_HEIGHT $BLOCK_HEIGHT $TRUST_HASH

sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \
s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"$SNAP_RPC,$SNAP_RPC\"| ; \
s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; \
s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"|" $HOME/.osmosisd/config/config.toml

peers="@osmosis-mainnet.peers.l0vd.com:" \
&& sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.osmosisd/config/config.toml 

d tendermint unsafe-reset-all --home ~/.osmosisd && sudo systemctl restart d && journalctl -u d -f --output cat
```

#### Turn off State Sync Mode after synchronization

```
sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1false|" $HOME/.osmosisd/config/config.toml
```


# Useful commands

{% hint style="info" %}
Please note that the values in <> must be changed to your own values
{% endhint %}

### Keys

#### Add new key

```
d keys add <key_name>
```

#### Recover keys from seed

```
d keys add <key_name> --recover
```

#### Show all keys

```
d keys list
```

#### Delete key

```
d keys delete <key_name>
```

### Node configuration

#### Set custom port

*port 56 was taken as an example, you can use numbers from 1 to 64 to set custom node port*

```
OSMOSIS_PORT=56
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${OSMOSIS_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${OSMOSIS_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${OSMOSIS_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${OSMOSIS_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${OSMOSIS_PORT}660\"%" /$HOME/.osmosisd/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${OSMOSIS_PORT}317\"%; s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${OSMOSIS_PORT}317\"%; s%^address = \":8080\"%address = \":${OSMOSIS_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${OSMOSIS_PORT}090\"%; s%^address = \"localhost:9090\"%address = \"localhost:${OSMOSIS_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${OSMOSIS_PORT}091\"%; s%^address = \"localhost:9091\"%address = \"localhost:${OSMOSIS_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${OSMOSIS_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${OSMOSIS_PORT}546\"%" /$HOME/.osmosisd/config/app.toml
```

#### Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="10"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.osmosisd/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.osmosisd/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.osmosisd/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.osmosisd/config/app.toml
```

#### Disable indexing

```
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.osmosisd/config/config.toml
```

#### Set minimum gas prices

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.0025uosmo\"/" $HOME/.osmosisd/config/app.toml
```

### Validator configuration

#### Create validator

```
d tx staking create-validator \
--amount 1000000uosmo \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--pubkey $(d tendermint show-validator) \
--moniker <OSMOSIS_NODENAME> \
--chain-id  \
--from <OSMOSIS_WALLET> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--gas-prices 0.0025uosmo \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### Edit validator

```
d tx staking edit-validator \
--new-moniker <OSMOSIS_NODENAME> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--chain-id  \
--commission-rate 0.05 \
--from <OSMOSIS_WALLET> \
--gas-prices 0.0025uosmo \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### View validator info

```
d q staking validator $(d keys show <OSMOSIS_WALLET> --bech val -a)
```

#### Unjail validator

```
d tx slashing unjail --from <OSMOSIS_WALLET> --chain-id  --gas-prices 0.0025uosmo --gas-adjustment 1.5 --gas auto --yes 
```

#### Signing info

```
d query slashing signing-info $(d tendermint show-validator)
```

### Token operations

#### Send tokens

```
d tx bank send wallet <DEST_WALLET_ADDRESS> 100uosmo --from <OSMOSIS_WALLET> --chain-id  --gas-prices 0.0025uosmo --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to your validator

```
d tx staking delegate $(d keys show <OSMOSIS_WALLET> --bech val -a) 100uosmo --from <OSMOSIS_WALLET> --chain-id  --gas-prices 0.0025uosmo --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to another validator

```
d tx staking delegate <VALOPER_ADDRESS> 100uosmo --from <OSMOSIS_WALLET> --chain-id  --gas-prices 0.0025uosmo --gas-adjustment 1.5 --gas auto --yes
```

#### Redelegate tokens to another validator

```
d tx staking redelegate $(d keys show <OSMOSIS_WALLET> --bech val -a) <TO_VALOPER_ADDRESS> 100uosmo --from <OSMOSIS_WALLET> --chain-id  --gas-prices 0.0025uosmo --gas-adjustment 1.5 --gas auto --yes
```

#### Unbond tokens from staking

```
d tx staking unbond $(d keys show <OSMOSIS_WALLET> --bech val -a) 100uosmo --from <OSMOSIS_WALLET> --chain-id  --gas-prices 0.0025uosmo --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw all rewards from staking

```
d tx distribution withdraw-all-rewards --from <OSMOSIS_WALLET> --chain-id  --gas-prices 0.0025uosmo --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw validator rewards and comission

```
d tx distribution withdraw-rewards $(d keys show <OSMOSIS_WALLET> --bech val -a) --commission --from wallet --chain-id  --gas-adjustment 1.5 --gas auto --gas-prices 0.0025uosmo -y

```

### Governance

#### Vote "YES"

```
d tx gov vote <proposal_id> yes --from <OSMOSIS_WALLET> --chain-id  --gas-prices 0.0025uosmo --gas-adjustment 1.5 --gas auto --yes
```

#### Vote "NO"

```
d tx gov vote <proposal_id> no --from <OSMOSIS_WALLET> --chain-id  --gas-prices 0.0025uosmo --gas-adjustment 1.5 --gas auto --yes
```

#### Abstain from voting

```
d tx gov vote <proposal_id> abstain --from <OSMOSIS_WALLET> --chain-id  --gas-adjustment 1.5 --gas auto --gas-prices 0.0025uosmo -y
```

### General commands

#### Check node status

```
d status | jq
```

#### Check service status

```
sudo systemctl status d
```

#### Check logs

```
sudo journalctl -u d -f --no-hostname -o cat
```

#### Restart service

```
sudo systemctl restart d
```

#### Stop service

```
sudo systemctl stop d
```

#### Start service

```
sudo systemctl start d
```

#### Disable service

```
sudo systemctl disable d
```

#### Enable service

```
sudo systemctl enable d
```

#### Reload service after changes

```
sudo systemctl daemon-reload
```


# Monitoring

## Monitoring

Advantages of using our free service:

* Our monitoring service is working on dedicated server (24/7 online)
* No need to install database (InfluxDB)
* No need to install and configure Grafana Dashboard
* On Grafana dashboard you will find all necessary metrics of your node (we use this monitoring service by ourselves, so we've configured dashboard properly)

## One line installation:

```
. <(wget -qO- https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/osmosis/monitoring/osmosis-monitoring-install.sh)
```

## OR Manual installation of telegraf and monitoring script

Install telegraf

```
sudo apt update
sudo apt -y install curl jq bc

# install telegraf
wget https://dl.influxdata.com/telegraf/releases/telegraf_1.14.1-1_amd64.deb
dpkg -i telegraf_*.deb

sudo systemctl enable --now telegraf
sudo systemctl is-enabled telegraf

# make the telegraf user sudo and adm to be able to execute scripts as osmosis user
sudo adduser telegraf sudo
sudo adduser telegraf adm
sudo -- bash -c 'echo "telegraf ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers'
```

You can check telegraf service status:

```
sudo systemctl status telegraf
```

Status can be not ok with default Telegraf's config. Next steps will fix it.

Get files from this project repo and copy variable script template

```
cd $HOME
mkdir osmosis-mainnet-monitoring
cd osmosis-mainnet-monitoring
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/osmosis/monitoring/monitor.sh
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/osmosis/monitoring/telegraf.conf
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/osmosis/monitoring/variables.sh
```

```
nano variables.sh
```

Insert your parameters to **variables.sh**:

* full path to osmosis binary to COS\_BIN\_NAME ( check `which d`)
* node PRC port to COS\_PORT\_RPC ( check in file `path_to_osmosis_node_config/config/config.toml`)
* node validator address to COS\_VALOPER ( like `osmovaloper********`)

Save changes in variables.sh and enable execution permissions:

```
chmod +x monitor.sh variables.sh
```

Create telegraf service for osmosis-mainnet-node monitoring

```
cat > /etc/systemd/system/telegraf_osmosis_mainnet.service <<EOL
[Unit]
Description=The plugin-driven server agent for reporting metrics into InfluxDB
Documentation=https://github.com/influxdata/telegraf
After=network.target
[Service]
EnvironmentFile=-/etc/default/telegraf
User=telegraf
ExecStart=/usr/bin/telegraf -config /etc/telegraf/telegraf_osmosis_mainnet.conf -config-directory /etc/telegraf/telegraf.d $TELEGRAF_OPTS
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartForceExitStatus=SIGPIPE
KillMode=control-group
[Install]
WantedBy=multi-user.target
EOL
```

Edit telegraf configuration

```
sudo mv /etc/telegraf/telegraf.conf /etc/telegraf/telegraf.conf.orig
sudo mv telegraf_osmosis_mainnet.conf /etc/telegraf/telegraf_osmosis_mainnet.conf
```

Restart telegraf service

```
sudo systemctl daemon-reload
sudo systemctl enable telegraf_osmosis_mainnet
sudo systemctl restart telegraf_osmosis_mainnet
```

### Dashboard interface

Dashboard has main cosmos-based node information and common system metrics. There is a description for each metric.

Go to our comunity dashboard and select you node from the server list:

### [Dashboard link](https://monitoring-dashboards.l0vd.com/d/Osmosis_mainnet/osmosis-mainnet-monitoring-by-l0vd?orgId=1\&refresh=30s\&from=now-1h\&to=now)

![Screenshot\_1](https://user-images.githubusercontent.com/43213686/169405751-8ff53124-e128-4078-8d68-229a18ea4e25.png) ![Screenshot\_2](https://user-images.githubusercontent.com/43213686/169405777-eb9965a5-9fe8-4ecf-944b-4482c41c019b.png)

#### Mon health

Complex parameter can show problem concerning receiving metrics from node. Normal value is "OK"

#### Sync status

Node catching\_up parameter

#### Block height

Latest blockheight of node

#### Time since latest block

Time interval in seconds between taking the metric and node latest block time. Value greater 15s may indicate some kind of synchronization problem.

#### Peers

Number of connected peers

#### Jailed status

Validator jailed status.

#### Missed blocks

Number of missed blocks in 10000 blocks running window. If the validator misses more than 500 blocks, it will end up in jail.

#### Bonded status

Validator stake bonded info

#### Voting power

Validator voting power. If the value of this parameter is zero, your node isn't in the active pool of validators

#### Delegated tokens

Number of delegated tokens

#### Version

Version of d binary

#### Vali Rank

Your node stake rank

#### Active validator numbers

Total number of active validators

#### Other common system metrics: CPU/RAM/FS load, etc.

No comments needed


# Stride

**Overview**

Stride is a multichain liquid staking zone (appchain) on the Cosmos Blockchain. Stride allows users to stake any IBC-compatible tokens, and receive stTokens in return, which are redeemable for the original token at a 1:1 ratio.

**Official links**

[Website](https://stride.zone/) | [Twitter](https://twitter.com/stride_zone) | [Discord](https://discord.gg/stride-zone) | [Github](https://github.com/Stride-Labs)

**Chain info**

|                |   |
| -------------- | - |
| Chain-id       |   |
| Binary name    | d |
| Binary version |   |

**Explorer**

<https://explorers.l0vd.com/stride-mainnet>

**Public Endpoints**

RPC <https://stride-mainnet.rpc.l0vd.com>

API <https://stride-mainnet.api.l0vd.com>

GRPC

```
stride-mainnet.grpc.l0vd.com:80
```

PEER

```
@stride-mainnet.peers.l0vd.com:
```


# Installation

If you want to setup Stride fullnode manually follow the steps below

## Update and upgrade

```
sudo apt update && sudo apt upgrade -y
```

## Install GO

```
if ! [ -x "$(command -v go)" ]; then
  ver="1.19.3"
  cd $HOME
  wget "https://golang.org/dl/go$ver.linux-amd64.tar.gz"
  sudo rm -rf /usr/local/go
  sudo tar -C /usr/local -xzf "go$ver.linux-amd64.tar.gz"
  rm "go$ver.linux-amd64.tar.gz"
  echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> ~/.bash_profile
  source ~/.bash_profile
fi
```

## Install node

```
cd $HOME
rm -rf stride
git clone https://github.com/Stride-Labs/stride.git
cd stride
git checkout 
make install
```

## Setting up vars

You should replace values in <>\
\<YOUR\_MONIKER> Here you should put name of your moniker (validator) that will be visible in explorer\
\<YOUR\_WALLET> Here you shoud put the name of your wallet

```
STRIDE_WALLET="<YOUR_WALLET_NAME>"
STRIDE_NODENAME="<YOUR_MONIKER>"
STRIDE_CHAIN_ID=""
```

```
echo "
export STRIDE_WALLET=${STRIDE_WALLET}
export STRIDE_NODENAME=${STRIDE_NODENAME}
export STRIDE_CHAIN_ID=${STRIDE_CHAIN_ID}
" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

## Configure your node

```
d config chain-id ${STRIDE_CHAIN_ID}
```

## Initialize your node

```
d init ${STRIDE_NODENAME} --chain-id ${STRIDE_CHAIN_ID}
```

## Download genesis & addrbook

```
curl -Ls "https://snapshots.l0vd.com/stride-mainnet/genesis.json" > $HOME/.stride/config/genesis.json
curl -Ls "https://snapshots.l0vd.com/stride-mainnet/addrbook.json" > $HOME/.stride/config/addrbook.json
```

## (OPTIONAL) Set custom ports

### If you want to use non-default ports

```
STRIDE_PORT=<SET_CUSTOM_PORT> #Example: STRIDE_PORT=56 (numbers from 1 to 64)
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${STRIDE_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${STRIDE_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${STRIDE_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${STRIDE_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${STRIDE_PORT}660\"%" /$HOME/.stride/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${STRIDE_PORT}317\"%; s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${STRIDE_PORT}317\"%; s%^address = \":8080\"%address = \":${STRIDE_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${STRIDE_PORT}090\"%; s%^address = \"localhost:9090\"%address = \"localhost:${STRIDE_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${STRIDE_PORT}091\"%; s%^address = \"localhost:9091\"%address = \"localhost:${STRIDE_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${STRIDE_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${STRIDE_PORT}546\"%" /$HOME/.stride/config/app.toml
```

```
d config node tcp://localhost:${STRIDE_PORT}657
```

## Set seeds and peers

```
PEERS="@stride-mainnet.peers.l0vd.com:"
sed -i -e "s/^seeds *=.*/seeds = \"$SEEDS\"/; s/^persistent_peers *=.*/persistent_peers = \"$PEERS\"/" $HOME/.stride/config/config.toml
```

## Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="50"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.stride/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.stride/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.stride/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.stride/config/app.toml
```

## Set minimum gas price and null indexer

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.0005ustrd\"/" $HOME/.stride/config/app.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.stride/config/config.toml
```

## Create Service

```
sudo tee /etc/systemd/system/d.service > /dev/null <<EOF
[Unit]
Description=Stride mainnet
After=network-online.target

[Service]
User=$USER
ExecStart=$(which d) start
Restart=on-failure
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF
```

## Reset blockchain info and restart your node

```
sudo systemctl daemon-reload
sudo systemctl enable d
d tendermint unsafe-reset-all --home $HOME/.stride --keep-addr-book
sudo systemctl restart d && sudo journalctl -u d -f -o cat
```

## (OPTIONAL) Use State Sync

### [State Sync](/mainnets/stride/installation-guide)

## Starting a validator

### 1. Add a new key

```
d keys add ${STRIDE_WALLET}
```

#### (OR)

### 1. Recover your key

```
d keys add ${STRIDE_WALLET} --recover
```

```
STRIDE_WALLET_ADDR=$(d keys show ${STRIDE_WALLET} -a)
echo "export STRIDE_WALLET_ADDR=${STRIDE_WALLET_ADDR}" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

## 2. Create validator

{% hint style="info" %}
Wait until the node is synchronized.
{% endhint %}

```
d tx staking create-validator \
--amount 1000000ustrd \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--details "" \
--pubkey $(d tendermint show-validator) \
--moniker ${STRIDE_NODENAME} \
--chain-id ${STRIDE_CHAIN_ID} \
--from ${STRIDE_WALLET_ADDR} \
--gas-prices 0.0005ustrd \
--gas-adjustment 1.5 \
--gas auto \
--yes
```


# Snapshot


# State sync

### Info

**Public RPC endpoint:** [**https://stride-mainnet.rpc.l0vd.com**](https://stride-mainnet.rpc.l0vd.com)

**Public API:** [**https://stride-mainnet.api.l0vd.com**](https://stride-mainnet.api.l0vd.com)

### Guide to sync your node using State Sync:

#### Copy the entire command

```
sudo systemctl stop d
SNAP_RPC="https://stride-mainnet.rpc.l0vd.com:443"; \
LATEST_HEIGHT=$(curl -s $SNAP_RPC/block | jq -r .result.block.header.height); \
BLOCK_HEIGHT=$((LATEST_HEIGHT - 2000)); \
TRUST_HASH=$(curl -s "$SNAP_RPC/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash); \
echo $LATEST_HEIGHT $BLOCK_HEIGHT $TRUST_HASH

sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \
s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"$SNAP_RPC,$SNAP_RPC\"| ; \
s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; \
s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"|" $HOME/.stride/config/config.toml

peers="@stride-mainnet.peers.l0vd.com:" \
&& sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.stride/config/config.toml 

d tendermint unsafe-reset-all --home ~/.stride && sudo systemctl restart d && journalctl -u d -f --output cat
```

#### Turn off State Sync Mode after synchronization

```
sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1false|" $HOME/.stride/config/config.toml
```


# Useful commands

{% hint style="info" %}
Please note that the values in <> must be changed to your own values
{% endhint %}

### Keys

#### Add new key

```
d keys add <key_name>
```

#### Recover keys from seed

```
d keys add <key_name> --recover
```

#### Show all keys

```
d keys list
```

#### Delete key

```
d keys delete <key_name>
```

### Node configuration

#### Set custom port

*port 56 was taken as an example, you can use numbers from 1 to 64 to set custom node port*

```
STRIDE_PORT=56
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${STRIDE_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${STRIDE_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${STRIDE_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${STRIDE_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${STRIDE_PORT}660\"%" /$HOME/.stride/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${STRIDE_PORT}317\"%; s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${STRIDE_PORT}317\"%; s%^address = \":8080\"%address = \":${STRIDE_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${STRIDE_PORT}090\"%; s%^address = \"localhost:9090\"%address = \"localhost:${STRIDE_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${STRIDE_PORT}091\"%; s%^address = \"localhost:9091\"%address = \"localhost:${STRIDE_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${STRIDE_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${STRIDE_PORT}546\"%" /$HOME/.stride/config/app.toml
```

#### Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="10"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.stride/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.stride/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.stride/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.stride/config/app.toml
```

#### Disable indexing

```
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.stride/config/config.toml
```

#### Set minimum gas prices

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.0005ustrd\"/" $HOME/.stride/config/app.toml
```

### Validator configuration

#### Create validator

```
d tx staking create-validator \
--amount 1000000ustrd \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--pubkey $(d tendermint show-validator) \
--moniker <STRIDE_NODENAME> \
--chain-id  \
--from <STRIDE_WALLET> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--gas-prices 0.0005ustrd \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### Edit validator

```
d tx staking edit-validator \
--new-moniker <STRIDE_NODENAME> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--chain-id  \
--commission-rate 0.05 \
--from <STRIDE_WALLET> \
--gas-prices 0.0005ustrd \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### View validator info

```
d q staking validator $(d keys show <STRIDE_WALLET> --bech val -a)
```

#### Unjail validator

```
d tx slashing unjail --from <STRIDE_WALLET> --chain-id  --gas-prices 0.0005ustrd --gas-adjustment 1.5 --gas auto --yes 
```

#### Signing info

```
d query slashing signing-info $(d tendermint show-validator)
```

### Token operations

#### Send tokens

```
d tx bank send wallet <DEST_WALLET_ADDRESS> 100ustrd --from <STRIDE_WALLET> --chain-id  --gas-prices 0.0005ustrd --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to your validator

```
d tx staking delegate $(d keys show <STRIDE_WALLET> --bech val -a) 100ustrd --from <STRIDE_WALLET> --chain-id  --gas-prices 0.0005ustrd --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to another validator

```
d tx staking delegate <VALOPER_ADDRESS> 100ustrd --from <STRIDE_WALLET> --chain-id  --gas-prices 0.0005ustrd --gas-adjustment 1.5 --gas auto --yes
```

#### Redelegate tokens to another validator

```
d tx staking redelegate $(d keys show <STRIDE_WALLET> --bech val -a) <TO_VALOPER_ADDRESS> 100ustrd --from <STRIDE_WALLET> --chain-id  --gas-prices 0.0005ustrd --gas-adjustment 1.5 --gas auto --yes
```

#### Unbond tokens from staking

```
d tx staking unbond $(d keys show <STRIDE_WALLET> --bech val -a) 100ustrd --from <STRIDE_WALLET> --chain-id  --gas-prices 0.0005ustrd --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw all rewards from staking

```
d tx distribution withdraw-all-rewards --from <STRIDE_WALLET> --chain-id  --gas-prices 0.0005ustrd --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw validator rewards and comission

```
d tx distribution withdraw-rewards $(d keys show <STRIDE_WALLET> --bech val -a) --commission --from wallet --chain-id  --gas-adjustment 1.5 --gas auto --gas-prices 0.0005ustrd -y

```

### Governance

#### Vote "YES"

```
d tx gov vote <proposal_id> yes --from <STRIDE_WALLET> --chain-id  --gas-prices 0.0005ustrd --gas-adjustment 1.5 --gas auto --yes
```

#### Vote "NO"

```
d tx gov vote <proposal_id> no --from <STRIDE_WALLET> --chain-id  --gas-prices 0.0005ustrd --gas-adjustment 1.5 --gas auto --yes
```

#### Abstain from voting

```
d tx gov vote <proposal_id> abstain --from <STRIDE_WALLET> --chain-id  --gas-adjustment 1.5 --gas auto --gas-prices 0.0005ustrd -y
```

### General commands

#### Check node status

```
d status | jq
```

#### Check service status

```
sudo systemctl status d
```

#### Check logs

```
sudo journalctl -u d -f --no-hostname -o cat
```

#### Restart service

```
sudo systemctl restart d
```

#### Stop service

```
sudo systemctl stop d
```

#### Start service

```
sudo systemctl start d
```

#### Disable service

```
sudo systemctl disable d
```

#### Enable service

```
sudo systemctl enable d
```

#### Reload service after changes

```
sudo systemctl daemon-reload
```


# Monitoring

## Monitoring

Advantages of using our free service:

* Our monitoring service is working on dedicated server (24/7 online)
* No need to install database (InfluxDB)
* No need to install and configure Grafana Dashboard
* On Grafana dashboard you will find all necessary metrics of your node (we use this monitoring service by ourselves, so we've configured dashboard properly)

## One line installation:

```
. <(wget -qO- https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/stride/monitoring/stride-monitoring-install.sh)
```

## OR Manual installation of telegraf and monitoring script

Install telegraf

```
sudo apt update
sudo apt -y install curl jq bc

# install telegraf
wget https://dl.influxdata.com/telegraf/releases/telegraf_1.14.1-1_amd64.deb
dpkg -i telegraf_*.deb

sudo systemctl enable --now telegraf
sudo systemctl is-enabled telegraf

# make the telegraf user sudo and adm to be able to execute scripts as stride user
sudo adduser telegraf sudo
sudo adduser telegraf adm
sudo -- bash -c 'echo "telegraf ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers'
```

You can check telegraf service status:

```
sudo systemctl status telegraf
```

Status can be not ok with default Telegraf's config. Next steps will fix it.

Get files from this project repo and copy variable script template

```
cd $HOME
mkdir stride-mainnet-monitoring
cd stride-mainnet-monitoring
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/stride/monitoring/monitor.sh
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/stride/monitoring/telegraf.conf
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/stride/monitoring/variables.sh
```

```
nano variables.sh
```

Insert your parameters to **variables.sh**:

* full path to stride binary to COS\_BIN\_NAME ( check `which strided`)
* node PRC port to COS\_PORT\_RPC ( check in file `path_to_stride_node_config/config/config.toml`)
* node validator address to COS\_VALOPER ( like `stridevaloper********`)

Save changes in variables.sh and enable execution permissions:

```
chmod +x monitor.sh variables.sh
```

Create telegraf service for stride-mainnet-node monitoring

```
cat > /etc/systemd/system/telegraf_stride_mainnet.service <<EOL
[Unit]
Description=The plugin-driven server agent for reporting metrics into InfluxDB
Documentation=https://github.com/influxdata/telegraf
After=network.target
[Service]
EnvironmentFile=-/etc/default/telegraf
User=telegraf
ExecStart=/usr/bin/telegraf -config /etc/telegraf/telegraf_stride_mainnet.conf -config-directory /etc/telegraf/telegraf.d $TELEGRAF_OPTS
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartForceExitStatus=SIGPIPE
KillMode=control-group
[Install]
WantedBy=multi-user.target
EOL
```

Edit telegraf configuration

```
sudo mv /etc/telegraf/telegraf.conf /etc/telegraf/telegraf.conf.orig
sudo mv telegraf_stride_mainnet.conf /etc/telegraf/telegraf_stride_mainnet.conf
```

Restart telegraf service

```
sudo systemctl daemon-reload
sudo systemctl enable telegraf_stride_mainnet
sudo systemctl restart telegraf_stride_mainnet
```

### Dashboard interface

Dashboard has main cosmos-based node information and common system metrics. There is a description for each metric.

Go to our comunity dashboard and select you node from the server list:

### [Dashboard link](https://monitoring-dashboards.l0vd.com/d/Stride_mainnet/stride-mainnet-monitoring-by-l0vd?orgId=1\&refresh=30s\&from=now-1h\&to=now)

![Screenshot\_1](https://user-images.githubusercontent.com/43213686/169405751-8ff53124-e128-4078-8d68-229a18ea4e25.png) ![Screenshot\_2](https://user-images.githubusercontent.com/43213686/169405777-eb9965a5-9fe8-4ecf-944b-4482c41c019b.png)

#### Mon health

Complex parameter can show problem concerning receiving metrics from node. Normal value is "OK"

#### Sync status

Node catching\_up parameter

#### Block height

Latest blockheight of node

#### Time since latest block

Time interval in seconds between taking the metric and node latest block time. Value greater 15s may indicate some kind of synchronization problem.

#### Peers

Number of connected peers

#### Jailed status

Validator jailed status.

#### Missed blocks

Number of missed blocks in 10000 blocks running window. If the validator misses more than 500 blocks, it will end up in jail.

#### Bonded status

Validator stake bonded info

#### Voting power

Validator voting power. If the value of this parameter is zero, your node isn't in the active pool of validators

#### Delegated tokens

Number of delegated tokens

#### Version

Version of strided binary

#### Vali Rank

Your node stake rank

#### Active validator numbers

Total number of active validators

#### Other common system metrics: CPU/RAM/FS load, etc.

No comments needed


# Umee

**Overview**

Umee is a layer-one blockchain built on Cosmos designed to create a universal cross-chain DeFi hub. It serves as a base layer for future DApps and money legos.

**Official links**

[Website](https://umee.cc/) | [Twitter](https://twitter.com/Umee_CrossChain) | [Discord](https://discord.gg/umee) | [Github](https://github.com/umee-network)

**Chain info**

|                |        |
| -------------- | ------ |
| Chain-id       | umee-1 |
| Binary name    | d      |
| Binary version | v      |

**Explorer**

<https://explorers.l0vd.com/umee-mainnet>

**Public Endpoints**

RPC <https://umee-mainnet.rpc.l0vd.com>

API <https://umee-mainnet.api.l0vd.com>

GRPC

```
umee-mainnet.grpc.l0vd.com:80
```

PEER

```
de1139e62ef9947a99972dd7d8b6690c93907f2a@umee-mainnet.peers.l0vd.com:10656
```


# Installation

### Manual node setup

If you want to setup Umee fullnode manually follow the steps below

#### Update and upgrade

```
sudo apt update && sudo apt upgrade -y
```

#### Install GO

```
if ! [ -x "$(command -v go)" ]; then
  ver="1.19.3"
  cd $HOME
  wget "https://golang.org/dl/go$ver.linux-amd64.tar.gz"
  sudo rm -rf /usr/local/go
  sudo tar -C /usr/local -xzf "go$ver.linux-amd64.tar.gz"
  rm "go$ver.linux-amd64.tar.gz"
  echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> ~/.bash_profile
  source ~/.bash_profile
fi
```

#### Install node

```
cd $HOME
rm -rf umee
git clone https://github.com/umee-network/umee.git
cd umee
git checkout v
make install
```

#### Setting up vars

You should replace values in <>\
\<YOUR\_MONIKER> Here you should put name of your moniker (validator) that will be visible in explorer\
\<YOUR\_WALLET> Here you shoud put the name of your wallet

```
UMEE_WALLET="<YOUR_WALLET_NAME>"
UMEE_NODENAME="<YOUR_MONIKER>"
UMEE_CHAIN_ID="umee-1"
```

```
echo "
export UMEE_WALLET=${UMEE_WALLET}
export UMEE_NODENAME=${UMEE_NODENAME}
export UMEE_CHAIN_ID=${UMEE_CHAIN_ID}
" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

#### Configure your node

```
d config chain-id ${UMEE_CHAIN_ID}
```

#### Initialize your node

```
d init ${UMEE_NODENAME} --chain-id ${UMEE_CHAIN_ID}
```

#### Download genesis & addrbook

```
curl -Ls "https://snapshots.l0vd.com/umee-mainnet/genesis.json" > $HOME/.umee/config/genesis.json
curl -Ls "https://snapshots.l0vd.com/umee-mainnet/addrbook.json" > $HOME/.umee/config/addrbook.json
```

#### (OPTIONAL) Set custom ports

**If you want to use non-default ports**

```
UMEE_PORT=<SET_CUSTOM_PORT> #Example: UMEE_PORT=56 (numbers from 1 to 64)
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${UMEE_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${UMEE_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${UMEE_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${UMEE_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${UMEE_PORT}660\"%" /$HOME/.umee/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${UMEE_PORT}317\"%; s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${UMEE_PORT}317\"%; s%^address = \":8080\"%address = \":${UMEE_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${UMEE_PORT}090\"%; s%^address = \"localhost:9090\"%address = \"localhost:${UMEE_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${UMEE_PORT}091\"%; s%^address = \"localhost:9091\"%address = \"localhost:${UMEE_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${UMEE_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${UMEE_PORT}546\"%" /$HOME/.umee/config/app.toml
```

#### Set seeds and peers

```
PEERS="de1139e62ef9947a99972dd7d8b6690c93907f2a@umee-mainnet.peers.l0vd.com:10656"
sed -i -e "s/^seeds *=.*/seeds = \"$SEEDS\"/; s/^persistent_peers *=.*/persistent_peers = \"$PEERS\"/" $HOME/.umee/config/config.toml
```

#### Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="50"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.umee/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.umee/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.umee/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.umee/config/app.toml
```

#### Set minimum gas price and null indexer

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.2uumee\"/" $HOME/.umee/config/app.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.umee/config/config.toml
```

#### Create Service

```
sudo tee /etc/systemd/system/d.service > /dev/null <<EOF
[Unit]
Description=Umee mainnet
After=network-online.target

[Service]
User=$USER
ExecStart=$(which d) start
Restart=on-failure
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF
```

#### Reset blockchain info and restart your node

```
sudo systemctl daemon-reload
sudo systemctl enable d
d tendermint unsafe-reset-all --home $HOME/.umee --keep-addr-book
sudo systemctl restart d && sudo journalctl -u d -f -o cat
```

#### (OPTIONAL) Use State Sync

[**State Sync**](/mainnets/umee/installation-guide)

#### Starting a validator

**1. Add a new key**

```
d keys add ${UMEE_WALLET}
```

**(OR)**

**1. Recover your key**

```
d keys add ${UMEE_WALLET} --recover
```

```
UMEE_WALLET_ADDR=$(d keys show ${UMEE_WALLET} -a)
echo "export UMEE_WALLET_ADDR=${UMEE_WALLET_ADDR}" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

#### 2. Create validator

{% hint style="info" %}
Wait until the node is synchronized.
{% endhint %}

```
d tx staking create-validator \
--amount 1000000uumee \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--details "" \
--pubkey $(d tendermint show-validator) \
--moniker ${UMEE_NODENAME} \
--chain-id ${UMEE_CHAIN_ID} \
--from ${UMEE_WALLET_ADDR} \
--gas-prices 0.2uumee \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

### Set up Price-feeder

#### Install price-feeder

```
cd $HOME
git clone https://github.com/ojo-network/price-feeder.git
cd price-feeder
git checkout umee/v2.1.6-1
make install
```

```
mkdir -p $HOME/umee-price-feeder
```

```
wget -O $HOME/umee-price-feeder/price-feeder.toml "https://raw.githubusercontent.com/ojo-network/price-feeder/umee/price-feeder.example.toml"
```

#### Add price-feeder key

```
umeed keys add UMEE_PFD_WALLET
```

```
echo "
export UMEE_PFD_WALLET=$(umeed keys show UMEE_PFD_WALLET -a)
" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

#### Fund price-feeder wallet

#### Set up variables

```
UMEE_KEYRING_PASS="xxxxxxxxx"
UMEE_GRPC_PORT="${UMEE_PORT}090"
UMEE_RPC_PORT="${UMEE_PORT}657"
UMEE_HOME="$HOME/.umee"
UMEE_VALOPER=$(umeed keys show $UMEE_WALLET_ADDR --bech val -a)
```

#### Export variables

```
echo "
export UMEE_KEYRING_PASS=${UMEE_KEYRING_PASS}
export UMEE_GRPC_PORT=${UMEE_GRPC_PORT}
export UMEE_RPC_PORT=${UMEE_RPC_PORT}
export UMEE_HOME=${UMEE_HOME}
export UMEE_VALOPER=${UMEE_VALOPER}
" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

#### Set up price-feeder config

```
sed -i "s/^listen_addr *=.*/listen_addr = \"0.0.0.0:7173\"/;\
s/^address *=.*/address = \"$UMEE_PFD_WALLET\"/;\
s/^chain_id *=.*/chain_id = \"umee-1\"/;\
s/^validator *=.*/validator = \"$UMEE_VALOPER\"/;\
s/^backend *=.*/backend = \"os\"/;\
s|^dir *=.*|dir = \"${UMEE_HOME}\"|;\
s|^pass *=.*|pass = \"${UMEE_KEYRING_PASS}\"|;\
s|^grpc_endpoint *=.*|grpc_endpoint = \"localhost:${UMEE_GRPC_PORT}\"|;\
s|^tmrpc_endpoint *=.*|tmrpc_endpoint = \"http://localhost:${UMEE_RPC_PORT}\"|;\
s|^global-labels *=.*|global-labels = [[\"chain_id\", \"$UMEE_CHAIN_ID\"]]|;" $HOME/umee-price-feeder/price-feeder.toml
```

#### Create price-feeder service

```
sudo tee /etc/systemd/system/price-feeder.service > /dev/null <<EOF
[Unit]
Description=umee-price-feeder
After=network.target
[Service]
User=$USER
Environment="PRICE_FEEDER_PASS=${UMEE_KEYRING_PASS}"
Type=simple
ExecStart=$(which price-feeder) $HOME/umee-price-feeder/price-feeder.toml --skip-provider-check --log-level debug
RestartSec=10
Restart=on-failure
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
```

```
sudo systemctl daemon-reload
sudo systemctl enable price-feeder
```

#### Delegate price-feeder

```
umeed tx oracle delegate-feed-consent $UMEE_WALLET_ADDR $UMEE_PFD_WALLET --fees 40000uumee
```

#### Start price-feeder

```
sudo systemctl start price-feeder && journalctl -u price-feeder -f -o cat
```


# Snapshot

## Updates every 4 hours

## Install dependencies, if needed

```
sudo apt update
sudo apt install lz4 -y
```

## Sync from Snapshot

| Height   | Size   | Pruning         | Indexer | Creation Time (UTC+3) |
| -------- | ------ | --------------- | ------- | --------------------- |
| 21634491 | 1.38GB | custom/100/0/10 | null    | 2026-01-30T04:09:22   |

```
sudo systemctl stop umeed

cp $HOME/.umee/data/priv_validator_state.json $HOME/.umee/priv_validator_state.json.backup
${BINARY_NAME} tendermint unsafe-reset-all --home $HOME/.umee --keep-addr-book

rm -rf $HOME/.umee/data 

SNAP_NAME=$(curl -s https://snapshots.l0vd.com/mainnets/umee/umee-1/ | egrep -o ">umee-1.*\.tar.lz4" | tr -d ">")
curl https://snapshots.l0vd.com/mainnets/umee/umee-1/${SNAP_NAME} | lz4 -dc - | tar -xf - -C $HOME/.umee/data

mv $HOME/.umee/priv_validator_state.json.backup $HOME/.umee/data/priv_validator_state.json

sudo systemctl restart umeed
sudo journalctl -u umeed -f --no-hostname -o cat
```


# State sync

### Info

**Public RPC endpoint:** [**https://umee-mainnet.rpc.l0vd.com**](https://umee-mainnet.rpc.l0vd.com)

**Public API:** [**https://umee-mainnet.api.l0vd.com**](https://umee-mainnet.api.l0vd.com)

### Guide to sync your node using State Sync:

#### Copy the entire command

```
sudo systemctl stop d
SNAP_RPC="https://umee-mainnet.rpc.l0vd.com:443"; \
LATEST_HEIGHT=$(curl -s $SNAP_RPC/block | jq -r .result.block.header.height); \
BLOCK_HEIGHT=$((LATEST_HEIGHT - 2000)); \
TRUST_HASH=$(curl -s "$SNAP_RPC/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash); \
echo $LATEST_HEIGHT $BLOCK_HEIGHT $TRUST_HASH

sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \
s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"$SNAP_RPC,$SNAP_RPC\"| ; \
s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; \
s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"|" $HOME/.umee/config/config.toml

peers="de1139e62ef9947a99972dd7d8b6690c93907f2a@umee-mainnet.peers.l0vd.com:10656" \
&& sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.umee/config/config.toml 

d tendermint unsafe-reset-all --home ~/.umee && sudo systemctl restart d && journalctl -u d -f --output cat
```

#### Turn off State Sync Mode after synchronization

```
sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1false|" $HOME/.umee/config/config.toml
```


# Useful commands

{% hint style="info" %}
Please note that the values in <> must be changed to your own values
{% endhint %}

### Keys

#### Add new key

```
d keys add <key_name>
```

#### Recover keys from seed

```
d keys add <key_name> --recover
```

#### Show all keys

```
d keys list
```

#### Delete key

```
d keys delete <key_name>
```

### Node configuration

#### Set custom port

*port 56 was taken as an example, you can use numbers from 1 to 64 to set custom node port*

```
UMEE_PORT=56
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${UMEE_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${UMEE_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${UMEE_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${UMEE_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${UMEE_PORT}660\"%" /$HOME/.umee/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${UMEE_PORT}317\"%; s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${UMEE_PORT}317\"%; s%^address = \":8080\"%address = \":${UMEE_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${UMEE_PORT}090\"%; s%^address = \"localhost:9090\"%address = \"localhost:${UMEE_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${UMEE_PORT}091\"%; s%^address = \"localhost:9091\"%address = \"localhost:${UMEE_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${UMEE_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${UMEE_PORT}546\"%" /$HOME/.umee/config/app.toml
```

#### Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="10"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.umee/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.umee/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.umee/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.umee/config/app.toml
```

#### Disable indexing

```
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.umee/config/config.toml
```

#### Set minimum gas prices

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.2uumee\"/" $HOME/.umee/config/app.toml
```

### Validator configuration

#### Create validator

```
d tx staking create-validator \
--amount 1000000uumee \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--pubkey $(d tendermint show-validator) \
--moniker <UMEE_NODENAME> \
--chain-id umee-1 \
--from <UMEE_WALLET> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--gas-prices 0.2uumee \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### Edit validator

```
d tx staking edit-validator \
--new-moniker <UMEE_NODENAME> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--chain-id umee-1 \
--commission-rate 0.05 \
--from <UMEE_WALLET> \
--gas-prices 0.2uumee \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### View validator info

```
d q staking validator $(d keys show <UMEE_WALLET> --bech val -a)
```

#### Unjail validator

```
d tx slashing unjail --from <UMEE_WALLET> --chain-id umee-1 --gas-prices 0.2uumee --gas-adjustment 1.5 --gas auto --yes 
```

#### Signing info

```
d query slashing signing-info $(d tendermint show-validator)
```

### Token operations

#### Send tokens

```
d tx bank send wallet <DEST_WALLET_ADDRESS> 100uumee --from <UMEE_WALLET> --chain-id umee-1 --gas-prices 0.2uumee --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to your validator

```
d tx staking delegate $(d keys show <UMEE_WALLET> --bech val -a) 100uumee --from <UMEE_WALLET> --chain-id umee-1 --gas-prices 0.2uumee --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to another validator

```
d tx staking delegate <VALOPER_ADDRESS> 100uumee --from <UMEE_WALLET> --chain-id umee-1 --gas-prices 0.2uumee --gas-adjustment 1.5 --gas auto --yes
```

#### Redelegate tokens to another validator

```
d tx staking redelegate $(d keys show <UMEE_WALLET> --bech val -a) <TO_VALOPER_ADDRESS> 100uumee --from <UMEE_WALLET> --chain-id umee-1 --gas-prices 0.2uumee --gas-adjustment 1.5 --gas auto --yes
```

#### Unbond tokens from staking

```
d tx staking unbond $(d keys show <UMEE_WALLET> --bech val -a) 100uumee --from <UMEE_WALLET> --chain-id umee-1 --gas-prices 0.2uumee --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw all rewards from staking

```
d tx distribution withdraw-all-rewards --from <UMEE_WALLET> --chain-id umee-1 --gas-prices 0.2uumee --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw validator rewards and comission

```
d tx distribution withdraw-rewards $(d keys show <UMEE_WALLET> --bech val -a) --commission --from wallet --chain-id umee-1 --gas-adjustment 1.5 --gas auto --gas-prices 0.2uumee -y

```

### Governance

#### Vote "YES"

```
d tx gov vote <proposal_id> yes --from <UMEE_WALLET> --chain-id umee-1 --gas-prices 0.2uumee --gas-adjustment 1.5 --gas auto --yes
```

#### Vote "NO"

```
d tx gov vote <proposal_id> no --from <UMEE_WALLET> --chain-id umee-1 --gas-prices 0.2uumee --gas-adjustment 1.5 --gas auto --yes
```

#### Abstain from voting

```
d tx gov vote <proposal_id> abstain --from <UMEE_WALLET> --chain-id umee-1 --gas-adjustment 1.5 --gas auto --gas-prices 0.2uumee -y
```

### Price-feeder commands

#### Check logs

```
sudo journalctl -u umee-price-feeder -f --no-hostname -o cat
```

#### Restart price-feeder

```
sudo systemctl restart umee-price-feeder
```

#### Delegate pfd rights to different wallet than the one used to create a validator

```
umeed tx oracle delegate-feed-consent <MAIN_WALLET_ADDRESS> <PFD_WALLET_ADDRESS> --from <UMEE_WALLET> --gas-adjustment 1.5 --gas auto --gas-prices 0.2uumee -y
```

#### Check price-feeder delegated address

```
umeed q oracle feeder-delegation <VALOPER_ADDRESS>
```

#### Check missed price-feeder votes

```
umeed q oracle miss-counter <VALOPER_ADDRESS>
```

### General commands

#### Check node status

```
d status | jq
```

#### Check service status

```
sudo systemctl status d
```

#### Check logs

```
sudo journalctl -u d -f --no-hostname -o cat
```

#### Restart service

```
sudo systemctl restart d
```

#### Stop service

```
sudo systemctl stop d
```

#### Start service

```
sudo systemctl start d
```

#### Disable service

```
sudo systemctl disable d
```

#### Enable service

```
sudo systemctl enable d
```

#### Reload service after changes

```
sudo systemctl daemon-reload
```


# Monitoring

## Monitoring

Advantages of using our free service:

* Our monitoring service is working on dedicated server (24/7 online)
* No need to install database (InfluxDB)
* No need to install and configure Grafana Dashboard
* On Grafana dashboard you will find all necessary metrics of your node (we use this monitoring service by ourselves, so we've configured dashboard properly)

## One line installation:

```
. <(wget -qO- https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/umee/monitoring/umee-monitoring-install.sh)
```

## OR Manual installation of telegraf and monitoring script

Install telegraf

```
sudo apt update
sudo apt -y install curl jq bc

# install telegraf
wget https://dl.influxdata.com/telegraf/releases/telegraf_1.14.1-1_amd64.deb
dpkg -i telegraf_*.deb

sudo systemctl enable --now telegraf
sudo systemctl is-enabled telegraf

# make the telegraf user sudo and adm to be able to execute scripts as umee user
sudo adduser telegraf sudo
sudo adduser telegraf adm
sudo -- bash -c 'echo "telegraf ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers'
```

You can check telegraf service status:

```
sudo systemctl status telegraf
```

Status can be not ok with default Telegraf's config. Next steps will fix it.

Get files from this project repo and copy variable script template

```
cd $HOME
mkdir umee-mainnet-monitoring
cd umee-mainnet-monitoring
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/umee/monitoring/monitor.sh
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/umee/monitoring/telegraf.conf
wget https://raw.githubusercontent.com/L0vd/chain-services/main/mainnets/umee/monitoring/variables.sh
```

```
nano variables.sh
```

Insert your parameters to **variables.sh**:

* full path to umee binary to COS\_BIN\_NAME ( check `which umeed`)
* node PRC port to COS\_PORT\_RPC ( check in file `path_to_umee_node_config/config/config.toml`)
* node validator address to COS\_VALOPER ( like `umeevaloper********`)

Save changes in variables.sh and enable execution permissions:

```
chmod +x monitor.sh variables.sh
```

Create telegraf service for umee-mainnet-node monitoring

```
cat > /etc/systemd/system/telegraf_umee_mainnet.service <<EOL
[Unit]
Description=The plugin-driven server agent for reporting metrics into InfluxDB
Documentation=https://github.com/influxdata/telegraf
After=network.target
[Service]
EnvironmentFile=-/etc/default/telegraf
User=telegraf
ExecStart=/usr/bin/telegraf -config /etc/telegraf/telegraf_umee_mainnet.conf -config-directory /etc/telegraf/telegraf.d $TELEGRAF_OPTS
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartForceExitStatus=SIGPIPE
KillMode=control-group
[Install]
WantedBy=multi-user.target
EOL
```

Edit telegraf configuration

```
sudo mv /etc/telegraf/telegraf.conf /etc/telegraf/telegraf.conf.orig
sudo mv telegraf_umee_mainnet.conf /etc/telegraf/telegraf_umee_mainnet.conf
```

Restart telegraf service

```
sudo systemctl daemon-reload
sudo systemctl enable telegraf_umee_mainnet
sudo systemctl restart telegraf_umee_mainnet
```

### Dashboard interface

Dashboard has main cosmos-based node information and common system metrics. There is a description for each metric.

Go to our comunity dashboard and select you node from the server list:

### [Dashboard link](https://monitoring-dashboards.l0vd.com/d/Umee_mainnet/umee-mainnet-monitoring-by-l0vd?orgId=1\&refresh=30s\&from=now-1h\&to=now)

![Screenshot\_1](https://user-images.githubusercontent.com/43213686/169405751-8ff53124-e128-4078-8d68-229a18ea4e25.png) ![Screenshot\_2](https://user-images.githubusercontent.com/43213686/169405777-eb9965a5-9fe8-4ecf-944b-4482c41c019b.png)

#### Mon health

Complex parameter can show problem concerning receiving metrics from node. Normal value is "OK"

#### Sync status

Node catching\_up parameter

#### Block height

Latest blockheight of node

#### Time since latest block

Time interval in seconds between taking the metric and node latest block time. Value greater 15s may indicate some kind of synchronization problem.

#### Peers

Number of connected peers

#### Jailed status

Validator jailed status.

#### Missed blocks

Number of missed blocks in 10000 blocks running window. If the validator misses more than 500 blocks, it will end up in jail.

#### Bonded status

Validator stake bonded info

#### Voting power

Validator voting power. If the value of this parameter is zero, your node isn't in the active pool of validators

#### Delegated tokens

Number of delegated tokens

#### Version

Version of umeed binary

#### Vali Rank

Your node stake rank

#### Active validator numbers

Total number of active validators

#### Other common system metrics: CPU/RAM/FS load, etc.

No comments needed


# Andromeda

**Overview**

Andromeda is an application platform layer that connects all public blockchains in the Cosmos ecosystem. Through our vast library of no-code smart contracts, users can harness the power of web3.

**Official links**

[Website](https://www.andromedaprotocol.io/) | [Twitter](https://twitter.com/andromedaprot) | [Discord](https://discord.gg/EtSRGbPEXP) | [Github](https://github.com/andromedaprotocol)

**Chain info**

|                |                        |
| -------------- | ---------------------- |
| Chain-id       | galileo-3              |
| Binary version | galileo-3-v1.1.0-beta1 |

**Explorer**

<https://explorers.l0vd.com/andromeda-testnet>

**Public Endpoints**

RPC\
<https://andromeda-testnet.rpc.l0vd.com/>\
API\
<https://andromeda-testnet.api.l0vd.com/><br>

**Other services**

[Installation-guide](/testnets/andromeda/installation-guide)\
[State Sync](/testnets/andromeda/state-sync)\
[Snapshot](https://github.com/L0vd/chain-services/blob/main/testnets/andromeda/snapshot/README.md)\
[Useful commands](/testnets/andromeda/useful-commands)\
[Monitoring](/testnets/andromeda/monitoring)\
[Telegram wallet bot](/testnets/andromeda/wallet-bot)<br>


# Installation

If you want to setup Andromeda fullnode manually follow the steps below

## Update and upgrade

```
sudo apt update && sudo apt upgrade -y
```

## Install GO

```
if ! [ -x "$(command -v go)" ]; then
  ver="1.19.3"
  cd $HOME
  wget "https://golang.org/dl/go$ver.linux-amd64.tar.gz"
  sudo rm -rf /usr/local/go
  sudo tar -C /usr/local -xzf "go$ver.linux-amd64.tar.gz"
  rm "go$ver.linux-amd64.tar.gz"
  echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> ~/.bash_profile
  source ~/.bash_profile
fi
```

## Install node

```
cd $HOME
git clone https://github.com/andromedaprotocol/andromedad.git
cd andromedad
git checkout galileo-3-v1.1.0-beta1 
make install
andromedad version #galileo-3-v1.1.0-beta1
```

## Setting up vars

You should replace values in <>\
\<YOUR\_MONIKER> Here you should put name of your moniker (validator) that will be visible in explorer\
\<YOUR\_WALLET> Here you shoud put the name of your wallet

```
echo "export ANDROMEDA_WALLET="<YOUR_WALLET_NAME>"" >> $HOME/.bash_profile
echo "export ANDROMEDA_NODENAME="<YOUR_MONIKER>"" >> $HOME/.bash_profile
echo "export ANDROMEDA_CHAIN_ID="galileo-3"" >> $HOME/.bash_profile
source $HOME/.bash_profile
```

## Configure your node

```
andromedad config chain-id $ANDROMEDA_CHAIN_ID
```

## Initialize your node

```
andromedad init $ANDROMEDA_NODENAME --chain-id $ANDROMEDA_CHAIN_ID
```

## Download genesis

```
wget "$HOME/.andromedad/config/genesis.json" https://raw.githubusercontent.com/andromedaprotocol/testnets/galileo-3/genesis.json
```

## (OPTIONAL) Set custom ports

### If you want to use non-default ports

```
ANDROMEDA_PORT=<SET_CUSTOM_PORT> #Example: ANDROMEDA_PORT=56 (numbers from 1 to 64)
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${ANDROMEDA_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${ANDROMEDA_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${ANDROMEDA_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${ANDROMEDA_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${ANDROMEDA_PORT}660\"%" $HOME/.andromedad/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${ANDROMEDA_PORT}317\"%; s%^address = \":8080\"%address = \":${ANDROMEDA_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${ANDROMEDA_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${ANDROMEDA_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${ANDROMEDA_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${ANDROMEDA_PORT}546\"%" $HOME/.andromedad/config/app.toml
```

## Set seeds and peers

```
SEEDS=""
PEERS="77c04ed628aa56322c45b8da14b8567c1bf322e5@65.108.98.53:11056,d22bf273fc96fd6b184333271aa1e979e10876ff@188.40.140.51:21000"
sed -i -e "s/^seeds *=.*/seeds = \"$SEEDS\"/; s/^persistent_peers *=.*/persistent_peers = \"$PEERS\"/" $HOME/.andromedad/config/config.toml
```

## Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="50"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.andromedad/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.andromedad/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.andromedad/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.andromedad/config/app.toml
```

## Set minimum gas price and null indexer

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0uandr\"/" $HOME/.andromedad/config/app.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.andromedad/config/config.toml
```

## Create Service

```
sudo tee /etc/systemd/system/andromedad.service > /dev/null <<EOF
[Unit]
Description=Lava
After=network-online.target

[Service]
User=$USER
ExecStart=$(which andromedad) start
Restart=on-failure
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF
```

## Reset blockchain info and restart your node

```
sudo systemctl daemon-reload
sudo systemctl enable andromedad
andromedad tendermint unsafe-reset-all --home $HOME/.andromedad --keep-addr-book
sudo systemctl restart andromedad && sudo journalctl -u andromedad -f -o cat
```

## (OPTIONAL) Use State Sync

### [State Sync](/testnets/andromeda/installation-guide)

## Starting a validator

### 1. Add a new key

```
andromedad keys add $ANDROMEDA_WALLET
```

#### (OR)

### 1. Recover your key

```
andromedad keys add $ANDROMEDA_WALLET --recover
```

### 2. Request tokens from [faucet](https://discord.com/channels/1007329761229545512/1025144166117814404)

### 3. Create validator

{% hint style="info" %}
Wait until the node is synchronized.
{% endhint %}

```
andromedad tx staking create-validator \
--amount 1000000uandr \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--details "" \
--pubkey=$(andromedad tendermint show-validator) \
--moniker $ANDROMEDA_NODENAME \
--chain-id $ANDROMEDA_CHAIN_ID \
--from $ANDROMEDA_WALLET \
--gas-prices 0.1uandr \
--gas-adjustment 1.5 \
--gas auto \
--yes
```


# Snapshot


# State sync

## Info

#### Public RPC endpoint: <https://andromeda-testnet.rpc.l0vd.com>

#### Public API: <https://andromeda-testnet.api.l0vd.com>

## Guide to sync your node using State Sync:

### Copy the entire command

```
sudo systemctl stop andromedad
SNAP_RPC="https://andromeda-testnet.rpc.l0vd.com:443"; \
LATEST_HEIGHT=$(curl -s $SNAP_RPC/block | jq -r .result.block.header.height); \
BLOCK_HEIGHT=$((LATEST_HEIGHT - 1000)); \
TRUST_HASH=$(curl -s "$SNAP_RPC/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash); \
echo $LATEST_HEIGHT $BLOCK_HEIGHT $TRUST_HASH

sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \
s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"$SNAP_RPC,$SNAP_RPC\"| ; \
s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; \
s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"|" $HOME/.andromedad/config/config.toml

peers="3d7973758b48ba80b885069b020db503b7a75dde@95.216.2.219:26656" \
&& sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.andromedad/config/config.toml 

andromedad tendermint unsafe-reset-all --home ~/.andromedad --keep-addr-book && sudo systemctl restart andromedad && \
journalctl -u andromedad -f --output cat
```

### Turn off State Sync Mode after synchronization

```
sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1false|" $HOME/.andromedad/config/config.toml
```


# Useful commands

{% hint style="info" %}
Please note that the values in <> must be changed to your own values
{% endhint %}

### Keys

#### Add new key

```
andromedad keys add <key_name>
```

#### Recover keys from seed

```
andromedad keys add <key_name> --recover
```

#### Show all keys

```
andromedad keys list
```

#### Delete key

```
andromedad keys delete <key_name>
```

### Node configuration

#### Set custom port

*port 56 was taken as an example, you can use numbers from 1 to 64 to set custom node port*

```
ANDROMEDA_PORT=56
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${ANDROMEDA_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${ANDROMEDA_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${ANDROMEDA_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${ANDROMEDA_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${ANDROMEDA_PORT}660\"%" $HOME/.andromedad/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${ANDROMEDA_PORT}317\"%; s%^address = \":8080\"%address = \":${ANDROMEDA_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${ANDROMEDA_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${ANDROMEDA_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${ANDROMEDA_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${ANDROMEDA_PORT}546\"%" $HOME/.andromedad/config/app.toml
```

#### Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="50"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.andromedad/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.andromedad/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.andromedad/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.andromedad/config/app.toml
```

#### Disable indexing

```
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.andromedad/config/config.toml
```

#### Set minimum gas prices

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0uandr\"/" $HOME/.andromedad/config/app.toml
```

### Validator configuration

#### Create validator

```
andromedad tx staking create-validator \
--amount 1000000uandr \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--pubkey=$(andromedad tendermint show-validator) \
--moniker <ANDROMEDA_NODENAME> \
--chain-id galileo-3 \
--from <ANDROMEDA_WALLET> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--gas-prices 0.1uandr \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### Edit validator

```
andromedad tx staking edit-validator \
--new-moniker <ANDROMEDA_NODENAME> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--chain-id galileo-3 \
--commission-rate 0.05 \
--from <ANDROMEDA_WALLET> \
--gas-prices 0.1uandr \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### View validator info

```
andromedad q staking validator $(andromedad keys show <ANDROMEDA_WALLET> --bech val -a)
```

#### Unjail validator

```
andromedad tx slashing unjail --from <ANDROMEDA_WALLET> --chain-id galileo-3 --gas-prices 0.1uandr --gas-adjustment 1.5 --gas auto --yes 
```

#### Signing info

```
andromedad query slashing signing-info $(andromedad tendermint show-validator)
```

### Token operations

#### Send tokens

```
andromedad tx bank send wallet <DEST_WALLET_ADDRESS> 100uandr --from <ANDROMEDA_WALLET> --chain-id galileo-3 --gas-prices 0.1uandr --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to your validator

```
andromedad tx staking delegate $(andromedad keys show <ANDROMEDA_WALLET> --bech val -a) 100uandr --from <ANDROMEDA_WALLET> --chain-id galileo-3 --gas-prices 0.1uandr --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to another validator

```
andromedad tx staking delegate <VALOPER_ADDRESS> 100uandr --from <ANDROMEDA_WALLET> --chain-id galileo-3 --gas-prices 0.1uandr --gas-adjustment 1.5 --gas auto --yes
```

#### Redelegate tokens to another validator

```
andromedad tx staking redelegate <FROM_VALOPER_ADDRESS> <TO_VALOPER_ADDRESS> 100uandr --from <ANDROMEDA_WALLET> --chain-id galileo-3 --gas-prices 0.1uandr --gas-adjustment 1.5 --gas auto --yes
```

#### Unbond tokens from staking

```
andromedad tx staking unbond <VALOPER_ADDRESS> 100uandr --from <ANDROMEDA_WALLET> --chain-id galileo-3 --gas-prices 0.1uandr --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw all rewards from staking

```
andromedad tx distribution withdraw-all-rewards --from <ANDROMEDA_WALLET> --chain-id galileo-3 --gas-prices 0.1uandr --gas-adjustment 1.5 --gas auto --yes
```

### Governance

#### Vote "YES"

```
andromedad tx gov vote <proposal_id> yes --from <ANDROMEDA_WALLET> --chain-id galileo-3 --gas-prices 0.1uandr --gas-adjustment 1.5 --gas auto --yes
```

#### Vote "NO"

```
andromedad tx gov vote <proposal_id> no --from <ANDROMEDA_WALLET> --chain-id galileo-3 --gas-prices 0.1uandr --gas-adjustment 1.5 --gas auto --yes
```

#### Abstain from voting

```
andromedad tx gov vote <proposal_id> abstain --from <ANDROMEDA_WALLET> --chain-id galileo-3 --gas-adjustment 1.5 --gas auto --gas-prices 0.1uandr -y
```

### General commands

#### Check node status

```
andromedad status | jq
```

#### Check service status

```
sudo systemctl status andromedad
```

#### Check logs

```
sudo journalctl -u andromedad -f --no-hostname -o cat
```

#### Restart service

```
sudo systemctl restart andromedad
```

#### Stop service

```
sudo systemctl stop andromedad
```

#### Start service

```
sudo systemctl start andromedad
```

#### Disable service

```
sudo systemctl disable andromedad
```

#### Enable service

```
sudo systemctl enable andromedad
```

#### Reload service after changes

```
sudo systemctl daemon-reload
```


# Monitoring

## Monitoring

Advantages of using our free service:

* Our monitoring service is working on dedicated server (24/7 online)
* No need to install database (InfluxDB)
* No need to install and configure Grafana Dashboard
* On Grafana dashboard you will find all necessary metrics of your node (we use this monitoring service by ourselves, so we've configured dashboard properly)

## One line installation:

```
. <(wget -qO- https://raw.githubusercontent.com/L0vd/chain-services/main/testnets/andromeda/monitoring/andromeda-monitoring-install.sh)
```

## OR Manual installation of telegraf and monitoring script

Install telegraf

```
sudo apt update
sudo apt -y install curl jq bc

# install telegraf
wget https://dl.influxdata.com/telegraf/releases/telegraf_1.14.1-1_amd64.deb
dpkg -i telegraf_*.deb

sudo systemctl enable --now telegraf
sudo systemctl is-enabled telegraf

# make the telegraf user sudo and adm to be able to execute scripts as andromeda user
sudo adduser telegraf sudo
sudo adduser telegraf adm
sudo -- bash -c 'echo "telegraf ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers'
```

You can check telegraf service status:

```
sudo systemctl status telegraf
```

Status can be not ok with default Telegraf's config. Next steps will fix it.

Get files from this project repo and copy variable script template

```
cd $HOME
mkdir andromeda-monitoring
cd andromeda-monitoring
wget https://raw.githubusercontent.com/L0vd/chain-services/main/testnets/andromeda/monitoring/monitor.sh
wget https://raw.githubusercontent.com/L0vd/chain-services/main/testnets/andromeda/monitoring/telegraf.conf
wget https://raw.githubusercontent.com/L0vd/chain-services/main/testnets/andromeda/monitoring/variables.sh
```

```
nano variables.sh
```

Insert your parameters to **variables.sh**:

* full path to andromeda binary to COS\_BIN\_NAME ( check `which andromedad`)
* node PRC port to COS\_PORT\_RPC ( check in file `path_to_andromeda_node_config/config/config.toml`)
* node validator address to COS\_VALOPER ( like `andrvaloper********`)

Save changes in variables.sh and enable execution permissions:

```
chmod +x monitor.sh variables.sh
```

Create telegraf service for andromeda-node monitoring

```
cat > /etc/systemd/system/telegraf_andromeda.service <<EOL
[Unit]
Description=The plugin-driven server agent for reporting metrics into InfluxDB
Documentation=https://github.com/influxdata/telegraf
After=network.target
[Service]
EnvironmentFile=-/etc/default/telegraf
User=telegraf
ExecStart=/usr/bin/telegraf -config /etc/telegraf/telegraf_andromeda.conf -config-directory /etc/telegraf/telegraf.d $TELEGRAF_OPTS
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartForceExitStatus=SIGPIPE
KillMode=control-group
[Install]
WantedBy=multi-user.target
EOL
```

Edit telegraf configuration

```
sudo mv /etc/telegraf/telegraf.conf /etc/telegraf/telegraf.conf.orig
sudo mv telegraf.conf /etc/telegraf/telegraf_andromeda.conf
```

Restart telegraf service

```
sudo systemctl daemon-reload
sudo systemctl enable telegraf_andromeda
sudo systemctl restart telegraf_andromeda
```

### Dashboard interface

Dashboard has main cosmos-based node information and common system metrics. There is a description for each metric.

Go to our comunity dashboard and select you node from the server list:

### [Dashboard link](http://95.216.2.219:3000/d/Andromeda/andromeda-monitoring-by-l0vd?orgId=1\&refresh=30s\&from=now-5m\&to=now)

![Screenshot\_1](https://user-images.githubusercontent.com/43213686/169405751-8ff53124-e128-4078-8d68-229a18ea4e25.png) ![Screenshot\_2](https://user-images.githubusercontent.com/43213686/169405777-eb9965a5-9fe8-4ecf-944b-4482c41c019b.png)

#### Mon health

Complex parameter can show problem concerning receiving metrics from node. Normal value is "OK"

#### Sync status

Node catching\_up parameter

#### Block height

Latest blockheight of node

#### Time since latest block

Time interval in seconds between taking the metric and node latest block time. Value greater 15s may indicate some kind of synchronization problem.

#### Peers

Number of connected peers

#### Jailed status

Validator jailed status.

#### Missed blocks

Number of missed blocks in 10000 blocks running window. If the validator misses more than 500 blocks, it will end up in jail.

#### Bonded status

Validator stake bonded info

#### Voting power

Validator voting power. If the value of this parameter is zero, your node isn't in the active pool of validators

#### Delegated tokens

Number of delegated tokens

#### Version

Version of andromedad binary

#### Vali Rank

Your node stake rank

#### Active validator numbers

Total number of active validators

#### Other common system metrics: CPU/RAM/FS load, etc.

No comments needed


# Wallet bot

<https://t.me/L0vdBot>

## Telegram Bot

The bot does several useful things.

1. Automatically adds validators you staked in to your watch list
2. Bot which will be useful for people who are using mobile devices and don't have access to Keplr to check the amount of tokens they have in differenet states (Delegated, Unbonding, Rewards, etc.)
3. Aggregates ANDR token info and provides brief highlights regarding the token.
4. Shows all active validators, their comission and stake.
5. Shows latest proposals with current status.

To get started, add your wallet address. After that, you will be able to see the number of tokens in different states. In addition, the bot will automatically add validators that you delegated your tokens earlier to the Watchlist.

**Here is the full list of available commands:**\
/start - start working with bot (select Andromeda from network list)\
/menu - call menu buttons\
/help - list of commands

**List of available buttons in the menu:**\
💎 Token Info - Highlights of $ANDR token\
💰 Balances - Shows the number of tokens for watchlist accounts\
➕ Add - Add account or validator to watchlist\
➖ Delete - Delete account or validator from watchlist\
🔍 Watchlist - List of your accounts and validators\
👷 Validators - List of active validators\
📢 Proposals - List of proposals\
📂 Help - List of commands\
📚 Menu - Call menu buttons

## Screenshots

**Start**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/nois/start.png)\
**Token Info**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/nois/token_info.png?raw=true)\
**Balance Mode**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/nois/balance.png?raw=true)\
**Watchlist Mode**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/nois/watchlist.png?raw=true) **Validators Mode**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/nois/validators.png)\
**Proposals Mode**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/nois/proposals.png?raw=true)\
**Help**\
![Screenshot](https://github.com/L0vd/screenshots/blob/main/nois/help.png?raw=true)


# Archway

**Overview**

Archway is an incentivized smart contract chain for the Cosmos ecosystem that allows developers to deploy high-performance dapps and get rewarded for the value they contribute to the network.

**Official links**

[Website](https://archway.io/) | [Twitter](https://twitter.com/archwayhq) | [Discord](https://discord.gg/archwayhq) | [Github](https://github.com/archway-network)

**Chain info**

|                |          |
| -------------- | -------- |
| Chain-id       |          |
| Binary name    | archwayd |
| Binary version | v        |

**Explorer**

<https://explorers.l0vd.com/archway-testnet>

**Public Endpoints**

RPC <https://archway-testnet.rpc.l0vd.com>

API <https://archway-testnet.api.l0vd.com>

GRPC

```
archway-testnet.grpc.l0vd.com:80
```

PEER

```
@archway-testnet.peers.l0vd.com:
```


# Installation

If you want to setup Archway fullnode manually follow the steps below

## Update and upgrade

```
sudo apt update && sudo apt upgrade -y
```

## Install GO

```
if ! [ -x "$(command -v go)" ]; then
  ver="1.19.3"
  cd $HOME
  wget "https://golang.org/dl/go$ver.linux-amd64.tar.gz"
  sudo rm -rf /usr/local/go
  sudo tar -C /usr/local -xzf "go$ver.linux-amd64.tar.gz"
  rm "go$ver.linux-amd64.tar.gz"
  echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> ~/.bash_profile
  source ~/.bash_profile
fi
```

## Install node

```
cd $HOME
rm -rf archway
git clone https://github.com/archway-network/archway.git
cd archway
git checkout v
make install
```

## Setting up vars

You should replace values in <>\
\<YOUR\_MONIKER> Here you should put name of your moniker (validator) that will be visible in explorer\
\<YOUR\_WALLET> Here you shoud put the name of your wallet

```
ARCHWAY_WALLET="<YOUR_WALLET_NAME>"
ARCHWAY_NODENAME="<YOUR_MONIKER>"
ARCHWAY_CHAIN_ID=""
```

```
echo "
export ARCHWAY_WALLET=${ARCHWAY_WALLET}
export ARCHWAY_NODENAME=${ARCHWAY_NODENAME}
export ARCHWAY_CHAIN_ID=${ARCHWAY_CHAIN_ID}
" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

## Configure your node

```
archwayd config chain-id ${ARCHWAY_CHAIN_ID}
```

## Initialize your node

```
archwayd init ${ARCHWAY_NODENAME} --chain-id ${ARCHWAY_CHAIN_ID}
```

## Download genesis & addrbook

```
curl -Ls "https://snapshots.l0vd.com/archway-testnet/genesis.json" > $HOME/.archway/config/genesis.json
curl -Ls "https://snapshots.l0vd.com/archway-testnet/addrbook.json" > $HOME/.archway/config/addrbook.json
```

## (OPTIONAL) Set custom ports

### If you want to use non-default ports

```
ARCHWAY_PORT=<SET_CUSTOM_PORT> #Example: ARCHWAY_PORT=56 (numbers from 1 to 64)
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${ARCHWAY_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${ARCHWAY_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${ARCHWAY_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${ARCHWAY_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${ARCHWAY_PORT}660\"%" /$HOME/.archway/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${ARCHWAY_PORT}317\"%; s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${ARCHWAY_PORT}317\"%; s%^address = \":8080\"%address = \":${ARCHWAY_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${ARCHWAY_PORT}090\"%; s%^address = \"localhost:9090\"%address = \"localhost:${ARCHWAY_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${ARCHWAY_PORT}091\"%; s%^address = \"localhost:9091\"%address = \"localhost:${ARCHWAY_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${ARCHWAY_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${ARCHWAY_PORT}546\"%" /$HOME/.archway/config/app.toml
```

```
archwayd config node tcp://localhost:${ARCHWAY_PORT}657
```

## Set seeds and peers

```
PEERS="@archway-testnet.peers.l0vd.com:"
sed -i -e "s/^seeds *=.*/seeds = \"$SEEDS\"/; s/^persistent_peers *=.*/persistent_peers = \"$PEERS\"/" $HOME/.archway/config/config.toml
```

## Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="50"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.archway/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.archway/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.archway/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.archway/config/app.toml
```

## Set minimum gas price and null indexer

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"1000000000000aconst\"/" $HOME/.archway/config/app.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.archway/config/config.toml
```

## Create Service

```
sudo tee /etc/systemd/system/archwayd.service > /dev/null <<EOF
[Unit]
Description=Archway testnet
After=network-online.target

[Service]
User=$USER
ExecStart=$(which archwayd) start
Restart=on-failure
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF
```

## Reset blockchain info and restart your node

```
sudo systemctl daemon-reload
sudo systemctl enable archwayd
archwayd tendermint unsafe-reset-all --home $HOME/.archway --keep-addr-book
sudo systemctl restart archwayd && sudo journalctl -u archwayd -f -o cat
```

## (OPTIONAL) Use State Sync

### [State Sync](/testnets/archway/installation-guide)

## Starting a validator

### 1. Add a new key

```
archwayd keys add ${ARCHWAY_WALLET}
```

#### (OR)

### 1. Recover your key

```
archwayd keys add ${ARCHWAY_WALLET} --recover
```

```
ARCHWAY_WALLET_ADDR=$(archwayd keys show ${ARCHWAY_WALLET} -a)
echo "export ARCHWAY_WALLET_ADDR=${ARCHWAY_WALLET_ADDR}" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

## 2. Create validator

{% hint style="info" %}
Wait until the node is synchronized.
{% endhint %}

```
archwayd tx staking create-validator \
--amount 1000000aconst \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--details "" \
--pubkey $(archwayd tendermint show-validator) \
--moniker ${ARCHWAY_NODENAME} \
--chain-id ${ARCHWAY_CHAIN_ID} \
--from ${ARCHWAY_WALLET_ADDR} \
--gas-prices 1000000000000aconst \
--gas-adjustment 1.5 \
--gas auto \
--yes
```


# State sync

### Info

**Public RPC endpoint:** [**https://archway-testnet.rpc.l0vd.com**](https://archway-testnet.rpc.l0vd.com)

**Public API:** [**https://archway-testnet.api.l0vd.com**](https://archway-testnet.api.l0vd.com)

### Guide to sync your node using State Sync:

#### Copy the entire command

```
sudo systemctl stop archwayd
SNAP_RPC="https://archway-testnet.rpc.l0vd.com:443"; \
LATEST_HEIGHT=$(curl -s $SNAP_RPC/block | jq -r .result.block.header.height); \
BLOCK_HEIGHT=$((LATEST_HEIGHT - 2000)); \
TRUST_HASH=$(curl -s "$SNAP_RPC/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash); \
echo $LATEST_HEIGHT $BLOCK_HEIGHT $TRUST_HASH

sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \
s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"$SNAP_RPC,$SNAP_RPC\"| ; \
s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; \
s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"|" $HOME/.archway/config/config.toml

peers="@archway-testnet.peers.l0vd.com:" \
&& sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.archway/config/config.toml 

archwayd tendermint unsafe-reset-all --home ~/.archway && sudo systemctl restart archwayd && journalctl -u archwayd -f --output cat
```

#### Turn off State Sync Mode after synchronization

```
sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1false|" $HOME/.archway/config/config.toml
```


# Useful commands

{% hint style="info" %}
Please note that the values in <> must be changed to your own values
{% endhint %}

### Keys

#### Add new key

```
archwayd keys add <key_name>
```

#### Recover keys from seed

```
archwayd keys add <key_name> --recover
```

#### Show all keys

```
archwayd keys list
```

#### Delete key

```
archwayd keys delete <key_name>
```

### Node configuration

#### Set custom port

*port 56 was taken as an example, you can use numbers from 1 to 64 to set custom node port*

```
ARCHWAY_PORT=56
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${ARCHWAY_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${ARCHWAY_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${ARCHWAY_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${ARCHWAY_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${ARCHWAY_PORT}660\"%" /$HOME/.archway/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${ARCHWAY_PORT}317\"%; s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${ARCHWAY_PORT}317\"%; s%^address = \":8080\"%address = \":${ARCHWAY_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${ARCHWAY_PORT}090\"%; s%^address = \"localhost:9090\"%address = \"localhost:${ARCHWAY_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${ARCHWAY_PORT}091\"%; s%^address = \"localhost:9091\"%address = \"localhost:${ARCHWAY_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${ARCHWAY_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${ARCHWAY_PORT}546\"%" /$HOME/.archway/config/app.toml
```

#### Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="10"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.archway/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.archway/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.archway/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.archway/config/app.toml
```

#### Disable indexing

```
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.archway/config/config.toml
```

#### Set minimum gas prices

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"1000000000000aconst\"/" $HOME/.archway/config/app.toml
```

### Validator configuration

#### Create validator

```
archwayd tx staking create-validator \
--amount 1000000aconst \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--pubkey $(archwayd tendermint show-validator) \
--moniker <ARCHWAY_NODENAME> \
--chain-id  \
--from <ARCHWAY_WALLET> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--gas-prices 1000000000000aconst \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### Edit validator

```
archwayd tx staking edit-validator \
--new-moniker <ARCHWAY_NODENAME> \
--identity <KEYBASE_ID> \
--details <YOUR_TEXT> \
--website <YOUR_WEBSITE> \
--chain-id  \
--commission-rate 0.05 \
--from <ARCHWAY_WALLET> \
--gas-prices 1000000000000aconst \
--gas-adjustment 1.5 \
--gas auto \
--yes
```

#### View validator info

```
archwayd q staking validator $(archwayd keys show <ARCHWAY_WALLET> --bech val -a)
```

#### Unjail validator

```
archwayd tx slashing unjail --from <ARCHWAY_WALLET> --chain-id  --gas-prices 1000000000000aconst --gas-adjustment 1.5 --gas auto --yes 
```

#### Signing info

```
archwayd query slashing signing-info $(archwayd tendermint show-validator)
```

### Token operations

#### Send tokens

```
archwayd tx bank send wallet <DEST_WALLET_ADDRESS> 100aconst --from <ARCHWAY_WALLET> --chain-id  --gas-prices 1000000000000aconst --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to your validator

```
archwayd tx staking delegate $(archwayd keys show <ARCHWAY_WALLET> --bech val -a) 100aconst --from <ARCHWAY_WALLET> --chain-id  --gas-prices 1000000000000aconst --gas-adjustment 1.5 --gas auto --yes
```

#### Delegate token to another validator

```
archwayd tx staking delegate <VALOPER_ADDRESS> 100aconst --from <ARCHWAY_WALLET> --chain-id  --gas-prices 1000000000000aconst --gas-adjustment 1.5 --gas auto --yes
```

#### Redelegate tokens to another validator

```
archwayd tx staking redelegate $(archwayd keys show <ARCHWAY_WALLET> --bech val -a) <TO_VALOPER_ADDRESS> 100aconst --from <ARCHWAY_WALLET> --chain-id  --gas-prices 1000000000000aconst --gas-adjustment 1.5 --gas auto --yes
```

#### Unbond tokens from staking

```
archwayd tx staking unbond $(archwayd keys show <ARCHWAY_WALLET> --bech val -a) 100aconst --from <ARCHWAY_WALLET> --chain-id  --gas-prices 1000000000000aconst --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw all rewards from staking

```
archwayd tx distribution withdraw-all-rewards --from <ARCHWAY_WALLET> --chain-id  --gas-prices 1000000000000aconst --gas-adjustment 1.5 --gas auto --yes
```

#### Withdraw validator rewards and comission

```
archwayd tx distribution withdraw-rewards $(archwayd keys show <ARCHWAY_WALLET> --bech val -a) --commission --from wallet --chain-id  --gas-adjustment 1.5 --gas auto --gas-prices 1000000000000aconst -y

```

### Governance

#### Vote "YES"

```
archwayd tx gov vote <proposal_id> yes --from <ARCHWAY_WALLET> --chain-id  --gas-prices 1000000000000aconst --gas-adjustment 1.5 --gas auto --yes
```

#### Vote "NO"

```
archwayd tx gov vote <proposal_id> no --from <ARCHWAY_WALLET> --chain-id  --gas-prices 1000000000000aconst --gas-adjustment 1.5 --gas auto --yes
```

#### Abstain from voting

```
archwayd tx gov vote <proposal_id> abstain --from <ARCHWAY_WALLET> --chain-id  --gas-adjustment 1.5 --gas auto --gas-prices 1000000000000aconst -y
```

### General commands

#### Check node status

```
archwayd status | jq
```

#### Check service status

```
sudo systemctl status archwayd
```

#### Check logs

```
sudo journalctl -u archwayd -f --no-hostname -o cat
```

#### Restart service

```
sudo systemctl restart archwayd
```

#### Stop service

```
sudo systemctl stop archwayd
```

#### Start service

```
sudo systemctl start archwayd
```

#### Disable service

```
sudo systemctl disable archwayd
```

#### Enable service

```
sudo systemctl enable archwayd
```

#### Reload service after changes

```
sudo systemctl daemon-reload
```


# Monitoring

## Monitoring

Advantages of using our free service:

* Our monitoring service is working on dedicated server (24/7 online)
* No need to install database (InfluxDB)
* No need to install and configure Grafana Dashboard
* On Grafana dashboard you will find all necessary metrics of your node (we use this monitoring service by ourselves, so we've configured dashboard properly)

## One line installation:

```
. <(wget -qO- https://raw.githubusercontent.com/L0vd/chain-services/main/testnets/archway/monitoring/archway-monitoring-install.sh)
```

## OR Manual installation of telegraf and monitoring script

Install telegraf

```
sudo apt update
sudo apt -y install curl jq bc

# install telegraf
wget https://dl.influxdata.com/telegraf/releases/telegraf_1.14.1-1_amd64.deb
dpkg -i telegraf_*.deb

sudo systemctl enable --now telegraf
sudo systemctl is-enabled telegraf

# make the telegraf user sudo and adm to be able to execute scripts as archway user
sudo adduser telegraf sudo
sudo adduser telegraf adm
sudo -- bash -c 'echo "telegraf ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers'
```

You can check telegraf service status:

```
sudo systemctl status telegraf
```

Status can be not ok with default Telegraf's config. Next steps will fix it.

Get files from this project repo and copy variable script template

```
cd $HOME
mkdir archway-testnet-monitoring
cd archway-testnet-monitoring
wget https://raw.githubusercontent.com/L0vd/chain-services/main/testnets/archway/monitoring/monitor.sh
wget https://raw.githubusercontent.com/L0vd/chain-services/main/testnets/archway/monitoring/telegraf.conf
wget https://raw.githubusercontent.com/L0vd/chain-services/main/testnets/archway/monitoring/variables.sh
```

```
nano variables.sh
```

Insert your parameters to **variables.sh**:

* full path to archway binary to COS\_BIN\_NAME ( check `which archwayd`)
* node PRC port to COS\_PORT\_RPC ( check in file `path_to_archway_node_config/config/config.toml`)
* node validator address to COS\_VALOPER ( like `archwayvaloper********`)

Save changes in variables.sh and enable execution permissions:

```
chmod +x monitor.sh variables.sh
```

Create telegraf service for archway-testnet-node monitoring

```
cat > /etc/systemd/system/telegraf_archway_testnet.service <<EOL
[Unit]
Description=The plugin-driven server agent for reporting metrics into InfluxDB
Documentation=https://github.com/influxdata/telegraf
After=network.target
[Service]
EnvironmentFile=-/etc/default/telegraf
User=telegraf
ExecStart=/usr/bin/telegraf -config /etc/telegraf/telegraf_archway_testnet.conf -config-directory /etc/telegraf/telegraf.d $TELEGRAF_OPTS
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartForceExitStatus=SIGPIPE
KillMode=control-group
[Install]
WantedBy=multi-user.target
EOL
```

Edit telegraf configuration

```
sudo mv /etc/telegraf/telegraf.conf /etc/telegraf/telegraf.conf.orig
sudo mv telegraf_archway_testnet.conf /etc/telegraf/telegraf_archway_testnet.conf
```

Restart telegraf service

```
sudo systemctl daemon-reload
sudo systemctl enable telegraf_archway_testnet
sudo systemctl restart telegraf_archway_testnet
```

### Dashboard interface

Dashboard has main cosmos-based node information and common system metrics. There is a description for each metric.

Go to our comunity dashboard and select you node from the server list:

### [Dashboard link](https://monitoring-dashboards.l0vd.com/d/Archway_testnet/archway-testnet-monitoring-by-l0vd?orgId=1\&refresh=30s\&from=now-1h\&to=now)

![Screenshot\_1](https://user-images.githubusercontent.com/43213686/169405751-8ff53124-e128-4078-8d68-229a18ea4e25.png) ![Screenshot\_2](https://user-images.githubusercontent.com/43213686/169405777-eb9965a5-9fe8-4ecf-944b-4482c41c019b.png)

#### Mon health

Complex parameter can show problem concerning receiving metrics from node. Normal value is "OK"

#### Sync status

Node catching\_up parameter

#### Block height

Latest blockheight of node

#### Time since latest block

Time interval in seconds between taking the metric and node latest block time. Value greater 15s may indicate some kind of synchronization problem.

#### Peers

Number of connected peers

#### Jailed status

Validator jailed status.

#### Missed blocks

Number of missed blocks in 10000 blocks running window. If the validator misses more than 500 blocks, it will end up in jail.

#### Bonded status

Validator stake bonded info

#### Voting power

Validator voting power. If the value of this parameter is zero, your node isn't in the active pool of validators

#### Delegated tokens

Number of delegated tokens

#### Version

Version of archwayd binary

#### Vali Rank

Your node stake rank

#### Active validator numbers

Total number of active validators

#### Other common system metrics: CPU/RAM/FS load, etc.

No comments needed


# Arkeo

**Overview**

Arkeo is a free-market decentralized network for providing access to blockchain data. Its intended goal is to create a decentralized option for interacting with any blockchain (although not limited to) and its data.

**Official links**

[Website](https://arkeo.network/) | [Twitter](https://twitter.com/arkeonetwork) | [Discord](https://discord.gg/BfEHpm6uFc) | [Github](https://github.com/arkeonetwork)

**Chain info**

|                |        |
| -------------- | ------ |
| Chain-id       | arkeo  |
| Binary name    | arkeod |
| Binary version | v      |

**Explorer**

<https://explorers.l0vd.com/arkeo-testnet>

**Public Endpoints**

RPC <https://arkeo-testnet.rpc.l0vd.com>

API <https://api-t.arkeo.nodestake.top>

GRPC

```
arkeo-testnet.grpc.l0vd.com:80
```

PEER

```
cb9401d70e1bd59e3ed279942ce026dae82aca1f@arkeo-testnet.peers.l0vd.com:27656
```


# Installation

If you want to setup Arkeo fullnode manually follow the steps below

## Update and upgrade

```
sudo apt update && sudo apt upgrade -y
```

## Install GO

```
if ! [ -x "$(command -v go)" ]; then
  ver="1.19.3"
  cd $HOME
  wget "https://golang.org/dl/go$ver.linux-amd64.tar.gz"
  sudo rm -rf /usr/local/go
  sudo tar -C /usr/local -xzf "go$ver.linux-amd64.tar.gz"
  rm "go$ver.linux-amd64.tar.gz"
  echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> ~/.bash_profile
  source ~/.bash_profile
fi
```

## Install node

```
cd $HOME
wget https://snapshots.l0vd.com/arkeo-testnet/arkeod
chmod +x arkeod
mv arkeod /root/go/bin/
arkeod version
```

## Setting up vars

You should replace values in <>\
\<YOUR\_MONIKER> Here you should put name of your moniker (validator) that will be visible in explorer\
\<YOUR\_WALLET> Here you shoud put the name of your wallet

```
ARKEO_WALLET="<YOUR_WALLET_NAME>"
ARKEO_NODENAME="<YOUR_MONIKER>"
ARKEO_CHAIN_ID="arkeo"
```

```
echo "
export ARKEO_WALLET=${ARKEO_WALLET}
export ARKEO_NODENAME=${ARKEO_NODENAME}
export ARKEO_CHAIN_ID=${ARKEO_CHAIN_ID}
" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

## Configure your node

```
arkeod config chain-id ${ARKEO_CHAIN_ID}
```

## Initialize your node

```
arkeod init ${ARKEO_NODENAME} --chain-id ${ARKEO_CHAIN_ID}
```

## Download genesis & addrbook

```
curl -Ls "https://snapshots.l0vd.com/arkeo-testnet/genesis.json" > $HOME/.arkeo/config/genesis.json
curl -Ls "https://snapshots.l0vd.com/arkeo-testnet/addrbook.json" > $HOME/.arkeo/config/addrbook.json
```

## (OPTIONAL) Set custom ports

### If you want to use non-default ports

```
ARKEO_PORT=<SET_CUSTOM_PORT> #Example: ARKEO_PORT=56 (numbers from 1 to 64)
```

```
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${ARKEO_PORT}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${ARKEO_PORT}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${ARKEO_PORT}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${ARKEO_PORT}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${ARKEO_PORT}660\"%" /$HOME/.arkeo/config/config.toml
sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${ARKEO_PORT}317\"%; s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${ARKEO_PORT}317\"%; s%^address = \":8080\"%address = \":${ARKEO_PORT}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${ARKEO_PORT}090\"%; s%^address = \"localhost:9090\"%address = \"localhost:${ARKEO_PORT}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${ARKEO_PORT}091\"%; s%^address = \"localhost:9091\"%address = \"localhost:${ARKEO_PORT}091\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${ARKEO_PORT}545\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${ARKEO_PORT}546\"%" /$HOME/.arkeo/config/app.toml
```

## Set seeds and peers

```
PEERS="cb9401d70e1bd59e3ed279942ce026dae82aca1f@arkeo-testnet.peers.l0vd.com:27656"
sed -i -e "s/^seeds *=.*/seeds = \"$SEEDS\"/; s/^persistent_peers *=.*/persistent_peers = \"$PEERS\"/" $HOME/.arkeo/config/config.toml
```

## Config pruning

```
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="0"
pruning_interval="50"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.arkeo/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.arkeo/config/app.toml
sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.arkeo/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.arkeo/config/app.toml
```

## Set minimum gas price and null indexer

```
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0uarkeo\"/" $HOME/.arkeo/config/app.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.arkeo/config/config.toml
```

## Create Service

```
sudo tee /etc/systemd/system/arkeod.service > /dev/null <<EOF
[Unit]
Description=Arkeo testnet
After=network-online.target

[Service]
User=$USER
ExecStart=$(which arkeod) start
Restart=on-failure
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF
```

## Reset blockchain info and restart your node

```
sudo systemctl daemon-reload
sudo systemctl enable arkeod
arkeod tendermint unsafe-reset-all --home $HOME/.arkeo --keep-addr-book
sudo systemctl restart arkeod && sudo journalctl -u arkeod -f -o cat
```

## (OPTIONAL) Use State Sync

### [State Sync](/testnets/arkeo/installation-guide)

## Starting a validator

### 1. Add a new key

```
arkeod keys add ${ARKEO_WALLET}
```

#### (OR)

### 1. Recover your key

```
arkeod keys add ${ARKEO_WALLET} --recover
```

```
ARKEO_WALLET_ADDR=$(arkeod keys show ${ARKEO_WALLET} -a)
echo "export ARKEO_WALLET_ADDR=${ARKEO_WALLET_ADDR}" >> $HOME/.bash_profile

source $HOME/.bash_profile
```

## 2. Create validator

{% hint style="info" %}
Wait until the node is synchronized.
{% endhint %}

```
arkeod tx staking create-validator \
--amount 1000000uarkeo \
--commission-max-change-rate "0.01" \
--commission-max-rate "0.20" \
--commission-rate "0.1" \
--min-self-delegation "1" \
--details "" \
--pubkey $(arkeod tendermint show-validator) \
--moniker ${ARKEO_NODENAME} \
--chain-id ${ARKEO_CHAIN_ID} \
--from ${ARKEO_WALLET_ADDR} \
--gas-prices 0uarkeo \
--gas-adjustment 1.5 \
--gas auto \
--yes
```


# Snapshot

## Updates every 4 hours

## Install dependencies, if needed

```
sudo apt update
sudo apt install lz4 -y
```

## Sync from Snapshot

| Height  | Size   | Pruning         | Indexer | Creation Time (UTC+3) |
| ------- | ------ | --------------- | ------- | --------------------- |
| 3741009 | 0.5 GB | custom/100/0/10 | null    | 2024-04-19\_17:46:41  |

```
sudo systemctl stop arkeod

cp $HOME/.arkeo/data/priv_validator_state.json $HOME/.arkeo/priv_validator_state.json.backup
arkeod tendermint unsafe-reset-all --home $HOME/.arkeo --keep-addr-book

rm -rf $HOME/.arkeo/data 

SNAP_NAME=$(curl -s https://snapshots.l0vd.com/arkeo-testnet/ | egrep -o ">arkeo.*\.tar.lz4" | tr -d ">")
curl https://snapshots.l0vd.com/arkeo-testnet/${SNAP_NAME} | lz4 -dc - | tar -xf - -C $HOME/.arkeo

mv $HOME/.arkeo/priv_validator_state.json.backup $HOME/.arkeo/data/priv_validator_state.json

sudo systemctl restart arkeod
sudo journalctl -u arkeod -f --no-hostname -o cat
```




---

[Next Page](/llms-full.txt/1)

