|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | +N=4 |
| 4 | +KEYS=("v1" "v2" "v3" "v4") |
| 5 | +CHAINID="devnet" |
| 6 | +MONIKER="Side Labs" |
| 7 | +BINARY="$HOME/go/bin/sided" |
| 8 | +DENOM_STR="uside,sat,uusdc,uusdt" |
| 9 | +INITIAL_ACCOUNT_STR="" |
| 10 | +set -f |
| 11 | +IFS=, |
| 12 | +DENOMS=($DENOM_STR) |
| 13 | +INITIAL_ACCOUNTS=($INITIAL_ACCOUNT_STR) |
| 14 | + |
| 15 | +IFS=";" |
| 16 | + |
| 17 | +INITIAL_SUPPLY="100000000000000" |
| 18 | +BLOCK_GAS=10000000 |
| 19 | +MAX_GAS=10000000000 |
| 20 | + |
| 21 | +# btcbridge params |
| 22 | +BTC_VAULT=() # ("<address>" "<pk>" "<asset type>") |
| 23 | +RUNES_VAULT=() |
| 24 | +TRUSTED_NON_BTC_RELAYER="" |
| 25 | +TRUSTED_FEE_PROVIDER="" |
| 26 | +PROTOCOL_FEE_COLLECTOR="" |
| 27 | + |
| 28 | +# gov params |
| 29 | +GOV_VOTING_PERIOD="60s" |
| 30 | +GOV_EXPEDITED_VOTING_PERIOD="30s" |
| 31 | + |
| 32 | +# Remember to change to other types of keyring like 'file' in-case exposing to outside world, |
| 33 | +# otherwise your balance will be wiped quickly |
| 34 | +# The keyring test does not require private key to steal tokens from you |
| 35 | +KEYRING="test" |
| 36 | +#KEYALGO="secp256k1" |
| 37 | +KEYALGO="segwit" |
| 38 | +LOGLEVEL="info" |
| 39 | +# Set dedicated home directory for the $BINARY instance |
| 40 | +HOMEDIR="$HOME/testnet" |
| 41 | + |
| 42 | +# Path variables |
| 43 | +# CONFIG=$HOMEDIR/config/config.toml |
| 44 | +# APP_TOML=$HOMEDIR/config/app.toml |
| 45 | + |
| 46 | +# GENESIS=$HOMEDIR/config/genesis.json |
| 47 | +# TMP_GENESIS=$HOMEDIR/config/tmp_genesis.json |
| 48 | + |
| 49 | +# validate dependencies are installed |
| 50 | +command -v jq >/dev/null 2>&1 || { |
| 51 | + echo >&2 "jq not installed. More info: https://stedolan.github.io/jq/download/" |
| 52 | + exit 1 |
| 53 | +} |
| 54 | + |
| 55 | +# used to exit on first error (any non-zero exit code) |
| 56 | +set -e |
| 57 | + |
| 58 | +# Reinstall daemon |
| 59 | +cd .. |
| 60 | +make install |
| 61 | +cd scripts |
| 62 | + |
| 63 | +# User prompt if an existing local node configuration is found. |
| 64 | +if [ -d "$HOMEDIR" ]; then |
| 65 | + printf "\nAn existing folder at '%s' was found. You can choose to delete this folder and start a new local node with new keys from genesis. When declined, the existing local node is started. \n" "$HOMEDIR" |
| 66 | + echo "Overwrite the existing configuration and start a new local node? [y/n]" |
| 67 | + read -r overwrite |
| 68 | +else |
| 69 | + overwrite="Y" |
| 70 | +fi |
| 71 | + |
| 72 | + |
| 73 | +# Setup local node if overwrite is set to Yes, otherwise skip setup |
| 74 | +if [[ $overwrite == "y" || $overwrite == "Y" ]]; then |
| 75 | + # Remove the previous folder |
| 76 | + rm -rf "$HOMEDIR" |
| 77 | + NODE_ID="" |
| 78 | + # Set moniker and chain-id for Cascadia (Moniker can be anything, chain-id must be an integer) |
| 79 | + for ((i=1; i<=N; i++)); do |
| 80 | + |
| 81 | + APPHOME="$HOMEDIR/side$i" |
| 82 | + $BINARY init "$MONIKER #$i" -o --chain-id $CHAINID --home $APPHOME --default-denom "${DENOMS[0]}" &> /dev/null |
| 83 | + |
| 84 | + CONFIG=$APPHOME/config/config.toml |
| 85 | + APP_TOML=$APPHOME/config/app.toml |
| 86 | + |
| 87 | + sed -i.bak 's/swagger = false/swagger = true/g' $APP_TOML |
| 88 | + sed -i.bak 's/pruning = "default"/pruning = "everything"/g' "$APP_TOML" |
| 89 | + sed -i.bak "s/minimum-gas-prices = \"\"/minimum-gas-prices = \"0.000001${DENOMS[0]}\"/g" $APP_TOML |
| 90 | + sed -i.bak "s/bitcoin_rpc = \"\"/bitcoin_rpc = \"192.248.150.102:18332\"/g" $APP_TOML |
| 91 | + sed -i.bak "s/bitcoin_rpc_user = \"\"/bitcoin_rpc_user = \"side\"/g" $APP_TOML |
| 92 | + sed -i.bak "s/bitcoin_rpc_password = \"\"/bitcoin_rpc_password = \"12345678\"/g" $APP_TOML |
| 93 | + |
| 94 | + if [[ $i -eq 1 ]]; then |
| 95 | + |
| 96 | + sed -i.bak "s/127.0.0.1:26657/0.0.0.0:26657/g" "$CONFIG" |
| 97 | + sed -i.bak 's/cors_allowed_origins\s*=\s*\[\]/cors_allowed_origins = ["*",]/g' "$CONFIG" |
| 98 | + |
| 99 | + NODE_ID=$($BINARY comet show-node-id --home $APPHOME) |
| 100 | + for key in "${!DENOMS[@]}"; do |
| 101 | + BALANCES+=",${INITIAL_SUPPLY}${DENOMS[$key]}" |
| 102 | + done |
| 103 | + # echo "$KEY ${BALANCES:1}" |
| 104 | + for ((j=1; j<=N; j++)); do |
| 105 | + $BINARY keys add "v$j" --keyring-backend $KEYRING --algo $KEYALGO --home $APPHOME &> "$HOMEDIR/$j.mnemonic" |
| 106 | + # cp -r $HOMEDIR $APPHOME |
| 107 | + $BINARY genesis add-genesis-account v$j ${BALANCES:1} --keyring-backend $KEYRING --home $APPHOME |
| 108 | + done |
| 109 | + |
| 110 | + echo "Genesis accounts allocated for local accounts" |
| 111 | + |
| 112 | + $BINARY genesis gentx v$i ${INITIAL_SUPPLY%?}${DENOMS[0]} --keyring-backend $KEYRING --chain-id $CHAINID --identity "666AC57CC678BEC4" --website="https://side.one" --home $APPHOME |
| 113 | + |
| 114 | + # set genesis |
| 115 | + GENESIS=$APPHOME/config/genesis.json |
| 116 | + TMP_GENESIS=$APPHOME/config/tmp_genesis.json |
| 117 | + |
| 118 | + jq --arg max_gas "$MAX_GAS" '.consensus_params["block"]["max_gas"]=$max_gas' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" |
| 119 | + jq --arg height "3" '.consensus["params"]["abci"]["vote_extensions_enable_height"]=$height' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" |
| 120 | + |
| 121 | + # set gov voting period |
| 122 | + if [ -n "$GOV_VOTING_PERIOD" ]; then |
| 123 | + jq --arg voting_period "${GOV_VOTING_PERIOD}" '.app_state["gov"]["params"]["voting_period"]=$voting_period' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" |
| 124 | + fi |
| 125 | + |
| 126 | + # set gov expedited voting period |
| 127 | + if [ -n "$GOV_EXPEDITED_VOTING_PERIOD" ]; then |
| 128 | + jq --arg expedited_voting_period "${GOV_EXPEDITED_VOTING_PERIOD}" '.app_state["gov"]["params"]["expedited_voting_period"]=$expedited_voting_period' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" |
| 129 | + fi |
| 130 | + |
| 131 | + # set vaults if provided |
| 132 | + if [[ "${#BTC_VAULT[@]}" -eq 3 && "${#RUNES_VAULT[@]}" -eq 3 ]]; then |
| 133 | + jq --arg btc_vault "${BTC_VAULT[0]}" '.app_state["btcbridge"]["params"]["vaults"][0]["address"]=$btc_vault' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" |
| 134 | + jq --arg btc_vault_pk "${BTC_VAULT[1]}" '.app_state["btcbridge"]["params"]["vaults"][0]["pub_key"]=$btc_vault_pk' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" |
| 135 | + jq --arg btc_vault_asset_type "${BTC_VAULT[2]}" '.app_state["btcbridge"]["params"]["vaults"][0]["asset_type"]=$btc_vault_asset_type' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" |
| 136 | + jq --arg runes_vault "${RUNES_VAULT[0]}" '.app_state["btcbridge"]["params"]["vaults"][1]["address"]=$runes_vault' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" |
| 137 | + jq --arg runes_vault_pk "${RUNES_VAULT[1]}" '.app_state["btcbridge"]["params"]["vaults"][1]["pub_key"]=$runes_vault_pk' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" |
| 138 | + jq --arg runes_vault_asset_type "${RUNES_VAULT[2]}" '.app_state["btcbridge"]["params"]["vaults"][1]["asset_type"]=$runes_vault_asset_type' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" |
| 139 | + fi |
| 140 | + |
| 141 | + # set trusted non btc relayer |
| 142 | + if [ -n "$TRUSTED_NON_BTC_RELAYER" ]; then |
| 143 | + jq --arg relayer "$TRUSTED_NON_BTC_RELAYER" '.app_state["btcbridge"]["params"]["trusted_non_btc_relayers"][0]=$relayer' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" |
| 144 | + fi |
| 145 | + |
| 146 | + # set trusted fee provider |
| 147 | + if [ -n "$TRUSTED_FEE_PROVIDER" ]; then |
| 148 | + jq --arg provider "$TRUSTED_FEE_PROVIDER" '.app_state["btcbridge"]["params"]["trusted_fee_providers"][0]=$provider' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" |
| 149 | + fi |
| 150 | + |
| 151 | + # set protocol fee collector |
| 152 | + if [ -n "$PROTOCOL_FEE_COLLECTOR" ]; then |
| 153 | + jq --arg fee_collector "$PROTOCOL_FEE_COLLECTOR" '.app_state["btcbridge"]["params"]["protocol_fees"]["collector"]=$fee_collector' "$GENESIS" >"$TMP_GENESIS" && mv "$TMP_GENESIS" "$GENESIS" |
| 154 | + fi |
| 155 | + |
| 156 | + continue |
| 157 | + fi |
| 158 | + |
| 159 | + sed -i.bak "s/127.0.0.1:26657/0.0.0.0:26${i}57/g" $CONFIG |
| 160 | + sed -i.bak "s/127.0.0.1:26658/127.0.0.1:26${i}28/g" $CONFIG |
| 161 | + sed -i.bak "s/0.0.0.0:26656/0.0.0.0:26${i}56/g" $CONFIG |
| 162 | + sed -i.bak "s/localhost:6060/localhost:60${i}0/g" $CONFIG |
| 163 | + sed -i.bak "s/persistent_peers = \"\"/persistent_peers = \"$NODE_ID@localhost:26656\"/g" $CONFIG |
| 164 | + |
| 165 | + cp -f "${APPHOME%?}1/config/genesis.json" "$APPHOME/config/genesis.json" |
| 166 | + cp -r "${APPHOME%?}1/keyring-$KEYRING" "$APPHOME/keyring-$KEYRING" |
| 167 | + |
| 168 | + $BINARY genesis gentx v$i ${INITIAL_SUPPLY%?}${DENOMS[0]} --keyring-backend $KEYRING --chain-id $CHAINID --identity "666AC57CC678BEC4" --website="https://side.one" --home $APPHOME --p2p-port "26${i}56" --ip 127.0.0.1 |
| 169 | + cp -r "$APPHOME/config/gentx/" "${APPHOME%?}1/config/gentx" |
| 170 | + |
| 171 | + done |
| 172 | + |
| 173 | + $BINARY genesis collect-gentxs --home ${APPHOME%?}1 # &> /dev/null |
| 174 | + $BINARY genesis validate --home ${APPHOME%?}1 |
| 175 | + # $BINARY keys list --keyring-dir $HOMEDIR --keyring-backend $KEYRING |
| 176 | + echo "Genesis transactions collected" |
| 177 | + |
| 178 | + for ((i=2; i<=N; i++)); do |
| 179 | + cp -f "${APPHOME%?}1/config/genesis.json" "${APPHOME%?}$i/config" |
| 180 | + shasum ${APPHOME%?}$i/config/genesis.json |
| 181 | + done |
| 182 | + |
| 183 | + # exit 0 |
| 184 | + # $BINARY genesis gentx "${KEYS[1]}" ${INITIAL_SUPPLY%?}${DENOMS[0]} --keyring-backend $KEYRING --chain-id $CHAINID --identity 666AC57CC678BEC4 --website="https://side.one" --home $HOMEDIR2 --p2p-port 26626 |
| 185 | + # $BINARY genesis gentx "${KEYS[2]}" ${INITIAL_SUPPLY%?}${DENOMS[0]} --keyring-backend $KEYRING --chain-id $CHAINID --identity "666AC57CC678BEC4" --website="https://side.one" --home $HOMEDIR3 --p2p-port 26636 |
| 186 | + # $BINARY genesis gentx "${KEYS[3]}" ${INITIAL_SUPPLY%?}${DENOMS[0]} --keyring-backend $KEYRING --chain-id $CHAINID --identity "666AC57CC678BEC4" --website="https://side.one" --home $HOMEDIR4 --p2p-port 26646 |
| 187 | + |
| 188 | + # cp -r "$HOMEDIR2/config/gentx/" "$HOMEDIR/config/gentx" |
| 189 | + # cp -r "$HOMEDIR3/config/gentx/" "$HOMEDIR/config/gentx" |
| 190 | + # cp -r "$HOMEDIR4/config/gentx/" "$HOMEDIR/config/gentx" |
| 191 | + |
| 192 | + # # Collect genesis tx |
| 193 | + # $BINARY genesis collect-gentxs --home &> /dev/null |
| 194 | + # echo "Genesis transactions collected" |
| 195 | + |
| 196 | + # Run this to ensure everything worked and that the genesis file is setup correctly |
| 197 | + # $BINARY genesis validate --home "$HOMEDIR" |
| 198 | + |
| 199 | + # cp -f "$HOMEDIR/config/genesis.json" "$HOMEDIR2/config" |
| 200 | + # cp -f "$HOMEDIR/config/genesis.json" "$HOMEDIR3/config" |
| 201 | + # cp -f "$HOMEDIR/config/genesis.json" "$HOMEDIR4/config" |
| 202 | + |
| 203 | + if [[ $1 == "pending" ]]; then |
| 204 | + echo "pending mode is on, please wait for the first block committed." |
| 205 | + fi |
| 206 | +fi |
| 207 | + |
| 208 | +# Cleanup function to run on Ctrl-C |
| 209 | +cleanup() { |
| 210 | + # echo "Ctrl-C detected! Killing background jobs..." |
| 211 | + # kill $pid1 $pid2 $pid3 |
| 212 | + # wait $pid1 $pid2 $pid3 2>/dev/null |
| 213 | + echo "All background jobs cleaned up. Exiting." |
| 214 | + exit 0 |
| 215 | +} |
| 216 | + |
| 217 | +# Trap SIGINT (Ctrl-C) |
| 218 | +trap cleanup SIGINT |
| 219 | + |
| 220 | +for ((i=2; i<=N; i++)); do |
| 221 | + $BINARY start --home ${APPHOME%?}$i > "$HOMEDIR/output$i.log" 2>&1 & |
| 222 | +done |
| 223 | + |
| 224 | +# Start the node (remove the --pruning=nothing flag if historical queries are not needed) |
| 225 | +$BINARY start --log_level info --minimum-gas-prices=0.0001${DENOMS[0]} --home ${APPHOME%?}1 |
0 commit comments