scripts/validate-gentxs.sh
#!/usr/bin/env bash

DAEMON_HOME="/tmp/simd$(date +%s)"
RANDOM_KEY="randomvalidatorkey"

echo "#############################################"
echo "### Ensure to set the below ENV settings ###"
echo "#############################################"
echo "
DAEMON= # ex: simd
CHAIN_ID= # ex: testnet-1
DENOM= # ex: ustake
GH_URL= # ex: https://github.com/cosmos/cosmos-sdk
BINARY_VERSION= # ex :v0.44.0
GO_VERSION=1.17
PRELAUNCH_GENESIS_URL= # ex: https://raw.githubusercontent.com/cosmos/cosmos-sdk/master/$CHAIN_ID/genesis-prelaunch.json
GENTXS_DIR= # ex: $GOPATH/github.com/cosmos/mainnet/$CHAIN_ID/gentxs"
echo

if [[ -z "${GH_URL}" ]]; then
  echo "GH_URL in not set, required. Ex: https://github.com/cosmos/cosmos-sdk"
  exit 0
fi
if [[ -z "${DAEMON}" ]]; then
  echo "DAEMON is not set, required. Ex: simd, gaiad etc"
  exit 0
fi
if [[ -z "${DENOM}" ]]; then
  echo "DENOM in not set, required. Ex: stake, uatom etc"
  exit 0
fi
if [[ -z "${GO_VERSION}" ]]; then
  echo "GO_VERSION in not set, required. Ex: 1.15.2, 1.16.6 etc."
  exit 0
fi
if [[ -z "${CHAIN_ID}" ]]; then
  echo "CHAIN_ID in not set, required."
  exit 0
fi
if [[ -z "${PRELAUNCH_GENESIS_URL}" ]]; then
  echo "PRELAUNCH_GENESIS_URL (genesis file url) in not set, required."
  exit 0
fi
if [[ -z "${GENTXS_DIR}" ]]; then
  echo "GENTXS_DIR in not set, required."
  exit 0
fi

command_exists () {
    type "$1" &> /dev/null ;
}

if command_exists go ; then
    echo "Golang is already installed"
else
  read -s -p "Installing go using apt. Do you want to proceed (y/n)?: " useApt

  if [ "$useApt" != "y" ]; then
    echo
    echo "Install go manually and execute this script"
    exit 0;
  fi

  sudo apt update
  sudo apt install build-essential -y

  wget https://dl.google.com/go/go$GO_VERSION.linux-amd64.tar.gz
  tar -xvf go$GO_VERSION.linux-amd64.tar.gz
  sudo mv go /usr/local

  echo "" >> ~/.profile
  echo 'export GOPATH=$HOME/go' >> ~/.profile
  echo 'export GOROOT=/usr/local/go' >> ~/.profile
  echo 'export GOBIN=$GOPATH/bin' >> ~/.profile
  echo 'export PATH=$PATH:/usr/local/go/bin:$GOBIN' >> ~/.profile

  . ~/.profile

  go version
fi

if [ "$(ls -A $GENTXS_DIR)" ]; then
    echo "Install $DAEMON"
    git clone $GH_URL $DAEMON
    cd $DAEMON
    git fetch && git checkout $BINARY_VERSION
    make install
    $DAEMON version

    for GENTX_FILE in $GENTXS_DIR/*.json; do
        if [ -f "$GENTX_FILE" ]; then
            set -e

            echo "GentxFile::::"
            echo $GENTX_FILE

            echo "...........Init a testnet.............."
            $DAEMON init --chain-id $CHAIN_ID validator --home $DAEMON_HOME

            $DAEMON keys add $RANDOM_KEY --keyring-backend test --home $DAEMON_HOME

            echo "..........Fetching genesis......."
            curl -s $PRELAUNCH_GENESIS_URL > $DAEMON_HOME/config/genesis.json

            # this genesis time is different from original genesis time, just for validating gentx.
            sed -i '/genesis_time/c\   \"genesis_time\" : \"2021-01-01T00:00:00Z\",' $DAEMON_HOME/config/genesis.json

            GENACC=$(cat $GENTX_FILE | sed -n 's|.*"delegator_address":"\([^"]*\)".*|\1|p')
            denomquery=$(jq -r '.body.messages[0].value.denom' $GENTX_FILE)
            amountquery=$(jq -r '.body.messages[0].value.amount' $GENTX_FILE)

            # only allow $DENOM tokens to be bonded
            if [ $denomquery != $DENOM ]; then
                echo "invalid denomination"
                exit 1
            fi

            $DAEMON add-genesis-account $RANDOM_KEY 1000000000000000$DENOM --home $DAEMON_HOME \
                --keyring-backend test

            $DAEMON gentx $RANDOM_KEY 900000000000000$DENOM --home $DAEMON_HOME \
                --keyring-backend test --chain-id $CHAIN_ID

            cp $GENTX_FILE $DAEMON_HOME/config/gentx/

            echo "..........Collecting gentxs......."
            $DAEMON collect-gentxs --home $DAEMON_HOME
            $DAEMON validate-genesis --home $DAEMON_HOME

            echo "..........Starting node......."
            $DAEMON start --home $DAEMON_HOME &

            sleep 10s

            echo "...checking network status.."
            echo "if this fails, most probably the gentx with address $GENACC is invalid"
            $DAEMON status --node http://localhost:26657

            echo "...Cleaning the stuff..."
            killall $DAEMON >/dev/null 2>&1
            sleep 2s
            rm -rf $DAEMON_HOME
        fi
    done
else
    echo "$GENTXS_DIR is empty, nothing to validate"
fi
