Chain ID Latest Version Tag Custom Port
chiado_10010-1 genesis 178

Setup validator name

Replace YOUR_MONIKER_GOES_HERE with your validator name

MONIKER="YOUR_MONIKER_GOES_HERE"

Install dependencies

Update system and install build tools

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

Install Go

sudo rm -rf /usr/local/go
curl -Ls https://go.dev/dl/go1.23.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)

Download binaries

# Download project binaries
mkdir -p $HOME/.warden/cosmovisor/genesis/bin
wget -O $HOME/.warden/cosmovisor/genesis/bin/wardend https://snapshots.kjnodes.com/warden-testnet/wardend-v0.5.2-linux-amd64
chmod +x $HOME/.warden/cosmovisor/genesis/bin/wardend

# Create application symlinks
sudo ln -s $HOME/.warden/cosmovisor/genesis $HOME/.warden/cosmovisor/current -f
sudo ln -s $HOME/.warden/cosmovisor/current/bin/wardend /usr/local/bin/wardend -f

Install Cosmovisor and create a service

# Download and install Cosmovisor
go install cosmossdk.io/tools/cosmovisor/cmd/cosmovisor@v1.6.0

# Create service
sudo tee /etc/systemd/system/warden-testnet.service > /dev/null << EOF
[Unit]
Description=warden node service
After=network-online.target

[Service]
User=$USER
ExecStart=$(which cosmovisor) run start
Restart=on-failure
RestartSec=10
LimitNOFILE=65535
Environment="DAEMON_HOME=$HOME/.warden"
Environment="DAEMON_NAME=wardend"
Environment="UNSAFE_SKIP_BACKUP=true"
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:$HOME/.warden/cosmovisor/current/bin"

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable warden-testnet.service

Initialize the node

# Set node configuration
wardend config set client chain-id chiado_10010-1
wardend config set client keyring-backend test
wardend config set client node tcp://localhost:17857

# Initialize the node
wardend init $MONIKER --chain-id chiado_10010-1

# Download genesis and addrbook
curl -Ls https://snapshots.kjnodes.com/warden-testnet/genesis.json > $HOME/.warden/config/genesis.json
curl -Ls https://snapshots.kjnodes.com/warden-testnet/addrbook.json > $HOME/.warden/config/addrbook.json

# Add seeds
sed -i -e "s|^seeds *=.*|seeds = \"3f472746f46493309650e5a033076689996c8881@warden-testnet.rpc.kjnodes.com:17859\"|" $HOME/.warden/config/config.toml

# Set minimum gas price
sed -i -e "s|^minimum-gas-prices *=.*|minimum-gas-prices = \"250000000000000award\"|" $HOME/.warden/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/.warden/config/app.toml

# Set custom ports
sed -i -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:17858\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:17857\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:17860\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:17856\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":17866\"%" $HOME/.warden/config/config.toml
sed -i -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:17817\"%; s%^address = \":8080\"%address = \":17880\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:17890\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:17891\"%; s%:8545%:17845%; s%:8546%:17846%; s%:6065%:17865%" $HOME/.warden/config/app.toml

Download latest chain snapshot

curl -L https://snapshots.kjnodes.com/warden-testnet/snapshot_latest.tar.lz4 | tar -Ilz4 -xf - -C $HOME/.warden
[[ -f $HOME/.warden/data/upgrade-info.json ]] && cp $HOME/.warden/data/upgrade-info.json $HOME/.warden/cosmovisor/genesis/upgrade-info.json

Start service and check the logs

sudo systemctl start warden-testnet.service && sudo journalctl -u warden-testnet.service -f --no-hostname -o cat

Set up Slinky

This guide is only for validator nodes

Official documentation: https://docs.wardenprotocol.org/operate-a-node/operate-connect

The Slinky Oracle consists of two main elements:

  1. An on-chain component that retrieves price data from the sidecar with each block, forwards these prices to the blockchain through vote extensions, and compiles prices from all validators involved.

  2. A sidecar process dedicated to polling price information from various providers and delivering this data to the on-chain component.

Step 1: Clone the Repository and build binaries

# Clone repository
cd $HOME
rm -rf slinky
git clone https://github.com/skip-mev/slinky.git
cd slinky

# Build binaries
make build

# Move binary to local bin
mv build/slinky /usr/local/bin/
rm -rf build

Step 2: Run oracle

Create systemd service

sudo tee /etc/systemd/system/warden-slinky.service > /dev/null <<EOF
[Unit]
Description=W Slinky Oracle
After=network-online.target

[Service]
User=$USER
ExecStart=$(which slinky) --market-map-endpoint 127.0.0.1:17890
Restart=on-failure
RestartSec=30
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

Enable and start systemd service

sudo systemctl daemon-reload
sudo systemctl enable warden-slinky.service
sudo systemctl start warden-slinky.service

Step 3: Enable Oracle Vote Extension

In order to utilize the Slinky oracle data in the Initia node, the Oracle setting should be enabled in the config/app.toml file.

###############################################################################
###                                  Oracle                                 ###
###############################################################################

[oracle]
# This option indicates whether the oracle is enabled.
enabled = "true"

# This is the URL of the out-of-process oracle sidecar used to connect
# to the oracle sidecar when the application boots up. Note that the address
# can be modified at any point, but will only take effect after the application is
# restarted. This can be the address of an oracle container running on the same
# machine or a remote machine.
oracle_address = "127.0.0.1:8080"

# This is the time that the client is willing to wait for responses from
# the oracle before timing out.
client_timeout = "2s"

# This option determines whether oracle metrics are enabled. Specifically
# this enables instrumentation of the oracle client and the interaction between
# the oracle and the app.
metrics_enabled = "true"

Step 5: Check the systemd logs

To check service logs use command below:

journalctl -fu warden-slinky -o cat

Successfull Log example:

14T19:07:08.296Z","num_prices":65}
May 14 19:07:08 slinky[877177]: {"level":"info","ts":"2024-05-14T19:07:08.547Z","caller":"oracle/oracle.go:163","msg":"oracle updated prices","pid":877177,"process":"oracle","last_sync":"2024-05-14T19:07:08.547Z","num_prices":65}
May 14 19:07:08 slinky[877177]: {"level":"info","ts":"2024-05-14T19:07:08.796Z","caller":"oracle/oracle.go:163","msg":"oracle updated prices","pid":877177,"process":"oracle","last_sync":"2024-05-14T19:07:08.796Z","num_prices":65}
May 14 19:07:09 slinky[877177]: {"level":"info","ts":"2024-05-14T19:07:09.045Z","caller":"oracle/oracle.go:163","msg":"oracle updated prices","pid":877177,"process":"oracle","last_sync":"2024-05-14T19:07:09.045Z","num_prices":65}
May 14 19:07:09 slinky[877177]: {"level":"info","ts":"2024-05-14T19:07:09.296Z","caller":"oracle/oracle.go:163","msg":"oracle updated prices","pid":877177,"process":"oracle","last_sync":"2024-05-14T19:07:09.296Z","num_prices":65}
May 14 19:07:09 slinky[877177]: {"level":"info","ts":"2024-05-14T19:07:09.544Z","caller":"marketmap/fetcher.go:116","msg":"successfully fetched market map data from module; checking if market map has changed","pid":877177,"process":"provider_orchestrator"}

Step 6: Check Slinky oracle prices

To check oracle prices use command below:

curl -s http://localhost:18080/slinky/oracle/v1/prices | jq

Successfull Output example:

{
  "prices": {
    "AAVE/USD": "14586392373",
    "ADA/USD": "3450582900",
    "AEVO/USD": "358748700",
    "ALGO/USD": "1213849710",
    "APE/USD": "1147196400",
    "APT/USD": "10256515410",
    "ARB/USD": "560307510",
    "ARKM/USD": "1700808600",
    "ASTR/USD": "583491270",
    "ATOM/USD": "4735682700",
    "AVAX/USD": "2676225330",
    "AXL/USD": "822074145",
    "BCH/USD": "3601477200",
    "BLUR/USD": "2487257700",
    "BNB/USD": "5913857400",
    "BONK/USD": "2265070132",
    "BTC/USD": "6768883272",
    "COMP/USD": "4363943100",
    "CRV/USD": "2501247900",
    "DOGE/USD": "14044162200",
    "DOT/USD": "4180892306",
    "DYDX/USD": "1087038540",
    "DYM/USD": "1655840100",
    "EOS/USD": "4701706500",
    "ETC/USD": "1878783930",
    "ETH/USD": "2520394488",
    "FET/USD": "13359641700",
    "FIL/USD": "3713398800",
    "GRT/USD": "1627410015",
    "HBAR/USD": "514869680",
    "ICP/USD": "825122010",
    "IMX/USD": "1460876670",
    "INJ/USD": "2022383340",
    "JTO/USD": "2346826071",
    "JUP/USD": "10145393250",
    "LDO/USD": "1104113250",
    "LINK/USD": "11431992000",
    "LTC/USD": "7107021600",
    "MANA/USD": "3176210447",
    "MATIC/USD": "3555168297",
    "MKR/USD": "1142899410",
    "NEAR/USD": "4635752700",
    "NTRN/USD": "39677206",
    "OP/USD": "1687149029",
    "ORDI/USD": "3426599700",
    "PEPE/USD": "98980665000",
    "PYTH/USD": "3678423300",
    "RUNE/USD": "5373505766",
    "SEI/USD": "4227039000",
    "SHIB/USD": "17827256000",
    "SNX/USD": "1487957700",
    "SOL/USD": "17553204150",
    "STRK/USD": "399420210",
    "STX/USD": "1796181792",
    "SUI/USD": "19546308000",
    "TIA/USD": "604901463",
    "TRX/USD": "16463467500",
    "UNI/USD": "7960423800",
    "USDT/USD": "999300489",
    "WLD/USD": "2189366370",
    "WOO/USD": "1958988083",
    "XLM/USD": "956890000",
    "XRP/USD": "5314277400"
  },
  "timestamp": "2024-10-24T17:49:59.331746639Z",
  "version": "v1.0.8-5-gd8867073"
}