# 👋 About US

**Hi 👋, we are VALIDEXIS**

We are a global team passionate about building the future of decentralized networks. 🌍 Our mission is to create a robust, secure, and scalable infrastructure for blockchain ecosystems and Web3 projects.

💡 **What we do:**\
VALIDEXIS specializes in running, testing, and supporting blockchain nodes on testnets and mainnets. We focus on delivering seamless validator services and tools to empower decentralized technologies. From early-stage collaboration to production-grade solutions, we work tirelessly to ensure the success of the projects we support.

🚀 **Our approach:**

* **Reliability:** We ensure the highest uptime and performance for validators and nodes.
* **Expertise:** With years of experience in the blockchain space, we provide trusted support for a wide range of networks.
* **Collaboration:** We actively participate in network growth, testnets, and governance to help projects evolve.

🤝 **Let’s work together:**\
VALIDEXIS is always looking for new opportunities to collaborate with innovative blockchain projects. Whether you need node operations, governance support, or testnet participation, our team is here to help.

📫 Learn more about us and our work at [validexis.com](https://validexis.com).

Together, let’s shape the future of decentralized networks!


# 🌐 Supported Networks

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-cover data-type="files"></th><th data-hidden></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>ZetaChain  Mainnet</strong></td><td>chain-id: zetachain_7000-1</td><td><a href="/files/UmT8XEK83wxSJzQ5zQaU">/files/UmT8XEK83wxSJzQ5zQaU</a></td><td></td><td><a href="/pages/hiP3qmQAaVZTkchrBRUo">/pages/hiP3qmQAaVZTkchrBRUo</a></td></tr><tr><td><strong>Xion  Mainnet</strong></td><td>chain-id: xion-mainnet-1</td><td><a href="/files/M2K8q2WpRvEckpc6r4No">/files/M2K8q2WpRvEckpc6r4No</a></td><td></td><td><a href="/pages/190YKuWCDv9wz1R9C4Cy">/pages/190YKuWCDv9wz1R9C4Cy</a></td></tr><tr><td><strong>Nibiru  Mainnet</strong></td><td>Сhain-id: cataclysm-1</td><td><a href="/files/TqpEq24rs9GpZEdFGQ8q">/files/TqpEq24rs9GpZEdFGQ8q</a></td><td></td><td><a href="/pages/6OdnVfRgXAxLpSn8vYVG">/pages/6OdnVfRgXAxLpSn8vYVG</a></td></tr><tr><td><strong>Kyve  Mainnet</strong></td><td>chain-id: kyve-1</td><td><a href="/files/SDQtQLgoYQ9ehUu9tW58">/files/SDQtQLgoYQ9ehUu9tW58</a></td><td></td><td><a href="/pages/x3UmDz2vcp8bLSXcIYEw">/pages/x3UmDz2vcp8bLSXcIYEw</a></td></tr><tr><td><strong>Juno  Mainnet</strong></td><td>chain-id: juno-1</td><td><a href="/files/6GdrzZ6UGzKIB14BkL0X">/files/6GdrzZ6UGzKIB14BkL0X</a></td><td></td><td><a href="/pages/OAPYhFdiBYzCJeVqnm5i">/pages/OAPYhFdiBYzCJeVqnm5i</a></td></tr><tr><td><strong>Agoric  Mainnet</strong></td><td>chain-id: agoric-3</td><td><a href="/files/ijemWKFVpzrcY9mbhfUq">/files/ijemWKFVpzrcY9mbhfUq</a></td><td></td><td><a href="/pages/7m2udv11VSfJswCeH4yI">/pages/7m2udv11VSfJswCeH4yI</a></td></tr><tr><td><strong>Celestia  Mainnet</strong></td><td>chain-id: celestia</td><td><a href="/files/5KXZht4z9jJurti867ZH">/files/5KXZht4z9jJurti867ZH</a></td><td></td><td><a href="/pages/AGevJhH1UxpAxiE7POuC">/pages/AGevJhH1UxpAxiE7POuC</a></td></tr><tr><td><strong>Celestia  Testnet</strong></td><td>chain-id: mocha-4</td><td><a href="/files/tBjJCNFlzZLBFLo7MgCL">/files/tBjJCNFlzZLBFLo7MgCL</a></td><td></td><td><a href="/pages/w4UCIFMfsLsBzGZVRf7m">/pages/w4UCIFMfsLsBzGZVRf7m</a></td></tr><tr><td><strong>Cosmos Hub Mainnet</strong></td><td>chain-id: cosmoshub-4</td><td><a href="/files/VOnk3lof01h3BlgsULYw">/files/VOnk3lof01h3BlgsULYw</a></td><td></td><td><a href="/pages/KzqtKm1XG8Gza8VJ6LMy">/pages/KzqtKm1XG8Gza8VJ6LMy</a></td></tr><tr><td><strong>Lava Mainnet</strong></td><td>chain-id: lava-mainnet-1</td><td><a href="/files/2cXZqd9pG7POdjMJ4YzR">/files/2cXZqd9pG7POdjMJ4YzR</a></td><td></td><td><a href="/pages/lnMcBuWWJwDuveezCNia">/pages/lnMcBuWWJwDuveezCNia</a></td></tr><tr><td><strong>Kusama Mainnet</strong></td><td>chain-id: kusama</td><td><a href="/files/wetSdR1Zmv2gFYUXP1ek">/files/wetSdR1Zmv2gFYUXP1ek</a></td><td></td><td><a href="/pages/jOylUf6pSHzy8wuYCIaT">/pages/jOylUf6pSHzy8wuYCIaT</a></td></tr><tr><td><strong>Polkadot Mainnet</strong></td><td>chain-id: polkadot</td><td><a href="/files/2HLiPVPVEkPhrKqJDrJ4">/files/2HLiPVPVEkPhrKqJDrJ4</a></td><td></td><td><a href="/pages/nqxfR4G6sN6110F5p5my">/pages/nqxfR4G6sN6110F5p5my</a></td></tr><tr><td><strong>Starknet Mainnet</strong></td><td></td><td><a href="/files/YKwrcua6gpzK5QpRkvIR">/files/YKwrcua6gpzK5QpRkvIR</a></td><td></td><td><a href="/pages/xZfexKN72SSwisuis4If">/pages/xZfexKN72SSwisuis4If</a></td></tr></tbody></table>


# 🌍 Our Validators

We actively participate in various blockchain networks, ensuring decentralization, security, and stability. Below, you can find information about our validators VALIDEXIS and delegate your tokens with confidence.

#### <mark style="color:blue;">ZetaChain ➤➤➤</mark>  🔗 [**Explorer Link**](https://zetachain.explorers.guru/validator/zetavaloper1z0ejlx3mqvcvlsecqyxt9framvh2twxjnzw763)

#### <mark style="color:blue;">Starknet ➤➤➤</mark>  🔗 [**Dashboard Link**](https://voyager.online/staking?validator=0x02f78b1aa5ea0ff516f0f2aeee20cc980002b7d973899bb6ae5e8d005959cbaf)

#### <mark style="color:blue;">Nibiru  ➤➤➤</mark>  🔗 [**Explorer Link**](https://nibiru.explorers.guru/validator/nibivaloper1f45t0taeztrkucjcamzn6egtuc4zhlmv5u8q5g)

#### <mark style="color:blue;">Kyve  ➤➤➤</mark>  🔗 [**Explorer Link**](https://explorer.stavr.tech/Kyve/staking/kyvevaloper1dx0qru00v3ljt8kp4vg6luru8mn45kmfwuwh9r)

#### <mark style="color:blue;">Juno  ➤➤➤</mark>  🔗 [**Explorer Link**](https://explorer.stavr.tech/Juno/staking/junovaloper12x3cw57qhsplp4y2x7tuvq4mua9w4rggzv2afa)

#### <mark style="color:blue;">Agoric  ➤➤➤</mark>  🔗 [**Explorer Link**](https://agoric.explorers.guru/validator/agoricvaloper1d7jvxrx3w3xces3uc4fjh3vv50kh0ptk5630nw)

#### <mark style="color:blue;">Lava  ➤➤➤</mark>  🔗 [**Explorer Link**](https://lava-explorer.mellifera.network/lava/staking/lava@valoper158phs7lyknqgr4pjxl524q7rn67z6n0d28khts)

#### <mark style="color:blue;">CosmosHub  ➤➤➤</mark>  🔗 [**Explorer Link**](https://cosmos.explorers.guru/validator/cosmosvaloper16ydjycnc98hsrkdx0s2vz8x7mtawqm37c96ls9)

#### <mark style="color:blue;">Polkadot  ➤➤➤</mark>  🔗 [**Explorer Link**](https://polkadot.subscan.io/validator/14iQfZCoj3uRcvau6Wxk9Gy9UXQZrChRZZNFVdBPMTJxmtuP?tab=reward)

#### <mark style="color:blue;">Kusama  ➤➤➤</mark>  🔗 [**Explorer Link**](https://kusama.subscan.io/validator/CfaUrAbVqqirEByiXFhgmS34dZq3nJpy6sKYtFHvSr3uQuG?tab=reward)

####

#### 💡 **Why Delegate to Us?**

* 🔒 **Secure & Reliable Infrastructure**
* 🏆 **Experienced Team in Blockchain Validation**
* ⚡ **Low Commission Rates**
* 💬 **24/7 Support & Community Engagement**


# 🔐  Validator Security: Our Approach and Protection Measures

Our team places great emphasis on ensuring the security of validators, understanding that key protection and operational stability are the foundation of a successfully functioning blockchain ecosystem. We have implemented strict security measures, including disabling password-based access to servers and granting access exclusively via SSH keys with two-factor authentication. Our firewalls are configured to allow only the necessary ports, minimizing external risks.

Encrypted backups of validator and wallet keys are securely stored on a separate server with restricted access, and all data transfers are conducted through secure channels. To further safeguard keys, we use the Horcrux tool, which ensures their secure fragmentation and distribution across multiple servers, eliminating the risk of compromise even if one server is accessed.

We utilize tools such as Fail2ban to prevent unauthorized access and regularly update our systems to meet modern security standards. Reliable key management with TMKMS and a comprehensive approach to security enable us to ensure the stability and protection of our validators, even in unforeseen circumstances.


# 🔒Enhancing SSH Security for a Validator

Securing SSH access is critical to protecting your validator. This guide covers essential security measures to minimize the risk of unauthorized access.

### **1. Changing the Default SSH Port**

By default, SSH runs on **port 22**, making it an easy target for attacks. Changing it to a non-standard port improves security.

1. Open the SSH configuration file:

   ```bash
   sudo nano /etc/ssh/sshd_config
   ```
2. Find the line:

   ```plaintext
   #Port 22
   ```

   Change it to something like:

   ```plaintext
   Port 2222
   ```
3. Save changes (**Ctrl + X → Y → Enter**) and restart SSH:

   ```bash
   sudo systemctl restart sshd
   ```

**Important:** Make sure the new port is allowed in your firewall.

```bash
sudo ufw allow 2222/tcp
```

***

### **2. Disabling Password Authentication**

Using passwords makes your server vulnerable to brute-force attacks. SSH keys provide better security.

#### **Generating SSH Keys**

On your **local computer** (not the server), run:

```bash
ssh-keygen -t ed25519 -C "your_email@example.com"
```

This creates private (`~/.ssh/id_ed25519`) and public (`~/.ssh/id_ed25519.pub`) keys.

#### **Adding the Key to the Server**

Copy the public key to your server:

```bash
ssh-copy-id -p 2222 user@your_server
```

Or manually:

```bash
cat ~/.ssh/id_ed25519.pub | ssh -p 2222 user@your_server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
```

#### **Disabling Password Authentication**

Edit the SSH config:

```bash
sudo nano /etc/ssh/sshd_config
```

Find and change:

```plaintext
PasswordAuthentication no
```

Restart SSH:

```bash
sudo systemctl restart sshd
```

***

### **3. Restricting SSH Access to Specific Users**

Limit SSH access to selected users for additional security.

In `/etc/ssh/sshd_config`, add:

```plaintext
AllowUsers validator_user
```

Restart SSH:

```bash
sudo systemctl restart sshd
```

***

### **4. Enabling Two-Factor Authentication (2FA)**

Adding 2FA enhances security with an additional authentication step.

1. Install **Google Authenticator**:

   ```bash
   sudo apt install libpam-google-authenticator
   ```
2. Run the setup:

   ```bash
   google-authenticator
   ```

   Follow the instructions and scan the QR code in the Google Authenticator app.
3. Enable 2FA in SSH:\
   Edit `/etc/pam.d/sshd` and add:

   ```plaintext
   auth required pam_google_authenticator.so
   ```
4. In `/etc/ssh/sshd_config`, enable challenge-response authentication:

   ```plaintext
   ChallengeResponseAuthentication yes
   ```
5. Restart SSH:

   ```bash
   sudo systemctl restart sshd
   ```

***

### **5. Limiting Failed Login Attempts**

Use **Fail2Ban** to protect against brute-force attacks.

#### **Installing and Configuring Fail2Ban**

```bash
sudo apt install fail2ban -y
```

Create a configuration file:

```bash
sudo nano /etc/fail2ban/jail.local
```

Add:

```plaintext
[sshd]
enabled = true
port = 2222
maxretry = 3
findtime = 600
bantime = 3600
```

Restart Fail2Ban:

```bash
sudo systemctl restart fail2ban
```

***

### **6. Restricting SSH Access by IP (Whitelist)**

If you have a static IP, restrict SSH access to that IP only.

Edit `/etc/hosts.allow`:

```plaintext
sshd: 192.168.1.100
```

Block all other IPs in `/etc/hosts.deny`:

```plaintext
sshd: ALL
```

***

### **7. Configuring the Firewall (UFW)**

Close unnecessary ports and allow only the SSH port you set.

```bash
sudo ufw allow 2222/tcp
sudo ufw enable
```

Check firewall status:

```bash
sudo ufw status verbose
```

***

### **8. Monitoring SSH Access**

Check active SSH sessions:

```bash
who
```

View login attempts:

```bash
sudo cat /var/log/auth.log | grep "Failed"
```

***

Now your SSH access is well-protected. The key security measures include **SSH keys instead of passwords, 2FA, Fail2Ban, and firewall rules**.


# 📡  TMKMS for Remote Signing

TMKMS (Tendermint Key Management System) is a key management system used in blockchain-based ecosystems like Cosmos. The primary purpose of TMKMS is to provide secure storage and management of cryptographic keys, which are used by validators to sign blocks in decentralized networks.

**Update the system**

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

**Install Rust and the necessary libraries**

```bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
sudo apt install build-essential pkg-config libssl-dev -y
```

**Install TMKMS**

```bash
git clone https://github.com/iqlusioninc/tmkms.git $HOME/tmkms
cd $HOME/tmkms
git checkout v0.15.0
 
cargo build --release --features=softsign 
cargo install tmkms --features=softsign
```

**Check the TMKMS version**

```bash
tmkms version
```

**Initialize TMKMS**

```bash
mkdir -p $HOME/.tmkms/<chain-id>
tmkms init $HOME/.tmkms/<chain-id>
```

The command will create the necessary configuration files and keys, and you will receive output similar to the following:

```bash
Generated KMS configuration: /home/user/.tmkms/<chain-id>/tmkms.toml
Generated Secret Connection key: /home/user/.tmkms/<chain-id>/secrets/kms-identity.key
```

**Import the validator key**

If you need to use an existing validator key, copy its file to the TMKMS server. Make sure the file is in the correct location:

```bash
cat $HOME/priv_validator_key.json
```

**Import the key into TMKMS**

```bash
tmkms softsign import $HOME/priv_validator_key.json $HOME/.tmkms/<chain-id>/secrets/<chain-id>-consensus.key
```

After a successful import, it is recommended to delete the original file for security:

```bash
sudo shred -uvz $HOME/priv_validator_key.json
```

**Configuring the validator**

On the validator side, open the necessary port for remote connection. For example, if the validator uses port 26658, edit the configuration file `config.toml` (or the equivalent file for your network):

```bash
priv_validator_laddr = "tcp://<IP Validador>:26658"
```

**Configuring TMKMS**

On the TMKMS server, edit the `tmkms.toml` configuration file that was created during the initialization stage. Open it for editing:

```bash
sudo nano ~/.tmkms/<chain-id>/tmkms.toml
```

Example of a minimal configuration for the network:

```bash
## Chain Configuration
[[chain]]
id = "<chain-id>"
key_format = { type = "bech32", account_key_prefix = "<chain-id>pub", consensus_key_prefix = "<chain-id>valconspub" }
state_file = "$HOME/.tmkms/<chain-id>/state/<chain-id>-consensus.json"

## Signing Provider Configuration
[[providers.softsign]]
chain_ids = ["<chain-id>"]
key_type = "consensus"
path = "$HOME/.tmkms/<chain-id>/secrets/<chain-id>-consensus.key"

## Validator Configuration
[[validator]]
chain_id = "<chain-id>"
addr = "tcp://<IP validator>:26658"
secret_key = "$HOME/.tmkms/<chain-id>/secrets/kms-identity.key"
protocol_version = "v0.38"
reconnect = true
```

**Сreate a service**

```bash
sudo tee /etc/systemd/system/<chain-id>-tmkmsd.service << EOF
[Unit]
Description=TMKMS-<chain-id>
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=always
RestartSec=10
User=$USER
ExecStart=$(which tmkms) start -c $HOME/.tmkms/<chain-id>/tmkms.toml
LimitNOFILE=1024

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

**Starting TMKMS**

```bash
sudo systemctl daemon-reload
sudo systemctl enable <chain-id>-tmkmsd.service
sudo systemctl start <chain-id>-tmkmsd.service
```

Check the service status

```bash
sudo systemctl status <chain-id>-tmkmsd.service
```

Check the logs

```bash
sudo journalctl -u <chain-id>-tmkmsd.service -f -o cat
```

**Configuring the firewall**

Configuring the firewall for the validator server:

```bash
sudo ufw allow "OpenSSH"
sudo ufw allow 22
sudo ufw enable
```

Configuring the firewall for the TMKMS server:

```bash
sudo ufw allow from <IP TMKMS> proto tcp to any port 26658
sudo ufw deny 26658
sudo ufw enable
```

Now your TMKMS is configured and ready to work with remote signing in the blockchain network.


# TMKMS Update for Celestia

Latest Version Tag: v0.14.0-celestia

This guide provides the necessary steps to update TMKMS for the Celestia. The update includes moving the configuration and keys to a dedicated hidden folder (`~/.tmkms`), updating the systemd service, and installing the new TMKMS binary from the official Celestia repository.

#### **Create Hidden TMKMS Directory**

```bash
mkdir -p $HOME/.tmkms/celestia
```

#### Stop the existing TMKMS service

```bash
sudo systemctl stop celestia-tmkmsd.service
```

#### Make a backup (recommended)

```bash
cp -r $HOME/tmkms $HOME/tmkms_backup_$(date +%Y%m%d)
```

#### **Copy Existing Keys, State, and Config**

```bash
cp -r $HOME/tmkms/celestia/secrets $HOME/.tmkms/celestia/
cp -r $HOME/tmkms/celestia/state $HOME/.tmkms/celestia/
cp $HOME/tmkms/celestia/tmkms.toml $HOME/.tmkms/celestia/
```

#### **Update Paths in `tmkms.toml`**

```bash
sed -i "s|state_file = .*|state_file = \"$HOME/.tmkms/celestia/state/celestia-consensus.json\"|" $HOME/.tmkms/celestia/tmkms.toml
sed -i "s|path = .*|path = \"$HOME/.tmkms/celestia/secrets/celestia-consensus.key\"|" $HOME/.tmkms/celestia/tmkms.toml
sed -i "s|secret_key = .*|secret_key = \"$HOME/.tmkms/celestia/secrets/kms-identity.key\"|" $HOME/.tmkms/celestia/tmkms.toml
sed -i 's|protocol_version = "v0\.34"|protocol_version = "v0.38"|' $HOME/.tmkms/celestia/tmkms.toml
```

#### **Update Systemd Service**

```bash
sudo tee /etc/systemd/system/celestia-tmkmsd.service > /dev/null << EOF
[Unit]
Description=TMKMS for Celestia
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=always
RestartSec=10
User=$USER
ExecStart=$(which tmkms) start -c $HOME/.tmkms/celestia/tmkms.toml
LimitNOFILE=1024

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

#### **Remove Old TMKMS Source Directory (Optional)**

```bash
rm -rf $HOME/tmkms
```

#### **Clone the Official Celestia TMKMS Repository**

```bash
git clone https://github.com/iqlusioninc/tmkms.git $HOME/tmkms
cd $HOME/tmkms
git checkout v0.15.0
```

#### **Build and Install TMKMS**

```bash
cargo build --release --features=softsign
cargo install --path . --features=softsign
```

#### **Reload Systemd and Restart TMKMS**

```bash
sudo systemctl daemon-reload
sudo systemctl enable celestia-tmkmsd.service
sudo systemctl restart celestia-tmkmsd.service
sudo journalctl -u celestia-tmkmsd.service -f -o cat
```

***

**Note:** Ensure that the paths in the `tmkms.toml` file are correctly set to the new locations. This guide assumes the use of the `$HOME` environment variable for user-specific directories.


# TMKMS Update v0.15.0

#### Stop the existing TMKMS service

```bash
sudo systemctl stop celestia-tmkmsd.service
```

#### Download and build binaries

```bash
rm -rf $HOME/tmkms
git clone https://github.com/iqlusioninc/tmkms.git $HOME/tmkms
cd $HOME/tmkms
git checkout v0.15.0

cargo build --release --features=softsign
cargo install --path . --features=softsign
```

#### Start service and check the logs

```bash
sudo systemctl daemon-reload
sudo systemctl restart celestia-tmkmsd.service
sudo journalctl -u celestia-tmkmsd.service -f -o cat
```


# 🔑  Horcrux

Horcrux is a distributed signing tool that splits the validator's private key into multiple parts, ensuring its security. This approach prevents key compromise even if one part is accessed.

***

### Preparing the Infrastructure

Horcrux requires at least **two servers** (three or more are recommended) to split the key. Setup involves:

**Horcrux servers** for distributed signing.

**Validator node** to interact with the blockchain network.

Ensure the following:

1. **SSH access** and server setup.
2. Install Horcrux on each server.
3. Configure firewalls to allow communication between servers on the Horcrux ports.
4. **Time synchronization**: Make sure all servers use NTP for synchronized time.

```bash
sudo apt install ntp  
sudo systemctl enable ntp  
sudo systemctl start ntp
```

***

### Server Requirements for Horcrux-Based Validator Setup

#### Signer Nodes (Horcrux Co-signers)

**Type:** VPS (Virtual Private Server)\
**Recommended Specifications:**

* **CPU:** 4 vCPU
* **RAM:** 4 GB
* **Storage:** 80 GB NVMe SSD
* **Network:** 1 Gbps bandwidth

**Required Open Ports:**

* **2222** — for communication between Horcrux co-signers
* **SSH (22)** — for remote administration
* **Prometheus port** (optional, if using monitoring)

#### Sentry Nodes (Validator Nodes or Observers)

**Type:** Bare-metal or VPS\
**Recommended Specifications:**

* **CPU:** 4 vCPU
* **RAM:** 16 GB
* **Storage:** 250 GB SSD
* **Network:** Stable and fast connection

**Required Open Ports:**

* **1234** — private port for connection from Horcrux signers
* **26656** — P2P port for communication with the blockchain network

### Update system and install build tools

```bash
sudo apt -q update
sudo apt -qy install curl git jq lz4 build-essential
sudo apt -qy upgrade
```

### Install GO

```bash
sudo rm -rf /usr/local/go
curl -Ls https://go.dev/dl/go1.23.6.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)
echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bash_profile
source $HOME/.bash_profile
go version
```

### Installing Horcrux

Run the following commands on **each co-signer node**:

```bash
git clone https://github.com/strangelove-ventures/horcrux.git
cd horcrux
make install
```

After installation, verify it with:

```bash
horcrux version
```

### Initialize Horcrux Configuration

Run the following command on **one of the co-signer nodes** to generate the shared configuration:

```bash
horcrux config init \
  --node "tcp://<VALIDATOR_IP>:1234" \
  --cosigner "tcp://<COSIGNER_1_IP>:2222" \
  --cosigner "tcp://<COSIGNER_2_IP>:2222" \
  --cosigner "tcp://<COSIGNER_3_IP>:2222" \
  --threshold 2 \
  --grpc-timeout 1000ms \
  --raft-timeout 1000ms
```

> 🔧 **Note:**
>
> * Replace `<VALIDATOR_IP_X>` with the actual IP addresses of your validator (or sentry) nodes that expose the `priv_validator_laddr` port (`1234`).
> * Replace `<COSIGNER_X_IP>` with the IPs of each co-signer node using port `2222`.
> * The order of the `--cosigner` flags determines which shard (`cosigner_1`, `cosigner_2`, `cosigner_3`) goes to which server. Be consistent when distributing keys and configuration files.

#### Generate ECIES Keys (for Secure Communication Between Co-Signers)

Run this once to generate the ECIES encryption keys:

```bash
horcrux create-ecies-shards --shards 3
```

This will create the following directory structure:

```bash
./cosigner_1/
  ecies_keys.json
./cosigner_2/
  ecies_keys.json
./cosigner_3/
  ecies_keys.json
```

#### Fragment the Validator Private Key

> ⚠️ Copy the `priv_validator_key.json` file from your **validator node** into your working directory **before** running this command.

Then run:

```bash
horcrux create-ed25519-shards --chain-id <CHAIN_ID> --key-file ./priv_validator_key.json --threshold 2 --shards 3
```

This will update the structure:

```bash
./cosigner_1/
  <CHAIN_ID>_shard.json
  ecies_keys.json

./cosigner_2/
  <CHAIN_ID>_shard.json
  ecies_keys.json

./cosigner_3/
  <CHAIN_ID>_shard.json
  ecies_keys.json
```

✅ At this point, you should move `priv_validator_key.json` to a **secure storage location** — it is no longer needed in the signer environment.

### Distribute Config Files to Co-Signer Nodes

Each co-signer node must have the following files placed in their respective `~/.horcrux/` directory:

```
~/.horcrux/
├── config.yaml
├── ecies_keys.json
├── <CHAIN_ID>_shard.json
└── state/
    └── <CHAIN_ID>_priv_validator_state.json
```

> ❗ **Important:**\
> Ensure that each cosigner receives **only their own** files according to the order in which you ran `horcrux config init` and generated shards (i.e., cosigner\_1, cosigner\_2, cosigner\_3).

### Setting Up the Horcrux Service

**Create a service file**: On each server, create a file at `/etc/systemd/system/horcrux.service`:

```ini
sudo tee /etc/systemd/system/horcrux.service > /dev/null << EOF  
[Unit]  
Description=MPC Signer node  
After=network-online.target  
[Service]  
User=$USER  
WorkingDirectory=/home/$USER  
ExecStart=$(which horcrux) start  
Restart=on-failure  
RestartSec=3  
LimitNOFILE=4096  
[Install]  
WantedBy=multi-user.target  
EOF
```

**Start and check the service**:

```bash
sudo systemctl daemon-reload  
sudo systemctl enable horcrux.service
sudo systemctl start horcrux.service  
sudo systemctl status horcrux.service  
```

### Share Consensus State Between Signers

Each signer node must start from the **same consensus state** to avoid double-signing.

#### 🛑 On the validator node:

```bash
sudo systemctl stop <node_service>
```

1. Open the validator's consensus state file:

   ```bash
   cat .<NODE_HOME>/data/priv_validator_state.json
   ```

   Example output:

   ```json
   {
     "height": "6513530",
     "round": 0,
     "step": 3,
     "signature": "IEOS7EJ8C6Z...",
     "signbytes": "6B080211BA83..."
   }
   ```
2. Create a **stripped-down version** of this file to be placed in each co-signer’s state directory:

   ```json
   {
     "height": "6513530",
     "round": "0",
     "step": 3
   }
   ```
3. Copy this file to all co-signer nodes as:

   ```
   ~/.horcrux/state/<CHAIN_ID>_priv_validator_state.json
   ```

### Configuring the Validator Node

* Update the validator's configuration file: In the `config.toml` file of your validator node, specify the remote Horcrux address for signing:

```toml
priv_validator_laddr = "tcp://0.0.0.0:1234"
```

* Restart the validator:

```bash
sudo systemctl restart <node_service>
```

**Check Horcrux logs:**

```
sudo journalctl -u horcrux -f
```

### Monitoring and Testing

* **Check connectivity**: Ensure the validator node successfully connects to the Horcrux servers.
* **Test signing**: Verify transactions are signed correctly by creating a test transaction on the network.
* **Setup monitoring**: Use tools like Prometheus and Grafana to monitor the validator and Horcrux servers.

***

### &#x20;Security Recommendations

* **Isolate Horcrux servers**: Restrict access to only the validator node.
* **Keep software updated**: Regularly update Horcrux and the operating systems.
* **Backup configuration**: Store copies of the configuration and key shares in a secure location.


# 💽 Ledger for Validator Key Management

#### How We Use Ledger in Our Validator Infrastructure

At VALIDEXIS, the security of our validators is our top priority.\
To ensure full protection of validator keys and prevent any form of unauthorized access, we use **Ledger hardware wallets (Nano S Plus, Nano X, or Stax)** for signing and managing validator operations.

Each validator key is stored exclusively on a dedicated Ledger device, isolated from our validator nodes.\
All transactions — whether staking, voting, or withdrawing rewards — are physically confirmed on the Ledger itself, which eliminates the risk of key exposure even if a node or workstation is compromised.

Our architecture follows a two-tier security model:

1. **Node layer** — servers with restricted access, running validator and CLI tools.
2. **Key management layer** — Ledger devices used only during manual transaction signing sessions.

This approach guarantees that private keys never leave the hardware wallet, providing a highly secure and verifiable signing environment.

***

### ⚙️ How to Set Up and Use Ledger for a Celestia Validator

#### 1. Prepare Your Ledger Device

1. **Install Ledger Live**
   * Download from the official Ledger website at [ledger.com](https://www.ledger.com/ledger-live)
   * Update your device firmware to the latest version.
2. **Create or Restore a Wallet**
   * Select *“Set up as new device”* or *“Restore from recovery phrase”*.
   * Carefully write down the 24-word recovery phrase and store it offline.
3. **Install the Celestia App**
   * In Ledger Live, go to **My Ledger** → **Install Apps**.
   * Search for *Celestia* and install the app.
   * Once installed, your Ledger is ready for Celestia operations.

***

#### 2. Connecting Ledger to a Celestia Wallet

**Option A — via Keplr Wallet**

1. Connect your Ledger to the computer and unlock it.
2. Open the *Celestia* app on your device.
3. Visit [Keplr Wallet](https://wallet.keplr.app/).
4. Click **“Import Ledger”** → select the *Celestia* network.
5. Approve the connection on the device.

Now your Celestia address is accessible in Keplr, and every transaction (delegation, reward claim, voting) must be confirmed directly on the Ledger.

***

**Option B — via CLI (Command Line Interface)**

1. **Install Celestia CLI**

   ```bash
   sudo apt install -y jq git curl build-essential
   git clone https://github.com/celestiaorg/celestia-app
   cd celestia-app && make install
   ```
2. **Connect your Ledger** and open the *Celestia* app.
3. **List available keys:**

   ```bash
   celestia-appd keys list --ledger
   ```
4. **Add a new Ledger-based key:**

   ```bash
   celestia-appd keys add wallet --ledger
   ```
5. **View your address:**

   ```bash
   celestia-appd keys show wallet --address
   ```
6. **Use Ledger for all signing operations:**
   * **Delegate tokens:**

     ```bash
     celestia-appd tx staking delegate <valoper_address> 1000000utia --from wallet --ledger
     ```
   * **Withdraw rewards:**

     ```bash
     celestia-appd tx distribution withdraw-rewards <valoper_address> --from wallet --ledger
     ```
   * **Vote on proposals:**

     ```bash
     celestia-appd tx gov vote 1 yes --from wallet --ledger
     ```

Each transaction must be physically confirmed on your Ledger device before broadcasting.

***

#### 3. Security Recommendations

* Never enter your seed phrase on a computer or online form.
* Avoid connecting Ledger to unknown or shared systems.
* Keep your hardware wallet and recovery phrase stored separately.
* Use a dedicated Ledger for each validator when possible.
* Maintain an offline backup of your seed phrase (paper or metal plate).

***

### 🧩 Benefits of Using Ledger for Validator Key Management

✅ Private keys remain fully isolated within the hardware wallet.\
✅ Even if a node or workstation is compromised, the attacker cannot sign transactions.\
✅ Seamless integration with CLI, Keplr, and other ecosystem tools.\
✅ Suitable for multiple networks — Celestia, Cosmos, Osmosis, and beyond.

***

📘 *Using Ledger for validator key management provides a robust, industry-grade approach to securing your blockchain infrastructure.*


# 🛡️ Protecting Validator from DDoS Attacks

### Understanding the DDoS Threat

**What is a DDoS attack?**\
A Distributed Denial of Service (DDoS) attack floods your server with excessive traffic, making it unavailable.

**Types of DDoS attacks:**

* **Network-layer attacks (L3-L4, volumetric attacks)** – Overloading bandwidth (UDP flood, SYN flood).
* **Transport-layer attacks (L4)** – Exhausting connections (TCP flood, Slowloris).
* **Application-layer attacks (L7, HTTP flood)** – Overloading APIs and RPC endpoints.

### Network-Level Protection (L3-L4)

At the network level, you need to limit malicious traffic.

#### Configuring Firewalls (UFW, iptables)

**UFW (Uncomplicated Firewall)**

```bash
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow 26656/tcp  # Open port for P2P (example for Cosmos SDK)
sudo ufw enable
```

**iptables (Advanced option)**

```bash
# Blocking UDP flood
sudo iptables -A INPUT -p udp --dport 26656 -m limit --limit 10/s --limit-burst 20 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 26656 -j DROP

# SYN flood protection
sudo iptables -A INPUT -p tcp --syn --dport 26656 -m limit --limit 10/s --limit-burst 20 -j ACCEPT
sudo iptables -A INPUT -p tcp --syn --dport 26656 -j DROP
```

#### Rate Limiting (Restricting Requests)

**Fail2Ban** can automatically ban suspicious IPs.

```bash
sudo apt install fail2ban -y
sudo nano /etc/fail2ban/jail.local
```

Add:

```
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600
```

Apply changes:

```bash
sudo systemctl restart fail2ban
```

***

### Protecting Network Infrastructure

#### Using Cloudflare or Another CDN

Cloudflare or Radware helps filter malicious traffic.

**How to set up Cloudflare?**

1. Register on [Cloudflare](https://www.cloudflare.com/).
2. Add your domain.
3. Enable **"Under Attack Mode"**.
4. Restrict API access to trusted IPs only.

#### Setting Up Reverse Proxy (NGINX)

**Why use it?**\
NGINX can hide your real IP and limit requests.

**Example config for L7 attack protection:**

```nginx
server {
    listen 80;
    server_name validator.example.com;

    location / {
        proxy_pass http://localhost:26657;
        proxy_set_header X-Real-IP $remote_addr;
        limit_req zone=one burst=5 nodelay;
    }

    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
}
```

Apply the config:

```bash
sudo systemctl restart nginx
```

***

### Monitoring and Automated Response

#### Installing CrowdSec

CrowdSec detects and blocks attacks.

```bash
curl -fsSL https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash
sudo apt install crowdsec -y
```

#### &#x20;Monitoring Load (Prometheus + Grafana)

1. Install **Prometheus**:

```bash
sudo apt install prometheus -y
```

2. Install **Grafana** and set up dashboards.

***

### Additional Security Measures

* **Restrict access by IP** – Allow access only from trusted IPs.
* **Use VPN (WireGuard, OpenVPN)** – Hide your validator’s real IP.
* **Separate RPC and P2P networks** – Don’t run everything on a single server.


# 🧩Multi-Factor Authentication (MFA) for a Validator

Multi-Factor Authentication (MFA) is a crucial security measure for a validator. It prevents unauthorized access to the server, wallet, and critical node management systems.

### Setting Up MFA for SSH Access

#### **Enabling Two-Factor Authentication with Google Authenticator**

**Install Google Authenticator**

```bash
sudo apt update && sudo apt install libpam-google-authenticator -y
```

**Generate a Secret Key**

```bash
google-authenticator
```

A QR code and key will appear. **Save your backup codes!**

**Configure PAM for SSH**

```bash
sudo nano /etc/pam.d/sshd
```

Add this line at the beginning:

```
auth required pam_google_authenticator.so
```

**Enable MFA in the SSH Configuration**

```bash
sudo nano /etc/ssh/sshd_config
```

Modify the following parameters:

```
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
```

Restart SSH:

```bash
sudo systemctl restart sshd
```

Now, SSH access will require a one-time password (OTP) from Google Authenticator.

***

### MFA for Hardware Security Keys (YubiKey)

**Install FIDO2/U2F Support**

```bash
sudo apt install libpam-u2f -y
```

**Register Your YubiKey**

```bash
mkdir -p ~/.config/Yubico
pamu2fcfg > ~/.config/Yubico/u2f_keys
```

Press the YubiKey button to confirm registration.

**Configure PAM for SSH**

```bash
sudo nano /etc/pam.d/sshd
```

Add:

```
auth required pam_u2f.so
```

Now, SSH access will require the hardware security key.

***

### MFA for the Validator Wallet

#### **Best Option – Hardware Wallet (Ledger, Trezor)**

* Store private keys on **Ledger Nano X** or **Trezor Model T**.
* Connect only when signing transactions.
* **Keplr + Ledger** is an ideal solution for Cosmos validators.

#### **Securing a Hot Wallet**

If the wallet is stored on the server, run:

```bash
chmod 600 ~/.wallet/keystore
chown username:username ~/.wallet/keystore
```

* **Backup your mnemonic phrase offline.**
* Restrict access to wallet files using **ACL (Access Control List).**

***

### MFA for Monitoring and API

**Securing Grafana with a Password + MFA**

1. Enable **OAuth 2.0** with Google/Auth0 for Grafana.
2. Restrict access to Grafana with **2FA**.
3. Set up Fail2Ban to protect against brute-force attacks:

```bash
sudo nano /etc/fail2ban/jail.local
```

Add:

```
[grafana]
enabled = true
port = 3000
filter = grafana
logpath = /var/log/grafana/grafana.log
maxretry = 5
bantime = 3600
```

Apply changes:

```bash
sudo systemctl restart fail2ban
```

***

### Protecting RPC and API with MFA

&#x20;**Securing RPC Access via NGINX + OAuth**

1. Install **NGINX + JWT authentication**.
2. Restrict access to `/rpc`, `/api` by IP addresses and keys.
3. Implement **Cloudflare Access** to enforce **MFA for API access**.


# 🚨Monitoring

Ensuring the uninterrupted performance and stability of our blockchain validators is a critical priority. To achieve this, we have implemented a robust and multi-layered monitoring infrastructure that delivers detailed insights into both system-level and application-level metrics. This allows us to maintain validator health, optimize performance, and quickly address any issues.

Our monitoring stack integrates the following key components:

1. **Prometheus and Node Exporter**\
   Prometheus serves as the backbone of our monitoring system, collecting metrics from all key components of the validator infrastructure. With Node Exporter, we monitor detailed system-level metrics such as CPU utilization, memory consumption, disk I/O, and network throughput. This data provides a clear picture of server resource usage, helping us identify and address performance bottlenecks before they impact operations.
2. **Grafana Dashboards**\
   Grafana is used to visualize the data collected by Prometheus, presenting it in intuitive and customizable dashboards. These dashboards provide real-time insights into validator performance, including block production rates, peer connectivity, and transaction processing. Alerts configured within Grafana ensure we are immediately informed of anomalies such as excessive resource usage, high latency, or missed blocks.
3. **Tenderduty**\
   Tenderduty plays a crucial role in monitoring the operational health of our validators. It tracks critical events, including missed blocks, downtime, and potential slashing risks. By generating alerts in real time, Tenderduty enables us to respond promptly to issues, minimizing downtime and mitigating risks to our stake.
4. **Custom Monitoring Scripts**\
   To complement off-the-shelf solutions, we have developed custom scripts tailored to our validators' specific needs. These scripts perform additional checks, such as monitoring consensus participation, verifying data integrity, and ensuring the timely application of updates. They also include automated routines to collect logs and perform diagnostics, streamlining the troubleshooting process.
5. **Comprehensive Logging and Alerting**\
   Logs from all components—validators, monitoring tools, and custom scripts—are aggregated and analyzed for patterns that might indicate potential problems. Alerts are configured to notify the team via multiple channels, ensuring prompt response regardless of the time or location.
6. **High Availability and Failover Monitoring**\
   For validators deployed in high-availability configurations, our monitoring system tracks both primary and backup nodes. This ensures seamless failover during maintenance or unexpected outages. Metrics from both nodes are continuously reviewed to confirm readiness and validate the effectiveness of our failover mechanisms.

By combining real-time monitoring, advanced alerting, and custom analytics, we maintain a proactive approach to validator health and stability. This ensures that our validators remain reliable, secure, and fully compliant with network requirements.


# 📊  Node-exporter + Prometheus + Grafana

In this guide, we’ll set up a monitoring system to collect metrics from all servers and visualize them in Grafana.

We will use a dedicated server to host **Prometheus**, **Grafana**, and **Node Exporter**, while only **Node Exporter** will be installed on other servers.

* **Prometheus** is an open-source time-series database written in Go. It pulls metrics from defined services, eliminating data queue bottlenecks and ensuring reliable monitoring.
* **Node Exporter** exports server metrics in a format compatible with Prometheus. While Prometheus supports many exporters, Node Exporter is ideal for server monitoring.
* **Grafana** is a web-based tool for visualizing time-series data from Prometheus and other databases. Although Prometheus has its own web interface, Grafana is recommended for advanced visualization.

The setup flow is as follows: **Node Exporter** collects server metrics → **Prometheus** stores the data → **Grafana** visualizes it in dashboards.

## *Node Exporter*

#### ***Install and Set Up Node Exporter***

```bash
# Download and extract Node Exporter
cd $HOME && \
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz && \
tar xvf node_exporter-1.8.2.linux-amd64.tar.gz && \
rm node_exporter-1.8.2.linux-amd64.tar.gz && \
sudo mv node_exporter-1.8.2.linux-amd64 node_exporter && \
chmod +x $HOME/node_exporter/node_exporter && \
sudo mv $HOME/node_exporter/node_exporter /usr/local/bin && \
rm -Rvf $HOME/node_exporter/

# Create a system user with restricted permissions for Node Exporter
sudo useradd --no-create-home --shell /bin/false node_exporter
```

#### ***Create and Enable the\*\*\*\* ****`exporterd`**** \*\*\*\*Service***

```bash
# Create the systemd service file
sudo tee /etc/systemd/system/node_exporterd.service > /dev/null <<EOF
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=node_exporter
Group=node_exporter
ExecStart=/usr/local/bin/node_exporter
Restart=always
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=default.target
EOF

# Reload systemd, enable, and start the service
sudo systemctl daemon-reload
sudo systemctl enable node_exporterd
sudo systemctl restart node_exporterd

sudo systemctl status node_exporterd
```

<figure><img src="/files/nZHwAcgl5Bx42Nvouqxm" alt=""><figcaption></figcaption></figure>

#### ***Verify Logs***

```bash
sudo journalctl -u node_exporterd -f
```

#### ***Access Node Exporter Metrics***

Open a web browser and navigate to:\
**`http://<server_IP>:9100/`**

Replace `<server_IP>` with the actual IP address of your server running `node_exporter`.

## *Prometheus*

#### ***Update Repositories and Upgrade Packages***

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

#### ***Install Necessary Utilities***

```bash
sudo apt install -y curl iptables build-essential git wget jq make gcc nano tmux htop nvme-cli pkg-config libssl-dev libleveldb-dev tar clang bsdmainutils ncdu unzip python3-pip
pip install yq
```

```bash
# Create a Prometheus User
sudo useradd -m -s /bin/bash prometheus
sudo groupadd --system prometheus
sudo usermod -aG prometheus prometheus
```

#### ***Download and Install Prometheus***

```bash
# Create Necessary Directories
sudo mkdir /var/lib/prometheus
for i in rules rules.d files_sd; do sudo mkdir -p /etc/prometheus/${i}; done
mkdir -p /tmp/prometheus && cd /tmp/prometheus
```

```bash
#Download Prometheus
curl -s https://api.github.com/repos/prometheus/prometheus/releases/latest | grep browser_download_url | grep linux-amd64 | cut -d '"' -f 4 | xargs wget
```

```bash
# Extract and Move Prometheus Binaries
tar xvf prometheus*.tar.gz
cd prometheus*/
sudo mv prometheus promtool /usr/local/bin/
```

```bash
# Check Installed Versions
prometheus --version
promtool --version
```

```bash
# Move Configuration Files
sudo mv prometheus.yml /etc/prometheus/prometheus.yml
sudo mv consoles/ console_libraries/ /etc/prometheus/
```

#### ***Create the Prometheus Service File***

```bash
sudo tee /etc/systemd/system/prometheus.service > /dev/null <<EOF
[Unit]
Description=Prometheus
Documentation=https://prometheus.io/docs/introduction/overview/
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=prometheus
Group=prometheus
ExecReload=/bin/kill -HUP \$MAINPID
ExecStart=/usr/local/bin/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/var/lib/prometheus \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries \
--web.listen-address=0.0.0.0:9090 \
--web.external-url=

SyslogIdentifier=prometheus
Restart=always

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

> *You can replace the port `9090` with a custom port if needed (e.g., `8080`).*

#### ***Set Permissions***

```bash
for i in rules rules.d files_sd; do sudo chown -R prometheus:prometheus /etc/prometheus/${i}; done
for i in rules rules.d files_sd; do sudo chmod -R 775 /etc/prometheus/${i}; done
sudo chown -R prometheus:prometheus /var/lib/prometheus/
```

#### ***Start and Enable the Prometheus Service***

```bash
sudo systemctl daemon-reload
sudo systemctl enable prometheus
sudo systemctl start prometheus
sudo systemctl status prometheus
```

<figure><img src="/files/qqvfYnFxZpKpptW78fQh" alt=""><figcaption></figcaption></figure>

#### ***Access Prometheus***

Open a web browser and navigate to:\
**`http://<server_IP>:9090/`**\
Replace `<server_IP>` with the IP address of the server running Prometheus.

<figure><img src="/files/wZtYHjkmBzo06saxLH85" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/0EEX5iVT0xVoNJPSdC1r" alt=""><figcaption></figcaption></figure>

#### ***Add Additional Servers to Prometheus Configuration***

To monitor multiple servers, update the `prometheus.yml` configuration file with the relevant settings for each server.

#### ***Open the Prometheus Configuration File***

```bash
sudo nano /etc/prometheus/prometheus.yml
```

#### ***Add a New Job for Monitoring***

Here’s an example configuration for a job named `celestia-consensus` that monitors the target at `localhost:26660`.

<pre class="language-yaml"><code class="lang-yaml"><strong>- job_name: celestia-consensus
</strong>  static_configs:
  - targets: ['localhost:26660']
</code></pre>

<figure><img src="/files/WyMnEe5uOLclDNkrUqo0" alt=""><figcaption></figcaption></figure>

You can replace `localhost:26660` with the IP address and port of the server or service you want to monitor.

For example, if monitoring another server:

```yaml
- job_name: my-second-server
  static_configs:
    - targets: ['192.168.1.100:9100'] 
```

#### ***Restart Prometheus***

Restart the Prometheus service to apply the new configuration:

```bash
sudo systemctl restart prometheus
```

#### ***Verify Prometheus is Running Properly***

Check the service status to ensure Prometheus is running without issues:

```bash
sudo systemctl status prometheus
```

#### ***Access Prometheus***

Navigate to **`http://<server_IP>:9090/targets`** in your web browser to see the list of active targets and ensure that the new job is being monitored.

## *Grafana*

#### ***Install Required Dependencies***

```bash
sudo apt-get install -y apt-transport-https software-properties-common wget
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
```

#### ***Add the Grafana Repository***

```bash
echo "deb https://packages.grafana.com/enterprise/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
```

#### ***Create a User for Grafana***

```bash
sudo useradd -m -s /bin/bash grafana
sudo groupadd --system grafana
sudo usermod -aG grafana grafana
```

#### ***Install Grafana Enterprise***

```bash
#Install Additional Utilities
sudo apt-get install -y adduser libfontconfig1
```

```bash
#Download and Install Grafana Enterprise
wget https://dl.grafana.com/enterprise/release/grafana-enterprise_9.3.2_amd64.deb
sudo dpkg -i grafana-enterprise_9.3.2_amd64.deb
```

#### ***Start and Enable the Grafana Server***

```bash
sudo systemctl daemon-reload
sudo systemctl enable grafana-server
sudo systemctl start grafana-server
sudo systemctl status grafana-server
```

<figure><img src="/files/v9VsnZI7bAjoWDbnWU1f" alt=""><figcaption></figcaption></figure>

#### &#x20;***Access Grafana***

Open a web browser and navigate to:\
**`http://<server_IP>:3000`**

Replace `<server_IP>` with your server's IP address.

* Default **username**: `admin`
* Default **password**: `admin` (You will be prompted to change it after the first login).

<figure><img src="/files/2iDjRbICuWBZQRsVurqk" alt=""><figcaption></figcaption></figure>

After changing the password, click "Configuration" and then "Data Sources".

<figure><img src="/files/g3O6tRZGYIdzZWZ8Hbw9" alt=""><figcaption></figcaption></figure>

Now click on Add data source and select the Prometheus data source.

<figure><img src="/files/NUrgpY5CWp5BwQ9JVKYZ" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/Tx5s1MEXDr2KmEmn6cYi" alt=""><figcaption></figcaption></figure>

#### ***Access Prometheus***

To access Prometheus, enter the **IP address** followed by port **9090** .

* If you are running **Prometheus and Grafana on the same server**, use:\
  **`http://localhost:9090`**
* If **Prometheus and Grafana are on separate servers**, enter the **IP address of the Prometheus server**, for example:\
  **`http://<Prometheus_IP>:9090`**

Replace `<Prometheus_IP>` with the actual IP address of your Prometheus server.

<figure><img src="/files/5N6lgGMZ3K40cwBmBof3" alt=""><figcaption></figcaption></figure>

Save the settings.

<figure><img src="/files/ESjHcSIkjoGMA44qxDGw" alt=""><figcaption></figcaption></figure>

#### ***Download Grafana Dashboard JSON Files***

To set up dashboards in Grafana, you need the **JSON files** of the dashboards. These files can either be:

1. **Downloaded** from a public source like Grafana's [Dashboard Library](https://grafana.com/grafana/dashboards/).
2. **Shared** by someone else.
3. **Created** by you directly in Grafana.

* If you’re using Grafana's library, search for the dashboard by its **ID** and download the JSON file.
* Once downloaded, you can **import** the JSON file into Grafana through the **Import Dashboard** option in the Grafana interface.

<figure><img src="/files/NIviW4kooZK1WqAfKQz2" alt=""><figcaption></figcaption></figure>

Now click on Import and then on Upload JSON file.

<figure><img src="/files/rwOpanE9SL61Px14P9ND" alt=""><figcaption></figcaption></figure>

Upload the JSON file you downloaded earlier, then select the Prometheus data source you just configured and click the +Import button.

<figure><img src="/files/1OnZMm4PVX21SDxbp09w" alt=""><figcaption></figcaption></figure>

Now you have a fully functional monitoring system that can scale to include additional servers and services as needed.


# 🕵️  TenderDuty for Node Monitoring

TenderDuty is a robust tool for monitoring blockchain nodes, providing insights into network height, validator status, uptime, signed blocks, and transmitted blocks. It also supports alerts via Telegram and Discord for effective monitoring.

***

### *Preparing the Environment*

Start by updating your server and installing the necessary dependencies:

```bash
sudo apt update && sudo apt upgrade -y
sudo apt install curl git wget jq make gcc tmux htop pkg-config libssl-dev tar clang unzip -y
```

### *Installing Docker*

Docker is required to run TenderDuty. Follow these steps to install it:

Add the Docker repository key:

```bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```

Add the Docker repository:

```bash
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
```

Install Docker:

```bash
sudo apt update && sudo apt install docker-ce -y
```

Verify the installation:

```bash
docker --version
```

### *Setting Up TenderDuty*

Create a dedicated directory for TenderDuty and set up the configuration.

Create the directory and navigate to it:

```bash
mkdir $HOME/tenderduty && cd $HOME/tenderduty
```

Download the example configuration file:

```bash
docker run --rm ghcr.io/blockpane/tenderduty:latest -example-config > config.yml
```

Edit the configuration file:

```bash
nano $HOME/tenderduty/config.yml
```

Customize the configuration:

* Replace `celestia` with your project name.
* Update the `chain_id` (e.g., replace `mocha-4` with your chain ID, such as `testnet-1`).
* Enter your validator address in the `valoper_address` field.
* Update the `url` field with the RPC address of your node, such as `tcp://localhost:26657`.

### *Running TenderDuty*

Launch TenderDuty as a Docker container using the following command:

```bash
docker run -d --name tenderduty -p "8888:8888" --restart unless-stopped \
    -v $(pwd)/config.yml:/var/lib/tenderduty/config.yml \
    ghcr.io/blockpane/tenderduty:latest
```

### *Securing the Server*

To protect your server, configure a firewall.

Install the `ufw` firewall if not already installed:

```bash
sudo apt install ufw
```

Set up firewall rules:

```bash
sudo ufw default allow outgoing
sudo ufw default deny incoming
sudo ufw allow ssh/tcp
sudo ufw limit ssh/tcp
sudo ufw allow 8888/tcp
sudo ufw enable
```

You can now access the TenderDuty dashboard in your browser at:\
`http://<YOUR_SERVER_IP>:8888`.

***

### *Configuring Telegram Notifications*

To configure, use this [documentation](https://stackoverflow.com/questions/32423837/telegram-bot-how-to-get-a-group-chat-id).

To enable notifications in Telegram:

1. Create a Telegram bot using `@BotFather` and save the API token.
2. Create a Telegram group, add the bot to the group, and retrieve the group ID.
3. Edit the configuration file:

   ```bash
   nano $HOME/tenderduty/config.yml
   ```
4. Modify the Telegram section:

   ```yaml
   telegram:
     enabled: yes
     api_key: '<YOUR_BOT_API_KEY>'
     channel: '<YOUR_GROUP_ID>'
   ```

### *Restarting TenderDuty*

Apply the configuration changes by restarting the Docker container:

```bash
docker restart tenderduty
```

***

TenderDuty is now fully installed and configured. Monitor your node status, receive real-time alerts, and manage everything via the web interface.


# 🧵 Setting up connection to IBC with Hermes

### *Prerequisites*

* A Linux server (Ubuntu/Debian recommended)
* Minimum: 4 GB RAM, 2 CPU, 100 GB SSD
* Rust and Cargo installed
* Access to RPC nodes for Celestia and Osmosis (or own full nodes)
* Wallets funded with a small amount of TIA (Celestia) and OSMO (Osmosis)

### *Install Hermes Relayer*

```bash
# Update system
sudo apt update && sudo apt upgrade -y

# Install dependencies
sudo apt install -y build-essential git curl jq pkg-config libssl-dev

# Install Rust (if not already installed)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env

# Clone and install Hermes
git clone https://github.com/informalsystems/hermes.git
cd hermes
git checkout v1.13.0  # Use a stable version
cargo install --locked --path crates/relayer-cli

# Verify installation
hermes version
```

***

### *Configure Hermes with Fee Support*

```bash
# Create config directory
mkdir -p $HOME/.hermes/keys

# Create configuration file
cat > $HOME/.hermes/config.toml << EOF
[global]
log_level = 'info'
clear_packets_interval = 100
tx_confirmation = true

[mode]
[mode.clients]
enabled = true
refresh = true
misbehaviour = true

[mode.connections]
enabled = true

[mode.channels]
enabled = true

[mode.packets]
enabled = true
clear_interval = 100
clear_on_start = true
tx_confirmation = true

[rest]
enabled = true
host = '127.0.0.1'
port = 3000

[telemetry]
enabled = true
host = '127.0.0.1'
port = 3001

[[chains]]
id = 'celestia'
type = 'CosmosSdk'
rpc_addr = 'https://rpc.celestia.org:443'
grpc_addr = 'https://grpc.celestia.org:443'
websocket_addr = 'wss://rpc.celestia.org:443/websocket'
rpc_timeout = '10s'
account_prefix = 'celestia'
key_name = 'celestia-key'
key_store_type = 'Test'
store_prefix = 'ibc'
default_gas = 100000
max_gas = 3000000
gas_price = { price = 0.025, denom = 'utia' }
gas_multiplier = 1.3
max_msg_num = 30
max_tx_size = 180000
clock_drift = '5s'
max_block_time = '30s'
trusting_period = '14days'
trust_threshold = { numerator = '1', denominator = '3' }
address_type = { derivation = 'cosmos' }

[[chains.packet_filter]]
policy = 'allow'
list = [
  ['transfer', '*'],
]

[chains.packet_filter.min_fees]
enabled = true
recv_fee = [{ amount = "100", denom = "utia" }]
ack_fee = [{ amount = "100", denom = "utia" }]
timeout_fee = [{ amount = "100", denom = "utia" }]

[[chains]]
id = 'osmosis-1'
type = 'CosmosSdk'
rpc_addr = 'https://rpc.osmosis.zone:443'
grpc_addr = 'https://grpc.osmosis.zone:443'
websocket_addr = 'wss://rpc.osmosis.zone:443/websocket'
rpc_timeout = '10s'
account_prefix = 'osmo'
key_name = 'osmo-key'
key_store_type = 'Test'
store_prefix = 'ibc'
default_gas = 100000
max_gas = 3000000
gas_price = { price = 0.025, denom = 'uosmo' }
gas_multiplier = 1.3
max_msg_num = 30
max_tx_size = 180000
clock_drift = '5s'
max_block_time = '30s'
trusting_period = '14days'
trust_threshold = { numerator = '1', denominator = '3' }
address_type = { derivation = 'cosmos' }

[[chains.packet_filter]]
policy = 'allow'
list = [
  ['transfer', '*'],
]

[chains.packet_filter.min_fees]
enabled = true
recv_fee = [{ amount = "100", denom = "uosmo" }]
ack_fee = [{ amount = "100", denom = "uosmo" }]
timeout_fee = [{ amount = "100", denom = "uosmo" }]
EOF
```

***

### *Add Wallet Keys*

```bash
# Save your mnemonics securely
echo "your celestia mnemonic here" > $HOME/celestia_mnemonic.txt
echo "your osmosis mnemonic here" > $HOME/osmosis_mnemonic.txt
chmod 600 $HOME/celestia_mnemonic.txt $HOME/osmosis_mnemonic.txt

# Import keys
hermes keys add --chain celestia --mnemonic-file $HOME/celestia_mnemonic.txt
hermes keys add --chain osmosis-1 --mnemonic-file $HOME/osmosis_mnemonic.txt

# Check keys
hermes keys list --chain celestia
hermes keys list --chain osmosis-1
```

***

### *Validate Configuration and Network Access*

```bash
# Validate Hermes configuration
hermes config validate

# Check network health
hermes health-check
```

***

### *Create Clients, Connections, and Channel*

```bash
# Create clients
hermes create client --host-chain celestia --reference-chain osmosis-1
hermes create client --host-chain osmosis-1 --reference-chain celestia

# Query created clients
hermes query clients --host-chain celestia
hermes query clients --host-chain osmosis-1

# Create connection
hermes create connection --a-chain celestia --b-chain osmosis-1

# Query connections
hermes query connections --chain celestia
hermes query connections --chain osmosis-1

# Create channel for token transfers
hermes create channel --a-chain celestia --b-chain osmosis-1 --a-port transfer --b-port transfer --new-client-connection

# Query channels
hermes query channels --chain celestia
hermes query channels --chain osmosis-1
```

***

### *Run Hermes Relayer*

```bash
# Run Hermes in background
nohup hermes start > hermes.log 2>&1 &

# Check if running
ps aux | grep hermes

# View logs
tail -f hermes.log
```

***

### *Setup Hermes as a systemd Service*

```bash
# Create a systemd service
sudo tee /etc/systemd/system/hermes.service > /dev/null << EOF
[Unit]
Description=Hermes IBC Relayer
After=network-online.target

[Service]
User=$USER
ExecStart=$(which hermes) start
Restart=always
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

# Enable and start service
sudo systemctl daemon-reload
sudo systemctl enable hermes
sudo systemctl start hermes

# Check service status
sudo systemctl status hermes
```


# 🤖PolkadotUltraBot

**Introducing a smart and private way to stay on top of your Polkadot activity — all within Telegram.**\
Monitor your validators  and wallets, get real-time alerts, track balances, and check node/account status effortlessly.

Take your Polkadot experience to the next level with automated notifications, quick insights, and seamless multi-account control — all in one open-source, self-hosted Telegram bot.

<figure><img src="/files/7JaSLHG4vLrmfgheRsAx" alt="" width="375"><figcaption></figcaption></figure>

### What can this bot do?

* 🔗 **Effortlessly manage and monitor your Polkadot validators and wallets**\
  Add, remove, and organize any number of accounts — perfect for stakers, node operators, delegators, and enthusiasts.
* 📡 **Instantly check statuses, reward points, and up-to-date balances**\
  Get key metrics for your validators and wallets in seconds. No more switching tabs or parsing block explorers.
* 🚨 **Receive real-time alerts**
  * **New transaction?** Notification in Telegram.
  * **Validator points stuck or offline?** Immediate warning, so you stay in the active set.
* 🔄 **Easily switch active addresses**\
  Use inline menus and buttons to set which account you want to monitor — one tap, instant context switch.
* ⚡️ **Stay one step ahead**\
  Be proactive, not reactive: get notified before an issue costs you rewards!


# 🚀 Getting started

After sending the `/start` command, the bot greets the user and outlines its core features:

* Manage all your validators and wallets in one place
* Instantly check balances, staking status, and activity
* Quickly switch between nodes and wallets
* Receive alerts about transactions and validator status changes

<figure><img src="/files/oeHTlgINbtTrdg7QPkOW" alt="" width="375"><figcaption></figcaption></figure>


# 👛 Wallet

The `/walletstatus` command provides a summary of the currently active wallet:

* **Address:** the active wallet address
* **Total Balance:** the amount of DOT and its equivalent value in USD
* **Locked, Bonded, Reserved, Unbonding:** status breakdown in both DOT and USD

🧩 This feature is especially useful for monitoring funds and quickly assessing wallet activity.

<figure><img src="/files/iis0v9Xb6M2nkjGSI42k" alt="" width="375"><figcaption></figcaption></figure>


# 📤 Transaction Notification

The bot instantly notifies you about every new transaction related to your monitored wallet. In this example, an **outgoing** transaction is displayed with full details:

* &#x20;**Date:** Timestamp of the transaction
* &#x20;**Direction:** Indicates whether the transaction is incoming or outgoing
* &#x20;**Amount:** The transferred amount in DOT
* &#x20;**From:** Sender’s wallet address
* &#x20;**To:** Recipient’s wallet address
* &#x20;**TxHash:** Link to view full transaction details on Subscan

⚡ This real-time alert system allows users to stay on top of their account activity without needing to manually check explorers. Perfect for delegators, validators, and teams.

<figure><img src="/files/7uEcxSr0znoiCaHkgTJ6" alt="" width="375"><figcaption></figcaption></figure>


# 🖥️ Validator Status Monitoring

Stay fully informed about the status of your active Polkadot validator with a detailed snapshot delivered right in Telegram — in real time.

**📡 Validator Details Include:**

* &#x20;**Address** — Full validator address
* &#x20;**Moniker** — Display name of the validator
* &#x20;**Status** — Real-time validator state (e.g., Active 🟢)
* &#x20;**Faults** — Current fault status (e.g., No 🟢)
* &#x20;**Points** — Era points earned
* &#x20;**Self Bonded** — Amount self-staked by the validator
* &#x20;**Total Bonded** — Total DOT bonded to this validator
* &#x20;**Commission** — Validator's current commission rate

🔗 Includes a direct link to Subscan for full validator analytics and performance metrics.

<figure><img src="/files/UtZV2E6dR5wvTVJu9kdz" alt="" width="375"><figcaption></figcaption></figure>


# 🔔 Notifications & Alerts

The bot delivers real-time alerts for balance changes, new nominations, validator status updates, and on-chain governance activity such as referenda outcomes.

#### 🔴 Example alerts:

* ❌ Referendum rejected
* ⚠️ Warning: validator points have not changed
* 📈 Activity monitoring: immediate alert if your node is offline or out of the active set

#### 💡 Benefit:

Stay informed and take action before any issue affects your staking rewards.

<figure><img src="/files/jrqs9NiEhEBMbeEhonYP" alt="" width="375"><figcaption></figcaption></figure>


# 📊 Nominations

Shows nomination alerts with nominator address and the amount of DOT staked to your validator.

#### Example format:

```
🔗 VALIDEXIS  
💰 New nomination  
👤 Nominator: 16dw9...Agwsa  
💸 Amount: 20,900.00 DOT
```

Track who is nominating your validator and with how much stake.

<figure><img src="/files/VudM14l7GVnSpksfUPno" alt="" width="375"><figcaption></figcaption></figure>


# 🤖CelestiaUltraBot

We present to you [Celestia UltraBot](https://validexis.com/celestiaultrabot) - a versatile tool for participants in the Celestia ecosystem. The bot provides real-time information on staking, validator monitoring, and AI-powered solutions.

With Celestia UltraBot, you can:\
✅ Track validator performance\
✅ Receive detailed earnings reports\
✅ Manage wallet balances\
✅ Get instant notifications about key network events\
✅ Utilize AI support for technical issues\
✅ Stay updated on governance proposals and network news

All features are easily accessible via Telegram, ensuring seamless access to essential information anytime! 🚀


# 🏆 Contest

| [<mark style="color:green;background-color:green;">**PARTICIPATE**</mark>](< https://t.me/CelestiaUltraBot>) |
| :----------------------------------------------------------------------------------------------------------: |

## 🚀 Win 1000 TIA 🚀 CelestiaUltraBot Twitter Challenge! 🎉

## 🚀 Ensuring a Fair & Transparent Contest

To make this contest fair and transparent, we have added anti-spam filters and rules to ensure genuine participation for both existing Celestia users and newcomers. We also introduced a special reward system for influencers, community leaders, and regular users who help promote the contest.

***

### ✅ Contest Participation Rules

#### 🔹 1. Two Participation Levels

There are two ways to join the contest, depending on your experience with Celestia:

**1️⃣** For Active Celestia Users (those who have already interacted with the network before February 1st, 2025)&#x20;

2️⃣ For Newcomers (those who are just starting and may not have interacted with Celestia before February 1st, 2025)

Both groups have different requirements, but everyone has a fair chance to win! 🎉

***

### 📌 General Requirements for ALL Participants

✅ Like, retweet, and comment on the official contest post on X (Twitter).\
✅ Follow our official X account.\
✅ Follow the official Celestia X account.\
✅ Join our official Telegram channel.\
✅ Submit your participation through our Telegram bot.

🚨 **Participants who fail to complete all these steps will not be eligible for rewards.**

***

### 👤 1️⃣ Rules for Active Celestia Users

#### 🔹 1. Must Have Interacted with the Celestia Network Before February 1st

✅ Participants must have made at least one transaction on the Celestia network before February 1, 2025.\
✅ This can include:

* Delegating tokens to a validator
* Sending/receiving TIA
* Voting on a Celestia governance proposal

✅ Purpose: To ensure the participant is genuinely engaged with the network and not just creating a wallet for the contest.

🚨 **Wallets with no transaction history before February 1st, 2025, will be disqualified.**

#### 🔹 2. Wallet Balance Must Be At Least **25 TIA**

✅ The wallet must maintain a minimum balance of 25 TIA throughout the contest.\
✅ The balance will be checked at a random moment (snapshot of the wallet).\
✅ If the balance drops below 25 TIA, the participant is automatically disqualified.\
✅ The balance will be verified via a blockchain explorer (to prevent fake accounts).

#### 🔹 3. Creative Post (Photo, Video, or Other Engaging Content) 🎨

✅ Participants must create a creative post related to **Celestia** or **CelestiaUltraBot** on **Twitter/X**.

✅ The post can be in any creative format and may include one of the following categories:

• 🌍 Why Celestia is the Future – Infographic or Carousel Post Create a visually appealing post showcasing Celestia’s key advantages, such as modularity, scalability, and data availability (DA). Use an infographic, a carousel post, or a short Twitter thread to explain why Celestia is a game-changer.

• 🤖 Video Review: How CelestiaUltraBot Helps Users Record a short video demonstration showing how CelestiaUltraBot can be used (e.g., checking balance, staking analysis, getting block info). Make it engaging and informative!

• 😂 Creative Memes About Celestia and Decentralization Design a unique meme related to Celestia, CelestiaUltraBot, or DA concepts that will entertain the community and highlight the project’s significance.

• 📸 Real Photo with CelestiaUltraBot Take a real-life photo of CelestiaUltraBot on your phone, tablet, or PC. You can optionally include Celestia-related elements (Celestia merch, TIA price charts, blockchain dashboards, or anything representing the ecosystem).

• 🎬 TikTok-Style Video: “Why I Choose Celestia?” Create a dynamic short video (15-30 sec) explaining why Celestia stands out compared to other blockchain solutions. Use text overlays, transitions, and effects to make it engaging.

• 📖 “Success Story” – How Celestia Impacted Your Web3 Journey Share your personal experience in a video or carousel post about how Celestia has opened new opportunities for you in the Web3 space.

• 🎨 Fan Art or Creative Content Inspired by Celestia Design an original artwork, illustration, or even a 3D model that reflects Celestia’s vision and technological innovations. Get creative and showcase your artistic talent!

✅ The post must include the following hashtags:

**#CelestiaUltraBot #Celestia #TIA**

✅ Participants must also tag:

**@validexis** and **@celestia** in their post.

#### 🚀 Additionally, content from the Mammothon event is also accepted!

Share your photos, videos, or insights from the event to highlight Celestia’s ecosystem and community.

**🚨 Low-effort posts (e.g., plain screenshots without added creativity) will NOT be accepted.**

#### 🔹 4. Additional Verification for Wallet Authenticity

✅ We reserve the right to request on-chain verification actions to confirm wallet ownership and activity.\
✅ This may include a small test transaction, signing a message, or another form of blockchain-based verification.\
✅ Participants who refuse verification may be disqualified.

#### 🏆 Prizes for Active Celestia Users

🥇 **1st Place** – **250 TIA**\
🥈 **2nd Place** – **150 TIA**\
🥉 **3rd Place** – **100 TIA**\
🎖️ **Bonus prizes for creativity!**

***

### 🆕 2️⃣ Rules for Newcomers to Celestia

#### 🔹 1. First Interaction with the Celestia Network (No Requirement Before February 1st)

✅ Participants do NOT need to have previous interactions with Celestia before February 1st, 2025.\
✅ However, they must complete at least one transaction before the contest ends.\
✅ This can include:

* Receiving TIA from another wallet
* Sending TIA to another address
* Delegating TIA to a validator

🚨 **Wallets that remain empty or inactive throughout the contest will be disqualified.**

#### 🔹 2. Wallet Balance Must Be At Least **10 TIA**

✅ The wallet must maintain a minimum balance of 10 TIA throughout the contest.\
✅ The balance will be checked randomly to ensure compliance.\
✅ If the balance drops below 10 TIA, the participant is automatically disqualified.

🚨 **Participants who create a wallet but do not fund it with at least 10 TIA will not qualify.**

#### 🏆 Prizes for Newcomers

🥇 **1st Place** – **30 TIA**\
🥈 **2nd Place** – **25 TIA**\
🥉 **3rd Place** – **20 TIA**\
🎖️ **4th to 10th Places** – **10 TIA**

***

### 📢 Special Bonus for Influencers & Community Members!

Now, not only influencers and bloggers can earn bonuses for bringing new participants, but all users can invite friends and get rewards if they win!

#### 🔹 1. Influencer & User Referral Rewards for Winning Participants

🏆 If their referred participant wins:

* 🥇 **1st Place** – **100 TIA Bonus**
* 🥈 **2nd Place** – **75 TIA Bonus**
* 🥉 **3rd Place** – **50 TIA Bonus**

✅ The participant must mention the referrer’s Twitter handle, Telegram username, or wallet address when submitting their contest entry.\
✅ Applies to influencers, Telegram channel owners, and regular users who invite friends.\
✅ For influencers & bloggers:

* Participants must include a unique hashtag (e.g., #celestiaUltraBot) in their post.
* This helps track which influencer brought the most participants and ensures fair reward distribution.

#### 🔹 2. Influencer & User Leaderboard Rewards for Bringing the Most Participants

🏆 If they refer the most participants:

* 🥇 **1st Place** – **100 TIA Bonus**
* 🥈 **2nd Place** – **75 TIA Bonus**
* 🥉 **3rd Place** – **50 TIA Bonus**

✅ A real-time leaderboard will be updated to show the top referrers.

🚨 **For influencers & bloggers:**

* Participants referred by an influencer must include their unique hashtag in their post (e.g., `#`celestiaUltraBot).
* This ensures automatic tracking and accurate counting of referrals.

🚨 Only verified participants who meet all contest conditions will count.\
🚨 Duplicate or fake accounts will be disqualified.

🚨 At least 7 different influencers or users must launch their own referral hashtags for rewards to be granted. If fewer than 7 influencers/users create and use their referral hashtags, the contest organizers will determine the rewards and their amounts at their discretion.

#### **🔹 3. Protection Against Multi-Accounts & Fake Participants**

🚨 One person = One Twitter/X account + One Celestia wallet.\
🚨 Multi-accounts, duplicates, or fake engagement will lead to disqualification.\
🚨 All entries will be manually reviewed, and suspicious accounts will be removed.\
🚨 The contest admins reserve the right to request additional verification.

***

### 🏆 How Will Winners Be Selected?

✅ Random balance checks will be conducted throughout the contest.\
✅ We will verify that all wallets have Celestia transactions.\
✅ We will review the quality and originality of submitted posts.\
✅ Verification of Twitter/X engagement (like, retweet, comment, follow required).\
✅ Once all checks are completed, we will announce the winners!

***

### 📢 Final Note: This Contest is for Real Celestia Users!

🔥 **Fake accounts, multi-accounts, and freeloaders – stay away!**\
🔥 **This contest is for real Celestia users and active community members!**

🚀 **Ready to participate? Create your creative post and join CelestiaUltraBot now!**

| [<mark style="color:green;background-color:green;">**PARTICIPATE**</mark>](https://t.me/CelestiaUltraBot) |
| :-------------------------------------------------------------------------------------------------------: |

<br>


# 🚀 Getting started

**Open the @CelestiaUltraBot:** Click [this link](https://t.me/CelestiaUltraBot) to launch the bot in Telegram. It will automatically connect to your account.

Enter the **/start** command to begin work.

<figure><img src="/files/oeYvpLQ7Drjhfm9T4JLj" alt="" width="375"><figcaption></figcaption></figure>


# 🖥️ Validator monitoring

The Telegram bot provides the user with information about the status of a **validator** in the Celestia network. This is especially useful for delegators, validators, and anyone monitoring decentralized networks.

Enter the Validator Address\
The bot requests the user to provide the validator address in the following format:

```
celestiavaloper1...
```

This is a unique identifier of the validator in the Celestia network.

***

After entering the validator address, the bot provides a menu with available commands for easy navigation.

For example, you can get detailed information about the validator status:

<figure><img src="/files/OPNSNrPd0AHSDcUDpXD3" alt="" width="375"><figcaption></figcaption></figure>

CelestiaUltraBot promptly notifies the user of critical changes in validator status, such as missing blocks, and informs when the situation normalizes. This allows token holders to react in time and prevent sanctions from the network:

<figure><img src="/files/9Kk3yrI6YOGGpK64EZa5" alt=""><figcaption></figcaption></figure>


# 🔍 Bridge Node Monitoring

This section demonstrates how to monitor the status of your Celestia **bridge node** using the **CelestiaUltraBot** in Telegram. Below are two example screenshots showing typical node states: a healthy synchronized node and a node experiencing synchronization issues.

#### ✅ Example: Healthy Bridge Node

<figure><img src="/files/pdtIqbroO4UfIXmNvC4l" alt="" width="375"><figcaption></figcaption></figure>

This screenshot shows a bridge node that is fully operational:

* Node is successfully synchronized with the network.
* It is connected to peers and actively exchanging P2P messages.
* Resource usage (RAM, threads, GC pause time) is within normal limits.
* The node has been running stably for over 24 hours.
* It is running a recent version of the bridge software.

Use this as a reference for what a **properly working node** should look like.

#### ⚠️ Example: Bridge Node with Sync Issues

<figure><img src="/files/TI8RHXeg0VenUInIU96N" alt="" width="375"><figcaption></figcaption></figure>

This screenshot shows a bridge node that is encountering **synchronization errors**:

* The bot reports failed sync attempts and shows how many blocks are missing.
* System load is significantly higher, including memory usage and GC pause time.
* Sync issues may be caused by high system load, poor network connectivity, or outdated software.

This example helps identify and understand the symptoms of a **malfunctioning or unsynchronized node**.


# 👛 Wallet

The **Wallet** section in CelestiaUltraBot provides detailed insights into wallet-related data for both delegators and validator operators. It helps monitor earnings, commissions, and overall performance.

#### 💼 **Wallet Financial Overview**

This view summarizes the financial health of a wallet. It includes:

* **Total Value**: Combined total of delegated, spendable, and reward balances.
* **Spendable Balance**: Tokens available for use or transfer.
* **Delegated Amount**: Tokens currently staked to validators.
* **Claimable Rewards**: Rewards accumulated and available to claim.
* **Commission Earned**: If the wallet belongs to a validator, shows commission income.
* **Unbonding Amount**: Tokens currently being withdrawn from staking.

<figure><img src="/files/yoHG8qm2zERFBao31VUF" alt="" width="375"><figcaption></figcaption></figure>

✅ **Purpose**: Gives delegators and validators a quick snapshot of their wallet’s assets and staking position.

#### 📈 **Profitability Reports**

This section provides a detailed profitability report for a validator. It includes:

* **Validator Address**: Identifies the validator being analyzed.
* **Monthly Infrastructure Cost**: Custom cost input (e.g. server or operational expenses).
* **Gross Reward (TIA & USD)**: Total rewards earned for the selected period.
* **Net Profit (USD)**: Earnings after deducting infrastructure costs.
* **Voting Power**: Total amount of tokens delegated to the validator.
* **Commission Rate**: Percentage fee taken by the validator from delegator rewards.
* **APR**: Annual Percentage Rate earned through staking.
* **Current Token Price**: Real-time price of TIA for USD conversion.

<figure><img src="/files/kQbEVKzT7EoWD6w35cC3" alt="" width="375"><figcaption></figcaption></figure>

✅ **Purpose**: Helps validators track earnings, profitability, and operational efficiency.

#### 📈 **Wallet Analytics & Rewards**

This analytics section breaks down wallet earnings and validator fee impact:

* **Monthly Rewards Income**: Estimated monthly staking rewards in TIA and USD.
* **Expected Rewards (Next Week)**: Projected rewards for the upcoming week.
* **Losses Due to Validator Fees**: The amount lost from validator commission rates.
* **Commission Income**: Relevant for validator wallets, shows how much was earned through commission fees.

<figure><img src="/files/N2WaFVmO6nn5k1dUnFN9" alt="" width="375"><figcaption></figcaption></figure>

✅ **Purpose**: Helps users evaluate validator performance, optimize delegation strategy, and understand expected passive income.

#### 💸 Wallet Notifications & Transactions

This section provides tools to monitor wallet activity and receive real-time alerts:

**Reports📨** – View reward reports based on the selected period.\
**Node Alerts🔔** – Get notifications about validator or node-related events.\
**Transactions💸** – Track incoming and outgoing transactions on your wallet.

After selecting **Last Transaction**, the bot displays key transaction details:

* **Wallet Address**: Shortened for privacy.
* **Received Amount**: Total TIA received and its estimated USD value.
* **Sender Address**: Shortened view of the transaction origin.
* **Tx Hash**: Clickable link to explore the full transaction on-chain.

<figure><img src="/files/iLC0aiuqCijCImpCRt1K" alt="" width="375"><figcaption></figcaption></figure>

✅ **Purpose**: Enables users to monitor wallet activity, verify received rewards or payments, and stay up to date without needing to check a block explorer manually.


# 🛸 AI Troubleshooting

This smart assistant is built to instantly help you troubleshoot and fix technical issues related to your Celestia node. Whether you're a validator, delegator, or node operator, the bot simplifies problem-solving by analyzing pasted errors in real time.

🔧 **What the bot can do:**

* Automatically analyzes technical errors and logs
* Provides step-by-step instructions for resolving issues
* Suggests terminal commands (e.g., for checking ports or stopping conflicting processes)
* Helps even without deep technical knowledge — just paste the error, and the bot will guide you

<figure><img src="/files/1ymiZGUlwukkSXIBsdrc" alt="" width="375"><figcaption></figcaption></figure>

📌 Perfect for validators, developers, and node operators who want to save time and quickly find solutions.


# 🧮 CelestiaBridge

Explore real-time performance, location, and technical status of Celestia nodes at:\
🔗 <https://celestiabridge.com/nodes>

<figure><img src="/files/9pm7QYMLHJKE7krfpgKr" alt=""><figcaption></figcaption></figure>

This platform provides in-depth analytics for each node, including uptime, version tracking, update history, latency, GC pause times, and geographical decentralization.

Below is our detailed scoring methodology used to assess and categorize nodes based on **Reliability**, **Decentralization**, and **Performance**.

### CelestiaBridge Node Scoring Methodology

#### 1. **Reliability** (up to 40 points)

* **Uptime (up to 15 points):**\
  – If uptime over the past 24h is ≥ 98% → 15 points\
  – 95–97.99% → 10 points\
  – 90–94.99% → 5 points
* **Version Match (up to 15 points):**\
  – If the node’s version matches the current version → 15 points\
  – Otherwise → 0 points
* **Updates 3/3 (up to 10 points):**\
  – If the node was updated within 24h for the last 3 upgrades → 10 points\
  – Otherwise → 0 points

***

#### 2. **Decentralization** (up to 40 points)

* **Country Uniqueness (up to 10 points):**\
  – If the country has only 1 such node → 10 points\
  – 2–3 nodes → 7 points\
  – 4–5 nodes → 4 points\
  – More than 5 → 0 points
* **Region Uniqueness (up to 10 points):**\
  – If the continent has 1–3 nodes → 10 points\
  – 4–7 nodes → 6 points\
  – 8–10 nodes → 3 points\
  – More than 10 → 0 points
* **City Uniqueness (up to 10 points):**\
  – If the city hosts only 1 node → 10 points\
  – 2 nodes → 7 points\
  – 3 nodes → 2 points\
  – More than 3 → 0 points
* **Provider Uniqueness (up to 10 points):**\
  – If the provider is **Hetzner** → always 0 points\
  – Otherwise:\
  • 1 node with the provider → 10 points\
  • 2–3 nodes → 7 points\
  • 4–5 nodes → 4 points\
  • More than 5 nodes → 0 points

***

#### 3. **Performance** (up to 20 points)

* **Latency (up to 10 points):**\
  – Average latency < 70 ms → 10 points\
  – < 100 ms → 4 points\
  – < 150 ms → 4 points\
  – ≥ 150 ms → 0 points
* **GC Pause (up to 10 points):**\
  – Average GC pause < 5 ms → 10 points\
  – < 10 ms → 7 points\
  – < 20 ms → 4 points\
  – ≥ 20 ms → 0 points

> **Important:** If the node is hosted on **Hetzner**, it automatically receives a grade of **E** and 0 points.

#### 🏅 Final Score Categories

* **A** — 85 points and above
* **B** — 70–84 points
* **C** — 55–69 points
* **D** — 30–54 points
* **E** — less than 30 points


# 🧠 VALIDEXIS AI Terminal

Explore in-depth analytics, telemetry insights, and intelligent data exchange across the Celestia modular ecosystem with the **AI Terminal by VALIDEXIS**.

🔗 **Learn more:** <https://celestiabridge.com/ai>

<figure><img src="/files/Grl81FikOak19kiq95Ez" alt=""><figcaption></figcaption></figure>

### Overview

AI Terminal by VALIDEXIS represents a new generation of analytical tools designed for the Celestia ecosystem.\
It unifies on-chain statistics, validator analytics, and OpenTelemetry (OTEL) bridge node metrics into a single, intelligent environment that allows users to explore network performance and health in depth.

Trained on real operational data from the Celestia network, the AI Terminal is capable of performing advanced analytical tasks, including:

1. Comprehensive evaluation of node performance, uptime stability, and synchronization efficiency.
2. Detection of anomalies and early identification of risks within validator or bridge behavior through continuous metric monitoring.
3. Analysis of staking activity, validator distribution, and overall decentralization trends across the network.
4. Aggregation and visualization of on-chain metrics in real time, offering an immediate overview of network dynamics and validator performance.

Beyond a simple conversational interface, the AI Terminal functions as a context-aware analytical engine. It interprets raw blockchain telemetry, explains underlying patterns, and even predicts potential operational issues before they escalate.

By integrating machine intelligence with Celestia’s open modular data, VALIDEXIS transforms technical information into clear, actionable insight — making interaction with blockchain infrastructure not only more efficient, but also more intuitive and predictive.

***

### MCP (Modular Communication Protocol)

**MCP (Modular Communication Protocol)** is the technological foundation behind the AI Terminal by VALIDEXIS.\
It enables flexible, secure, and intelligent data exchange between the modular components of the Celestia ecosystem — including nodes, analytics services, and user interfaces.

Unlike traditional REST or WebSocket APIs, MCP is designed for context-aware data routing and real-time modular interaction. Instead of simple request–response exchanges, it establishes a continuous, event-driven architecture where every component can dynamically respond to network and telemetry changes.

***

#### Core Characteristics of MCP

<table data-header-hidden><thead><tr><th width="273"></th><th></th></tr></thead><tbody><tr><td><strong>Characteristic</strong></td><td><strong>Description</strong></td></tr><tr><td><strong>Modularity and Extensibility</strong></td><td>MCP is built to support multiple independent modules — validators, bridge nodes, indexers, monitoring systems, and AI agents. Each module can be added, removed, or updated without interrupting the rest of the system.</td></tr><tr><td><strong>Real-Time Data Streaming</strong></td><td>The protocol maintains persistent connections to stream OTEL telemetry, validator statistics, and on-chain parameters in real time. This allows the AI Terminal to analyze and visualize data instantly as it changes across the network.</td></tr><tr><td><strong>Contextual Request Routing</strong></td><td>MCP intelligently routes queries based on context. Instead of sending all requests to a fixed endpoint, it dynamically directs them to the modules best suited to handle them — for example, the validator analytics module or the risk prediction engine.</td></tr><tr><td><strong>Security and Access Control</strong></td><td>Built-in authentication and data filtering ensure that sensitive validator metrics remain protected. MCP delivers only the necessary analytical data, maintaining both privacy and transparency.</td></tr><tr><td><strong>Machine Learning Integration</strong></td><td>MCP works seamlessly with the VALIDEXIS AI core, transmitting not only raw data but also enriched analytical signals — such as anomaly detections, statistical insights, and predictive outputs — that feed the AI Terminal’s intelligent analysis.</td></tr></tbody></table>

***

### The Role of MCP in VALIDEXIS Infrastructure

MCP acts as the communication backbone between low-level systems (Celestia nodes, OTEL agents, data storage layers) and high-level analytical layers (AI Terminal and visualization modules).\
This architecture allows VALIDEXIS to:

* Scale data processing independently of the core Celestia nodes.
* Aggregate multiple data sources into a unified analytical framework.
* Deliver low-latency, context-aware responses to user queries.
* Integrate new types of data or analytical modules without system reconfiguration.

In essence, MCP transforms the AI Terminal from a simple analytical interface into a living communication network within Celestia’s modular ecosystem — where every component, from node to AI engine, is interconnected through an intelligent data flow.

***

### ⚡ AI Assistant (MCP)

The AI Assistant (MCP) serves as the operational interface layer of the VALIDEXIS AI ecosystem — connecting the MCP architecture and AI Terminal analytics engine into an intelligent, interactive environment.

***

#### How to Run the Assistant (MCP/Web Chat)

**1. Start the local API (on port 8002)**

```bash
uvicorn api_main:app --reload --port 8002
```

**2. Start the MCP server (assistant) on port 8003**

```bash
uvicorn celestia_mcp.web_chat_api:app --reload --port 8003
```

The MCP server will be available at:\
👉 <http://127.0.0.1:8003>\
Web chat interface: <http://127.0.0.1:8003>

***

#### Capabilities

* Accepts natural language queries in any language (automatic detection).
* Supports analytical queries: filtering, sorting, aggregation, top-N, unique values, sum, min/max, count.
* Works with both local API and Cosmos REST API, automatically selecting the right endpoint.
* Handles large paginated data and aggregates across pages.
* Responds in the user’s language, formats answers as paragraphs/lists, and never hallucinates data.
* Supports query chaining and complex analytical workflows.
* Performs Bridge Decentralization Analysis, understanding metrics and provider distributions.

***

#### &#x20;How to Add New Endpoints/Queries

**For Cosmos REST API:**

1. Add a new function to `services/cosmos_api.py` or to FastAPI (`api_main.py`).
2. If the endpoint returns paginated data, add `is_pagination = True`.
3. Describe parameters and response structure in the English docstring.

**For Local API:**

* Add the endpoint to FastAPI with a detailed English docstring.
* The assistant automatically discovers new endpoints via the registry mechanism.

***

#### Assistant Workflow Diagram

<figure><img src="/files/pXfaYY53H31E1dawA7LE" alt=""><figcaption></figcaption></figure>

***

#### &#x20;Example: Complex Query

> “Show the top 5 delegators for validator X with a balance greater than 1,000,000 TIA”

1. The LLM generates a plan: selects the endpoint, adds filters, and parameter substitution.
2. The APIExecutor executes the sequence, chaining results between queries.
3. The response is formatted in the user’s language for clarity.

***

#### &#x20;Example: Bridge Decentralization Analysis

> “Analyze bridge decentralization and identify concentration risks”

* The LLM analyzes decentralization metrics from the nodes endpoint.
* Identifies nodes with `provider_hetzner=true` and recommends provider diversification.
* Flags `*_over_limit=true` fields indicating centralization issues.
* Provides actionable recommendations for decentralization improvement.

***

#### 🔗 Next Steps

* Explore VALIDEXIS AI Core integrations and custom analytics pipelines.
* Connect AI Assistant (MCP) to external Celestia observability dashboards.
* Learn more at [celestiabridge.com/ai](https://celestiabridge.com/ai)


# 💬 Example Analytical Queries

Explore real examples of natural language questions that the VALIDEXIS AI Assistant (MCP) can analyze and respond to.\
The assistant supports multilingual queries, performs real-time analytics, and retrieves on-chain and telemetry data from the Celestia network.

***

#### 🌐 Network & Decentralization

* Evaluate the level of decentralization of bridge `12D3KooWAp7s1K9Yha2KQm4cM6H8D4xEqt9Bn3rpc56DZne8kPa`
* Evaluate the overall decentralization level of the Celestia network
* How many bridges have good decentralization?
* How many bridges have poor decentralization?
* Evaluate decentralization in Europe
* Evaluate decentralization in Asia
* Evaluate decentralization in North America
* How many bridges are located in Europe?
* How many bridges are located in Asia?
* How many bridges are located in North America?

***

#### 🌉 Bridge Analytics

* Which metric most often shows bridge performance problems?
* Name the most problematic metric for bridge `12D3KooWA8zq7P5nWu2Fm9LqHrU6G7tEqt3An8rpc56DZne4pQv`
* What is the synchronization level of bridge `12D3KooWA5n8Qy6jRc9Kp3VdFg7T1xEqt8An8rpc56DZne2mRa`
* List the latest anomalies detected for bridge `12D3KooWAm9f1Pz6yT5Dh8RcKq3N4bEqt9An8rpc56DZne6sTx`
* How many bridges have a synchronization level of 100%?
* How many bridges have less than 100% synchronization?
* How many active bridges are currently in operation?

***

#### 👥 Validator Analytics

* How many delegators exist in the Celestia network?
* Who is the largest delegator?
* List validators with the lowest uptime
* Which validator has the highest and lowest number of delegators?
* How many active validators are there?
* What is the current block height of the network?
* How many transactions are included in the latest block?
* How many validators have uptime below 100%?
* Give information about validator `VALIDEXIS`
* Give information about validator `celestiavaloper1tq8d2x7r6zk9h4y9jpa8e7qz7nrkv2u4cqj2fw`
* How many missed blocks exist across the network?
* Which validator has the most and least missed blocks?
* What are the top 15 validators by stake size?
* What are the top 10 validators by number of delegators?
* Which validator has the fewest delegators?
* What are the main reasons for validators missing blocks?
* How is validator uptime calculated?

***

#### 💰 Staking & Delegation

* How many delegators are there in the network?
* Who is the largest delegator?
* How many wallets have a balance greater than 1,000,000 TIA?
* How many wallets have a balance less than 1,000,000 TIA?
* List all wallets with a balance greater than 1,000,000 TIA
* Name the wallet with the largest delegation size
* Show the top 10 wallets with the highest balance
* Show the top 10 wallets with the largest delegation size
* Which validator received the largest single delegation?
* Provide the balance of wallet `celestia1fj7t9u3v4sq9y2x5lzk7n5qj2zhsr9a8y7rj5m`
* Provide the total amount of staked TIA

***

#### 🔍 Blockchain Information

* List all latest mainnet releases
* What is the current active network update?
* How many validators have uptime below 100%?
* Describe the Celestia blockchain in detail
* How many bridges are located on each continent?
* What metrics are shown in the OTEL file?
* Which metric is the key for bridge performance?

***

#### 📈 Market & Dynamics

* What is the current TIA price?
* What was the change in TIA price over the last 7 days?
* What is the trend in TIA price (up or down)?
* How did the number of delegators change over the last 7 days?

***

#### 🧩 Example Query Execution

* "Show the top 5 delegators for validator `celestiavaloper1q9x8w2r7lzp5y8s3tjh0p5u6vfjgq0s2xwj3sn` with a balance greater than 1,000,000 TIA"
* "Analyze bridge decentralization and identify concentration risks"
* "Provide actionable recommendations for improving bridge decentralization"


# Celestia

Celestia is building a modular consensus and data network, allowing anyone to deploy their own blockchain with ease. Its architecture aims to accelerate Web3 innovation in the next decade.

[**WebSite**](https://celestia.org/)

[**GitHub**](https://github.com/celestiaorg)

[**Twitter**](https://x.com/celestia)


# 🗂️  API/RPC/gRPC/AddrBook

## *API, RPC, gRPC* <a href="#rpc" id="rpc"></a>

API: <https://api-celestia-mainnet.validexis.com/>

RPC: <https://rpc-celestia-mainnet.validexis.com/>

gRPC:

```html
grpc-celestia-mainnet.validexis.com:443
```

## *Peers, Seeds, Live Peers*

***Peer:***

<pre class="language-bash"><code class="lang-bash"><strong>a48c5bb03ff416f6cb0245e0aa42523cc6c9f430@peer-celestia-mainnet.validexis.com:26656
</strong></code></pre>

***Seed:***

```bash
0074b06d366fe8e1d6a2a53b6752bd55e33267f6@seed-celestia-mainnet.validexis.com:37656
```

***Live peer (20 active):***

```bash
PEERS="d2faee0c04be9a813223db1491c05843eaf4db9f@162.249.168.149:26656,6f7ac7b93950aa548d2eeac482d4262659cacd24@176.9.124.52:11656,0c8ec01f1c37734274e7ac2f91021a55194bb0bb@65.109.26.242:11656,8449c9c28976ce556a47cfeee075f92f482818bb@65.109.116.50:11656,b35ff7f853eb424f5e8d2eb53540564913490f4b@195.201.106.166:11656,862dbd738c850a8d46374c965639c626f293e1a2@3.36.39.77:26656,b519fc0c69726b43de28b82f998c8db7faf9741d@5.9.89.67:15670,453f91c346b9a9a89506f6d0452a46fdd2e8069d@65.108.229.11:26656,c4a985404298c96e9eb3c87185268854e5bd51c2@43.202.190.82:26656,dd533d82b1207e4e3cf648fbb6fc18448dd098f3@124.243.184.78:26656,90e6e5d0a602857841886332e179a699582234d3@185.100.10.34:26656,71fa05f1ff6031224c4c175e03a3a9f5ed560158@38.58.176.180:26656,6c409d1dc48b108b60227b6897adc7c6bbaa893d@43.202.25.67:26656,45c8627df8b9767365cf6a52ab6ad46c933df0ee@64.31.14.2:26656,a7ca111a7a4951caaeb595c41b049bc8300202b1@67.209.54.198:26656,e8e212f82dec998f4c5a5f8a828a1ab3bf30de39@169.155.171.105:26656,edc6bc6ee3c37a698225e17bd4b8c687ee05f977@138.201.63.42:26756,284313184f63d9f06b218a67a0e2de126b64258d@136.60.129.34:15048,4f85259b8743dd464612724fc30ee303d22eb43e@116.202.220.238:29659,6a1e1fd9f5a2ee93c86a8657ab329f11648b91dc@65.109.93.17:11633"
sed -i -e "/^[p2p]/,/^[/{s/^[[:space:]]*persistent_peers *=.*/persistent_peers = \"$PEERS\"/}" $HOME/.celestia-app/config/config.toml
```

## *AddrBook (upd 1h)*

```bash
wget -O $HOME/.celestia-app/config/addrbook.json https://mainnets1.validexis.com/celestia/addrbook.json
```

## *Genesis* <a href="#genesis" id="genesis"></a>

```bash
wget -O $HOME/.celestia-app/config/genesis.json https://mainnets1.validexis.com/celestia/genesis.json
```


# 📥 State Syns

State Sync allows you not to synchronize the entire blockchain database and quickly synchronize the node.

#### *Stop the service and reset the data* <a href="#stop-the-service-and-reset-the-data" id="stop-the-service-and-reset-the-data"></a>

```bash
sudo systemctl stop celestia-appd
cp $HOME/.celestia-app/data/priv_validator_state.json $HOME/.celestia-app/priv_validator_state.json.backup
celestia-appd tendermint unsafe-reset-all --home $HOME/.celestia-app
```

#### *Get height and hash*

```bash
SNAP_RPC=https://celestia-mainnet-rpc.validexis.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
```

#### *Download addrbook*

```bash
wget -O $HOME/.celestia-app/config/addrbook.json https://mainnets1.validexis.com/celestia/addrbook.json
```

#### *Adding the variables to config.tom*l

```bash
sed -E -i.bak \
  -e "s|^(enable[[:space:]]*=[[:space:]]*).*$|\1true|" \
  -e "s|^(rpc_servers[[:space:]]*=[[:space:]]*).*$|\1\"$SNAP_RPC,$SNAP_RPC\"|" \
  -e "s|^(trust_height[[:space:]]*=[[:space:]]*).*$|\1$BLOCK_HEIGHT|" \
  -e "s|^(trust_hash[[:space:]]*=[[:space:]]*).*$|\1\"$TRUST_HASH\"|" \
  -e "s|^(seeds[[:space:]]*=[[:space:]]*).*$|\1\"\"|" \
  $HOME/.celestia-app/config/config.toml

mv $HOME/.celestia-app/priv_validator_state.json.backup $HOME/.celestia-app/data/priv_validator_state.json
```

#### Restart the service and check the log <a href="#restart-the-service-and-check-the-log" id="restart-the-service-and-check-the-log"></a>

```bash
sudo systemctl start celestia-appd && sudo journalctl -u celestia-appd -f --no-hostname -o cat
```


# 📸  Snapshot

## *Snapshot Consensus Node (pruned)* <a href="#snap" id="snap"></a>

* updated every 4h

***Download and unpack snapshot***

```bash
sudo systemctl stop celestia-appd

cp $HOME/.celestia-app/data/priv_validator_state.json $HOME/.celestia-app/priv_validator_state.json.backup

rm -rf $HOME/.celestia-app/data
curl -L https://snapshots1.validexis.com/celestia-mainnet/snap_celestia-prun.tar.lz4 | tar -Ilz4 -xf - -C $HOME/.celestia-app/

mv $HOME/.celestia-app/priv_validator_state.json.backup $HOME/.celestia-app/data/priv_validator_state.json

sudo systemctl restart celestia-appd && sudo journalctl -u celestia-appd -f
```

## *Snapshot Consensus Full Node* <a href="#snapshot-archive" id="snapshot-archive"></a>

{% hint style="info" %} <mark style="color:blue;">It's recommended to use Tmux or Screen for downloads, as the process may take several hours, ensuring that the session remains active even if the connection is interrupted.</mark>
{% endhint %}

* **Height**: 8 538 199
* **Generated**: 2025-11-16T16:27:28Z
* **Size**: 5.5 TB
* **Indexer:** kv

***Download and unpack snapshot***

```bash
sudo systemctl stop celestia-appd

cp $HOME/.celestia-app/data/priv_validator_state.json $HOME/.celestia-app/priv_validator_state.json.backup

rm -rf $HOME/.celestia-app/data
curl -L https://snapshots1.validexis.com/celestia-mainnet/snap_celestia-archive_8538199.tar.lz4 | tar -Ilz4 -xf - -C $HOME/.celestia-app/

mv $HOME/.celestia-app/priv_validator_state.json.backup $HOME/.celestia-app/data/priv_validator_state.json

sudo systemctl restart celestia-appd && sudo journalctl -u celestia-appd -f
```


# 🔗  Validator Node Installation

Chain ID: celestia | Latest Version Tag: v6.4.10

Recommended Hardware:

<table><thead><tr><th>Node Type</th><th width="184">CPU</th><th>RAM</th><th>Storage</th></tr></thead><tbody><tr><td>Mainnet</td><td>6</td><td>8GB</td><td>500GB </td></tr></tbody></table>

&#x20;***Install dependencies***

<pre class="language-bash"><code class="lang-bash"># Update the repositories
<strong>sudo apt update &#x26;&#x26; sudo apt upgrade -y
</strong></code></pre>

```bash
# Install developer packages
sudo apt install curl git wget htop tmux build-essential jq make lz4 gcc unzip -y
```

```bash
# Install Go
sudo rm -rf /usr/local/go
curl -Ls https://go.dev/dl/go1.24.6.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)
echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bash_profile
source $HOME/.bash_profile
go version
```

## ***Automatic Installation***

```bash
source <(curl -s https://raw.githubusercontent.com/validexisinfra/Celestia/main/setup_validator_mainnet.sh)
```

## ***Manual Installation***

```bash
# Come up with the name of your node and replace it instead <your_moniker>
MONIKER=<your_moniker>
```

```bash
# Download binary files
cd $HOME 
rm -rf celestia-app 
git clone https://github.com/celestiaorg/celestia-app.git 
cd celestia-app 
git checkout v6.4.10

make install
```

```bash
# Config and initialize the node
celestia-appd config set client chain-id celestia
celestia-appd config set client keyring-backend file
celestia-appd config set client node tcp://localhost:26657

celestia-appd init $MONIKER --chain-id celestia
```

```bash
# Download genesis and addrbook
wget -O $HOME/.celestia-app/config/genesis.json https://mainnets1.validexis.com/celestia/genesis.json
wget -O $HOME/.celestia-app/config/addrbook.json https://mainnets1.validexis.com/celestia/addrbook.json
```

***Setup config***

<pre class="language-bash"><code class="lang-bash"># Set seeds and peers
<strong>SEEDS="0074b06d366fe8e1d6a2a53b6752bd55e33267f6@seed-celestia-mainnet.validexis.com:37656"
</strong>PEERS="a48c5bb03ff416f6cb0245e0aa42523cc6c9f430@peer-celestia-mainnet.validexis.com:26656,a8ddad6896dddccc42534f24afc6d14bbf278f33@65.109.18.169:11656,b5622df798ab39de650fa2e7c79190a0d3e814e0@137.184.44.109:26656,e263dbf2fbd4734a364dac1236bb8cbd83a0c012@157.90.33.62:28656,d0c4affc656bad26d7a46e4b946c0be71baa4a1f@46.4.51.104:11656,a5f01c0afea36df559b8d92e55626c0b5275dfd0@103.219.169.97:43656,74fc653041a6ca07e3432f6f12e8753e1e4dfe21@38.121.43.84:26656,6ee545c2992a8201ce2ed68d73776695627595db@168.119.37.164:12056,ce99d7da2530f75d05880d13d9eda384d5a1afe4@65.109.34.34:23356,2ae2d3d0b97c4fcd134decb202ac241cd2f44735@37.252.186.118:2000,e6d602f66559ee2a7280a46efbc5f87efe567bcb@139.84.143.106:10456,2fdf0e8288e18f39815a750857414325a07e5fca@218.153.200.72:11002,44336a5aaae84446a31bc6fe22246d8a11af3c90@65.109.19.111:40656,9d4afca92c2d6e681d3605ae25cb1817620a9604@35.195.100.59:26656,c33e89275c461a3871253025a1f5dcde9f8856a2@136.243.67.47:11656,a71a4c58dce5b2268e3c7f229608772327110ee5@65.109.54.91:11056,9cd7540cd22f9a9442af23b5d83c2a69ea4b24c2@62.210.122.96:26656"
sed -i -e "/^\[p2p\]/,/^\[/{s/^[[:space:]]*seeds *=.*/seeds = \"$SEEDS\"/}" \
       -e "/^\[p2p\]/,/^\[/{s/^[[:space:]]*persistent_peers *=.*/persistent_peers = \"$PEERS\"/}" $HOME/.celestia-app/config/config.toml
       
# Set commit timeout
sed -i -e "s|^target_height_duration *=.*|timeout_commit = \"11s\"|" $HOME/.celestia-app/config/config.toml

# Set minimum gas price
sed -i -e "s|^minimum-gas-prices *=.*|minimum-gas-prices = \"0.002utia\"|" $HOME/.celestia-app/config/app.toml

# Set pruning
sed -i -e "s/^pruning *=.*/pruning = \"custom\"/" $HOME/.celestia-app/config/app.toml 
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"100\"/" $HOME/.celestia-app/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"19\"/" $HOME/.celestia-app/config/app.toml

# Enable bbr
sudo modprobe tcp_bbr
echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
</code></pre>

```bash
# Create service file
sudo tee /etc/systemd/system/celestia-appd.service > /dev/null <<EOF
[Unit]
Description=Celestia node
After=network-online.target

[Service]
User=$USER
WorkingDirectory=$HOME/.celestia-app
ExecStart=$(which celestia-appd) start --home $HOME/.celestia-app
Restart=on-failure
RestartSec=5
LimitNOFILE=65535

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

```bash
# Download latest chain snapshot
curl -L https://snapshots1.validexis.com/celestia-mainnet/snap_celestia-prun.tar.lz4 | tar -Ilz4 -xf - -C $HOME/.celestia-app/
```

```bash
# Enable and start service
sudo systemctl daemon-reload
sudo systemctl enable celestia-appd
sudo systemctl start celestia-appd && sudo journalctl -u celestia-appd -f
```

```bash
# Check status
celestia-appd status 2>&1 | jq .SyncInfo

#"catching_up": false means that the node is synchronized, we are waiting for complete synchronization
```

***Wallets***

```bash
# Create wallet
celestia-appd keys add wallet
```

The wallet has been created. In the last line there will be a phrase that must be written down

```bash
# If the wallet was already there, restore it
celestia-appd add wallet --recover

# Insert the seed phrase from your wallet
# If everything is correct, you will see your wallet data
```

***Validator***

Do not forget to create a profile on <https://keybase.io/> and set a profile photo there that will be imported by key and used for your validators.

```bash
celestia-appd tx staking create-validator \
--amount 1000000utia \
--pubkey $(celestia-appd tendermint show-validator) \
--moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id celestia \
--commission-rate 0.05 \
--commission-max-rate 0.20 \
--commission-max-change-rate 0.05 \
--min-self-delegation 1 \
--from wallet \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0.005utia \
-y
```

**!!! Save priv\_validator\_key.json which is located in /root/.celestia-app/config**


# 🛠️  Upgrade

***Automatic upgrade***

```bash
source <(curl -s https://raw.githubusercontent.com/validexisinfra/Celestia/main/upgrade_mainnet_app.sh)
```

***Manual upgrade***

```bash
cd $HOME
rm -rf celestia-app
git clone https://github.com/celestiaorg/celestia-app
cd celestia-app
git checkout v6.4.10
make install

sudo systemctl restart celestia-appd && sudo journalctl -fu celestia-appd -o cat
```


# 📜  Useful Commands

***Get validator info***

```bash
celestia-appd status 2>&1 | jq .ValidatorInfo
```

***Get sync info***

```bash
celestia-appd status 2>&1 | jq
```

### *Key management* <a href="#key-management" id="key-management"></a>

***Add new key***

```bash
celestia-appd keys add wallet
```

***Recover existing key***

<pre class="language-bash"><code class="lang-bash"><strong>celestia-appd keys add wallet --recover
</strong></code></pre>

***List all keys***

```bash
celestia-appd keys list
```

***Delete key***

```bash
celestia-appd keys delete wallet
```

***Query wallet balance***

```bash
celestia-appd q bank balances $(celestia-appd keys show wallet -a)
```

### *Validator management* <a href="#validator-management" id="validator-management"></a>

Please make sure you have adjusted **moniker**, **identity**, **details** and **website** to match your values.

***Create new validator***

```bash
celestia-appd tx staking create-validator \
--amount 1000000utia \
--pubkey $(celestia-appd tendermint show-validator) \
--moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id celestia \
--commission-rate 0.05 \
--commission-max-rate 0.20 \
--commission-max-change-rate 0.05 \
--min-self-delegation 1 \
--from wallet \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0.005utia \
-y
```

***Edit existing validator***

```bash
celestia-appd tx staking edit-validator \
--new-moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id celestia \
--commission-rate 0.05 \
--from wallet \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0.005utia \
-y
```

***Validator Details***

```bash
celestia-appd q staking validator $(celestia-appd keys show wallet --bech val -a) 
```

***Jailing info***

```bash
celestia-appd q slashing signing-info $(celestia-appd tendermint show-validator) 
```

***Slashing parameters***

```bash
celestia-appd q slashing params 
```

***Unjail validator***

```bash
celestia-appd tx slashing unjail --from wallet --chain-id celestia --gas-adjustment 1.4 --gas auto --gas-prices 0.002utia -y
```

### *Token management* <a href="#token-management" id="token-management"></a>

***Withdraw rewards from all validators***

```bash
celestia-appd tx distribution withdraw-all-rewards --from wallet --chain-id celestia --gas-adjustment 1.4 --gas auto --gas-prices 0.002utia -y
```

***Withdraw commission and rewards from your validator***

```bash
celestia-appd tx distribution withdraw-rewards $(celestia-appd keys show wallet --bech val -a) --commission --from wallet --chain-id celestia --gas-adjustment 1.4 --gas auto --gas-prices 0.002utia -y
```

***Delegate tokens to yourself***

```bash
celestia-appd tx staking delegate $(celestia-appd keys show wallet --bech val -a) 1000000utia --from wallet --chain-id celestia --gas-adjustment 1.4 --gas auto --gas-prices 0.002utia -y
```

***Delegate tokens to validator***

```bash
celestia-appd tx staking delegate <TO_VALOPER_ADDRESS> 1000000utia --from wallet --chain-id celestia --gas-adjustment 1.4 --gas auto --gas-prices 0.002utia -y
```

***Redelegate tokens to another validator***

```bash
celestia-appd tx staking redelegate $(celestia-appd keys show wallet --bech val -a) <TO_VALOPER_ADDRESS> 1000000utia --from wallet --chain-id celestia --gas-adjustment 1.4 --gas auto --gas-prices 0.002utia -y
```

***Unbond tokens from your validator***

```bash
celestia-appd tx staking unbond $(celestia-appd keys show wallet --bech val -a) 1000000utia --from wallet --chain-id celestia --gas-adjustment 1.4 --gas auto --gas-prices 0.002utia -y
```

***Send tokens to the wallet***

```bash
celestia-appd tx bank send wallet <TO_WALLET_ADDRESS> 1000000utia --from wallet --chain-id celestia --gas-adjustment 1.4 --gas auto --gas-prices 0.002utia -y
```

***Remove node***

Please, before proceeding with the next step! All chain data will be lost! Make sure you have backed up your **priv\_validator\_key.json**!

```bash
sudo systemctl stop celestia-appd
sudo systemctl disable celestia-appd
sudo rm -rf /etc/systemd/system/celestia-appd.service
sudo rm $(which celestia-appd)
sudo rm -rf $HOME/.celestia-app
sudo rm -rf $HOME/celestia-app
```

### *Service Management* <a href="#service-management" id="service-management"></a>

***Reload service configuration***

```bash
sudo systemctl daemon-reload
```

***Enable service***

```bash
sudo systemctl enable celestia-appd
```

***Disable service***

```bash
sudo systemctl disable celestia-appd
```

***Start service***

```bash
sudo systemctl start celestia-appd
```

***Stop service***

```bash
sudo systemctl stop celestia-appd
```

***Restart service***

```bash
sudo systemctl restart celestia-appd
```

***Check service status***

```bash
sudo systemctl status celestia-appd
```

***Check service logs***

```bash
sudo journalctl -u celestia-appd -f --no-hostname -o cat
```


# 💾  Full Node Installation

Chain ID: celestia | Latest Version Tag: v6.4.10

Recommended Hardware:

<table><thead><tr><th>Node Type</th><th width="184">CPU</th><th>RAM</th><th>Storage</th></tr></thead><tbody><tr><td>Mainnet</td><td>6</td><td>16GB</td><td>10TB </td></tr></tbody></table>

&#x20;***Install dependencies***

<pre class="language-bash"><code class="lang-bash"># Update the repositories
<strong>sudo apt update &#x26;&#x26; apt upgrade -y
</strong></code></pre>

```bash
# Install developer packages
sudo apt install curl git wget htop tmux build-essential jq make lz4 gcc unzip -y
```

```bash
# Install Go
sudo rm -rf /usr/local/go
curl -Ls https://go.dev/dl/go1.24.6.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)
echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bash_profile
source $HOME/.bash_profile
go version
```

## ***Automatic Installation***

```bash
source <(curl -s https://raw.githubusercontent.com/validexisinfra/Celestia/main/setup_archiv_mainnet.sh)
```

## ***Manual Installation***

```bash
# Come up with the name of your node and replace it instead <your_moniker>
MONIKER=<your_moniker>
```

```bash
# Download binary files
cd $HOME 
rm -rf celestia-app 
git clone https://github.com/celestiaorg/celestia-app.git 
cd celestia-app 
git checkout v6.4.10

make install
```

```bash
# Config and initialize the node
celestia-appd config set client chain-id celestia
celestia-appd config set client keyring-backend file
celestia-appd config set client node tcp://localhost:26657

celestia-appd init $MONIKER --chain-id celestia
```

```bash
# Download genesis and addrbook
wget -O $HOME/.celestia-app/config/genesis.json https://mainnets1.validexis.com/celestia/genesis.json
wget -O $HOME/.celestia-app/config/addrbook.json https://mainnets1.validexis.com/celestia/addrbook.json
```

***Setup config***

```bash
# Set seeds and peers
SEEDS="0074b06d366fe8e1d6a2a53b6752bd55e33267f6@seed-celestia-mainnet.validexis.com:37656"
PEERS="60d481edb7e49efe01fa0b49a346cf9f8400db19@peer-celestia-mainnet.validexis.com:26656,a8ddad6896dddccc42534f24afc6d14bbf278f33@65.109.18.169:11656,b5622df798ab39de650fa2e7c79190a0d3e814e0@137.184.44.109:26656,e263dbf2fbd4734a364dac1236bb8cbd83a0c012@157.90.33.62:28656,d0c4affc656bad26d7a46e4b946c0be71baa4a1f@46.4.51.104:11656,a5f01c0afea36df559b8d92e55626c0b5275dfd0@103.219.169.97:43656,74fc653041a6ca07e3432f6f12e8753e1e4dfe21@38.121.43.84:26656,6ee545c2992a8201ce2ed68d73776695627595db@168.119.37.164:12056,ce99d7da2530f75d05880d13d9eda384d5a1afe4@65.109.34.34:23356,2ae2d3d0b97c4fcd134decb202ac241cd2f44735@37.252.186.118:2000,e6d602f66559ee2a7280a46efbc5f87efe567bcb@139.84.143.106:10456,2fdf0e8288e18f39815a750857414325a07e5fca@218.153.200.72:11002,44336a5aaae84446a31bc6fe22246d8a11af3c90@65.109.19.111:40656,9d4afca92c2d6e681d3605ae25cb1817620a9604@35.195.100.59:26656,c33e89275c461a3871253025a1f5dcde9f8856a2@136.243.67.47:11656,a71a4c58dce5b2268e3c7f229608772327110ee5@65.109.54.91:11056,9cd7540cd22f9a9442af23b5d83c2a69ea4b24c2@62.210.122.96:26656"
sed -i -e "/^\[p2p\]/,/^\[/{s/^[[:space:]]*seeds *=.*/seeds = \"$SEEDS\"/}" \
       -e "/^\[p2p\]/,/^\[/{s/^[[:space:]]*persistent_peers *=.*/persistent_peers = \"$PEERS\"/}" $HOME/.celestia-app/config/config.toml
       
# Set commit timeout
sed -i -e "s|^target_height_duration *=.*|timeout_commit = \"11s\"|" $HOME/.celestia-app/config/config.toml

# Set minimum gas price and disable indexing
sed -i -e "s|^minimum-gas-prices *=.*|minimum-gas-prices = \"0.002utia\"|" $HOME/.celestia-app/config/app.toml
sed -i -e "s/^indexer *=.*/indexer = \"kv\"/" $HOME/.celestia-app/config/config.toml

# Set pruning
sed -i \
  -e 's|^pruning *=.*|pruning = "nothing"|' \
  $HOME/.celestia-app/config/app.toml

# Enable bbr
sudo modprobe tcp_bbr
echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
```

```bash
# Create service file
sudo tee /etc/systemd/system/celestia-appd.service > /dev/null <<EOF
[Unit]
Description=Celestia node
After=network-online.target

[Service]
User=$USER
WorkingDirectory=$HOME/.celestia-app
ExecStart=$(which celestia-appd) start --home $HOME/.celestia-app
Restart=on-failure
RestartSec=5
LimitNOFILE=65535

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

```bash
# Download latest chain snapshot
curl -L https://snapshots1.validexis.com/celestia-mainnet/snap_celestia-archive_8538199.tar.lz4 | tar -Ilz4 -xf - -C $HOME/.celestia-app/
```

```bash
# Enable and start service
sudo systemctl daemon-reload
sudo systemctl enable celestia-appd
sudo systemctl start celestia-appd && sudo journalctl -u celestia-appd -f
```

```bash
# Check status
celestia-appd status 2>&1 | jq .SyncInfo

#"catching_up": false means that the node is synchronized, we are waiting for complete synchronization
```


# 🛠️  Upgrade

***Automatic upgrade***

```bash
source <(curl -s https://raw.githubusercontent.com/validexisinfra/Celestia/main/upgrade_mainnet_app.sh)
```

***Manual upgrade***

```bash
cd $HOME
rm -rf celestia-app
git clone https://github.com/celestiaorg/celestia-app
cd celestia-app
git checkout v6.4.10
make install

sudo systemctl restart celestia-appd && sudo journalctl -fu celestia-appd -o cat
```


# 📜  Useful Commands

***Get sync info***

```bash
celestia-appd status 2>&1 | jq
```

### *Service Management* <a href="#service-management" id="service-management"></a>

***Reload service configuration***

```bash
sudo systemctl daemon-reload
```

***Enable service***

```bash
sudo systemctl enable celestia-appd
```

***Disable service***

```bash
sudo systemctl disable celestia-appd
```

***Start service***

```bash
sudo systemctl start celestia-appd
```

***Stop service***

```bash
sudo systemctl stop celestia-appd
```

***Restart service***

```bash
sudo systemctl restart celestia-appd
```

***Check service status***

```bash
sudo systemctl status celestia-appd
```

***Check service logs***

```bash
sudo journalctl -u celestia-appd -f --no-hostname -o cat
```


# 🌉  Bridge Node Installation

Chain ID: celestia | Latest Version Tag: v0.28.4

Recommended Hardware:

<table><thead><tr><th>Node Type</th><th width="184">CPU</th><th>RAM</th><th>Storage</th></tr></thead><tbody><tr><td>Mainnet</td><td>6</td><td>16GB</td><td>10TB </td></tr></tbody></table>

&#x20;***Install dependencies***

<pre class="language-bash"><code class="lang-bash"># Update the repositories
<strong>sudo apt update &#x26;&#x26; sudo apt upgrade -y
</strong></code></pre>

```bash
# Install developer packages
sudo apt install curl git wget htop tmux build-essential jq make lz4 gcc unzip -y
```

```bash
# Install Go
sudo rm -rf /usr/local/go
curl -Ls https://go.dev/dl/go1.24.6.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)
echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bash_profile
source $HOME/.bash_profile
go version
```

## ***Automatic Installation***

```bash
source <(curl -s https://raw.githubusercontent.com/validexisinfra/Celestia/main/setup_bridge_mainnet.sh)
```

## ***Manual Installation***

```bash
# Download binary files
cd $HOME
rm -rf celestia-node
git clone https://github.com/celestiaorg/celestia-node.git
cd celestia-node/
git checkout tags/v0.28.4 
make build 
sudo make install 
make cel-key
```

```bash
# Initiaton
celestia bridge init --core.ip <RPC_NODE_IP>
```

Once you start the Bridge Node, a wallet key will be generated for you. You will need to fund that address with Mainnet tokens to pay for PayForBlob transactions. You can find the address by running the following command:

```bash
cd $HOME/celestia-node
./cel-key list --node.type bridge --keyring-backend test
```

```bash
# Create service file
sudo tee /etc/systemd/system/celestia-bridge.service > /dev/null <<EOF
[Unit]
Description=celestia Bridge
After=network-online.target

[Service]
User=$USER
ExecStart=$(which celestia) bridge start --archival \
--metrics.tls=true --metrics --metrics.endpoint otel.celestia.observer
Restart=on-failure
RestartSec=3
LimitNOFILE=65535

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

```bash
# Enable and start service
sudo systemctl daemon-reload
sudo systemctl enable celestia-bridge
sudo systemctl restart celestia-bridge && sudo journalctl -u celestia-bridge -f
```


# 🛠️  Upgrade

***Automatic upgrade***

```bash
source <(curl -s https://raw.githubusercontent.com/validexisinfra/Celestia/main/upgrade_mainnet_node.sh)
```

***Manual upgrade***

```bash
sudo systemctl stop celestia-bridge
```

<pre class="language-bash"><code class="lang-bash">cd $HOME
rm -rf celestia-node
git clone https://github.com/celestiaorg/celestia-node.git
cd celestia-node
git checkout tags/v0.28.4 
make build 
sudo make install 
make cel-key

celestia bridge config-update

<strong>sudo systemctl restart celestia-bridge &#x26;&#x26; sudo journalctl -u celestia-bridge -f
</strong></code></pre>


# 📜  Useful Commands

***Check bridge wallet balance***

```bash
celestia state balance --node.store ~/.celestia-bridge/
```

***Get wallet address***

```bash
cd $HOME/celestia-node
./cel-key list --node.type bridge --keyring-backend test
```

***Restore an existing cel\_key***

```bash
KEY_NAME="my_celes_key"
cd ~/celestia-node
./cel-key add $KEY_NAME --keyring-backend test --node.type bridge  --recover
```

***Check bridge node status***

```bash
celestia header sync-state --node.store ~/.celestia-bridge/
```

***Get Node ID***

```bash
celestia p2p info --node.store ~/.celestia-bridge/
```

### *Delete bridge node* <a href="#delete" id="delete"></a>

```bash
sudo systemctl stop celestia-bridge
sudo systemctl disable celestia-bridge
sudo rm /etc/systemd/system/celestia-bridge*
rm -rf $HOME/celestia-node $HOME/.celestia-bridge
```


# 💡  Light Node Installation

Chain ID: celestia | Latest Version Tag: v0.28.4

Recommended Hardware:

<table><thead><tr><th>Node Type</th><th width="184">CPU</th><th>RAM</th><th>Storage</th></tr></thead><tbody><tr><td>Mainnet</td><td>2</td><td>2GB</td><td>100GB </td></tr></tbody></table>

&#x20;***Install dependencies***

<pre class="language-bash"><code class="lang-bash"># Update the repositories
<strong>sudo apt update &#x26;&#x26; apt upgrade -y
</strong></code></pre>

```bash
# Install developer packages
sudo apt install curl git wget htop tmux build-essential jq make lz4 gcc unzip -y
```

```bash
# Install Go
sudo rm -rf /usr/local/go
curl -Ls https://go.dev/dl/go1.24.6.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)
echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bash_profile
source $HOME/.bash_profile
go version
```

## ***Manual Installation***

```bash
# Download binary files
cd $HOME && mkdir -p go/bin/
git clone https://github.com/celestiaorg/celestia-node.git
cd celestia-node/
git checkout tags/v0.28.4
make build 
sudo make install 
make cel-key
mv $HOME/celestia-node/cel-key /usr/local/bin/
```

```bash
# Initiaton
celestia light init
```

***Create wallet***

```bash
KEY_NAME="my_celes_key"
cd ~/celestia-node
./cel-key add $KEY_NAME --keyring-backend test --node.type light
```

***(Optional) Restore an existing cel\_key***

```bash
KEY_NAME="my_celes_key"
cd ~/celestia-node
./cel-key add $KEY_NAME --keyring-backend test --node.type light --recover
```

***You can find the address by running the following command in the celestia-node directory***

```bash
cd $HOME/celestia-node
./cel-key list --node.type light --keyring-backend test
```

***Add Consensus node RPC and gRPC ports***

```bash
CORE_IP="<PUT_CONSENSUS_NODE_IP>"
CORE_RPC_PORT="<PUT_CONSENSUS_NODE_RPC_PORT>"
CORE_GRPC_PORT="<PUT_CONSENSUS_NODE_GRPC_PORT>"
KEY_NAME="my_celes_key"
```

***Create Service file***

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

[Service]
User=$USER
ExecStart=$(which celestia) light start \
--core.ip $CORE_IP \
--core.rpc.port $CORE_RPC_PORT \
--core.grpc.port $CORE_GRPC_PORT \
--keyring.accname $KEY_NAME \
--metrics.tls=true \
--metrics --metrics.endpoint otel.celestia.observer
Restart=on-failure
RestartSec=3
LimitNOFILE=65535

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

***Enable and start service***

```bash
sudo systemctl daemon-reload
sudo systemctl enable celestia-light
sudo systemctl restart celestia-light && sudo journalctl -u celestia-light -fo cat
```


# 🛠️  Upgrade

***Manual upgrade***

```bash
sudo systemctl stop celestia-light
```

```bash
cd $HOME
rm -rf celestia-node
git clone https://github.com/celestiaorg/celestia-node.git
cd celestia-node
git checkout tags/v0.28.4 
make build 
sudo make install 
make cel-key

celestia light config-update

sudo systemctl restart celestia-light && sudo journalctl -u celestia-light -fo cat
```


# 📜  Useful Commands

***Check Light node wallet balance***

```bash
celestia state balance --node.store ~/.celestia-light/
```

***Get wallet address***

```bash
cd $HOME/celestia-node
./cel-key list --node.type light --keyring-backend test
```

***Restore an existing cel\_key***

```bash
KEY_NAME="my_celes_key"
cd ~/celestia-node
./cel-key add $KEY_NAME --keyring-backend test --node.type light  --recover
```

***Check light node status***

```bash
celestia header sync-state --node.store ~/.celestia-light/
```

***Get Node ID***

```bash
celestia p2p info --node.store ~/.celestia-light/
```

***(Optional) Add permissions for transferring keys to another server***

```bash
chmod -R 700 ~/.celestia-light
```

***Reset node***

```bash
celestia light unsafe-reset-store
```

### *Delete light node* <a href="#delete" id="delete"></a>

```bash
sudo systemctl stop celestia-light
sudo systemctl disable celestia-light
sudo rm /etc/systemd/system/celestia-light*
rm -rf $HOME/celestia-node $HOME/.celestia-light
```


# Story

AI's next leap depends on unlocking the $80 trillion IP asset class. Story tokenizes IP and makes it programmable, from ownership to remix to monetization.

[**WebSite**](https://www.story.foundation/)

[**GitHub**](https://github.com/storyprotocol)

[**Discord**](https://discord.com/invite/storyprotocol)

[**Twitter**](https://x.com/StoryProtocol)


# 🗂️  API/RPC/Peers/AddrBook

### *API, RPC* <a href="#rpc" id="rpc"></a>

**Cosmos:**

RPC: <https://rpc-story-mainnet.validexis.com>

Websocket: <wss://rpc-story-mainnet.validexis.com/websocket>

API: [https://api-story-mainnet.validexis.com](https://api-story-mainnet.validexis.com/)

**Ethereum Virtual Machine (EVM):**

JSON-RPC: [https://evm-story-mainnet.validexis.com:443](https://evm-story-mainnet.validexis.com/)

Websocket: [wss://wss-story-mainnet-wss.validexis.com:443](wss://wss-story-mainnet-wss.validexis.com/)

### *Peers, Seeds* <a href="#peers-seeds-live-peers" id="peers-seeds-live-peers"></a>

***Peer:***

```shellscript
607f17f8be461d5b204361df8d18a06d2c7b66c9@story-mainnet-peer.validexis.com:35656
```

***Seed:***

```shellscript
249de5c0085eb175da6ad7031f96bfc3ad751e33@story-mainnet-seed.validexis.com:35656
```

### *AddrBook (upd 1h)*

```bash
wget -O $HOME/.story/story/config/addrbook.json https://mainnets1.validexis.com/story/addrbook.json
```

### *Genesis* <a href="#genesis" id="genesis"></a>

```bash
wget -O $HOME/.story/story/config/genesis.json https://mainnets1.validexis.com/story/genesis.json
```


# 📸  Snapshot

## *Snapshot  (pruned)* <a href="#snap" id="snap"></a>

* updated every 6h

***Download and unpack snapshot***

```shellscript
# stop node and backup priv_validator_state.json
sudo systemctl stop story story-geth
cp $HOME/.story/story/data/priv_validator_state.json $HOME/.story/story/priv_validator_state.json.backup

# remove old data and unpack Story snapshot
rm -rf $HOME/.story/story/data
curl https://snapshots1.validexis.com/story-mainnet/snap_story.tar.lz4 | lz4 -dc - | tar -xf - -C $HOME/.story/story

# restore priv_validator_state.json
mv $HOME/.story/story/priv_validator_state.json.backup $HOME/.story/story/data/priv_validator_state.json

# delete geth data and unpack Geth snapshot
rm -rf $HOME/.story/geth/story/geth/chaindata
curl https://snapshots1.validexis.com/story-mainnet/geth_story_snap.tar.lz4 | lz4 -dc - | tar -xf - -C $HOME/.story/geth/story/geth

# restart node and check logs
sudo systemctl restart story story-geth
sudo journalctl -u story-geth -u story -f
```


# ⚙️  Installation

Chain ID: story-1 | Node Version: geth v1.2.0 | storyd v1.4.2

Recommended Hardware:

<table><thead><tr><th>Node Type</th><th width="184">CPU</th><th>RAM</th><th>Storage</th></tr></thead><tbody><tr><td>Mainnet</td><td>8</td><td>32GB</td><td>400GB </td></tr></tbody></table>

&#x20;***Install dependencies***

<pre class="language-bash"><code class="lang-bash"># Update the repositories
<strong>sudo apt update &#x26;&#x26; apt upgrade -y
</strong></code></pre>

```bash
# Install developer packages
sudo apt install -y curl git jq lz4 build-essential
```

```bash
# Install Go
sudo rm -rf /usr/local/go
curl -Ls https://go.dev/dl/go1.23.5.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)
echo "export PATH=$PATH:/usr/local/go/bin:/usr/local/bin:$HOME/go/bin" >> $HOME/.bash_profile
source $HOME/.bash_profile
go version
```

## ***Automatic Installation***

```bash
source <(curl -s https://raw.githubusercontent.com/validexisinfra/Story/main/install.sh)
```

## ***Manual Installation***

```bash
# Come up with the name of your node and replace it instead <your_moniker>
MONIKER=<your_moniker>
```

```bash
# Download binary files
cd $HOME
wget -O story-geth https://github.com/piplabs/story-geth/releases/download/v1.2.0/geth-linux-amd64
chmod +x story-geth
mv story-geth $HOME/go/bin/

# install Story
cd $HOME
rm -rf story
git clone https://github.com/piplabs/story
cd story
git checkout v1.4.2
go build -o story ./client 
mv $HOME/story/story $HOME/go/bin/
```

```bash
# Initialize the node
story init $MONIKER --network story-1
```

***Setup config***

```bash
# set seeds and peers
SEEDS="249de5c0085eb175da6ad7031f96bfc3ad751e33@story-mainnet-seed.validexis.com:35656"
PEERS="607f17f8be461d5b204361df8d18a06d2c7b66c9@story-mainnet-peer.validexis.com:35656,e605032fb4320e1d753abf9eda6df11569367ed3@34.126.123.46:26656,503f17f8be461d5b204361df8d18a06d2c7b66c9@160.202.131.55:26656,773ca1c46d7f4f7311aa84b03295e4b9ea5e77cc@51.159.20.50:26656,327de5c0085eb175da6ad7031f96bfc3ad751e33@79.137.98.193:26656,9e1591134891a711091a2a0aec861113f76ad0db@95.217.196.166:26656,cd7c6eb0fab7c1aa249cd68d055e3fc5b1cc6ae9@51.222.42.212:26656,a2a794dc81a98e47366ab3fa3b5f5663388b371e@188.40.102.137:58656,5ad60885838e30ac8801ae22217ff287ff16c0c8@64.110.106.33:26656,f8eeca47cb53dc205d38097263d5d856250f6c62@79.127.227.195:59456,0205ecba87c7bab90042c5a5c848c2aabe0bfdcc@35.228.67.149:26656,ed3f837119a7f1dbde9e7272c65f1366f294593b@5.199.164.81:27656"
sed -i -e "/^\[p2p\]/,/^\[/{s/^[[:space:]]*seeds *=.*/seeds = \"$SEEDS\"/}" \
       -e "/^\[p2p\]/,/^\[/{s/^[[:space:]]*persistent_peers *=.*/persistent_peers = \"$PEERS\"/}" $HOME/.story/story/config/config.toml

# enable prometheus and disable indexing
sed -i -e "s/prometheus = false/prometheus = true/" $HOME/.story/story/config/config.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.story/story/config/config.toml

```

***Set custom ports***

You can change value STORY\_PORT=35 To any other ports

```bash
STORY_PORT=35
```

```bash
# set custom ports in story.toml file
sed -i.bak -e "s%:1317%:${STORY_PORT}317%g;
s%:8551%:${STORY_PORT}551%g" $HOME/.story/story/config/story.toml
```

```bash
# set custom ports in config.toml file
sed -i.bak -e "s%:26658%:${STORY_PORT}658%g;
s%:26657%:${STORY_PORT}657%g;
s%:26656%:${STORY_PORT}656%g;
s%^external_address = \"\"%external_address = \"$(wget -qO- eth0.me):${STORY_PORT}656\"%;
s%:26660%:${STORY_PORT}660%g" $HOME/.story/story/config/config.toml
```

***Create a service***

```bash
# create geth servie file
sudo tee /etc/systemd/system/story-geth.service > /dev/null <<EOF
[Unit]
Description=Story Geth daemon
After=network-online.target

[Service]
User=$USER
ExecStart=$(which story-geth) --story --syncmode full \
--http --http.api eth,net,web3,engine --http.vhosts '*' \
--http.addr 0.0.0.0 --http.port ${STORY_PORT}545 \
--authrpc.port ${STORY_PORT}551 \
--ws --ws.api eth,web3,net,txpool \
--ws.addr 0.0.0.0 --ws.port ${STORY_PORT}546 \
--port ${STORY_PORT}303
Restart=on-failure
RestartSec=3
LimitNOFILE=65535

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

```shellscript
# create story service file
sudo tee /etc/systemd/system/story.service > /dev/null <<EOF
[Unit]
Description=Story Service
After=network.target

[Service]
User=$USER
WorkingDirectory=$HOME/.story/story
ExecStart=$(which story) run

Restart=on-failure
RestartSec=5
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
```

***Download latest chain snapshot***

```bash
# backup priv_validator_state.json
cp $HOME/.story/story/data/priv_validator_state.json $HOME/.story/story/priv_validator_state.json.backup

# remove old data and unpack Story snapshot
rm -rf $HOME/.story/story/data
curl https://snapshots1.validexis.com/story-mainnet/snap_story.tar.lz4 | lz4 -dc - | tar -xf - -C $HOME/.story/story

# restore priv_validator_state.json
mv $HOME/.story/story/priv_validator_state.json.backup $HOME/.story/story/data/priv_validator_state.json

# delete geth data and unpack Geth snapshot
rm -rf $HOME/.story/geth/story/geth/chaindata
mkdir -p $HOME/.story/geth/story/geth
curl https://snapshots1.validexis.com/story-mainnet/geth_story_snap.tar.lz4 | lz4 -dc - | tar -xf - -C $HOME/.story/geth/story/geth

```

```bash
# enable and start geth, story
sudo systemctl daemon-reload
sudo systemctl enable story story-geth
sudo systemctl restart story-geth && sleep 5 && sudo systemctl restart story
```

```bash
# check logs
journalctl -u story -u story-geth -f
```

### *Create validator* <a href="#create-validator" id="create-validator"></a>

View your validator key

```bash
story validator export
```

Export EVM private key

```bash
story validator export --export-evm-key
```

View EVM private key and make a key backup

```bash
cat $HOME/.story/story/config/private_key.txt
```

{% hint style="info" %}

#### Before creating a validator, wait for your node to get fully synced. Once "catching\_up" is "false", move on to the next step

{% endhint %}

```bash
curl localhost:$(sed -n '/\[rpc\]/,/laddr/ { /laddr/ {s/.*://; s/".*//; p} }' $HOME/.story/story/config/config.toml)/status | jq
```

#### *Create validator, locked*

```bash
story validator create --stake 1024000000000000000000 --moniker $MONIKER --chain-id 1514 --unlocked=false
```

#### *Create validator, unlocked*

```bash
story validator create --stake 1024000000000000000000 --moniker $MONIKER --chain-id 1514 --unlocked=true
```

Remember to backup your validator priv\_key from here:

```bash
cat $HOME/.story/story/config/priv_validator_key.json
```


# 🛠️  Upgrade

***Automatic upgrade***

```bash
source <(curl -s https://raw.githubusercontent.com/validexisinfra/Story/main/upgrade_mainnet.sh)
```

***Manual upgrade***

```bash
cd $HOME
rm -rf story
git clone https://github.com/piplabs/story
cd story
git checkout v1.4.2
go build -o story ./client 
sudo systemctl stop story-geth
wget -O $(which geth) https://github.com/piplabs/story-geth/releases/download/v1.2.0/geth-linux-amd64
chmod +x $(which geth)
sudo systemctl start story-geth
sudo mv $HOME/story/story $(which story)
sudo systemctl restart story && sudo journalctl -u story -f
```


# 📜  Useful Commands

### *Service operations*  <a href="#service-operations" id="service-operations"></a>

Check logs

```bash
sudo journalctl -u story -f
```

Start service

```bash
sudo systemctl start story
```

Stop service

```bash
sudo systemctl stop story
```

Restart service

```bash
sudo systemctl restart story
```

Check service status

```bash
sudo systemctl status story
```

Reload services

```bash
sudo systemctl daemon-reload
```

Enable Service

```bash
sudo systemctl enable story
```

Disable Service

```bash
sudo systemctl disable story
```

Node info

```bash
curl localhost:$(sed -n '/\[rpc\]/,/laddr/ { /laddr/ {s/.*://; s/".*//; p} }' $HOME/.story/story/config/config.toml)/status | jq
```

Your node peer

```bash
echo "$(curl localhost:$(sed -n '/\[rpc\]/,/laddr/ { /laddr/ {s/.*://; s/".*//; p} }' $HOME/.story/story/config/config.toml)/status | jq -r '.result.node_info.id')@$(wget -qO- eth0.me):$(sed -n '/Address to listen for incoming connection/{n;p;}' $HOME/.story/story/config/config.toml | sed 's/.*://; s/".*//')"
```

Your enode

```bash
story-geth --exec "admin.nodeInfo.enode" attach ~/.story/geth/story/geth.ipc
```

### *Staking* <a href="#staking" id="staking"></a>

Delegate to yourself

```bash
story validator stake --chain-id 1514 --validator-pubkey $(story validator export | grep "Compressed Public Key (hex)" | awk '{print $NF}') --stake 1000000000000000000 --private-key $(cat $HOME/.story/story/config/.env | grep "PRIVATE_KEY" | awk -F'=' '{print $2}')
```

Delegate

```bash
story validator stake --chain-id 1514 --validator-pubkey <VALIDATOR_PUB_KEY_IN_HEX> --stake 1000000000000000000 --private-key $(cat $HOME/.story/story/config/.env | grep "PRIVATE_KEY" | awk -F'=' '{print $2}')
```

Delegate on behalf of other delegator

```bash
story validator stake-on-behalf --chain-id 1514 --validator-pubkey <VALIDATOR_PUB_KEY_IN_HEX> --delegator-pubkey <DELEGATOR_PUB_KEY_IN_HEX> --stake 1000000000000000000 --private-key $(cat $HOME/.story/story/config/.env | grep "PRIVATE_KEY" | awk -F'=' '{print $2}')
```

Add operator

```bash
story validator add-operator --chain-id 1514 --operator <OPERATOR_EVM_ADDRESS> --private-key $(cat $HOME/.story/story/config/.env | grep "PRIVATE_KEY" | awk -F'=' '{print $2}')
```

Unstake from yourself

```bash
story validator unstake --chain-id 1514 --validator-pubkey $(story validator export | grep "Compressed Public Key (hex)" | awk '{print $NF}') --unstake 1000000000000000000 --private-key $(cat $HOME/.story/story/config/.env | grep "PRIVATE_KEY" | awk -F'=' '{print $2}')
```

Unstake

```bash
story validator unstake --chain-id 1514 --validator-pubkey <VALIDATOR_PUB_KEY_IN_HEX> --unstake 1000000000000000000 --private-key $(cat $HOME/.story/story/config/.env | grep "PRIVATE_KEY" | awk -F'=' '{print $2}')
```

Unstake on behalf of other delegator. To do so, you must be a registered authorized operator for this delegator.

```bash
story validator unstake-on-behalf --chain-id 1514 --validator-pubkey <VALIDATOR_PUB_KEY_IN_HEX> --delegator-pubkey <DELEGATOR_PUB_KEY_IN_HEX> --unstake 1000000000000000000 --private-key $(cat $HOME/.story/story/config/.env | grep "PRIVATE_KEY" | awk -F'=' '{print $2}')
```

Remove operator

```bash
story validator remove-operator --operator <OPERATOR_EVM_ADDRESS> --private-key $(cat $HOME/.story/story/config/.env | grep "PRIVATE_KEY" | awk -F'=' '{print $2}')
```

Set or change withdrawal address

```bash
story validator set-withdrawal-address --withdrawal-address <YOUR_EVM_ADDRESS> --private-key $(cat $HOME/.story/story/config/.env | grep "PRIVATE_KEY" | awk -F'=' '{print $2}')
```

### *Validator operations* <a href="#validator-operations" id="validator-operations"></a>

Validator info

```bash
curl localhost:$(sed -n '/\[rpc\]/,/laddr/ { /laddr/ {s/.*://; s/".*//; p} }' $HOME/.story/story/config/config.toml)/status | jq
```

Check Validator public key

```bash
story validator export
```

Check Validator private key

```bash
cat $HOME/.story/story/config/.env
```

### *Geth commands* <a href="#geth-commands" id="geth-commands"></a>

Check the latest block

```bash
story-geth --exec "eth.blockNumber" attach ~/.story/geth/story/geth.ipc
```

Peers your client is connected to

```bash
story-geth --exec "admin.peers" attach ~/.story/geth/story/geth.ipc
```

Check if syncing is still in progress: will output "true" if geth is syncing

```bash
story-geth --exec "eth.syncing" attach ~/.story/geth/story/geth.ipc
```

Check gas price

```bash
story-geth --exec "eth.gasPrice" attach ~/.story/geth/story/geth.ipc
```

Check account balance

```bash
story-geth --exec "eth.getBalance('<YOUR_EVM_ADDRESS>')" attach ~/.story/geth/story/geth.ipc
```


# Monad

Monad is a decentralized, developer-oriented first-layer smart contract platform, created to enhance performance.

[**WebSite**](https://www.monad.xyz/)

[**Docs**](https://docs.monad.xyz/)

[**Discord**](https://discord.com/invite/monad)

[**Twitter**](https://x.com/monad)


# 🖥️ Hardware Requirements

Before running a Monad node, make sure your hardware meets the required performance specifications. Monad is a high-throughput blockchain with strict execution and synchronization requirements, so insufficient hardware may lead to unstable node behavior or loss of consensus participation.

Hardware requirements are **identical for validators and full nodes**, except for **network bandwidth**.

> ⚠️ **Note:** Cloud-based or virtualized environments are **not officially supported**. Monad nodes should be deployed on dedicated bare metal servers.

***

### *Minimum Requirements*

#### *CPU*

* **16 physical cores**
* **4.5 GHz+ base clock**
* High single-core performance is required

#### *Memory*

* **32 GB RAM or more**

#### *Storage*

| Purpose            | Requirement                     |
| ------------------ | ------------------------------- |
| Execution (TrieDB) | **2 TB NVMe SSD**               |
| MonadBFT + OS      | **500 GB SSD**                  |
| Interface          | **PCIe Gen4 x4 NVMe or better** |

**Recommended SSDs:**\
Samsung 980 / 990 Pro, Samsung PM9A1, Micron 7450

**Not recommended:**\
Nextorage SSDs (known stability issues under load)

***

### *Network Bandwidth*

| Node Type | Bandwidth      |
| --------- | -------------- |
| Validator | **300 Mbit/s** |
| Full Node | **100 Mbit/s** |

***

### *Official Documentation*

This guide follows the official Monad requirements. Always refer to the documentation below for the most up-to-date information:

👉 [**https://docs.monad.xyz/node-ops/hardware-requirements**](https://docs.monad.xyz/node-ops/hardware-requirements?utm_source=chatgpt.com)


# 🔧 Prerequisites

Before continuing, make sure your setup meets the **Hardware Requirements** and the following environment prerequisites.

#### *System Requirements*

* **Bare-metal server**
* **Ubuntu 24.04 LTS or newer**
* **Linux kernel v6.8.0.60-generic or higher**
* **HyperThreading (HT) / Simultaneous MultiThreading (SMT) disabled in BIOS**\
  *(these features negatively impact node performance)*

> ⚠️ **Kernel Warning**\
> There is a known issue affecting Linux kernel versions\
> **v6.8.0.56-generic → v6.8.0.59-generic (inclusive)**\
> which can cause Monad clients to hang in an uninterruptible sleep state, severely impacting node stability.
>
> **Recommended:** `v6.8.0.60-generic` or newer.


# ⚙️  Installation

### *System Preparation*

Run all commands as **root** unless stated otherwise.

#### *Update system*

```bash
apt update && apt upgrade -y
```

Reboot if kernel was updated.

#### *Install dependencies*

```bash
apt install -y curl nvme-cli aria2 jq ufw
```

### *Install Monad Package*

#### *Configure APT repository*

```bash
cat <<EOF > /etc/apt/sources.list.d/category-labs.sources
Types: deb
URIs: https://pkg.category.xyz/
Suites: noble
Components: main
Signed-By: /etc/apt/keyrings/category-labs.gpg
EOF

curl -fsSL https://pkg.category.xyz/keys/public-key.asc | \
  gpg --dearmor --yes -o /etc/apt/keyrings/category-labs.gpg
```

#### *Install Monad*

```bash
apt update
apt install -y monad=0.12.7
apt-mark hold monad
```

### *Create Monad User*

```bash
useradd -m -s /bin/bash monad
```

Create directory structure:

```bash
mkdir -p /home/monad/monad-bft/config/{forkpoint,validators} \
         /home/monad/monad-bft/ledger
```

***

### *Configure TrieDB NVMe Device*

#### *Identify NVMe drive*

```bash
nvme list
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,MODEL
```

⚠ **Ensure the drive has no mounted filesystem**

#### *Partition drive*

```bash
TRIEDB_DRIVE=/dev/nvme1n1   # CHANGE THIS

parted $TRIEDB_DRIVE mklabel gpt
parted $TRIEDB_DRIVE mkpart triedb 0% 100%
```

#### *Create udev rule*

```bash
PARTUUID=$(lsblk -o PARTUUID $TRIEDB_DRIVE | tail -n 1)

echo "ENV{ID_PART_ENTRY_UUID}==\"$PARTUUID\", MODE=\"0666\", SYMLINK+=\"triedb\"" \
  > /etc/udev/rules.d/99-triedb.rules

udevadm trigger
udevadm control --reload
udevadm settle
ls -l /dev/triedb
```

#### *Verify 512-byte LBA*

```bash
nvme id-ns -H $TRIEDB_DRIVE | grep 'LBA Format' | grep 'in use'
```

Expected:

```bash
Data Size: 512 bytes (in use)
```

If not:

```bash
nvme format --lbaf=0 $TRIEDB_DRIVE
```

### &#x20;*Initialize TrieDB (MPT)*

```bash
systemctl start monad-mpt
journalctl -u monad-mpt -n 20 -o cat
```

Service must finish with:

```bash
monad-mpt.service: Deactivated successfully.
```

### *Firewall Configuration*

```bash
ufw allow ssh
ufw allow 8000
ufw enable
ufw status
```

Anti-spam UDP filter:

```bash
iptables -I INPUT -p udp --dport 8000 -m length --length 0:1400 -j DROP
```

Persist rule using `iptables-persistent` if desired.

### *Install OTEL Collector*

```bash
OTEL_VERSION=0.139.0
curl -fsSL https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v${OTEL_VERSION}/otelcol_${OTEL_VERSION}_linux_amd64.deb \
  -o /tmp/otelcol.deb

dpkg -i /tmp/otelcol.deb

cp /opt/monad/scripts/otel-config.yaml /etc/otelcol/config.yaml
systemctl restart otelcol
```

Metrics endpoint:

```shellscript
http://<NODE_IP>:8889/metrics
```

### *Download Configuration Files*

#### *Mainnet example*

```bash
MF_BUCKET=https://bucket.monadinfra.com

curl -o /home/monad/.env \
  $MF_BUCKET/config/mainnet/latest/.env.example

curl -o /home/monad/monad-bft/config/node.toml \
  $MF_BUCKET/config/mainnet/latest/node.toml
```

### *Keystore & Keys*

#### *Generate password*

```bash
sed -i "s|^KEYSTORE_PASSWORD=$|KEYSTORE_PASSWORD='$(openssl rand -base64 32)'|" /home/monad/.env
source /home/monad/.env
```

Backup password:

```bash
mkdir -p /opt/monad/backup
echo "$KEYSTORE_PASSWORD" > /opt/monad/backup/keystore-password-backup
```

#### *Generate keys*

```bash
monad-keystore create --key-type secp \
  --keystore-path /home/monad/monad-bft/config/id-secp \
  --password "$KEYSTORE_PASSWORD"

monad-keystore create --key-type bls \
  --keystore-path /home/monad/monad-bft/config/id-bls \
  --password "$KEYSTORE_PASSWORD"
```

⚠ Store backups **off-server**

***

### *Hard Reset (Snapshot Restore)*

```bash
systemctl stop monad-bft monad-execution monad-rpc
bash /opt/monad/scripts/reset-workspace.sh
```

Restore snapshot:

```bash
MF_BUCKET=https://bucket.monadinfra.com
curl -sSL $MF_BUCKET/scripts/mainnet/restore-from-snapshot.sh | bash
```

***

### *Validator Configuration*

Edit:

```bash
/home/monad/monad-bft/config/node.toml
```

#### *Mandatory changes*

```bash
beneficiary = "0x<VALIDATOR_REWARD_ADDRESS>"
node_name = "validator_<PROVIDER>"
```

Ensure validator-specific template is used.

Reload config without restart:

```bash
monad-debug-node --control-panel-ipc-path \
  /home/monad/monad-bft/controlpanel.sock reload-config
```

### *Start Services*

```bash
chown -R monad:monad /home/monad
systemctl enable monad-bft monad-execution monad-rpc
systemctl start monad-bft monad-execution monad-rpc
```

### &#x20;*Final Notes*

* Monitor logs: `journalctl -u monad-bft -f`
* Monitor metrics via OTEL
* Backup keys regularly
* Never expose keystore password


# 🪪 Validator Installation

### *Prerequisites & Assumptions*

Before starting validator onboarding, you **must** have:

* A **fully synced Monad full node** (execution + bft + rpc running)
* Access to a **Monad RPC endpoint** (local or remote)
* **SECP and BLS validator keys** already generated by `monad-bft`
* A **funded EVM address** with:
  * Minimum **100,000 MON** self‑stake
  * Additional MON for gas fees

> ⚠️ Production validators **must use a hardware wallet (Ledger)** for funded / authorized addresses.

***

### *Validator Eligibility Requirements*

To become **active**, a validator must satisfy **all** of the following:

| Requirement               | Value            |
| ------------------------- | ---------------- |
| Minimum self‑stake        | 100,000 MON      |
| Minimum total stake       | 10,000,000 MON   |
| Active validator set size | Top 200 by stake |

Once all conditions are met, the validator becomes active **in the next epoch**.

### *Configure Validator Node*

#### *node.toml (Validator Configuration)*

Ensure you are using the **validator‑themed `node.toml`**.

Mandatory check:

```toml
beneficiary = "0x<YOUR_BENEFICIARY_ADDRESS>"
```

* This address receives **block rewards**
* It does **not** have to be the funded or authorized address

Optional but recommended:

* Update `node_name` to a unique validator identifier
* Remove any `full_` prefix from full‑node testing

#### *Reload Config Without Restart*

```bash
monad-debug-node \
  --control-panel-ipc-path /home/monad/monad-bft/controlpanel.sock \
  reload-config
```

### *Install Staking CLI*

#### *Clone Repository*

```bash
git clone https://github.com/monad-developers/staking-sdk-cli.git
cd staking-sdk-cli
```

#### *Create Virtual Environment*

```bash
python -m venv cli-venv
source cli-venv/bin/activate
```

#### *Install Dependencies*

```bash
pip install .
```

> For development or modifications:

```bash
pip install -e .
```

### *Configure Staking CLI*

#### *Create config.toml*

```bash
cp staking-cli/config.toml.example config.toml
```

#### *Funded & Authorized Addresses*

You will need:

* **Funded address** — pays gas + provides stake
* **Authorized address** — controls validator operations on‑chain

These **can be different** addresses.

> 🔐 Recommended:
>
> * Funded address → Ledger
> * Authorized address → Ledger

Never commit `config.toml` to git.

### *Extract Validator Private Keys*

⚠️ **DO NOT** reuse old backup keys.

Always extract keys directly from keystores using `monad-keystore`.

```bash
source /home/monad/.env

monad-keystore recover \
  --password "$KEYSTORE_PASSWORD" \
  --keystore-path /home/monad/monad-bft/config/id-secp \
  --key-type secp

monad-keystore recover \
  --password "$KEYSTORE_PASSWORD" \
  --keystore-path /home/monad/monad-bft/config/id-bls \
  --key-type bls
```

Save outputs **securely** and verify public keys match your node identity.

### *Add Validator (CLI Workflow)*

```bash
python staking-cli/main.py add-validator \
  --secp-privkey "${SECP_PRIVATE_KEY}" \
  --bls-privkey "${BLS_PRIVATE_KEY}" \
  --auth-address "${AUTH_ADDRESS}" \
  --amount 100_000
```

#### *Verification Prompt*

You **must verify** derived public keys:

```
SECP Pubkey: 03bbf6...
BLS  Pubkey: 985d3f...
Do the derived public keys match? [y/n]
```

Confirm **only if keys match** your node.

Successful transaction:

```
Tx status: 1
Tx hash: 0x...
```

### *Add Validator (TUI Workflow)*

```bash
python staking-cli/main.py tui
```

Navigate:

```
1. Add Validator
```

Fill values carefully → confirm → submit.

### *Verify Validator Registration*

#### *Confirm Validator Creation*

```
INFO Validator Created! ID: <validator-id>
```

#### *Check Execution Set*

```bash
python main.py query validator-set \
  --type execution \
  --config-path ~/config.toml | grep <SECP_PUBKEY>
```

#### *Query Validator Info*

```bash
python main.py query validator \
  --validator-id <ID> \
  --config-path ~/config.toml
```

Verify:

* Stake
* Commission
* Status

### *Common Operations*

* Delegate
* Undelegate
* Withdraw
* Claim rewards
* Compound rewards
* Change commission

All available via CLI or TUI.

### *Troubleshooting*

#### *Transaction Failed (status 0)*

1. Fetch tx data via `eth_getTransactionByHash`
2. Replay via `eth_call` for trace

Common errors:

* `insufficient balance`
* `invalid validator id`
* `gas too low`

### *Security Best Practices*

* Use **Ledger hardware wallets** in production
* Never store private keys in git or plaintext
* Restrict RPC access
* Monitor validator health continuously

### *Final Notes*

* Validator activation occurs **next epoch** after requirements met
* Stake ranking determines activation
* Keep node fully synced and stable


# 🛠️  Upgrade

> Proceed with this upgrade only after an official notice from the Monad Foundation.

#### *Upgrade  — v0.12.7*

```bash
apt update && apt install --reinstall monad=0.12.7 -y \
  --allow-downgrades --allow-change-held-packages
  
systemctl restart monad-bft monad-execution monad-rpc
```

***Check service status***

```bash
systemctl status monad-bft monad-execution monad-rpc --no-pager
```

***Verify version***

```bash
monad-rpc --version
```

Expected:

```bash
monad-rpc {"commit":"e1e9489b8fc42c0a5af208bab20f6704f83c91c0","tag":"v0.12.7","branch":"","modified":true}
```

&#x20;


# 📜  Useful Commands

#### *Version Information*

Check the installed Monad binary version:

```bash
monad-node --version
```

#### *Service Status*

Check that all core services are running:

```bash
systemctl status monad-bft monad-execution monad-rpc --no-pager
```

#### *Logs*

View live logs for troubleshooting:

```bash
journalctl -u monad-bft -f
journalctl -u monad-execution -f
journalctl -u monad-rpc -f
```

#### *Block Height / Sync Status*

Once RPC is available, check the current block height:

```bash
curl http://localhost:8080 \
  -X POST \
  -H "Content-Type: application/json" \
  --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
```

#### *Disk Usage (MonadDB)*

Check TrieDB disk usage and retained history:

```bash
monad-mpt --storage /dev/triedb
```

#### *Quick Node Overview*

Get a summarized node status (services, sync, peers):

```bash
monad-status
```


# Zetachain

ZetaChain is the first Universal Blockchain with native access to Bitcoin, Ethereum, Solana, and more, offering seamless UX and unified liquidity to the next billions of users.

[**WebSite**](https://www.zetachain.com/)

[**GitHub**](https://github.com/zeta-chain/node/tags)

[**Discord**](https://discord.com/invite/zetachain)

[**Twitter**](https://x.com/zetablockchain)


# ⚙️  Installation

Chain ID: zetachain\_7000-1 | Latest Version Tag: v31.0.1 | Custom Port: 161

Recommended Hardware:

<table><thead><tr><th>Node Type</th><th width="184">CPU</th><th>RAM</th><th>Storage</th></tr></thead><tbody><tr><td>Mainnet</td><td>8</td><td>16GB</td><td>500GB </td></tr></tbody></table>

&#x20;***Install dependencies***

<pre class="language-bash"><code class="lang-bash"># Update the repositories
<strong>sudo apt update &#x26;&#x26; apt upgrade -y
</strong></code></pre>

```bash
# Install developer packages
sudo apt install -y curl git jq lz4 build-essential
```

```bash
# Install Go
sudo rm -rf /usr/local/go
curl -Ls https://go.dev/dl/go1.23.8.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)
echo "export PATH=$PATH:/usr/local/go/bin:/usr/local/bin:$HOME/go/bin" >> $HOME/.bash_profile
source $HOME/.bash_profile
go version
```

## ***Automatic Installation***

```bash
source <(curl -s https://raw.githubusercontent.com/validexisinfra/Zetachain/main/installmain.sh)
```

## ***Manual Installation***

```bash
# Come up with the name of your node and replace it instead <your_moniker>
MONIKER=<your_moniker>
```

```bash
# Download binary files
cd $HOME
wget -O $HOME/zetacored https://github.com/zeta-chain/node/releases/download/v32.0.0/zetacored-linux-amd64
chmod +x $HOME/zetacored 
mv $HOME/zetacored $HOME/go/bin
```

```bash
# Initialize the node
zetacored config set client chain-id zetachain_7000-1
zetacored config set client keyring-backend file
zetacored init $MONIKER --chain-id=zetachain_7000-1
```

<pre class="language-bash"><code class="lang-bash"># Download genesis and addrbook
<strong>curl -L https://snapshots.nodejumper.io/zetachain/genesis.json > $HOME/.zetacored/config/genesis.json
</strong>curl -L https://snapshots.nodejumper.io/zetachain/addrbook.json > $HOME/.zetacored/config/addrbook.json
</code></pre>

***Setup config***

```bash
# Set seeds and peers
sed -i -e 's|^seeds *=.*|seeds = "20e1000e88125698264454a884812746c2eb4807@seeds.lavenderfive.com:22556,1d41d344d3370d2ba54332de4967baa5cbd70a06@rpc.zetachain.nodestake.org:666,ade4d8bc8cbe014af6ebdf3cb7b1e9ad36f412c0@seeds.polkachu.com:22556,8d93468c6022fb3b263963bdea46b0a131d247cd@34.28.196.79:26656,637077d431f618181597706810a65c826524fd74@zetachain.rpc.nodeshub.online:22556,11b86546b092e0645a91b32ca78e40c8bec54546@zetachain-m.peer.stavr.tech:17656"|' $HOME/.zetacored/config/config.toml

# Set minimum gas price, enable prometheus and disable indexing
sed -i -e 's|^minimum-gas-prices *=.*|minimum-gas-prices = "20000000000azeta"|' $HOME/.zetacored/config/app.toml
sed -i -e "s/prometheus = false/prometheus = true/" $HOME/.zetacored/config/config.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.zetacored/config/config.toml

# Config pruning
sed -i -e "s/^pruning *=.*/pruning = \"custom\"/" $HOME/.zetacored/config/app.toml 
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"100\"/" $HOME/.zetacored/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"19\"/" $HOME/.zetacored/config/app.toml

```

#### ***Set custom ports***

You can change value CUSTOM\_PORT=161 To any other ports

```bash
CUSTOM_PORT=161
```

```bash
sed -i -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${CUSTOM_PORT}58\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${CUSTOM_PORT}57\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${CUSTOM_PORT}60\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${CUSTOM_PORT}56\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${CUSTOM_PORT}66\"%" $HOME/.zetacored/config/config.toml
sed -i -e "s%^address = \"tcp://localhost:1317\"%address = \"tcp://localhost:${CUSTOM_PORT}17\"%; s%^address = \":8080\"%address = \":${CUSTOM_PORT}80\"%; s%^address = \"localhost:9090\"%address = \"localhost:${CUSTOM_PORT}90\"%; s%^address = \"localhost:9091\"%address = \"localhost:${CUSTOM_PORT}91\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${CUSTOM_PORT}45\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${CUSTOM_PORT}46\"%" $HOME/.zetacored/config/app.toml
```

```bash
#Set config with new custom port
zetacored config set client node tcp://localhost:${CUSTOM_PORT}57
```

```bash
# Create service file
sudo tee /etc/systemd/system/zetacored.service > /dev/null <<EOF
[Unit]
Description=Zetachain node
After=network-online.target

[Service]
User=$USER
WorkingDirectory=$HOME/.zetacored
ExecStart=$(which zetacored) start --home $HOME/.zetacored
Restart=on-failure
RestartSec=5
LimitNOFILE=65535

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

```bash
# Download latest chain snapshot
curl "https://snapshots.nodejumper.io/zetachain/zetachain_latest.tar.lz4" | lz4 -dc - | tar -xf - -C "$HOME/.zetacored"
```

```bash
# Enable and start service
sudo systemctl daemon-reload
sudo systemctl enable zetacored
sudo systemctl restart zetacored && sudo journalctl -u zetacored -fo cat
```

```bash
# Check status
zetacored status 2>&1 | jq .SyncInfo

#"catching_up": false means that the node is synchronized, we are waiting for complete synchronization
```

***Wallets***

```bash
# Create wallet
zetacored keys add wallet
```

The wallet has been created. In the last line there will be a phrase that must be written down

```bash
# If the wallet was already there, restore it
zetacored keys add wallet --recover

# Insert the seed phrase from your wallet
# If everything is correct, you will see your wallet data
```

***Validator***

Do not forget to create a profile on <https://keybase.io/> and set a profile photo there that will be imported by key and used for your validators.

```bash
# Change <identity> to your key from keybase
zetacored tx staking create-validator \
--amount 1000000azeta \
--from=wallet \
--commission-rate 0.1 \
--commission-max-rate 0.2 \
--commission-max-change-rate 0.01 \
--min-self-delegation 1 \
--pubkey $(zetacored tendermint show-validator) \
--moniker=$MONIKER \
--identity=<identity> \
--website "" \
--details "" \
--chain-id zetachain_7000-1 \
--gas-prices=20000000000azeta \
--gas-adjustment=1.5 \
--gas=auto \
-y 
```

**!!! Save priv\_validator\_key.json which is located in /root/.zetacored/config**


# 🛠️  Upgrade

***Automatic upgrade***

```bash
source <(curl -s https://raw.githubusercontent.com/validexisinfra/Zetachain/main/upgrademain.sh)
```

***Manual upgrade***

```bash
cd $HOME
wget -O $HOME/zetacored https://github.com/zeta-chain/node/releases/download/v32.0.0/zetacored-linux-amd64
chmod +x $HOME/zetacored 
sudo mv $HOME/zetacored $(which zetacored)
sudo systemctl restart zetacored && sudo journalctl -u zetacored -f
```


# 📜  Useful Commands

***Get validator info***

```bash
zetacored status 2>&1 | jq .ValidatorInfo
```

***Get sync info***

```bash
zetacored status 2>&1 | jq
```

### *Key management* <a href="#key-management" id="key-management"></a>

***Add new key***

```bash
zetacored keys add wallet
```

***Recover existing key***

<pre class="language-bash"><code class="lang-bash"><strong>zetacored keys add wallet --recover
</strong></code></pre>

***List all keys***

```bash
zetacored keys list
```

***Delete key***

```bash
zetacored keys delete wallet
```

***Query wallet balance***

```bash
zetacored q bank balances $(zetacored keys show wallet -a)
```

### *Validator management* <a href="#validator-management" id="validator-management"></a>

Please make sure you have adjusted **moniker**, **identity**, **details** and **website** to match your values.

***Create new validator***

```bash
zetacored tx staking create-validator \
--amount 1000000azeta \
--pubkey $(zetacored tendermint show-validator) \
--moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id zetachain_7000-1 \
--commission-rate 0.1 \
--commission-max-rate 0.2 \
--commission-max-change-rate 0.01 \
--min-self-delegation 1 \
--from wallet \
--gas-prices=20000000000azeta \
--gas-adjustment=1.5 \
--gas=auto \
-y 
```

***Edit existing validator***

```bash
zetacored tx staking edit-validator \
--new-moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id zetachain_7000-1 \
--commission-rate 0.1 \
--from wallet \
--gas-prices=20000000000azeta \
--gas-adjustment=1.5 \
--gas=auto \
-y 
```

***Validator Details***

```bash
zetacored q staking validator $(zetacored keys show wallet --bech val -a) 
```

***Jailing info***

```bash
zetacored q slashing signing-info $(zetacored tendermint show-validator) 
```

***Slashing parameters***

```bash
zetacored q slashing params 
```

***Unjail validator***

```bash
zetacored tx slashing unjail --from wallet --chain-id zetachain_7000-1 --gas auto --gas-adjustment 1.5 --gas-prices 20000000000azeta -y
```

### *Token management* <a href="#token-management" id="token-management"></a>

***Withdraw all rewards***

```bash
zetacored tx distribution withdraw-all-rewards --from wallet --chain-id zetachain_7000-1 --gas auto --gas-adjustment 1.5 --gas-prices 20000000000azeta -y0000000000000azeta 
```

***Withdraw rewards and commission from your validator***

```bash
zetacored tx distribution withdraw-rewards $(zetacored keys show wallet --bech val -a) --from wallet --commission --chain-id zetachain_7000-1 --gas auto --gas-adjustment 1.5 --gas-prices 20000000000azeta -y
```

***Check your balance***

```bash
zetacored query bank balances wallet
```

***Delegate to Yourself***

```bash
zetacored tx staking delegate $(zetacored keys show wallet --bech val -a) 1000000azeta --from wallet --chain-id zetachain_7000-1 --gas-prices 20000000000azeta --gas-adjustment 1.5 --gas auto -y
```

***Delegate***

```bash
zetacored tx staking delegate <TO_VALOPER_ADDRESS> 1000000azeta --from wallet --chain-id zetachain_7000-1 --gas auto --gas-adjustment 1.5 --fees 2100000000000000azeta -y 	
```

***Redelegate Stake to Another Validator***

```bash
zetacored tx staking redelegate $(zetacored keys show wallet --bech val -a) <TO_VALOPER_ADDRESS> 1000000azeta --from wallet --chain-id zetachain_7000-1 --gas auto --gas-adjustment 1.5 --fees 2100000000000000azeta -y 
```

***Unbond***

```bash
zetacored tx staking unbond $(zetacored keys show wallet --bech val -a) 1000000azeta --from wallet --chain-id zetachain_7000-1 --gas auto --gas-adjustment 1.5 --fees 2100000000000000azeta -y 
```

***Transfer Funds***

```bash
zetacored tx bank send wallet <TO_WALLET_ADDRESS> 1000000azeta --gas auto --gas-adjustment 1.5 --fees 2100000000000000azeta -y 
```

***Remove node***

Please, before proceeding with the next step! All chain data will be lost! Make sure you have backed up your **priv\_validator\_key.json**!

```bash
cd $HOME
sudo systemctl stop zetacored
sudo systemctl disable zetacored
sudo rm /etc/systemd/system/zetacored.service
sudo systemctl daemon-reload
rm -f $(which zetacored)
rm -rf $HOME/.zetacored
```

### *Service Management* <a href="#service-management" id="service-management"></a>

***Reload service configuration***

```bash
sudo systemctl daemon-reload
```

***Enable service***

```bash
sudo systemctl enable zetacored
```

***Disable service***

```bash
sudo systemctl disable zetacored
```

***Start service***

```bash
sudo systemctl start zetacored
```

***Stop service***

```bash
sudo systemctl stop zetacored
```

***Restart service***

```bash
sudo systemctl restart zetacored
```

***Check service status***

```bash
sudo systemctl status zetacored
```

***Check service logs***

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


# Xion

XION empowers developers to build, launch and scale consumer-ready products from the ground up, removing technical barriers for all users through its Chain Abstraction.

[**WebSite**](https://xion.burnt.com/)

[**GitHub**](https://github.com/burnt-labs)

[**Discord**](https://discord.com/invite/burnt)

[**Twitter**](https://x.com/burnt_xion)


# ⚙️  Installation

Chain ID: xion-mainnet-1 | Node Version: v14.0.0 | Custom Port: 162

Recommended Hardware:

<table><thead><tr><th>Node Type</th><th width="184">CPU</th><th>RAM</th><th>Storage</th></tr></thead><tbody><tr><td>Mainnet</td><td>8</td><td>16GB</td><td>500GB </td></tr></tbody></table>

***Install dependencies***

```bash
# Update the repositories
sudo apt update && apt upgrade -y
```

<pre class="language-bash"><code class="lang-bash"># Install developer packages
<strong>sudo apt install -y curl git jq lz4 build-essential
</strong></code></pre>

```bash
# Install Go
sudo rm -rf /usr/local/go
curl -Ls https://go.dev/dl/go1.23.0.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)
echo "export PATH=$PATH:/usr/local/go/bin:/usr/local/bin:$HOME/go/bin" >> $HOME/.bash_profile
source $HOME/.bash_profile
go version

# go version go1.23.0 linux/amd64
```

## ***Automatic Installation***

```bash
source <(curl8 -s https://raw.githubusercontent.com/validexis/Xion/main/installmain.sh)
```

## ***Manual Installation***

```bash
# Come up with the name of your node and replace it instead <your_moniker>
MONIKER=<your_moniker>
```

<pre class="language-bash"><code class="lang-bash"># Download binary files
cd $HOME
rm -rf xion
git clone https://github.com/burnt-labs/xion.git
cd xion
git checkout v14.0.0

make install
<strong>xiond version
</strong></code></pre>

<pre class="language-bash"><code class="lang-bash"># Initialize the node
xiond init $MONIKER --chain-id=xion-mainnet-1

xiond config set client chain-id xion-mainnet-1
xiond config set client keyring-backend file
<strong>xiond config set client node tcp://localhost:26657
</strong></code></pre>

```bash
# Download genesis and addrbook
curl -Ls https://ss.xion.nodestake.org/genesis.json > $HOME/.xiond/config/genesis.json 
curl -Ls https://ss.xion.nodestake.org/addrbook.json > $HOME/.xiond/config/addrbook.json
```

***Setup config***

<pre class="language-bash"><code class="lang-bash"># Set seeds and peers
seed="6df32f0e5142861ea9ddfdde0fdb50698bceb760@rpc.xion.nodestake.org:666"
sed -i.bak -e "s/^seed *=.*/seed = \"$seed\"/" ~/.xiond/config/config.toml
peers=$(curl -s https://ss.xion.nodestake.org/peers.txt)
sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" ~/.xiond/config/config.toml
  
# Set minimum gas price, enable prometheus and disable indexing
sed -i -e "s|^minimum-gas-prices *=.*|minimum-gas-prices = \"0.0001uxion\"|" $HOME/.xiond/config/app.toml
<strong>sed -i -e "s/prometheus = false/prometheus = true/" $HOME/.xiond/config/config.toml
</strong>sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.xiond/config/config.toml

# Config pruning
sed -i -e "s/^pruning *=.*/pruning = \"custom\"/" $HOME/.xiond/config/app.toml 
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"100\"/" $HOME/.xiond/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"19\"/" $HOME/.xiond/config/app.toml

</code></pre>

#### ***Set custom ports***

You can change value CUSTOM\_PORT=162 To any other ports

```bash
CUSTOM_PORT=162
```

```bash
sed -i -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${CUSTOM_PORT}58\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${CUSTOM_PORT}57\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${CUSTOM_PORT}60\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${CUSTOM_PORT}56\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${CUSTOM_PORT}66\"%" $HOME/.xiond/config/config.toml
sed -i -e "s%^address = \"tcp://localhost:1317\"%address = \"tcp://localhost:${CUSTOM_PORT}17\"%; s%^address = \":8080\"%address = \":${CUSTOM_PORT}80\"%; s%^address = \"localhost:9090\"%address = \"localhost:${CUSTOM_PORT}90\"%; s%^address = \"localhost:9091\"%address = \"localhost:${CUSTOM_PORT}91\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${CUSTOM_PORT}45\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${CUSTOM_PORT}46\"%" $HOME/.xiond/config/app.toml
```

```bash
#Set config with new custom port
xiond config set client node tcp://localhost:${CUSTOM_PORT}57
```

```bash
# Create service file
sudo tee /etc/systemd/system/xiond.service > /dev/null <<EOF
[Unit]
Description=xiond Daemon
After=network-online.target

[Service]
User=$USER
ExecStart=$(which xiond) start
Restart=always
RestartSec=3
LimitNOFILE=65535

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

```bash
# Download latest chain snapshot
SNAP_NAME=$(curl -s https://ss.xion.nodestake.org/ | egrep -o ">20.*\.tar.lz4" | tr -d ">")
curl -o - -L https://ss.xion.nodestake.org/${SNAP_NAME}  | lz4 -c -d - | tar -x -C $HOME/.xiond
```

<pre class="language-bash"><code class="lang-bash"># Enable and start service
sudo systemctl daemon-reload
sudo systemctl enable xiond
<strong>sudo systemctl restart xiond &#x26;&#x26; sudo journalctl -u xiond -fo cat
</strong></code></pre>

```bash
# Check status
xiond status 2>&1 | jq

#"catching_up": false means that the node is synchronized, we are waiting for complete synchronization
```

***Wallets***

```bash
# Create wallet
xiond keys add wallet
```

The wallet has been created. In the last line there will be a phrase that must be written down

```bash
# If the wallet was already there, restore it
xiond keys add wallet --recover

# Insert the seed phrase from your wallet
# If everything is correct, you will see your wallet data
```

***Validator***

Do not forget to create a profile on <https://keybase.io/> and set a profile photo there that will be imported by key and used for your validators.

```bash
xiond tx staking create-validator \
--amount 1000000uxion \
--pubkey $(xiond tendermint show-validator) \
--moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id xion-mainnet-1 \
--commission-rate 0.05 \
--commission-max-rate 0.20 \
--commission-max-change-rate 0.05 \
--min-self-delegation 1 \
--from wallet \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0uxion \
-y
```

**!!! Save priv\_validator\_key.json which is located in /root/.zetacored/config**


# 🛠️  Upgrade

***Automatic upgrade***

```bash
source <(curl -s https://raw.githubusercontent.com/validexis/Xion/main/upgrademain.sh)
```

***Manual upgrade***

```bash
cd $HOME
rm -rf xion
git clone https://github.com/burnt-labs/xion.git
cd xion
git checkout v14.0.0

make install

sudo systemctl restart xiond && sudo journalctl -u xiond -fo cat
```


# 📜  Useful Commands

***Get validator info***

```bash
xiond status 2>&1 | jq .ValidatorInfo
```

***Get sync info***

```bash
xiond status 2>&1 | jq
```

### *Key management* <a href="#key-management" id="key-management"></a>

***Add new key***

```bash
xiond keys add wallet
```

***Recover existing key***

```bash
xiond keys add wallet --recover
```

***List all keys***

```bash
xiond keys list
```

***Delete key***

```bash
xiond keys delete wallet
```

***Query wallet balance***

```bash
xiond q bank balances $(xiond keys show wallet -a)
```

### *Validator management* <a href="#validator-management" id="validator-management"></a>

Please make sure you have adjusted **moniker**, **identity**, **details** and **website** to match your values.

***Create new validator***

```bash
xiond tx staking create-validator \
--amount 1000000uxion \
--pubkey $(xiond tendermint show-validator) \
--moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id xion-mainnet-1 \
--commission-rate 0.05 \
--commission-max-rate 0.20 \
--commission-max-change-rate 0.05 \
--min-self-delegation 1 \
--from wallet \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0uxion \
-y
```

***Edit existing validator***

```bash
xiond tx staking edit-validator \
--new-moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id xion-mainnet-1 \
--commission-rate 0.05 \
--from wallet \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0uxion \
-y
```

***Unjail validator***

```bash
xiond tx slashing unjail --from wallet --chain-id xion-mainnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0uxion -y
```

***Jail reason***

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

***View validator details***

```bash
xiond q staking validator $(xiond keys show wallet --bech val -a)
```

### &#x20;*Token management* <a href="#token-management" id="token-management"></a>

***Withdraw rewards from all validators***

```bash
xiond tx distribution withdraw-all-rewards --from wallet --chain-id xion-mainnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0uxion -y
```

***Withdraw commission and rewards from your validator***

```bash
xiond tx distribution withdraw-rewards $(xiond keys show wallet --bech val -a) --commission --from wallet --chain-id xion-mainnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0uxion -y
```

***Delegate tokens to yourself***

```bash
xiond tx staking delegate $(xiond keys show wallet --bech val -a) 1000000uxion --from wallet --chain-id xion-mainnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0uxion -y
```

***Delegate tokens to validator***

```bash
xiond tx staking delegate <TO_VALOPER_ADDRESS> 1000000uxion --from wallet --chain-id xion-mainnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0uxion -y
```

***Redelegate tokens to another validator***

```bash
xiond tx staking redelegate $(xiond keys show wallet --bech val -a) <TO_VALOPER_ADDRESS> 1000000uxion --from wallet --chain-id xion-mainnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0uxion -y
```

***Unbond tokens from your validator***

```bash
xiond tx staking unbond $(xiond keys show wallet --bech val -a) 1000000uxion --from wallet --chain-id xion-mainnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0uxion -y
```

***Send tokens to the wallet***

```bash
xiond tx bank send wallet <TO_WALLET_ADDRESS> 1000000uxion --from wallet --chain-id xion-mainnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0uxion -y
```

***Remove node***

Please, before proceeding with the next step! All chain data will be lost! Make sure you have backed up your **priv\_validator\_key.json**!

```bash
cd $HOME
sudo systemctl stop xiond
sudo systemctl disable xiond
sudo rm /etc/systemd/system/xiond
sudo systemctl daemon-reload
rm -f $(which xiond)
rm -rf $HOME/.xiond
rm -rf $HOME/xion
```

### *Service Management* <a href="#service-management" id="service-management"></a>

***Reload service configuration***

```bash
sudo systemctl daemon-reload
```

***Enable service***

```bash
sudo systemctl enable xiond
```

***Disable service***

```bash
sudo systemctl disable xiond
```

***Start service***

```bash
sudo systemctl start xiond
```

***Stop service***

```bash
sudo systemctl stop xiond
```

***Restart service***

```bash
sudo systemctl restart xiond
```

***Check service status***

```bash
sudo systemctl status xiond
```

***Check service logs***

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


# Nibiru

Nibiru Chain (NIBI) is a Layer 1 blockchain and smart contract ecosystem designed to provide high-performance and high-security blockchain services.

[**WebSite**](https://nibiru.fi/)

[**GitHub**](https://github.com/NibiruChain)

[**Discord**](https://discord.com/invite/nibirufi)

[**Twitter**](https://x.com/NibiruChain)


# ⚙️  Installation

Chain ID: cataclysm-1 | Node Version: v2.11.0 | Custom Port: 163

Recommended Hardware:

<table><thead><tr><th>Node Type</th><th width="184">CPU</th><th>RAM</th><th>Storage</th></tr></thead><tbody><tr><td>Mainnet</td><td>8</td><td>16GB</td><td>250GB </td></tr></tbody></table>

&#x20;***Install dependencies***

```bash
# Update the repositories
sudo apt update && sudo apt upgrade -y
```

```bash
# Install developer packages
sudo apt install -y curl git jq lz4 build-essential
```

```bash
# Install Go
sudo rm -rf /usr/local/go
curl -Ls https://go.dev/dl/go1.24.6.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)
echo "export PATH=$PATH:/usr/local/go/bin:/usr/local/bin:$HOME/go/bin" >> $HOME/.bash_profile
source $HOME/.bash_profile
go version

# go version go1.23.0 linux/amd64
```

## ***Automatic Installation***

```bash
source <(curl -s https://raw.githubusercontent.com/validexisinfra/Nibiru/main/installmain.sh)
```

## ***Manual Installation***

```bash
# Come up with the name of your node and replace it instead <your_moniker>
MONIKER=<your_moniker>
```

```bash
# Download binary files
cd $HOME && mkdir -p go/bin/
git clone https://github.com/NibiruChain/nibiru/
cd $HOME/nibiru/
git fetch --all
git checkout v2.11.0
make install
```

```bash
# Set node configuration
nibid config chain-id cataclysm-1
nibid config keyring-backend file
nibid config node tcp://localhost:26657

# Initialize the node
nibid init $MONIKER --chain-id cataclysm-1 --home $HOME/.nibid
```

```bash
# Download genesis and addrbook
curl -Ls https://ss.nibiru.nodestake.org/genesis.json > $HOME/.nibid/config/genesis.json 
curl -Ls https://ss.nibiru.nodestake.org/addrbook.json > $HOME/.nibid/config/addrbook.json
```

***Setup config***

```bash
# Set seeds and peers
seed="9a9e6eab3a83b670f7f20c3f56cd0e5f7f81f46c@rpc.nibiru.nodestake.org:666"
sed -i.bak -e "s/^seed *=.*/seed = \"$seed\"/" $HOME/.nibid/config/config.toml
peers=$(curl -s https://ss.nibiru.nodestake.org/peers.txt)
sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.nibid/config/config.toml

# Set minimum gas price, enable prometheus and disable indexing
sed -i.bak -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.025unibi\"/;" $HOME/.nibid/config/app.toml
sed -i -e "s/prometheus = false/prometheus = true/" $HOME/.nibid/config/config.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.nibid/config/config.toml

# Config pruning
sed -i \
  -e 's|^pruning *=.*|pruning = "custom"|' \
  -e 's|^pruning-keep-recent *=.*|pruning-keep-recent = "100"|' \
  -e 's|^pruning-keep-every *=.*|pruning-keep-every = "0"|' \
  -e 's|^pruning-interval *=.*|pruning-interval = "19"|' \
  $HOME/.nibid/config/app.toml
```

#### ***Set custom ports***

You can change value CUSTOM\_PORT=163 To any other ports

```bash
CUSTOM_PORT=163
```

```bash
sed -i -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${CUSTOM_PORT}58\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${CUSTOM_PORT}57\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${CUSTOM_PORT}60\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${CUSTOM_PORT}56\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${CUSTOM_PORT}66\"%" $HOME/.nibid/config/config.toml
sed -i -e "s%^address = \"tcp://localhost:1317\"%address = \"tcp://localhost:${CUSTOM_PORT}17\"%; s%^address = \":8080\"%address = \":${CUSTOM_PORT}80\"%; s%^address = \"localhost:9090\"%address = \"localhost:${CUSTOM_PORT}90\"%; s%^address = \"localhost:9091\"%address = \"localhost:${CUSTOM_PORT}91\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${CUSTOM_PORT}45\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${CUSTOM_PORT}46\"%" $HOME/.nibid/config/app.toml
```

<pre class="language-bash"><code class="lang-bash">#Set config with new custom port
<strong>nibid config node tcp://localhost:${CUSTOM_PORT}57
</strong></code></pre>

```bash
# Create service file
sudo tee /etc/systemd/system/nibid.service > /dev/null <<EOF
[Unit]
Description=nibid Daemon
After=network-online.target

[Service]
User=$USER
ExecStart=$(which nibid) start
Restart=always
RestartSec=3
LimitNOFILE=65535

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

```bash
# Download latest chain snapshot
mkdir -p "$HOME/.nibid/data"
curl -L https://snapshots3.stakevillage.net/cataclysm-1/snapshot_latest.tar.lz4 | tar -Ilz4 -xf - -C $HOME/.nibid/data
```

<pre class="language-bash"><code class="lang-bash"># Enable and start service
sudo systemctl daemon-reload
sudo systemctl enable nibid
<strong>sudo systemctl restart nibid &#x26;&#x26; sudo journalctl -u nibid -fo cat
</strong></code></pre>

```bash
# Check status
nibid status 2>&1 | jq .SyncInfo

#"catching_up": false means that the node is synchronized, we are waiting for complete synchronization
```

***Wallets***

```bash
# Create wallet
nibid keys add wallet
```

The wallet has been created. In the last line there will be a phrase that must be written down

```bash
# If the wallet was already there, restore it
nibid keys add wallet --recover

# Insert the seed phrase from your wallet
# If everything is correct, you will see your wallet data
```

***Validator***

Do not forget to create a profile on <https://keybase.io/> and set a profile photo there that will be imported by key and used for your validators.

```bash
nibid tx staking create-validator \
--amount=1000000unibi \
--pubkey=$(nibid tendermint show-validator) \
--moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id=cataclysm-1 \
--commission-rate="0.05" \
--commission-max-rate="0.2" \
--commission-max-change-rate="0.1" \
--min-self-delegation="1" \
--from wallet \
--fees 5000unibi \
-y
```

**!!! Save priv\_validator\_key.json which is located in /root/.nibid/config**


# 🛠️  Upgrade

***Automatic upgrade***

```bash
source <(curl -s https://raw.githubusercontent.com/validexisinfra/Nibiru/main/upgrademain.sh)
```

***Manual upgrade***

<pre class="language-bash"><code class="lang-bash">cd $HOME
rm -rf nibiru
git clone https://github.com/NibiruChain/nibiru.git
cd nibiru
git checkout v2.11.0
make install

<strong>sudo systemctl restart nibid &#x26;&#x26; sudo journalctl -fu nibid -o cat
</strong></code></pre>


# 📜  Useful Commands

***Get validator info***

```bash
nibid status 2>&1 | jq .ValidatorInfo
```

***Get sync info***

```bash
nibid status 2>&1 | jq .SyncInfo
```

### *Key management* <a href="#key-management" id="key-management"></a>

***Add new key***

```bash
nibid keys add wallet
```

***Recover existing key***

```bash
nibid keys add wallet --recover
```

***List all keys***

```bash
nibid keys list
```

***Delete key***

```bash
nibid keys delete wallet
```

***Query wallet balance***

```bash
nibid q bank balances $(nibid keys show wallet -a)
```

### *Validator management* <a href="#validator-management" id="validator-management"></a>

Please make sure you have adjusted **moniker**, **identity**, **details** and **website** to match your values.

***Create new validator***

```bash
nibid tx staking create-validator \
--amount 10000000unibi \
--pubkey $(nibid tendermint show-validator) \
--moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id cataclysm-1 \
--commission-rate 0.1 \
--commission-max-rate 0.20 \
--commission-max-change-rate 0.01 \
--min-self-delegation 1 \
--from wallet \
--fees 5000unibi \
-y
```

***Edit existing validator***

```bash
nibid tx staking edit-validator \
--new-moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id cataclysm-1 \
--commission-rate 0.05 \
--from wallet \
--fees 5000unibi \
-y
```

***Unjail validator***

```bash
nibid tx slashing unjail --from wallet --chain-id cataclysm-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025unibi -y
```

***Jail reason***

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

***View validator details***

```bash
nibid q staking validator $(nibid keys show wallet --bech val -a)
```

### &#x20;*Token management* <a href="#token-management" id="token-management"></a>

***Withdraw rewards from all validators***

```bash
nibid tx distribution withdraw-all-rewards --from wallet --chain-id cataclysm-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025unibi -y
```

***Withdraw commission and rewards from your validator***

```bash
nibid tx distribution withdraw-rewards $(nibid keys show wallet --bech val -a) --commission --from wallet --chain-id cataclysm-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025unibi -y
```

***Delegate tokens to yourself***

```bash
nibid tx staking delegate $(nibid keys show wallet --bech val -a) 1000000unibi --from wallet --chain-id cataclysm-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025unibi -y
```

***Delegate tokens to validator***

```bash
nibid tx staking delegate <TO_VALOPER_ADDRESS> 1000000unibi --from wallet --chain-id cataclysm-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025unibi -y
```

***Redelegate tokens to another validator***

```bash
nibid tx staking redelegate $(nibid keys show wallet --bech val -a) <TO_VALOPER_ADDRESS> 1000000unibi --from wallet --chain-id cataclysm-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025unibi -y
```

***Unbond tokens from your validator***

```bash
nibid tx staking unbond $(nibid keys show wallet --bech val -a) 1000000unibi --from wallet --chain-id cataclysm-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025unibi -y
```

***Send tokens to the wallet***

```bash
nibid tx bank send wallet <TO_WALLET_ADDRESS> 1000000unibi --from wallet --chain-id cataclysm-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025unibi -y
```

***Remove node***

Please, before proceeding with the next step! All chain data will be lost! Make sure you have backed up your **priv\_validator\_key.json**!

<pre class="language-bash"><code class="lang-bash"><strong>cd $HOME
</strong>sudo systemctl stop nibid
sudo systemctl disable nibid
sudo rm /etc/systemd/system/nibid.service
sudo systemctl daemon-reload
rm -f $(which nibid)
rm -rf $HOME/.nibid
rm -rf $HOME/nibiru
</code></pre>

### *Service Management* <a href="#service-management" id="service-management"></a>

***Reload service configuration***

```bash
sudo systemctl daemon-reload
```

***Enable service***

```bash
sudo systemctl enable nibid
```

***Disable service***

```bash
sudo systemctl disable nibid
```

***Start service***

```bash
sudo systemctl start nibid
```

***Stop service***

```bash
sudo systemctl stop nibid
```

***Restart service***

```bash
sudo systemctl restart nibid
```

***Check service status***

```bash
sudo systemctl status nibid
```

***Check service logs***

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


# Kyve

KYVE, the Web3 data lake solution, is a protocol that enables data providers to standardize, validate, and permanently store blockchain data streams.

[**WebSite**](https://www.kyve.network/)

[**GitHub**](https://github.com/KYVENetwork)

[**Discord**](https://discord.com/invite/PATvZvEmxF)

[**Twitter**](https://www.kyve.network/)


# ⚙️  Installation

Chain ID: kyve-1 | Node Version: v2.2.0 | Custom Port: 164

Recommended Hardware:

<table><thead><tr><th>Node Type</th><th width="184">CPU</th><th>RAM</th><th>Storage</th></tr></thead><tbody><tr><td>Mainnet</td><td>8</td><td>16GB</td><td><p></p><p>250GB </p></td></tr></tbody></table>

***Install dependencies***

```bash
# Update the repositories
sudo apt update && sudo apt upgrade -y
```

```bash
# Install developer packages
sudo apt install -y curl git jq lz4 build-essential
```

```bash
# Install Go
sudo rm -rf /usr/local/go
curl -Ls https://go.dev/dl/go1.24.6.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)
echo "export PATH=$PATH:/usr/local/go/bin:/usr/local/bin:$HOME/go/bin" >> $HOME/.bash_profile
source $HOME/.bash_profile
go version

# go version go1.24.6 linux/amd64
```

## ***Automatic Installation***

```bash
source <(curl -s https://raw.githubusercontent.com/validexisinfra/Kyve/main/installmain.sh)
```

## ***Manual Installation***

```bash
# Come up with the name of your node and replace it instead <your_moniker>
MONIKER=<your_moniker>
```

```bash
# Download binary files
cd $HOME && mkdir -p go/bin/
wget -O kyved https://github.com/KYVENetwork/chain/releases/download/v2.2.0/kyved_mainnet_linux_amd64
chmod +x kyved
sudo mv kyved $HOME/go/bin/kyved

kyved version
```

```bash
# Set node configuration
kyved config set client chain-id kyve-1
kyved config set client keyring-backend file
kyved config set client node tcp://localhost:26657

# Initialize the node
kyved init $MONIKER --chain-id=kyve-1
```

```bash
# Download genesis and addrbook
wget -L -O $HOME/.kyve/config/genesis.json https://server-1.stavr.tech/Mainnet/Kyve/genesis.json
wget -O $HOME/.kyve/config/addrbook.json "https://server-1.stavr.tech/Mainnet/Kyve/addrbook.json"
```

***Setup config***

```bash
# Set seeds and peers
sed -i -e "s/^filter_peers *=.*/filter_peers = \"true\"/" $HOME/.kyve/config/config.toml
external_address=$(wget -qO- eth0.me) 
sed -i.bak -e "s/^external_address *=.*/external_address = \"$external_address:26656\"/" $HOME/.kyve/config/config.toml
peers=""
sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.kyve/config/config.toml
seeds=""

# Set minimum gas price, enable prometheus and disable indexing
sed -i.bak -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.0ukyve\"/;" ~/.kyve/config/app.toml
sed -i -e "s/prometheus = false/prometheus = true/" $HOME/.kyve/config/config.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.kyve/config/config.toml

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

#### ***Set custom ports***

You can change value CUSTOM\_PORT=164 To any other ports

```bash
CUSTOM_PORT=164
```

```bash
sed -i -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${CUSTOM_PORT}58\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${CUSTOM_PORT}57\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${CUSTOM_PORT}60\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${CUSTOM_PORT}56\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${CUSTOM_PORT}66\"%" $HOME/.kyve/config/config.toml
sed -i -e "s%^address = \"tcp://localhost:1317\"%address = \"tcp://localhost:${CUSTOM_PORT}17\"%; s%^address = \":8080\"%address = \":${CUSTOM_PORT}80\"%; s%^address = \"localhost:9090\"%address = \"localhost:${CUSTOM_PORT}90\"%; s%^address = \"localhost:9091\"%address = \"localhost:${CUSTOM_PORT}91\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${CUSTOM_PORT}45\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${CUSTOM_PORT}46\"%" $HOME/.kyve/config/app.toml
```

```bash
#Set config with new custom port
kyved config set client node tcp://localhost:${CUSTOM_PORT}57
```

```bash
# Create service file
sudo tee /etc/systemd/system/kyved.service > /dev/null <<EOF
[Unit]
Description=kyve
After=network-online.target

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

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

```bash
# Download latest chain snapshot
LATEST_SNAPSHOT=$(curl -s https://server-1.stavr.tech/Mainnet/Kyve/ | grep -oE 'kyve-snap-[0-9]+\.tar\.lz4' | while read SNAPSHOT; do HEIGHT=$(curl -s "https://server-1.stavr.tech/Mainnet/Kyve/${SNAPSHOT%.tar.lz4}-info.txt" | awk '/Block height:/ {print $3}'); echo "$SNAPSHOT $HEIGHT"; done | sort -k2 -nr | head -n 1 | awk '{print $1}')
curl -o - -L https://server-1.stavr.tech/Mainnet/Kyve/$LATEST_SNAPSHOT | lz4 -c -d - | tar -x -C $HOME/.kyve
```

```bash
# Enable and start service
sudo systemctl daemon-reload
sudo systemctl enable kyved
sudo systemctl restart kyved && sudo journalctl -u kyved -fo cat
```

```bash
# Check status
kyved status 2>&1 | jq

#"catching_up": false means that the node is synchronized, we are waiting for complete synchronization
```

***Wallets***

```bash
# Create wallet
kyved keys add wallet
```

The wallet has been created. In the last line there will be a phrase that must be written down

```bash
# If the wallet was already there, restore it
kyved keys add wallet --recover

# Insert the seed phrase from your wallet
# If everything is correct, you will see your wallet data
```

***Validator***

Do not forget to create a profile on <https://keybase.io/> and set a profile photo there that will be imported by key and used for your validators.

```bash
kyved tx staking create-validator \
--amount 10000000000ukyve \
--pubkey=$(kyved tendermint show-validator) \
--moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id kyve-1 \
--commission-rate="0.10" \
--commission-max-rate="0.2" \
--commission-max-change-rate="0.05" \
--min-self-delegation="1" \
--from wallet \
--fees 5000unibi \
-y
```

**!!! Save priv\_validator\_key.json which is located in /root/.kyve/config**


# 🛠️  Upgrade

***Automatic upgrade***

```bash
source <(curl -s https://raw.githubusercontent.com/validexisinfra/Kyve/main/upgrademain.sh)
```

***Manual upgrade***

```bash
cd $HOME
wget -O kyved https://github.com/KYVENetwork/chain/releases/download/v2.2.0/kyved_mainnet_linux_amd64
chmod +x kyved
mv kyved $(which kyved)
kyved version

sudo systemctl restart kyved && sudo journalctl -fu kyved -o cat
```


# 📜  Useful Commands

***Get validator info***

```bash
kyved status 2>&1 | jq .ValidatorInfo
```

***Get sync info***

```bash
kyved status 2>&1 | jq
```

### *Key management* <a href="#key-management" id="key-management"></a>

***Add new key***

```bash
kyved keys add wallet
```

***Recover existing key***

```bash
kyved keys add wallet --recover
```

***List all keys***

```bash
kyved keys list
```

***Delete key***

```bash
kyved keys delete wallet
```

***Query wallet balance***

```bash
kyved q bank balances $(kyved keys show wallet -a)
```

### *Validator management* <a href="#validator-management" id="validator-management"></a>

Please make sure you have adjusted **moniker**, **identity**, **details** and **website** to match your values.

***Create new validator***

```bash
kyved tx staking create-validator \
--amount 10000000000ukyve \
--pubkey=$(kyved tendermint show-validator) \
--moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id kyve-1 \
--commission-rate="0.10" \
--commission-max-rate="0.2" \
--commission-max-change-rate="0.05" \
--min-self-delegation="1" \
--from wallet \
--gas 51000000 \
--fees 1020000ukyve \
-y
```

***Edit existing validator***

```bash
kyved tx staking edit-validator \
--new-moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id kyve-1 \
--commission-rate 0.05 \
--from wallet \
--gas 350000 -y
```

***Unjail validator***

```bash
kyved tx slashing unjail --from wallet --chain-id kyve-1 --gas 350000 -y
```

***Jail reason***

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

***View validator details***

```bash
kyved q staking validator $(kyved keys show wallet --bech val -a)
```

### &#x20;*Token management* <a href="#token-management" id="token-management"></a>

***Withdraw rewards from all validators***

```bash
kyved tx distribution withdraw-all-rewards --from wallet --chain-id kyve-1 --gas 350000 -y
```

***Withdraw commission and rewards from your validator***

```bash
kyved tx distribution withdraw-rewards $(kyved keys show wallet --bech val -a) --commission --from wallet --chain-id kyve-1 --gas 350000 -y
```

***Delegate tokens to yourself***

```bash
kyved tx staking delegate $(kyved keys show wallet --bech val -a) 1000000ukyve --from wallet --chain-id kyve-1 --gas 350000 -y
```

***Delegate tokens to validator***

```bash
kyved tx staking delegate <TO_VALOPER_ADDRESS> 1000000ukyve --from wallet --chain-id cataclysm-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.025unibi -y
```

***Redelegate tokens to another validator***

```bash
kyved tx staking redelegate $(kyved keys show wallet --bech val -a) <TO_VALOPER_ADDRESS> 1000000ukyve --from wallet --chain-id kyve-1 --gas 350000 -y
```

***Unbond tokens from your validator***

<pre class="language-bash"><code class="lang-bash"><strong>kyved tx staking unbond $(kyved keys show wallet --bech val -a) 1000000ukyve --from wallet --chain-id kyve-1 --gas 350000 -y
</strong></code></pre>

***Send tokens to the wallet***

```bash
kyved tx bank send wallet <TO_WALLET_ADDRESS> 1000000ukyve --from wallet --chain-id kyve-1 --gas 350000 -y
```

***Remove node***

Please, before proceeding with the next step! All chain data will be lost! Make sure you have backed up your **priv\_validator\_key.json**!

```bash
sudo systemctl stop kyved
sudo systemctl disable kyved
rm /etc/systemd/system/kyved.service
sudo systemctl daemon-reload
cd $HOME
rm -rf chain
rm -rf .kyve
rm -rf $(which kyved)
```

### *Service Management* <a href="#service-management" id="service-management"></a>

***Reload service configuration***

```bash
sudo systemctl daemon-reload
```

***Enable service***

```bash
sudo systemctl enable kyved
```

***Disable service***

```bash
sudo systemctl disable kyved
```

***Start service***

```bash
sudo systemctl start kyved
```

***Stop service***

```bash
sudo systemctl stop kyved
```

***Restart service***

```bash
sudo systemctl restart kyved
```

***Check service status***

```bash
sudo systemctl status kyved
```

***Check service logs***

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


# Juno

Juno is the permissionless neutral home of CosmWasm interoperable smart contracts and the InterWasm DAO. The ecosystem is pioneering CosmWasm development and adoption.

[**WebSite**](https://junonetwork.io/)

[**GitHub**](https://github.com/CosmosContracts)

[**Discord**](https://discord.com/invite/caEBtA4QDb)

[**Twitter**](https://x.com/JunoNetwork)


# ⚙️  Installation

Chain ID: juno-1 | Node Version: v29.0.0 | Custom Port: 165

Recommended Hardware:

<table><thead><tr><th>Node Type</th><th width="184">CPU</th><th>RAM</th><th>Storage</th></tr></thead><tbody><tr><td>Mainnet</td><td>12</td><td>32GB</td><td>450GB </td></tr></tbody></table>

***Install dependencies***

```bash
# Update the repositories
sudo apt update && sudo apt upgrade -y
```

```bash
# Install developer packages
sudo apt install -y curl git jq lz4 build-essential
```

```bash
# Install Go
sudo rm -rf /usr/local/go
curl -Ls https://go.dev/dl/go1.23.6.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)
echo "export PATH=$PATH:/usr/local/go/bin:/usr/local/bin:$HOME/go/bin" >> $HOME/.bash_profile
source $HOME/.bash_profile
go version

# go version go1.23.0 linux/amd64
```

## ***Automatic Installation***

```bash
source <(curl -s https://raw.githubusercontent.com/validexisinfra/Juno/main/installmain.sh)
```

## ***Manual Installation***

```bash
# Come up with the name of your node and replace it instead <your_moniker>
MONIKER=<your_moniker>
```

<pre class="language-bash"><code class="lang-bash"># Download binary files
<strong>cd $HOME
</strong>rm -rf juno
git clone https://github.com/CosmosContracts/juno juno
cd juno
git checkout v29.0.0
make install
</code></pre>

<pre class="language-bash"><code class="lang-bash"># Set node configuration
<strong>junod config set client chain-id juno-1
</strong>junod config set client keyring-backend file
junod config set client node tcp://localhost:26657

# Initialize the node
junod init $MONIKER --chain-id=juno-1
</code></pre>

```bash
# Download genesis and addrbook
wget -L -O $HOME/.juno/config/genesis.json https://server-1.stavr.tech/Mainnet/Juno/genesis.json
wget -O $HOME/.juno/config/addrbook.json "https://server-1.stavr.tech/Mainnet/Juno/addrbook.json"
```

***Setup config***

```bash
# Set seeds and peers
sed -i -e "s/^filter_peers *=.*/filter_peers = \"true\"/" $HOME/.juno/config/config.toml
external_address=$(wget -qO- eth0.me) 
sed -i.bak -e "s/^external_address *=.*/external_address = \"$external_address:26656\"/" $HOME/.juno/config/config.toml
peers=""
sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.juno/config/config.toml
seeds=""

# Set minimum gas price, enable prometheus and disable indexing
sed -i.bak -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.025ujuno\"/;" $HOME/.juno/config/app.toml
sed -i -e "s/prometheus = false/prometheus = true/" $HOME/.juno/config/config.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.juno/config/config.toml

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

#### ***Set custom ports***

You can change value CUSTOM\_PORT=165 To any other ports

```bash
CUSTOM_PORT=165
```

```bash
sed -i -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${CUSTOM_PORT}58\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${CUSTOM_PORT}57\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${CUSTOM_PORT}60\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${CUSTOM_PORT}56\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${CUSTOM_PORT}66\"%" $HOME/.juno/config/config.toml
sed -i -e "s%^address = \"tcp://localhost:1317\"%address = \"tcp://localhost:${CUSTOM_PORT}17\"%; s%^address = \":8080\"%address = \":${CUSTOM_PORT}80\"%; s%^address = \"localhost:9090\"%address = \"localhost:${CUSTOM_PORT}90\"%; s%^address = \"localhost:9091\"%address = \"localhost:${CUSTOM_PORT}91\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${CUSTOM_PORT}45\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${CUSTOM_PORT}46\"%" $HOME/.juno/config/app.toml
```

<pre class="language-bash"><code class="lang-bash">#Set config with new custom port
<strong>junod config node tcp://localhost:${CUSTOM_PORT}57
</strong></code></pre>

```bash
# Create service file
sudo tee /etc/systemd/system/junod.service > /dev/null <<EOF
[Unit]
Description=juno
After=network-online.target

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

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

```bash
# Download latest chain snapshot
LATEST_SNAPSHOT=$(curl -s https://server-1.stavr.tech/Mainnet/Juno/ | grep -oE 'juno-snap-[0-9]+\.tar\.lz4' | while read SNAPSHOT; do HEIGHT=$(curl -s "https://server-1.stavr.tech/Mainnet/Juno/${SNAPSHOT%.tar.lz4}-info.txt" | awk '/Block height:/ {print $3}'); echo "$SNAPSHOT $HEIGHT"; done | sort -k2 -nr | head -n 1 | awk '{print $1}')
curl -o - -L https://server-1.stavr.tech/Mainnet/Juno/$LATEST_SNAPSHOT | lz4 -c -d - | tar -x -C $HOME/.juno
```

<pre class="language-bash"><code class="lang-bash"># Enable and start service
sudo systemctl daemon-reload
sudo systemctl enable junod
<strong>sudo systemctl restart junod &#x26;&#x26; sudo journalctl -u junod -fo cat
</strong></code></pre>

```bash
# Check status
junod status 2>&1 | jq .SyncInfo

#"catching_up": false means that the node is synchronized, we are waiting for complete synchronization
```

***Wallets***

```bash
# Create wallet
junod keys add wallet
```

The wallet has been created. In the last line there will be a phrase that must be written down

```bash
# If the wallet was already there, restore it
junod keys add wallet --recover

# Insert the seed phrase from your wallet
# If everything is correct, you will see your wallet data
```

***Validator***

Do not forget to create a profile on <https://keybase.io/> and set a profile photo there that will be imported by key and used for your validators.

```bash
junod tx staking create-validator \
--amount 1000000ujuno \
--pubkey=$(junod tendermint show-validator) \
--moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id juno-1 \
--commission-rate="0.1" \
--commission-max-rate="0.1" \
--commission-max-change-rate="0.1" \
--min-self-delegation="1" \
--from wallet \
--gas 350000 \
-y
```

**!!! Save priv\_validator\_key.json which is located in /root/.juno/config**


# 🛠️  Upgrade

***Automatic upgrade***

```bash
source <(curl -s https://raw.githubusercontent.com/validexisinfra/Juno/main/upgrademain.sh)
```

***Manual upgrade***

```bash
cd $HOME/juno
git fetch --tags && git checkout v29.0.0
make install
junod version

sudo systemctl restart junod && sudo journalctl -fu junod -o cat
```


# 📜  Useful Commands

***Get validator info***

```bash
junod status 2>&1 | jq .ValidatorInfo
```

***Get sync info***

```bash
junod status 2>&1 | jq
```

### *Key management* <a href="#key-management" id="key-management"></a>

***Add new key***

```bash
junod keys add wallet
```

***Recover existing key***

```bash
junod keys add wallet --recover
```

***List all keys***

```bash
junod keys list
```

***Delete key***

```bash
junod keys delete wallet
```

***Query wallet balance***

```bash
junod q bank balances $(junod keys show wallet -a)
```

### *Validator management* <a href="#validator-management" id="validator-management"></a>

Please make sure you have adjusted **moniker**, **identity**, **details** and **website** to match your values.

***Create new validator***

```bash
junod tx staking create-validator \
--amount 1000000ujuno \
--pubkey=$(junod tendermint show-validator) \
--moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id juno-1 \
--commission-rate="0.1" \
--commission-max-rate="0.1" \
--commission-max-change-rate="0.05" \
--min-self-delegation="1" \
--from wallet \
--gas 350000 \
--fees 26250ujuno \
-y
```

***Edit existing validator***

```bash
junod tx staking edit-validator \
--new-moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id juno-1 \
--commission-rate 0.1 \
--from wallet \
--gas 350000 \
--fees 26250ujuno \
-y
```

***Unjail validator***

```bash
junod tx slashing unjail --from Wallet_name --chain-id juno-1 --gas 350000 --fees 26250ujuno -y
```

***Jail reason***

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

***View validator details***

```bash
junod q staking validator $(junod keys show wallet --bech val -a)
```

### &#x20;*Token management* <a href="#token-management" id="token-management"></a>

***Withdraw rewards from all validators***

```bash
junod tx distribution withdraw-all-rewards --from wallet --chain-id juno-1 --gas 350000 -y
```

***Withdraw commission and rewards from your validator***

```bash
junod tx distribution withdraw-rewards $(junod keys show wallet --bech val -a) --commission --from wallet --chain-id juno-1 --gas 350000 -y
```

***Delegate tokens to yourself***

```bash
junod tx staking delegate $(junod keys show wallet --bech val -a) 100000000ujuno --from wallet --chain-id juno-1 --gas 350000 -y
```

***Delegate tokens to validator***

```bash
junod tx staking delegate <TO_VALOPER_ADDRESS> 100000000ujuno --from wallet --chain-id juno-1 --gas 350000 -y
```

***Redelegate tokens to another validator***

```bash
junod tx staking redelegate $(junod keys show wallet --bech val -a) <TO_VALOPER_ADDRESS> 100000000ujuno --from wallet --chain-id juno-1 --gas 350000 -y
```

***Unbond tokens from your validator***

```bash
junod tx staking unbond $(junod keys show wallet --bech val -a) 100000000ujuno --from wallet --chain-id juno-1 --gas 350000 -y
```

***Send tokens to the wallet***

```bash
junod tx bank send wallet <TO_WALLET_ADDRESS> 100000000ujuno --from wallet --chain-id juno-1 --gas 350000 -y
```

***Remove node***

Please, before proceeding with the next step! All chain data will be lost! Make sure you have backed up your **priv\_validator\_key.json**!

```bash
sudo systemctl stop junod
sudo systemctl disable junod
rm /etc/systemd/system/junod.service
sudo systemctl daemon-reload
cd $HOME
rm -rf juno
rm -rf .juno
rm -rf $(which junod)
```

### *Service Management* <a href="#service-management" id="service-management"></a>

***Reload service configuration***

```bash
sudo systemctl daemon-reload
```

***Enable service***

```bash
sudo systemctl enable junod
```

***Disable service***

```bash
sudo systemctl disable junod
```

***Start service***

```bash
sudo systemctl start junod
```

***Stop service***

```bash
sudo systemctl stop junod
```

***Restart service***

```bash
sudo systemctl restart junod
```

***Check service status***

```bash
sudo systemctl status junod
```

***Check service logs***

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


# Agoric

Agoric is a secure JavaScript programming platform that makes it easy to create blockchain and smart contracts.

[**WebSite**](https://agoric.com/)

[**GitHub**](https://github.com/Agoric/agoric-sdk)

[**Discord**](https://discord.com/invite/qDW8DRes4s)

[**Twitter**](https://x.com/agoric)


# ⚙️  Installation

Chain ID: agoric-3 | Node Version: v0.35.0-u20.2 | Custom Port: 166

Recommended Hardware:

<table><thead><tr><th>Node Type</th><th width="184">CPU</th><th>RAM</th><th>Storage</th></tr></thead><tbody><tr><td>Mainnet</td><td>8</td><td>16GB</td><td>250GB </td></tr></tbody></table>

***Install dependencies***

```bash
# Update system and install build tools
sudo apt -q update 
sudo apt -qy install curl git jq lz4 build-essential 
sudo apt -qy upgrade
```

## ***Automatic Installation***

```bash
source <(curl -s https://raw.githubusercontent.com/validexisinfra/Agoric/main/installmain.sh)
```

## ***Manual Installation***

```bash
# Install Node.js 20 LTS with Corepack support
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo bash -
sudo apt update
sudo apt install -y nodejs
```

```bash
# Enable Corepack and set Yarn to version 4.9.1
corepack enable
corepack prepare yarn@4.9.1 --activate
yarn --version
```

```bash
# Install Go
sudo rm -rf /usr/local/go
curl -Ls https://go.dev/dl/go1.24.2.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)
echo "export PATH=$PATH:/usr/local/go/bin:/usr/local/bin:$HOME/go/bin" >> $HOME/.bash_profile
source $HOME/.bash_profile
go version
```

```bash
# Come up with the name of your node and replace it instead <your_moniker>
MONIKER=<your_moniker>
```

```bash
# Clone project repository
cd $HOME
rm -rf agoric-upgrade-20
git clone https://github.com/Agoric/agoric-sdk.git agoric-upgrade-21
cd agoric-upgrade-21
git checkout agoric-upgrade-21

# Install and build Agoric Javascript packages
yarn install && yarn build

# Install and build Agoric Cosmos SDK support
(cd packages/cosmic-swingset && make)
```

***Setup config***

```bash
# Set node configuration
agd config chain-id agoric-3
agd config keyring-backend file
agd config node tcp://localhost:26657

# Initialize the node
agd init $MONIKER --chain-id agoric-3

# Download genesis and addrbook
curl -Ls https://snapshots.kjnodes.com/agoric/genesis.json > $HOME/.agoric/config/genesis.json
curl -Ls https://snapshots.kjnodes.com/agoric/addrbook.json > $HOME/.agoric/config/addrbook.json

# Add seeds
sed -i -e "s|^seeds *=.*|seeds = \"400f3d9e30b69e78a7fb891f60d76fa3c73f0ecc@agoric.rpc.kjnodes.com:12759\"|" $HOME/.agoric/config/config.toml

# Set minimum gas price
sed -i -e "s|^minimum-gas-prices *=.*|minimum-gas-prices = \"0.025ubld\"|" $HOME/.agoric/config/app.toml

# Set pruning
sed -i \
  -e 's|^pruning *=.*|pruning = "custom"|' \
  -e 's|^pruning-keep-recent *=.*|pruning-keep-recent = "100"|' \
  -e 's|^pruning-keep-every *=.*|pruning-keep-every = "0"|' \
  -e 's|^pruning-interval *=.*|pruning-interval = "19"|' \
 $HOME/.agoric/config/app.toml
```

{% hint style="info" %}
For Agoric nodes, make sure you set `iavl-disable-fastnode = true` in `app.toml`.
{% endhint %}

#### ***Set custom ports***

You can change value CUSTOM\_PORT=166 To any other ports

```bash
CUSTOM_PORT=166
```

```bash
sed -i -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${CUSTOM_PORT}58\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${CUSTOM_PORT}57\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${CUSTOM_PORT}60\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${CUSTOM_PORT}56\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${CUSTOM_PORT}66\"%" $HOME/.agoric/config/config.toml
sed -i -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${CUSTOM_PORT}17\"%; s%^address = \":8080\"%address = \":${CUSTOM_PORT}80\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${CUSTOM_PORT}90\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${CUSTOM_PORT}91\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${CUSTOM_PORT}45\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${CUSTOM_PORT}46\"%" $HOME/.agoric/config/app.toml
```

```bash
#Set config with new custom port
agd config node tcp://localhost:${CUSTOM_PORT}57
```

```bash
# Create service file
sudo tee /etc/systemd/system/agoricd.service > /dev/null << EOF
[Unit]
Description=Agoric node service
After=network-online.target

[Service]
Type=simple
User=${USER}
ExecStart=$(which agd) start --home ${HOME}/.agoric
Restart=on-failure
RestartSec=10
LimitNOFILE=65535

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

```bash
# Download latest chain snapshot
SOON
```

```bash
# Enable and start service
sudo systemctl daemon-reload
sudo systemctl enable agoricd
sudo systemctl start agoricd && sudo journalctl -u agoricd -f -o cat
```

```bash
# Check status
agd status 2>&1 | jq .SyncInfo

#"catching_up": false means that the node is synchronized, we are waiting for complete synchronization
```

***Wallets***

```bash
# Create wallet
agd keys add wallet
```

The wallet has been created. In the last line there will be a phrase that must be written down

```bash
# If the wallet was already there, restore it
agd keys add wallet --recover

# Insert the seed phrase from your wallet
# If everything is correct, you will see your wallet data
```

***Validator***

Do not forget to create a profile on <https://keybase.io/> and set a profile photo there that will be imported by key and used for your validators.

```bash
agd tx staking create-validator \
--amount=1000000ubld \
--pubkey $(agd tendermint show-validator) \
--moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id=agoric-3 \
--commission-rate="0.1" \
--commission-max-rate="0.20" \
--commission-max-change-rate="0.1" \
--min-self-delegation="1" \
--from wallet \
--gas-adjustment=1.4 -y
```

**!!! Save priv\_validator\_key.json which is located in /root/.agoric/config**


# 🛠️  Upgrade

***Automatic upgrade***

```bash
source <(curl -s https://raw.githubusercontent.com/validexisinfra/Agoric/main/upgrademain.sh)
```

***Manual upgrade***

<pre class="language-bash"><code class="lang-bash">cd $HOME
rm -rf agoric-upgrade-20
git clone https://github.com/Agoric/agoric-sdk.git agoric-upgrade-21
cd agoric-upgrade-21
git checkout agoric-upgrade-21

# Install and build Agoric Javascript packages
<strong>yarn install &#x26;&#x26; yarn build
</strong><strong>
</strong># Install and build Agoric Cosmos SDK support
(cd packages/cosmic-swingset &#x26;&#x26; make)

sudo systemctl restart agoricd &#x26;&#x26; sudo journalctl -fu agoricd -o cat
</code></pre>


# 📜  Useful Commands

***Get validator info***

```bash
agd status 2>&1 | jq .ValidatorInfo
```

***Get sync info***

```bash
agd status 2>&1 | jq .SyncInfo
```

### *Key management* <a href="#key-management" id="key-management"></a>

***Add new key***

```bash
agd keys add wallet
```

***Recover existing key***

```bash
agd keys add wallet --recover
```

***List all keys***

```bash
agd keys list
```

***Delete key***

```bash
agd keys delete wallet
```

***Query wallet balance***

```bash
agd q bank balances $(agd keys show wallet -a)
```

### *Validator management* <a href="#validator-management" id="validator-management"></a>

Please make sure you have adjusted **moniker**, **identity**, **details** and **website** to match your values.

***Create new validator***

```bash
agd tx staking create-validator \
--amount=1000000ubld \
--broadcast-mode=block \
--pubkey=`ag0 tendermint show-validator` \
--moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id=agoric-3 \
--commission-rate="0.1" \
--commission-max-rate="0.20" \
--commission-max-change-rate="0.1" \
--min-self-delegation="1" \
--from wallet \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0.025ubld \
-y
```

***Edit existing validator***

```bash
agd tx staking edit-validator \
--new-moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
---chain-id=agoric-3 \
--commission-rate 0.1 \
--from wallet \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0.025ubld \
-y
```

***Unjail validator***

```bash
agd tx slashing unjail --from wallet --chain-id agoric-3 --gas-adjustment 1.4 --gas auto --gas-prices 0.025ubld -y
```

***Jail reason***

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

***View validator details***

```bash
agd q staking validator $(agd keys show wallet --bech val -a)
```

### &#x20;*Token management* <a href="#token-management" id="token-management"></a>

***Withdraw rewards from all validators***

```bash
agd tx distribution withdraw-all-rewards --from wallet --chain-id agoric-3 --gas-adjustment 1.4 --gas auto --gas-prices 0.025ubld -y
```

***Withdraw commission and rewards from your validator***

```bash
agd tx distribution withdraw-rewards $(agd keys show wallet --bech val -a) --commission --from wallet --chain-id agoric-3 --gas-adjustment 1.4 --gas auto --gas-prices 0.025ubld -y
```

***Delegate tokens to yourself***

```bash
agd tx staking delegate $(agd keys show wallet --bech val -a) 1000000ubld --from wallet --chain-id agoric-3 --gas-adjustment 1.4 --gas auto --gas-prices 0.025ubld -y
```

***Delegate tokens to validator***

```bash
agd tx staking delegate <TO_VALOPER_ADDRESS> 1000000ubld --from wallet --chain-id agoric-3 --gas-adjustment 1.4 --gas auto --gas-prices 0.025ubld -y
```

***Redelegate tokens to another validator***

```bash
agd tx staking redelegate $(agd keys show wallet --bech val -a) <TO_VALOPER_ADDRESS> 1000000ubld --from wallet --chain-id agoric-3 --gas-adjustment 1.4 --gas auto --gas-prices 0.025ubld -y
```

***Unbond tokens from your validator***

```bash
agd tx staking unbond $(agd keys show wallet --bech val -a) 1000000ubld --from wallet --chain-id agoric-3 --gas-adjustment 1.4 --gas auto --gas-prices 0.025ubld -y
```

***Send tokens to the wallet***

```bash
agd tx bank send wallet <TO_WALLET_ADDRESS> 1000000ubld --from wallet --chain-id agoric-3 --gas-adjustment 1.4 --gas auto --gas-prices 0.025ubld -y
```

***Remove node***

Please, before proceeding with the next step! All chain data will be lost! Make sure you have backed up your **priv\_validator\_key.json**!

```bash
cd $HOME
sudo systemctl stop agoricd
sudo systemctl disable agoricd
sudo rm /etc/systemd/system/agoricd.service
sudo systemctl daemon-reload
rm -f $(which agd)
rm -rf $HOME/.agoric
rm -rf $HOME/agoric-sdk
```

### *Service Management* <a href="#service-management" id="service-management"></a>

***Reload service configuration***

```bash
sudo systemctl daemon-reload
```

***Enable service***

```bash
sudo systemctl enable agoricd
```

***Disable service***

```bash
sudo systemctl disable agoricd
```

***Start service***

```bash
sudo systemctl start agoricd
```

***Stop service***

```bash
sudo systemctl stop agoricd
```

***Restart service***

```bash
sudo systemctl restart agoricd
```

***Check service status***

```bash
sudo systemctl status agoricd
```

***Check service logs***

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


# CosmosHub

The Cosmos Hub is the first of many interconnected blockchains powered by the interchain stack: CometBFT, CosmosSDK and IBC. The primary token of the Cosmos Hub is the ATOM.

[**WebSite**](https://cosmos.network/)

[**GitHub**](https://github.com/cosmos/interchain-security)

[**Discord**](https://discord.com/invite/interchain)

[**Twitter**](https://x.com/cosmoshub)


# ⚙️  Installation

Chain ID: cosmoshub-4 | Node Version: v24.0.0 | Custom Port: 167

Recommended Hardware:

<table><thead><tr><th>Node Type</th><th width="184">CPU</th><th>RAM</th><th>Storage</th></tr></thead><tbody><tr><td>Mainnet</td><td>8</td><td>16GB</td><td>250GB </td></tr></tbody></table>

&#x20;***Install dependencies***

```bash
# Update the repositories
sudo apt update && sudo apt upgrade -y
```

```bash
# Install developer packages
sudo apt install -y curl git jq lz4 build-essential
```

```bash
# Install Go
sudo rm -rf /usr/local/go
curl -Ls https://go.dev/dl/go1.23.8.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)
echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bash_profile
source $HOME/.bash_profile
go version
```

## ***Automatic Installation***

```bash
source <(curl -s https://raw.githubusercontent.com/validexisinfra/CosmosHub/main/installmain.sh)
```

## ***Manual Installation***

```bash
# Come up with the name of your node and replace it instead <your_moniker>
MONIKER=<your_moniker>
```

```bash
# Download binary files
cd $HOME
rm -rf gaia
git clone https://github.com/cosmos/gaia.git
cd gaia
git checkout v24.0.0
make install
```

```bash
# Set node configuration
gaiad config set client chain-id cosmoshub-4
gaiad config set client keyring-backend test
gaiad config set client node tcp://localhost:26657

# Initialize the node
gaiad init $MONIKER --chain-id cosmoshub-4
```

```bash
# Download genesis and addrbook
curl -Ls https://snapshots.kjnodes.com/cosmoshub/genesis.json > $HOME/.gaia/config/genesis.json
curl -Ls https://snapshots.kjnodes.com/cosmoshub/addrbook.json > $HOME/.gaia/config/addrbook.json
```

***Setup config***

```bash
# Set seeds and peers
SEEDS="00bf1f9d3c65137dc99c40cd03864384ce0ef7c3@cosmoshub-mainnet-seed.itrocket.net:34656"
PEERS="2441723e318545be469d43611d331e3271477ede@cosmoshub-mainnet-peer.itrocket.net:34656,e93fbb087acb7c0f8ca850a796310bb745b510b6@23.227.220.132:26656,b6fedf0d6c87628e72cd5a82058b551445168f9f@23.88.75.75:14956,48c5af84afc9e25f62a7189f0260fd907aac5f68@204.16.247.246:26656,8220e8029929413afff48dccc6a263e9ac0c3e5e@204.16.247.237:26656,bb355f5f5c323150d22608a80fc94d67c2f638bd@169.155.47.134:26656,c98397d6dd1b180ed94a3b17903209172c81ed23@54.39.131.64:26661,63f1915e9d052a04cb11243bb90ff67879dd972c@141.98.219.28:26656,88bd49450f1e9ffef6e272b2002862b2c012c315@95.217.43.189:14956,f52b6ca356060842431aa96392af4e9fdeaec436@67.209.53.70:26656,0add711ee2dcedcfb4c575aa1ace3f4995c8d731@170.64.218.141:26090"
sed -i -e "/^\[p2p\]/,/^\[/{s/^[[:space:]]*seeds *=.*/seeds = \"$SEEDS\"/}" \
       -e "/^\[p2p\]/,/^\[/{s/^[[:space:]]*persistent_peers *=.*/persistent_peers = \"$PEERS\"/}" $HOME/.gaia/config/config.toml

# Set minimum gas price, enable prometheus and disable indexing
sed -i 's|minimum-gas-prices =.*|minimum-gas-prices = "0.0025uatom"|g' $HOME/.gaia/config/app.toml
sed -i -e "s/prometheus = false/prometheus = true/" $HOME/.gaia/config/config.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.gaia/config/config.toml

# Config pruning
sed -i -e "s/^pruning *=.*/pruning = \"custom\"/" $HOME/.gaia/config/app.toml 
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"100\"/" $HOME/.gaia/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"19\"/" $HOME/.gaia/config/app.toml
```

#### ***Set custom ports***

You can change value CUSTOM\_PORT=167 To any other ports

```bash
CUSTOM_PORT=167
```

```bash
sed -i -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${CUSTOM_PORT}58\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://0.0.0.0:${CUSTOM_PORT}57\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${CUSTOM_PORT}60\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${CUSTOM_PORT}56\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${CUSTOM_PORT}66\"%" $HOME/.gaia/config/config.toml
sed -i -e "s%^address = \"tcp://localhost:1317\"%address = \"tcp://0.0.0.0:${CUSTOM_PORT}17\"%; s%^address = \":8080\"%address = \":${CUSTOM_PORT}80\"%; s%^address = \"localhost:9090\"%address = \"0.0.0.0:${CUSTOM_PORT}90\"%; s%^address = \"localhost:9091\"%address = \"0.0.0.0:${CUSTOM_PORT}91\"%; s%^address = \"127.0.0.1:8545\"%address = \"0.0.0.0:${CUSTOM_PORT}45\"%; s%^ws-address = \"127.0.0.1:8546\"%ws-address = \"0.0.0.0:${CUSTOM_PORT}46\"%" $HOME/.gaia/config/app.toml
```

```bash
#Set config with new custom port
gaiad config set client node tcp://localhost:${CUSTOM_PORT}57
```

```bash
# Create service file
sudo tee /etc/systemd/system/gaiad.service > /dev/null <<EOF
[Unit]
Description=Cosmos node
After=network-online.target

[Service]
User=$USER
WorkingDirectory=$HOME/.gaia
ExecStart=$(which gaiad) start --home $HOME/.gaia
Restart=on-failure
RestartSec=5
LimitNOFILE=65535

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

```bash
# Download latest chain snapshot
curl -L https://snapshots.kjnodes.com/cosmoshub/snapshot_latest.tar.lz4 | tar -Ilz4 -xf - -C $HOME/.gaia
```

```bash
# Enable and start service
sudo systemctl daemon-reload
sudo systemctl enable gaiad
sudo systemctl restart gaiad && sudo journalctl -u gaiad -fo cat
```

```bash
# Check status
gaiad status 2>&1 | jq .sync_info

#"catching_up": false means that the node is synchronized, we are waiting for complete synchronization
```

***Wallets***

```bash
# Create wallet
gaiad keys add wallet
```

The wallet has been created. In the last line there will be a phrase that must be written down

```bash
# If the wallet was already there, restore it
gaiad keys add wallet --recover

# Insert the seed phrase from your wallet
# If everything is correct, you will see your wallet data
```

***Validator***

Do not forget to create a profile on <https://keybase.io/> and set a profile photo there that will be imported by key and used for your validators.

```bash
gaiad tx staking create-validator <(cat <<EOF
{
  "pubkey": $(gaiad comet show-validator),
  "amount": "1000000uatom",
  "moniker": "YOUR_MONIKER_NAME",
  "identity": "YOUR_KEYBASE_ID",
  "website": "YOUR_WEBSITE_URL",
  "security": "YOUR_SECURITY_EMAIL",
  "details": "YOUR_DETAILS",
  "commission-rate": "0.05",
  "commission-max-rate": "0.20",
  "commission-max-change-rate": "0.05",
  "min-self-delegation": "1"
}
EOF
) \
--chain-id cosmoshub-4 \
--from wallet \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0.005uatom \
-y
```

**!!! Save priv\_validator\_key.json which is located in /root/.gaia/config**


# 🛠️  Upgrade

***Automatic upgrade***

```bash
source <(curl -s https://raw.githubusercontent.com/validexisinfra/CosmosHub/main/upgrademain.sh)
```

***Manual upgrade***

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

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


# 📜  Useful Commands

***Get validator info***

```bash
gaiad status 2>&1 | jq .ValidatorInfo
```

***Get sync info***

```bash
gaiad status 2>&1 | jq .sync_info
```

### *Key management* <a href="#key-management" id="key-management"></a>

***Add new key***

```bash
gaiad keys add wallet
```

***Recover existing key***

```bash
gaiad keys add wallet --recover
```

***List all keys***

```bash
gaiad keys list
```

***Delete key***

```bash
gaiad keys delete wallet
```

***Query wallet balance***

```bash
gaiad q bank balances $(gaiad keys show wallet -a)
```

### *Validator management* <a href="#validator-management" id="validator-management"></a>

Please make sure you have adjusted **moniker**, **identity**, **details** and **website** to match your values.

***Create new validator***

```bash
gaiad tx staking create-validator <(cat <<EOF
{
  "pubkey": $(gaiad comet show-validator),
  "amount": "1000000uatom",
  "moniker": "YOUR_MONIKER_NAME",
  "identity": "YOUR_KEYBASE_ID",
  "website": "YOUR_WEBSITE_URL",
  "security": "YOUR_SECURITY_EMAIL",
  "details": "YOUR_DETAILS",
  "commission-rate": "0.05",
  "commission-max-rate": "0.20",
  "commission-max-change-rate": "0.05",
  "min-self-delegation": "1"
}
EOF
) \
--chain-id cosmoshub-4 \
--from wallet \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0.005uatom \
-y
```

***Edit existing validator***

```bash
gaiad tx staking edit-validator \
--new-moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id cosmoshub-4 \
--commission-rate 0.05 \
--from wallet \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0.005uatom \
-y
```

***Unjail validator***

```bash
gaiad tx slashing unjail --from wallet --chain-id cosmoshub-4 --gas-adjustment 1.4 --gas auto --gas-prices 0.005uatom -y
```

***Jail reason***

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

***View validator details***

```bash
gaiad q staking validator $(gaiad keys show wallet --bech val -a)
```

### &#x20;*Token management* <a href="#token-management" id="token-management"></a>

***Withdraw rewards from all validators***

```bash
gaiad tx distribution withdraw-all-rewards --from wallet --chain-id cosmoshub-4 --gas-adjustment 1.4 --gas auto --gas-prices 0.005uatom -y
```

***Withdraw commission and rewards from your validator***

```bash
gaiad tx distribution withdraw-rewards $(gaiad keys show wallet --bech val -a) --commission --from wallet --chain-id cosmoshub-4 --gas-adjustment 1.4 --gas auto --gas-prices 0.005uatom -y
```

***Delegate tokens to yourself***

```bash
gaiad tx staking delegate $(gaiad keys show wallet --bech val -a) 1000000uatom --from wallet --chain-id cosmoshub-4 --gas-adjustment 1.4 --gas auto --gas-prices 0.005uatom -y
```

***Delegate tokens to validator***

```bash
gaiad tx staking delegate <TO_VALOPER_ADDRESS> 1000000uatom --from wallet --chain-id cosmoshub-4 --gas-adjustment 1.4 --gas auto --gas-prices 0.005uatom -y
```

***Redelegate tokens to another validator***

```bash
gaiad tx staking redelegate $(gaiad keys show wallet --bech val -a) <TO_VALOPER_ADDRESS> 1000000uatom --from wallet --chain-id cosmoshub-4 --gas-adjustment 1.4 --gas auto --gas-prices 0.005uatom -y
```

***Unbond tokens from your validator***

```bash
gaiad tx staking unbond $(gaiad keys show wallet --bech val -a) 1000000uatom --from wallet --chain-id cosmoshub-4 --gas-adjustment 1.4 --gas auto --gas-prices 0.005uatom -y
```

***Send tokens to the wallet***

```bash
gaiad tx bank send wallet <TO_WALLET_ADDRESS> 1000000uatom --from wallet --chain-id cosmoshub-4 --gas-adjustment 1.4 --gas auto --gas-prices 0.005uatom -y
```

***Remove node***

Please, before proceeding with the next step! All chain data will be lost! Make sure you have backed up your **priv\_validator\_key.json**!

```bash
cd $HOME
sudo systemctl stop gaiad
sudo systemctl disable gaiad
sudo rm /etc/systemd/system/gaiad.service
sudo systemctl daemon-reload
rm -f $(which gaiad)
rm -rf $HOME/.gaia
rm -rf $HOME/gaia
```

### *Service Management* <a href="#service-management" id="service-management"></a>

***Reload service configuration***

```bash
sudo systemctl daemon-reload
```

***Enable service***

```bash
sudo systemctl enable gaiad
```

***Disable service***

```bash
sudo systemctl disable gaiad
```

***Start service***

```bash
sudo systemctl start gaiad
```

***Stop service***

```bash
sudo systemctl stop gaiad
```

***Restart service***

```bash
sudo systemctl restart gaiad
```

***Check service status***

```bash
sudo systemctl status gaiad
```

***Check service logs***

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


# Lava

Lava is a protocol that coordinates dapp and AI agent traffic on each blockchain. Lava aggregates RPC providers, dynamically scaling to support demand and route requests to fast, reliable providers.

[**WebSite**](https://www.lavanet.xyz/)

[**GitHub**](https://github.com/lavanet/lava)

[**Discord**](https://discord.com/invite/Tbk5NxTCdA)

[**Twitter**](https://x.com/lavanetxyz)


# ⚙️  Installation

Chain ID: lava-mainnet-1 | Node Version: v5.3.0 | Custom Port: 168

Recommended Hardware:

<table><thead><tr><th>Node Type</th><th width="184">CPU</th><th>RAM</th><th>Storage</th></tr></thead><tbody><tr><td>Mainnet</td><td>8</td><td>16GB</td><td>250GB </td></tr></tbody></table>

&#x20;***Install dependencies***

```bash
# Update the repositories
sudo apt update && sudo apt upgrade -y
```

```bash
# Install developer packages
sudo apt install -y curl git jq lz4 build-essential
```

```bash
# Install Go
sudo rm -rf /usr/local/go
curl -Ls https://go.dev/dl/go1.23.6.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)
echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bash_profile
source $HOME/.bash_profile
go version
```

## ***Automatic Installation***

```bash
source <(curl -s https://raw.githubusercontent.com/validexisinfra/Lava/main/installmain.sh)
```

## ***Manual Installation***

```bash
# Come up with the name of your node and replace it instead <your_moniker>
MONIKER=<your_moniker>
```

```bash
# Download binary files
cd $HOME
rm -rf lava
git clone https://github.com/lavanet/lava.git
cd lava
git checkout v5.3.0
make install-all
```

```bash
# Set node configuration
lavad config chain-id lava-mainnet-1
lavad config keyring-backend file
lavad config node tcp://localhost:26657

# Initialize the node
lavad init $MONIKER --chain-id lava-mainnet-1
```

```bash
# Download genesis and addrbook
curl -Ls https://snapshots.kjnodes.com/lava/genesis.json > $HOME/.lava/config/genesis.json
curl -Ls https://snapshots.kjnodes.com/lava/addrbook.json > $HOME/.lava/config/addrbook.json
```

***Setup config***

```bash
# Add seeds
sed -i -e "s|^seeds *=.*|seeds = \"ebacd3e666003397fb685cd44956d33419219950@seed2.lava.chainlayer.net:26656,1105d3a3384edaa450f4f63c2b1ff08d366ee256@159.203.86.102:26656,f1caeaacfac32e4dd00916e8d912e1d834e94eb3@lava-seed.stakecito.com:26666,e4eb68c6fdfab1575b8794205caed47d4f737df4@lava-mainnet-seed.01node.com:26107,2d4db6b95804ea97e1f3655d043e6becf9bffc94@lava-seeds2.w3coins.io:11156,dcbfb490ea930fe9e8058089e3f6a14ca274c1c4@217.182.136.79:26656,e023c3892862744081360a99a2666e8111b196d3@38.242.213.53:26656,eafff29ec471bdd0985a9360b2c103997539c939@lava-seed.node.monster:26649,6a9a65d92b4820a5d198dd95743aa3059d0d3d4c@seed-lava.hashkey.cloud:26656\"|" $HOME/.lava/config/config.toml

# Add peers
peers="159a27880fe8704f44c307b18404061d46b77083@162.19.95.240:15656,0d6aed3038c55387f5b7c8fb1e702545358213ea@65.109.78.246:37656,0d67bedc7f929200d52c8724dfc50f848661f9ba@65.109.69.119:28656,f978474e77246a3635340d3bdb8dc14cb28d5ba0@188.214.129.218:26656,4008607a63c61e23bb74dfa613f93f9d178f5bd8@54.38.12.103:26656,d9bfa29e0cf9c4ce0cc9c26d98e5d97228f93b0b@65.108.233.103:14456,03c935c903ec7620d8e653fd179d5aa927888a09@136.243.55.115:40004,9d6216e9d79dc73247336ea18b928af9c9544e4f@51.210.223.80:19956,91971680907af210c45bf3618046314225a2629f@176.103.222.58:26656"
sed -i -e "s|^persistent_peers *=.*|persistent_peers = \"$peers\"|" $HOME/.lava/config/config.toml


# Set minimum gas price
sed -i -e "s|^minimum-gas-prices *=.*|minimum-gas-prices = \"0.000000001ulava\"|" $HOME/.lava/config/app.toml

# Settings
sed -i \
-e 's/timeout_propose = .*/timeout_propose = "1s"/' \
-e 's/timeout_propose_delta = .*/timeout_propose_delta = "500ms"/' \
-e 's/timeout_prevote = .*/timeout_prevote = "1s"/' \
-e 's/timeout_prevote_delta = .*/timeout_prevote_delta = "500ms"/' \
-e 's/timeout_precommit = .*/timeout_precommit = "500ms"/' \
-e 's/timeout_precommit_delta = .*/timeout_precommit_delta = "1s"/' \
-e 's/timeout_commit = .*/timeout_commit = "15s"/' \
-e 's/^create_empty_blocks = .*/create_empty_blocks = true/' \
-e 's/^create_empty_blocks_interval = .*/create_empty_blocks_interval = "15s"/' \
-e 's/^timeout_broadcast_tx_commit = .*/timeout_broadcast_tx_commit = "151s"/' \
-e 's/skip_timeout_commit = .*/skip_timeout_commit = false/' \
$HOME/.lava/config/config.toml

# Config pruning
sed -i -e "s/^pruning *=.*/pruning = \"custom\"/" $HOME/.lava/config/app.toml 
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"100\"/" $HOME/.lava/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"19\"/" $HOME/.lava/config/app.toml
```

#### ***Set custom ports***

You can change value CUSTOM\_PORT=168 To any other ports

```bash
CUSTOM_PORT=168
```

```bash
sed -i -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${CUSTOM_PORT}58\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${CUSTOM_PORT}57\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${CUSTOM_PORT}60\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${CUSTOM_PORT}56\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${CUSTOM_PORT}66\"%" $HOME/.lava/config/config.toml
sed -i -e "s%^address = \"tcp://localhost:1317\"%address = \"tcp://localhost:${CUSTOM_PORT}17\"%; s%^address = \":8080\"%address = \":${CUSTOM_PORT}80\"%; s%^address = \"localhost:9090\"%address = \"localhost:${CUSTOM_PORT}90\"%; s%^address = \"localhost:9091\"%address = \"localhost:${CUSTOM_PORT}91\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${CUSTOM_PORT}45\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${CUSTOM_PORT}46\"%" $HOME/.lava/config/app.toml
```

```bash
#Set config with new custom port
lavad config node tcp://localhost:${CUSTOM_PORT}57
```

```bash
# Create service file
sudo tee /etc/systemd/system/lavad.service > /dev/null <<EOF
[Unit]
Description=Lava node
After=network-online.target

[Service]
User=$USER
WorkingDirectory=$HOME/.lava
ExecStart=$(which lavad) start --home $HOME/.lava
Restart=on-failure
RestartSec=5
LimitNOFILE=65535

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

```bash
# Download latest chain snapshot
curl -L https://snapshots.kjnodes.com/lava/snapshot_latest.tar.lz4 | tar -Ilz4 -xf - -C $HOME/.lava
```

```bash
# Enable and start service
sudo systemctl daemon-reload
sudo systemctl enable lavad
sudo systemctl start lavad && sudo journalctl -u lavad -f --no-hostname -o cat
```

```bash
# Check status
lavad status 2>&1 | jq .SyncInfo

#"catching_up": false means that the node is synchronized, we are waiting for complete synchronization
```

***Wallets***

```bash
# Create wallet
lavad keys add wallet
```

The wallet has been created. In the last line there will be a phrase that must be written down

```bash
# If the wallet was already there, restore it
lavad keys add wallet --recover

# Insert the seed phrase from your wallet
# If everything is correct, you will see your wallet data
```

***Validator***

Do not forget to create a profile on <https://keybase.io/> and set a profile photo there that will be imported by key and used for your validators.

```bash
lavad tx staking create-validator \
--amount 1000000ulava \
--pubkey $(lavad tendermint show-validator) \
--moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id lava-mainnet-1 \
--commission-rate 0.05 \
--commission-max-rate 0.20 \
--commission-max-change-rate 0.01 \
--min-self-delegation 1 \
--from wallet \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0.000000001ulava \
-y
```

**!!! Save priv\_validator\_key.json which is located in /root/.lava/config**


# 🛠️  Upgrade

***Automatic upgrade***

```bash
source <(curl -s https://raw.githubusercontent.com/validexisinfra/Lava/main/upgrademain.sh)
```

***Manual upgrade***

```bash
cd $HOME
rm -rf lava
git clone https://github.com/lavanet/lava.git
cd lava
git checkout v5.3.0

export LAVA_BINARY=lavad
make install

sudo systemctl start lavad && sudo journalctl -u lavad -f --no-hostname -o cat
```


# 📜  Useful Commands

***Get validator info***

```bash
lavad status 2>&1 | jq .ValidatorInfo
```

***Get sync info***

```bash
lavad status 2>&1 | jq .SyncInfo
```

### *Key management* <a href="#key-management" id="key-management"></a>

***Add new key***

```bash
lavad keys add wallet
```

***Recover existing key***

```bash
lavad keys add wallet --recover
```

***List all keys***

```bash
lavad keys list
```

***Delete key***

```bash
lavad keys delete wallet
```

***Query wallet balance***

```bash
lavad q bank balances $(lavad keys show wallet -a)
```

### *Validator management* <a href="#validator-management" id="validator-management"></a>

Please make sure you have adjusted **moniker**, **identity**, **details** and **website** to match your values.

***Create new validator***

```bash
lavad tx staking create-validator \
--amount 1000000ulava \
--pubkey $(lavad tendermint show-validator) \
--moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id lava-mainnet-1 \
--commission-rate 0.05 \
--commission-max-rate 0.20 \
--commission-max-change-rate 0.01 \
--min-self-delegation 1 \
--from wallet \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0.000000001ulava \
-y
```

***Edit existing validator***

```bash
lavad tx staking edit-validator \
--new-moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id lava-mainnet-1 \
--commission-rate 0.05 \
--from wallet \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0.000000001ulava \
-y
```

***Unjail validator***

```bash
lavad tx slashing unjail --from wallet --chain-id lava-mainnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.000000001ulava -y
```

***Jail reason***

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

***View validator details***

```bash
lavad q staking validator $(lavad keys show wallet --bech val -a)
```

### &#x20;*Token management* <a href="#token-management" id="token-management"></a>

***Withdraw rewards from all validators***

```bash
lavad tx distribution withdraw-all-rewards --from wallet --chain-id lava-mainnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.000000001ulava -y
```

***Withdraw commission and rewards from your validator***

```bash
lavad tx distribution withdraw-rewards $(lavad keys show wallet --bech val -a) --commission --from wallet --chain-id lava-mainnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.000000001ulava -y
```

***Delegate tokens to yourself***

```bash
lavad tx staking delegate $(lavad keys show wallet --bech val -a) 1000000ulava --from wallet --chain-id lava-mainnet-1 --gas-adjustment 1.6 --gas auto --gas-prices 0.000000001ulava -y
```

***Delegate tokens to validator***

```bash
lavad tx staking delegate <TO_VALOPER_ADDRESS> 1000000ulava --from wallet --chain-id lava-mainnet-1 --gas-adjustment 1.6 --gas auto --gas-prices 0.000000001ulava -y
```

***Redelegate tokens to another validator***

```bash
lavad tx staking redelegate $(lavad keys show wallet --bech val -a) <TO_VALOPER_ADDRESS> 1000000ulava --from wallet --chain-id lava-mainnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.000000001ulava -y
```

***Unbond tokens from your validator***

```bash
lavad tx staking unbond $(lavad keys show wallet --bech val -a) 1000000ulava --from wallet --chain-id lava-mainnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.000000001ulava -y
```

***Send tokens to the wallet***

```bash
lavad tx bank send wallet <TO_WALLET_ADDRESS> 1000000ulava --from wallet --chain-id lava-mainnet-1 --gas-adjustment 1.4 --gas auto --gas-prices 0.000000001ulava -y
```

***Remove node***

Please, before proceeding with the next step! All chain data will be lost! Make sure you have backed up your **priv\_validator\_key.json**!

```bash
cd $HOME
sudo systemctl stop lavad
sudo systemctl disable lavad
sudo rm /etc/systemd/system/lavad.service
sudo systemctl daemon-reload
rm -f $(which lavad)
rm -rf $HOME/.lava
rm -rf $HOME/lava
```

### *Service Management* <a href="#service-management" id="service-management"></a>

***Reload service configuration***

```bash
sudo systemctl daemon-reload
```

***Enable service***

```bash
sudo systemctl enable lavad
```

***Disable service***

```bash
sudo systemctl disable lavad
```

***Start service***

```bash
sudo systemctl start lavad
```

***Stop service***

```bash
sudo systemctl stop lavad
```

***Restart service***

```bash
sudo systemctl restart lavad
```

***Check service status***

```bash
sudo systemctl status lavad
```

***Check service logs***

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


# Uptick

Uptick Network builds business-grade NFT infrastructure, offering a marketplace and diverse ecosystem applications to support the NFT economy.

[**WebSite**](https://www.uptick.network/)

[**GitHub**](https://github.com/UptickNetwork/uptick/tags)

[**Discord**](https://discord.com/invite/teqX78VZUV)

[**Twitter**](https://x.com/Uptickproject)


# ⚙️  Installation

Chain ID: uptick\_117-1 | Node Version: v0.2.19 | Custom Port: 169

Recommended Hardware:

<table><thead><tr><th>Node Type</th><th width="184">CPU</th><th>RAM</th><th>Storage</th></tr></thead><tbody><tr><td>Mainnet</td><td>8</td><td>16GB</td><td>250GB </td></tr></tbody></table>

&#x20;***Install dependencies***

```bash
# Update the repositories
sudo apt update && sudo apt upgrade -y
```

```bash
# Install developer packages
sudo apt install -y curl git jq lz4 build-essential
```

```bash
# Install Go
sudo rm -rf /usr/local/go
curl -Ls https://go.dev/dl/go1.23.6.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)
echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bash_profile
source $HOME/.bash_profile
go version
```

## ***Automatic Installation***

```bash
source <(curl -s https://raw.githubusercontent.com/validexisinfra/Uptick/main/installmain.sh)
```

## ***Manual Installation***

```bash
# Come up with the name of your node and replace it instead <your_moniker>
MONIKER=<your_moniker>
```

```bash
# Download binary files
cd $HOME
rm -rf uptick
git clone https://github.com/UptickNetwork/uptick.git
cd uptick
git checkout v0.2.19
make install
```

<pre class="language-bash"><code class="lang-bash"># Set node configuration
<strong>uptickd config chain-id uptick_117-1
</strong>uptickd config keyring-backend file
uptickd config node tcp://localhost:26657

# Initialize the node
uptickd init $MONIKER --chain-id uptick_117-1
</code></pre>

```bash
# Download genesis and addrbook
wget -O $HOME/.uptickd/config/genesis.json https://server-1.itrocket.net/mainnet/uptick/genesis.json
wget -O $HOME/.uptickd/config/addrbook.json  https://server-1.itrocket.net/mainnet/uptick/addrbook.json
```

***Setup config***

```bash
# Set seeds and peers
SEEDS="e71bae28852a0b603f7360ec17fe91e7f065f324@uptick-mainnet-seed.itrocket.net:35656"
PEERS="dd482d080820020b144ca2efaf128d78261dea82@uptick-mainnet-peer.itrocket.net:10656,5e5f399cc9dd01ec44f0af2b1bba1440d5ecf994@37.27.131.251:35656,f05733da50967e3955e11665b1901d36291dfaee@65.108.195.30:21656,ee045c74c0678f1122650a3a5223923977cae1b3@65.109.93.152:30656,37e4491bd756cf0ae5281c6f0da4bdcefe723eba@135.181.109.175:15656,fadab3eb04ebb651644ba15bb8f532bb509fe0f7@95.216.202.212:27656,71f6b583a3e4ed79e6f564c57b2a67cdd05fe6a4@65.21.63.225:11556,10da0790087be7a41d1fded3727aa5364b726416@157.90.0.102:26656,14ca9d73314dd519bc0b0be8511c88f85fe6873e@46.4.81.204:17656,7a320021212d346a7e8bfd5926feb4b307e7f69b@5.9.147.22:26556,16fa4bbce20eb8b7102ac751987d66380b2707fc@88.99.68.249:15956,9ce22beafb710cda061dfebb14074a25ef3385b0@185.180.222.190:16656,517d7d453dd116b1c2b990e5eb5ccc4a4bb4d00c@94.130.138.48:31656,0cba8f6d9de4a017c382f57e5389f0ad138605f4@144.76.74.73:15956,c21eeb897d3fa45a81772b56038045d1d873252e@142.132.199.236:30656,34d86f3a8dfce7d8b615563c587433c65792f104@185.219.142.221:15656,bd2e1f218fde74045fbcff3fe36c467e7f05d7a3@198.244.165.50:21656,d437de9c0b06e4270206a789fcefbb75973a5bb8@167.235.2.246:43756,90c0c03d27e5b4354bffb709d28340f2657ca1c7@138.201.121.185:26679,ccb5574802476107befcfdb79867a942008fdd82@167.235.9.223:61156,15267169f8eb4778a19b48360e5bcb519d923daa@207.121.13.108:35656,6efbb5b3a57a285a807c6ac9390278bfd58a8378@65.21.172.60:16656,b2bcb66f270153791b19e16ff23ddfec096f7097@142.132.202.50:41656,ea9c7688fa12f96c13cb37692fb129a780f6660e@65.109.88.251:11096,8fbfb8bff5d783df53b9ee95ab6b6e7ff708f280@65.108.134.215:32656,2cc70e14c1cdb94edce3a9f8aa149880331af29d@212.23.222.109:26356,bd954fa570942632c87867690bc7e6108a1527aa@65.109.70.100:27656,e75bcaf0cf2d5dce359c1258121ecaa6d5b41991@144.76.29.90:60956,c20c3532f30adcc3df74e563c32ef318c845bf83@157.180.3.171:656,513024d96e6d89c415952ec64eb8d67441247efa@38.242.149.183:26656,e8704845eaa0f3d39fcdc9c4065f3beb344384db@142.132.152.46:27656"
sed -i -e "/^\[p2p\]/,/^\[/{s/^[[:space:]]*seeds *=.*/seeds = \"$SEEDS\"/}" \
       -e "/^\[p2p\]/,/^\[/{s/^[[:space:]]*persistent_peers *=.*/persistent_peers = \"$PEERS\"/}" $HOME/.uptickd/config/config.toml

# Set minimum gas price, enable prometheus and disable indexing
sed -i 's|minimum-gas-prices =.*|minimum-gas-prices = "0.0025auptick"|g' $HOME/.uptickd/config/app.toml
sed -i -e "s/prometheus = false/prometheus = true/" $HOME/.uptickd/config/config.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.uptickd/config/config.toml

# Config pruning
sed -i -e "s/^pruning *=.*/pruning = \"custom\"/" $HOME/.uptickd/config/app.toml 
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"100\"/" $HOME/.uptickd/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"19\"/" $HOME/.uptickd/config/app.toml
```

#### ***Set custom ports***

You can change value CUSTOM\_PORT=169 To any other ports

```bash
CUSTOM_PORT=169
```

```bash
sed -i -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${CUSTOM_PORT}58\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${CUSTOM_PORT}57\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${CUSTOM_PORT}60\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${CUSTOM_PORT}56\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${CUSTOM_PORT}66\"%" $HOME/.uptickd/config/config.toml
sed -i -e "s%^address = \"tcp://localhost:1317\"%address = \"tcp://localhost:${CUSTOM_PORT}17\"%; s%^address = \":8080\"%address = \":${CUSTOM_PORT}80\"%; s%^address = \"localhost:9090\"%address = \"localhost:${CUSTOM_PORT}90\"%; s%^address = \"localhost:9091\"%address = \"localhost:${CUSTOM_PORT}91\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${CUSTOM_PORT}45\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${CUSTOM_PORT}46\"%" $HOME/.uptickd/config/app.toml
```

```bash
#Set config with new custom port
uptickd config node tcp://localhost:${CUSTOM_PORT}57
```

```bash
# Create service file
sudo tee /etc/systemd/system/uptickd.service > /dev/null <<EOF
[Unit]
Description=Uptick node
After=network-online.target
[Service]
User=$USER
WorkingDirectory=$HOME/.uptickd
ExecStart=$(which uptickd) start --home $HOME/.uptickd --chain-id uptick_117-1
Restart=on-failure
RestartSec=5
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
```

```bash
# Download latest chain snapshot

```

```bash
# Enable and start service
sudo systemctl daemon-reload
sudo systemctl enable uptickd
sudo systemctl restart uptickd && sudo journalctl -u uptickd -fo cat
```

```bash
# Check status
uptickd status 2>&1 | jq .SyncInfo

#"catching_up": false means that the node is synchronized, we are waiting for complete synchronization
```

***Wallets***

```bash
# Create wallet
uptickd keys add wallet
```

The wallet has been created. In the last line there will be a phrase that must be written down

```bash
# If the wallet was already there, restore it
uptickd keys add wallet --recover

# Insert the seed phrase from your wallet
# If everything is correct, you will see your wallet data
```

***Validator***

Do not forget to create a profile on <https://keybase.io/> and set a profile photo there that will be imported by key and used for your validators.

<pre class="language-bash"><code class="lang-bash"><strong>uptickd tx staking create-validator \
</strong>--amount 1000000auptick \
--pubkey $(uptickd tendermint show-validator) \
--moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id uptick_117-1 \
--commission-rate 0.1 \
--commission-max-rate 0.2 \
--commission-max-change-rate 0.01 \
--min-self-delegation 1 \
--from wallet \
--gas 250000 --fees 3000000000000000auptick \
-y
</code></pre>

**!!! Save priv\_validator\_key.json which is located in /root/.uptickd/config**


# 🛠️  Upgrade

***Automatic upgrade***

```bash
source <(curl -s https://raw.githubusercontent.com/validexisinfra/Uptick/main/upgrademain.sh)
```

***Manual upgrade***

<pre class="language-bash"><code class="lang-bash">cd $HOME
<strong>rm -rf uptick
</strong>git clone https://github.com/UptickNetwork/uptick.git
cd uptick
git checkout v0.2.19
make build
sudo mv $HOME/uptick/build/uptickd $(which uptickd)
sudo systemctl restart uptickd &#x26;&#x26; sudo journalctl -u uptickd -f
</code></pre>


# 📜  Useful Commands

***Get validator info***

```bash
uptickd status 2>&1 | jq .ValidatorInfo
```

***Get sync info***

```bash
uptickd status 2>&1 | jq
```

### *Key management* <a href="#key-management" id="key-management"></a>

***Add new key***

```bash
uptickd keys add wallet
```

***Recover existing key***

```bash
uptickd keys add wallet --recover
```

***List all keys***

```bash
uptickd keys list
```

***Delete key***

```bash
uptickd keys delete wallet
```

***Query wallet balance***

```bash
uptickd q bank balances $(uptickd keys show wallet -a)
```

### *Validator management* <a href="#validator-management" id="validator-management"></a>

Please make sure you have adjusted **moniker**, **identity**, **details** and **website** to match your values.

***Create new validator***

```bash
uptickd tx staking create-validator \
--amount 1000000auptick \
--pubkey $(uptickd tendermint show-validator) \
--moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--chain-id uptick_117-1 \
--commission-rate 0.1 \
--commission-max-rate 0.2 \
--commission-max-change-rate 0.01 \
--min-self-delegation 1 \
--from wallet \
--gas 250000 --fees 3000000000000000auptick \
-y
```

***Edit existing validator***

```bash
uptickd tx staking edit-validator \
--new-moniker "YOUR_MONIKER_NAME" \
--identity "YOUR_KEYBASE_ID" \
--details "YOUR_DETAILS" \
--website "YOUR_WEBSITE_URL" \
--commission-rate 0.05 \
--from wallet \
--gas 250000 --fees 3000000000000000auptick \
-y
```

***Unjail validator***

```bash
uptickd tx slashing unjail --from wallet --chain-id uptick_117-1 --gas 250000 --fees 3000000000000000auptick -y 
```

***Jail reason***

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

***View validator details***

```bash
uptickd q staking validator $(uptickd keys show wallet --bech val -a)
```

### &#x20;*Token management* <a href="#token-management" id="token-management"></a>

***Withdraw rewards from all validators***

```bash
uptickd tx distribution withdraw-all-rewards --from wallet --chain-id uptick_117-1 --gas 250000 --fees 3000000000000000auptick -y 
```

***Withdraw commission and rewards from your validator***

```bash
uptickd tx distribution withdraw-rewards $(uptickd keys show wallet --bech val -a) --commission --from wallet --chain-id uptick_117-1 --gas 250000 --fees 3000000000000000auptick -y 
```

***Delegate tokens to yourself***

```bash
uptickd tx staking delegate $(uptickd keys show $WALLET --bech val -a) 1000000auptick --from wallet --chain-id uptick_117-1 --gas 250000 --fees 3000000000000000auptick -y 
```

***Delegate tokens to validator***

```bash
uptickd tx staking delegate <TO_VALOPER_ADDRESS> 1000000auptick --from wallet --chain-id uptick_117-1 --gas 250000 --fees 3000000000000000auptick -y 
```

***Redelegate tokens to another validator***

```bash
uptickd tx staking redelegate $(uptickd keys show wallet --bech val -a) <TO_VALOPER_ADDRESS> 1000000auptick --from wallet --chain-id uptick_117-1 --gas 250000 --fees 3000000000000000auptick -y 
```

***Unbond tokens from your validator***

<pre class="language-bash"><code class="lang-bash"><strong>uptickd tx staking unbond $(uptickd keys show wallet --bech val -a) 1000000auptick --from wallet --chain-id uptick_117-1 --gas 250000 --fees 3000000000000000auptick -y
</strong></code></pre>

***Send tokens to the wallet***

```bash
uptickd tx bank send wallet <TO_WALLET_ADDRESS> 1000000auptick --from wallet --chain-id uptick_117-1 --gas 250000 --fees 3000000000000000auptick -y
```

***Remove node***

Please, before proceeding with the next step! All chain data will be lost! Make sure you have backed up your **priv\_validator\_key.json**!

```bash
sudo systemctl stop uptickd
sudo systemctl disable uptickd
sudo rm -rf /etc/systemd/system/uptickd.service
sudo rm $(which uptickd)
sudo rm -rf $HOME/.uptickd
sudo rm -rf $HOME/uptick
```

### *Service Management* <a href="#service-management" id="service-management"></a>

***Reload service configuration***

```bash
sudo systemctl daemon-reload
```

***Enable service***

```bash
sudo systemctl enable uptickd
```

***Disable service***

```bash
sudo systemctl disable uptickd
```

***Start service***

```bash
sudo systemctl start uptickd
```

***Stop service***

```bash
sudo systemctl stop uptickd
```

***Restart service***

```bash
sudo systemctl restart uptickd
```

***Check service status***

```bash
sudo systemctl status uptickd
```

***Check service logs***

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


# Paloma

Paloma is the fastest, secure crosschain communications blockchain. Paloma blockchain enables scalable, crosschain, smart contract execution with any data source.

[**WebSite**](https://www.palomachain.com/)

[**GitHub**](https://github.com/palomachain)

[**Discord**](https://discord.com/invite/tNqkNHvVNc)

[**Twitter**](https://x.com/paloma_chain)


# ⚙️  Installation

Chain ID: tumbler | Node Version: v2.4.14 | Custom Port: 171

Recommended Hardware:

<table><thead><tr><th>Node Type</th><th width="184">CPU</th><th>RAM</th><th>Storage</th></tr></thead><tbody><tr><td>Mainnet</td><td>8</td><td>16GB</td><td>250GB </td></tr></tbody></table>

&#x20;***Install dependencies***

```bash
# Update the repositories
sudo apt update && sudo apt upgrade -y
```

```bash
# Install developer packages
sudo apt install -y curl git jq lz4 build-essential
```

```bash
# Install Go
sudo rm -rf /usr/local/go
curl -Ls https://go.dev/dl/go1.24.2.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)
echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bash_profile
source $HOME/.bash_profile
go version
```

## ***Automatic Installation***

```bash
source <(curl -s https://raw.githubusercontent.com/validexisinfra/Paloma/main/installmain.sh)
```

## ***Manual Installation***

```bash
# Come up with the name of your node and replace it instead <your_moniker>
MONIKER=<your_moniker>
```

```bash
# Download binary files
cd $HOME
rm -rf paloma
git clone https://github.com/palomachain/paloma.git
cd paloma
git checkout v2.4.14
make install
```

<pre class="language-bash"><code class="lang-bash"># Set node configuration
<strong>palomad config set client chain-id tumbler
</strong>palomad config set client keyring-backend file
palomad config set client node tcp://localhost:26657

# Initialize the node
palomad init $MONIKER --chain-id tumbler
</code></pre>

```bash
# Download genesis and addrbook
wget -O genesis.json https://snapshots.polkachu.com/genesis/paloma/genesis.json --inet4-only
mv genesis.json ~/.paloma/config
wget -O addrbook.json https://snapshots.polkachu.com/addrbook/paloma/addrbook.json --inet4-only
mv addrbook.json ~/.paloma/config
```

***Setup config***

```bash
# Set seeds and peers
sed -i -e "s|^seeds *=.*|seeds = \"ade4d8bc8cbe014af6ebdf3cb7b1e9ad36f412c0@seeds.polkachu.com:12156\"|" $HOME/.paloma/config/config.toml

# Set minimum gas price
sed -i -e "s|^minimum-gas-prices *=.*|minimum-gas-prices = \"0ugrain\"|" $HOME/.paloma/config/app.toml

# Set pruning
sed -i \
  -e 's|^pruning *=.*|pruning = "custom"|' \
  -e 's|^pruning-keep-recent *=.*|pruning-keep-recent = "100"|' \
  -e 's|^pruning-keep-every *=.*|pruning-keep-every = "0"|' \
  -e 's|^pruning-interval *=.*|pruning-interval = "19"|' \
  $HOME/.paloma/config/app.toml
```

#### ***Set custom ports***

You can change value CUSTOM\_PORT=171 To any other ports

```bash
CUSTOM_PORT=171
```

```bash
sed -i -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${CUSTOM_PORT}58\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${CUSTOM_PORT}57\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${CUSTOM_PORT}60\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${CUSTOM_PORT}56\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${CUSTOM_PORT}66\"%" $HOME/.paloma/config/config.toml
sed -i -e "s%^address = \"tcp://localhost:1317\"%address = \"tcp://localhost:${CUSTOM_PORT}17\"%; s%^address = \":8080\"%address = \":${CUSTOM_PORT}80\"%; s%^address = \"localhost:9090\"%address = \"localhost:${CUSTOM_PORT}90\"%; s%^address = \"localhost:9091\"%address = \"localhost:${CUSTOM_PORT}91\"%; s%^address = \"0.0.0.0:8545\"%address = \"0.0.0.0:${CUSTOM_PORT}45\"%; s%^ws-address = \"0.0.0.0:8546\"%ws-address = \"0.0.0.0:${CUSTOM_PORT}46\"%" $HOME/.paloma/config/app.toml
```

<pre class="language-bash"><code class="lang-bash">#Set config with new custom port
<strong>palomad config set client node tcp://localhost:${CUSTOM_PORT}57
</strong></code></pre>

```bash
# Create service file
sudo tee /etc/systemd/system/palomad.service > /dev/null <<EOF
[Unit]
Description=paloma
After=network-online.target

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

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

```bash
# Download latest chain snapshot

```

```bash
# Enable and start service
sudo systemctl daemon-reload
sudo systemctl enable palomad
sudo systemctl restart palomad && sudo journalctl -u palomad -fo cat
```

```bash
# Check status
palomad status 2>&1 | jq .SyncInfo

#"catching_up": false means that the node is synchronized, we are waiting for complete synchronization
```

***Wallets***

```bash
# Create wallet
palomad keys add wallet
```

The wallet has been created. In the last line there will be a phrase that must be written down

```bash
# If the wallet was already there, restore it
palomad keys add wallet --recover

# Insert the seed phrase from your wallet
# If everything is correct, you will see your wallet data
```

***Validator***

Do not forget to create a profile on <https://keybase.io/> and set a profile photo there that will be imported by key and used for your validators.

```bash
palomad tx staking create-validator <(cat <<EOF
{
  "pubkey": $(palomad comet show-validator),
  "amount": "1000000ugrain",
  "moniker": "YOUR_MONIKER_NAME",
  "identity": "YOUR_KEYBASE_ID",
  "website": "YOUR_WEBSITE_URL",
  "security": "YOUR_SECURITY_EMAIL",
  "details": "YOUR_DETAILS",
  "commission-rate": "0.05",
  "commission-max-rate": "0.20",
  "commission-max-change-rate": "0.05",
  "min-self-delegation": "1"
}
EOF
) \
--chain-id tumbler \
--from wallet \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0ugrain \
-y
```

**!!! Save priv\_validator\_key.json which is located in /root/.paloma/config**




---

[Next Page](/llms-full.txt/1)

