Skip to content

Commit

Permalink
Local to Mainnet Scripts (#323)
Browse files Browse the repository at this point in the history
Co-authored-by: vish-stride <[email protected]>
  • Loading branch information
sampocs and shellvish authored Oct 31, 2022
1 parent 650c990 commit 4cb9626
Show file tree
Hide file tree
Showing 8 changed files with 547 additions and 0 deletions.
7 changes: 7 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,13 @@ services:
- ./scripts/state/hermes/config.toml:/home/hermes/.hermes/config.toml
restart: always

relayer-host:
image: stridezone:relayer
volumes:
- ./scripts/state/relayer:/home/relayer/.relayer
restart: always
command: [ "bash", "start.sh", "stride-host" ]

relayer-gaia:
image: stridezone:relayer
volumes:
Expand Down
25 changes: 25 additions & 0 deletions scripts/local-to-mainnet/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Connecting to Mainnet
## Dependency
* The fleet must be up and running for the host since we need the websocket endpoint

## Setup
* Ensure you have dockernet setup properly including all submodules up to date and the `STRIDE_ADMIN_MNEMONIC` enviornment variable set
* Fund three hot wallets and set the mnemonics as environment variables (`HOT_WALLET_1_MNEMONIC`, `HOT_WALLET_2_MNEMONIC`, `HOT_WALLET_3_MNEMONIC`)
* They all must have a non-zero balance on the host
* Wallet #1 should have enough to fund each liquid stake
* Wallet #2 and Wallet #3 only need enough to relay on the host (~1 native token)
* Update the variables at the top of `start.sh`

## Start Stride Local
* Build stride and the relayers
```
make build-docker build=srh
```
* Start a local stride and setup all the commands needed to test the flow
```
bash scripts/local-to-mainnet/start.sh
```

## Walk through Flow
* Step through the commands in `commands.sh` one by one and copy them into the terminal
* In the future, we can automate this more but since this interacts with mainnet, I think it's safer to run these manually for now
92 changes: 92 additions & 0 deletions scripts/local-to-mainnet/commands.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
############################################
### WARNING: THIS FILE IS AUTOGENERATED. ###
### ANY CHANGES WILL BE OVERWRITTEN. ###
############################################
#### SETUP HOT WALLET (Only needs to be run once)
echo "$HOT_WALLET_1_MNEMONIC" | build/osmosisd keys add hot --recover --keyring-backend test


#### START RELAYERS
# Create connections and channels
docker-compose run --rm relayer-host rly transact link stride-host
# (OR) If the go relayer isn't working, use hermes (you'll have to add the connections to the relayer config though in `scripts/state/relayer`)
# docker-compose run --rm hermes hermes create connection --a-chain osmosis-1 --b-chain local-test-7
# docker-compose run --rm hermes hermes create channel --a-chain local-test-7 --a-connection connection-0 --a-port transfer --b-port transfer

# Get channel ID created on the host
build/strided --home scripts/state/stride1 q ibc channel channels
transfer_channel=$(build/strided --home scripts/state/stride1 q ibc channel channels | grep channel-0 -A 4 | grep counterparty -A 1 | grep channel | awk '{print $2}') && echo $transfer_channel

# Start Hermes Relayer
docker-compose up -d hermes
docker-compose logs -f hermes | sed -r -u "s/\x1B\[([0-9]{1,3}(;[0-9]{1,2})?)?[mGK]//g" >> scripts/logs/hermes.log 2>&1 &

# Configure the Go Relayer to only run ICQ
sed -i -E "s|rule: \"\"|rule: allowlist|g" scripts/state/relayer/config/config.yaml

# Start Go Relayer (for ICQ)
docker-compose up -d relayer-host
docker-compose logs -f relayer-host | sed -r -u "s/\x1B\[([0-9]{1,3}(;[0-9]{1,2})?)?[mGK]//g" >> scripts/logs/relayer.log 2>&1 &


#### REGISTER HOST
# IBC Transfer from HOST to stride (from relayer account)
build/osmosisd tx ibc-transfer transfer transfer $transfer_channel stride1u20df3trc2c2zdhm8qvh2hdjx9ewh00sv6eyy8 4000000uosmo --from hot --chain-id osmosis-1 -y --keyring-backend test --node http://osmo-fleet-direct.main.stridenet.co:26657

# Confirm funds were recieved on stride and get IBC denom
build/strided --home scripts/state/stride1 q bank balances stride1u20df3trc2c2zdhm8qvh2hdjx9ewh00sv6eyy8

# Register host zone
IBC_DENOM=$(build/strided --home scripts/state/stride1 q bank balances stride1u20df3trc2c2zdhm8qvh2hdjx9ewh00sv6eyy8 | grep ibc | awk '{print $2}' | tr -d '"') && echo $IBC_DENOM
build/strided --home scripts/state/stride1 tx stakeibc register-host-zone \
connection-0 uosmo osmo $IBC_DENOM channel-0 1 \
--from admin --gas 1000000 -y

# Add validator
build/strided --home scripts/state/stride1 tx stakeibc add-validator osmosis-1 imperator osmovaloper1083svrca4t350mphfv9x45wq9asrs60c6rv0j5 10 5 --chain-id local-test-7 --keyring-backend test --from admin -y


#### FLOW
## Go Through Flow
# Liquid stake (then wait and LS again)
build/strided --home scripts/state/stride1 tx stakeibc liquid-stake 1000000 uosmo --keyring-backend test --from admin -y --chain-id local-test-7 -y

# Confirm stTokens, StakedBal, and Redemption Rate
build/strided --home scripts/state/stride1 q bank balances stride1u20df3trc2c2zdhm8qvh2hdjx9ewh00sv6eyy8
build/strided --home scripts/state/stride1 q stakeibc list-host-zone

# Redeem
build/strided --home scripts/state/stride1 tx stakeibc redeem-stake 1000 osmosis-1 osmo1c37n9aywapx2v0s6vk2yedydkkhq65zz38jfnc --from admin --keyring-backend test --chain-id local-test-7 -y

# Confirm stTokens and StakedBal
build/strided --home scripts/state/stride1 q bank balances stride1u20df3trc2c2zdhm8qvh2hdjx9ewh00sv6eyy8
build/strided --home scripts/state/stride1 q stakeibc list-host-zone

# Add another validator
build/strided --home scripts/state/stride1 tx stakeibc add-validator osmosis-1 imperator osmovaloper1083svrca4t350mphfv9x45wq9asrs60c6rv0j5 10 5 --chain-id local-test-7 --keyring-backend test --from admin -y

# Liquid stake and confirm the stake was split 50/50 between the validators
build/strided --home scripts/state/stride1 tx stakeibc liquid-stake 1000000 uosmo --keyring-backend test --from admin -y --chain-id local-test-7 -y

# Change validator weights
build/strided --home scripts/state/stride1 tx stakeibc change-validator-weight osmosis-1 osmovaloper1t8qckan2yrygq7kl9apwhzfalwzgc2429p8f0s 1 --from admin -y
build/strided --home scripts/state/stride1 tx stakeibc change-validator-weight osmosis-1-1 osmovaloper1083svrca4t350mphfv9x45wq9asrs60c6rv0j5 49 --from admin -y

# LS and confirm delegation aligned with new weights
build/strided --home scripts/state/stride1 tx stakeibc liquid-stake 1000000 ujuno --keyring-backend test --from admin -y --chain-id local-test-7 -y

# Call rebalance to and confirm new delegations
build/strided --home scripts/state/stride1 tx stakeibc rebalance-validators osmosis-1 5 --from admin

# Clear balances
fee_address=$(build/strided --home scripts/state/stride1 q stakeibc show-host-zone osmosis-1 | grep feeAccount -A 1 | grep address | awk '{print $2}') && echo $fee_address
balance=$(build/strided --home scripts/state/stride1 q bank balances $fee_address | grep amount | awk '{print $3}' | tr -d '"') && echo $balance
build/strided --home scripts/state/stride1 tx stakeibc clear-balance osmosis-1 $balance $transfer_channel --from admin

# Update delegations (just submit this query and confirm the ICQ callback displays in the stride logs)
# Must be submitted in ICQ window
build/strided --home scripts/state/stride1 tx stakeibc update-delegation osmosis-1 osmovaloper1t8qckan2yrygq7kl9apwhzfalwzgc2429p8f0s --from admin -y

#### MISC
# If a channel closes, restore it with:
build/strided --home scripts/state/stride1 tx stakeibc restore-interchain-account osmosis-1 {DELEGATION | WITHDRAWAL | FEE | REDEMPTION} --from admin
110 changes: 110 additions & 0 deletions scripts/local-to-mainnet/init_stride.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
#!/bin/bash

set -eu
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )

STRIDE_CHAIN_ID="$1"
STATE=$SCRIPT_DIR/../state
KEYS_LOGS=$SCRIPT_DIR/../logs/keys.log

# CHAIN PARAMS
BLOCK_TIME='5s'
STRIDE_DAY_EPOCH_DURATION="120s"
STRIDE_EPOCH_EPOCH_DURATION="120s"
MAX_DEPOSIT_PERIOD="30s"
VOTING_PERIOD="30s"
INITIAL_ANNUAL_PROVISIONS="10000000000000.000000000000000000"
VAL_TOKENS=5000000000000
STAKE_TOKENS=5000000000
ADMIN_TOKENS=1000000000
PEER_PORT=26656
RPC_PORT=26657
VAL_PREFIX=val
DENOM=ustrd

NODE_NAME="stride1"
STRIDE_VAL_MNEMONIC="close soup mirror crew erode defy knock trigger gather eyebrow tent farm gym gloom base lemon sleep weekend rich forget diagram hurt prize fly"
HERMES_MNEMONIC="alter old invest friend relief slot swear pioneer syrup economy vendor tray focus hedgehog artist legend antenna hair almost donkey spice protect sustain increase"
RELAYER_MNEMONIC="pride narrow breeze fitness sign bounce dose smart squirrel spell length federal replace coral lunar thunder vital push nuclear crouch fun accident hood need"

STRIDE_ADMIN_ACCT=admin
STRIDE_VAL_ACCT=val1
HERMES_ACCT=hrly1
RELAYER_ACCT=rly1

CMD="$SCRIPT_DIR/../../build/strided --home $SCRIPT_DIR/../state/stride1"

echo "Initializing Stride chain..."

# Create a state directory for the current node and initialize the chain
mkdir -p $STATE/$NODE_NAME
$CMD init STRIDE --chain-id $STRIDE_CHAIN_ID --overwrite &> /dev/null

# Update node networking configuration
config_toml="${STATE}/${NODE_NAME}/config/config.toml"
client_toml="${STATE}/${NODE_NAME}/config/client.toml"
app_toml="${STATE}/${NODE_NAME}/config/app.toml"
genesis_json="${STATE}/${NODE_NAME}/config/genesis.json"

sed -i -E "s|cors_allowed_origins = \[\]|cors_allowed_origins = [\"\*\"]|g" $config_toml
sed -i -E "s|127.0.0.1|0.0.0.0|g" $config_toml
sed -i -E "s|timeout_commit = \"5s\"|timeout_commit = \"${BLOCK_TIME}\"|g" $config_toml
sed -i -E "s|prometheus = false|prometheus = true|g" $config_toml

sed -i -E "s|minimum-gas-prices = \".*\"|minimum-gas-prices = \"0${DENOM}\"|g" $app_toml
sed -i -E '/\[api\]/,/^enable = .*$/ s/^enable = .*$/enable = true/' $app_toml
sed -i -E 's|unsafe-cors = .*|unsafe-cors = true|g' $app_toml

sed -i -E "s|chain-id = \"\"|chain-id = \"${STRIDE_CHAIN_ID}\"|g" $client_toml
sed -i -E "s|keyring-backend = \"os\"|keyring-backend = \"test\"|g" $client_toml
sed -i -E "s|node = \".*\"|node = \"tcp://localhost:$RPC_PORT\"|g" $client_toml

sed -i -E "s|\"stake\"|\"${DENOM}\"|g" $genesis_json

# Get the endpoint and node ID
node_id=$($CMD tendermint show-node-id)@$NODE_NAME:$PEER_PORT
echo "Node ID: $node_id"

# add a validator account
echo "$STRIDE_VAL_MNEMONIC" | $CMD keys add $STRIDE_VAL_ACCT --recover --keyring-backend=test >> $KEYS_LOGS 2>&1
VAL_ADDR=$($CMD keys show $STRIDE_VAL_ACCT --keyring-backend test -a)
# Add this account to the current node
$CMD add-genesis-account ${VAL_ADDR} ${VAL_TOKENS}${DENOM}
# actually set this account as a validator on the current node
$CMD gentx $STRIDE_VAL_ACCT ${STAKE_TOKENS}${DENOM} --chain-id $STRIDE_CHAIN_ID --keyring-backend test &> /dev/null

# Cleanup from seds
rm -rf ${client_toml}-E
rm -rf ${genesis_json}-E
rm -rf ${app_toml}-E

# add Hermes and ICQ relayer accounts on Stride
echo "$HERMES_MNEMONIC" | $CMD keys add $HERMES_ACCT --recover --keyring-backend=test >> $KEYS_LOGS 2>&1
echo "$RELAYER_MNEMONIC" | $CMD keys add $RELAYER_ACCT --recover --keyring-backend=test >> $KEYS_LOGS 2>&1
HERMES_ADDRESS=$($CMD keys show $HERMES_ACCT --keyring-backend test -a)
RELAYER_ADDRESS=$($CMD keys show $RELAYER_ACCT --keyring-backend test -a)

# give relayer accounts token balances
$CMD add-genesis-account ${HERMES_ADDRESS} ${VAL_TOKENS}${DENOM}
$CMD add-genesis-account ${RELAYER_ADDRESS} ${VAL_TOKENS}${DENOM}

# add the stride admin account
echo "$STRIDE_ADMIN_MNEMONIC" | $CMD keys add $STRIDE_ADMIN_ACCT --recover --keyring-backend=test >> $KEYS_LOGS 2>&1
STRIDE_ADMIN_ADDRESS=$($CMD keys show $STRIDE_ADMIN_ACCT --keyring-backend test -a)
$CMD add-genesis-account ${STRIDE_ADMIN_ADDRESS} ${ADMIN_TOKENS}${DENOM}

# now we process gentx txs on the main node
$CMD collect-gentxs &> /dev/null

# wipe out the persistent peers for the main node (these are incorrectly autogenerated for each validator during collect-gentxs)
sed -i -E "s|persistent_peers = .*|persistent_peers = \"\"|g" $config_toml

# update params
jq '(.app_state.epochs.epochs[] | select(.identifier=="day") ).duration = $epochLen' --arg epochLen $STRIDE_DAY_EPOCH_DURATION $genesis_json > json.tmp && mv json.tmp $genesis_json
jq '(.app_state.epochs.epochs[] | select(.identifier=="stride_epoch") ).duration = $epochLen' --arg epochLen $STRIDE_EPOCH_EPOCH_DURATION $genesis_json > json.tmp && mv json.tmp $genesis_json
jq '.app_state.gov.deposit_params.max_deposit_period = $newVal' --arg newVal "$MAX_DEPOSIT_PERIOD" $genesis_json > json.tmp && mv json.tmp $genesis_json
jq '.app_state.gov.voting_params.voting_period = $newVal' --arg newVal "$VOTING_PERIOD" $genesis_json > json.tmp && mv json.tmp $genesis_json

# Cleanup from seds
rm -rf ${config_toml}-E
rm -rf ${genesis_json}-E
91 changes: 91 additions & 0 deletions scripts/local-to-mainnet/start.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
#!/bin/bash

set -eu
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )

STRIDE_CHAIN_ID=local-test-7
HOST_CHAIN_ID=osmosis-1
HOST_ENDPOINT=osmo-fleet-direct.main.stridenet.co
HOST_ACCOUNT_PREFIX=osmo
HOST_DENOM=uosmo
HOST_BINARY=build/osmosisd
HOST_VAL_NAME_1=imperator
HOST_VAL_ADDRESS_1=osmovaloper1t8qckan2yrygq7kl9apwhzfalwzgc2429p8f0s
HOST_VAL_NAME_2=notional
HOST_VAL_ADDRESS_2=osmovaloper1083svrca4t350mphfv9x45wq9asrs60c6rv0j5
HOT_WALLET_ADDRESS=osmo1c37n9aywapx2v0s6vk2yedydkkhq65zz38jfnc

STATE=$SCRIPT_DIR/../state
STRIDE_LOGS=$SCRIPT_DIR/../logs/stride.log

HERMES_STRIDE_MNEMONIC="alter old invest friend relief slot swear pioneer syrup economy vendor tray focus hedgehog artist legend antenna hair almost donkey spice protect sustain increase"
RELAYER_STRIDE_MNEMONIC="pride narrow breeze fitness sign bounce dose smart squirrel spell length federal replace coral lunar thunder vital push nuclear crouch fun accident hood need"

# cleanup any stale state
make stop-docker
rm -rf $STATE $SCRIPT_DIR/../logs/*.log $SCRIPT_DIR/../logs/temp
mkdir -p $SCRIPT_DIR/../logs

# Start stride
sh ${SCRIPT_DIR}/init_stride.sh $STRIDE_CHAIN_ID

docker-compose up -d stride1
docker-compose logs -f stride1 | sed -r -u "s/\x1B\[([0-9]{1,3}(;[0-9]{1,2})?)?[mGK]//g" > $STRIDE_LOGS 2>&1 &

printf "Waiting for Stride to start..."
( tail -f -n0 $STRIDE_LOGS & ) | grep -q "finalizing commit of block"
echo "Done"

# Setup relayers
mkdir -p $STATE/hermes
mkdir -p $STATE/relayer/config
HERMES_CONFIG_FILE="$STATE/hermes/config.toml"
RELAYER_CONFIG_FILE="$STATE/relayer/config/config.yaml"
cp ${SCRIPT_DIR}/templates/hermes_config.toml $HERMES_CONFIG_FILE
cp ${SCRIPT_DIR}/templates/relayer_config.yaml $RELAYER_CONFIG_FILE

# Update relayer templates
sed -i -E "s|STRIDE_CHAIN_ID|$STRIDE_CHAIN_ID|g" $HERMES_CONFIG_FILE
sed -i -E "s|HOST_CHAIN_ID|$HOST_CHAIN_ID|g" $HERMES_CONFIG_FILE
sed -i -E "s|HOST_ENDPOINT|$HOST_ENDPOINT|g" $HERMES_CONFIG_FILE
sed -i -E "s|HOST_ACCOUNT_PREFIX|$HOST_ACCOUNT_PREFIX|g" $HERMES_CONFIG_FILE
sed -i -E "s|HOST_DENOM|$HOST_DENOM|g" $HERMES_CONFIG_FILE

sed -i -E "s|STRIDE_CHAIN_ID|$STRIDE_CHAIN_ID|g" $RELAYER_CONFIG_FILE
sed -i -E "s|HOST_CHAIN_ID|$HOST_CHAIN_ID|g" $RELAYER_CONFIG_FILE
sed -i -E "s|HOST_ENDPOINT|$HOST_ENDPOINT|g" $RELAYER_CONFIG_FILE
sed -i -E "s|HOST_ACCOUNT_PREFIX|$HOST_ACCOUNT_PREFIX|g" $RELAYER_CONFIG_FILE
sed -i -E "s|HOST_DENOM|$HOST_DENOM|g" $RELAYER_CONFIG_FILE

echo "Adding Hermes keys"
HERMES_CMD="$SCRIPT_DIR/../../build/hermes/release/hermes --config $STATE/hermes/config.toml"
TMP_MNEMONICS=$STATE/mnemonic.txt
echo "$HERMES_STRIDE_MNEMONIC" > $TMP_MNEMONICS
$HERMES_CMD keys add --key-name hrly1 --chain $STRIDE_CHAIN_ID --mnemonic-file $TMP_MNEMONICS --overwrite
echo "$HOT_WALLET_2_MNEMONIC" > $TMP_MNEMONICS
$HERMES_CMD keys add --key-name hrly2 --chain $HOST_CHAIN_ID --mnemonic-file $TMP_MNEMONICS --overwrite
rm -f $TMP_MNEMONICS

echo "Adding Relayer keys"
RELAYER_CMD="$SCRIPT_DIR/../../build/relayer --home $STATE/relayer"
$RELAYER_CMD keys restore stride rly1 "$RELAYER_STRIDE_MNEMONIC"
$RELAYER_CMD keys restore host rly2 "$HOT_WALLET_3_MNEMONIC"

# Update commands template
COMMANDS_FILE=${SCRIPT_DIR}/commands.sh
cp ${SCRIPT_DIR}/templates/commands.sh $COMMANDS_FILE
sed -i -E '1s/^/############################################\n### WARNING: THIS FILE IS AUTOGENERATED. ###\n### ANY CHANGES WILL BE OVERWRITTEN. ###\n############################################\n/' $COMMANDS_FILE
sed -i -E "s|STRIDE_CHAIN_ID|$STRIDE_CHAIN_ID|g" $COMMANDS_FILE
sed -i -E "s|HOST_CHAIN_ID|$HOST_CHAIN_ID|g" $COMMANDS_FILE
sed -i -E "s|HOST_BINARY|$HOST_BINARY|g" $COMMANDS_FILE
sed -i -E "s|HOST_DENOM|$HOST_DENOM|g" $COMMANDS_FILE
sed -i -E "s|HOST_ACCOUNT_PREFIX|$HOST_ACCOUNT_PREFIX|g" $COMMANDS_FILE
sed -i -E "s|HOST_ENDPOINT|$HOST_ENDPOINT|g" $COMMANDS_FILE
sed -i -E "s|HOST_VAL_NAME_1|$HOST_VAL_NAME_1|g" $COMMANDS_FILE
sed -i -E "s|HOST_VAL_NAME_2|$HOST_VAL_NAME_2|g" $COMMANDS_FILE
sed -i -E "s|HOST_VAL_ADDRESS_1|$HOST_VAL_ADDRESS_1|g" $COMMANDS_FILE
sed -i -E "s|HOST_VAL_ADDRESS_2|$HOST_VAL_ADDRESS_2|g" $COMMANDS_FILE
sed -i -E "s|HOT_WALLET_ADDRESS|$HOT_WALLET_ADDRESS|g" $COMMANDS_FILE

rm -f $COMMANDS_FILE-E
echo "Done"
Loading

0 comments on commit 4cb9626

Please sign in to comment.