From cd04836c4b72c615205f9eaf79b2c0be768d068a Mon Sep 17 00:00:00 2001 From: justinschuldt Date: Fri, 1 Apr 2022 10:49:54 -0500 Subject: [PATCH] add guardian-set-init.sh for tilt up --num=* --- Tiltfile | 11 ++++ scripts/guardian-set-init.sh | 112 +++++++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100755 scripts/guardian-set-init.sh diff --git a/Tiltfile b/Tiltfile index 10c9846cb..ece907f53 100644 --- a/Tiltfile +++ b/Tiltfile @@ -210,6 +210,13 @@ k8s_resource( trigger_mode = trigger_mode, ) +local_resource( + name = "guardian-set-init", + deps = ["scripts", "ethereum", "clients", "solana", "terra"], + cmd = './scripts/guardian-set-init.sh %s' % (num_guardians), + allow_parallel = True, + trigger_mode = trigger_mode, +) if num_guardians >= 2: local_resource( name = "guardian-set-update", @@ -267,6 +274,7 @@ if solana: port_forward(8900, name = "Solana WS [:8900]", host = webHost), port_forward(9000, name = "Solana PubSub [:9000]", host = webHost), ], + resource_deps = ["guardian-set-init"], labels = ["solana"], trigger_mode = trigger_mode, ) @@ -352,6 +360,7 @@ k8s_resource( port_forwards = [ port_forward(8545, name = "Ganache RPC [:8545]", host = webHost), ], + resource_deps = ["guardian-set-init"], labels = ["evm"], trigger_mode = trigger_mode, ) @@ -361,6 +370,7 @@ k8s_resource( port_forwards = [ port_forward(8546, name = "Ganache RPC [:8546]", host = webHost), ], + resource_deps = ["guardian-set-init"], labels = ["evm"], trigger_mode = trigger_mode, ) @@ -539,6 +549,7 @@ k8s_resource( port_forward(26657, name = "Terra RPC [:26657]", host = webHost), port_forward(1317, name = "Terra LCD [:1317]", host = webHost), ], + resource_deps = ["guardian-set-init"], labels = ["terra"], trigger_mode = trigger_mode, ) diff --git a/scripts/guardian-set-init.sh b/scripts/guardian-set-init.sh new file mode 100755 index 000000000..bc2b64216 --- /dev/null +++ b/scripts/guardian-set-init.sh @@ -0,0 +1,112 @@ +#!/usr/bin/env bash +# This script allows devnet initalization with more than one guardian. +# First argument is the number of guardians for the initial guardian set. +set -e + +numGuardians=$1 +echo "number of guardians to initialize: ${numGuardians}" + +addressesJson="./scripts/devnet-consts.json" + + +# create an array of strings containing the ECDSA public keys of the devnet guardians in the guardianset + +# guardiansPublicEth has the leading "0x" that Eth scripts expect. +guardiansPublicEth=$(jq -c --argjson lastIndex $numGuardians '.devnetGuardians[:$lastIndex] | [.[].public]' $addressesJson) +# guardiansPublicHex does not have a leading "0x", just hex strings. +guardiansPublicHex=$(jq -c --argjson lastIndex $numGuardians '.devnetGuardians[:$lastIndex] | [.[].public[2:]]' $addressesJson) + + +# copy the eth defaults to a new file so we can override just the things we need +cp ./ethereum/.env.test ./ethereum/.env + +# override the default INIT_SIGNERS with the list created above +sed -i "/INIT_SIGNERS=/c\INIT_SIGNERS=$guardiansPublicEth" ./ethereum/.env + +# create a local .env file, to be used by solana & terra +echo "INIT_SIGNERS=$guardiansPublicHex" > ./scripts/.env + + + +# create an array of strings containing the private keys of the devnet guardians in the guardianset +guardiansPrivate=$(jq -c --argjson lastIndex $numGuardians '.devnetGuardians[:$lastIndex] | [.[].private]' $addressesJson) + +# create a CSV string with the private keys of the guardians in the guardianset, that will be used to create registration VAAs +guardiansPrivateCSV=$( echo ${guardiansPrivate} | jq --raw-output -c '. | join(",")') + +echo "getting contract addresses from $addressesJson" +# get addresses from the constants file +solTokenBridge=$(jq --raw-output '.chains."1".contracts.tokenBridgeEmitterAddress' $addressesJson) +ethTokenBridge=$(jq --raw-output '.chains."2".contracts.tokenBridgeEmitterAddress' $addressesJson) +terraTokenBridge=$(jq --raw-output '.chains."3".contracts.tokenBridgeEmitterAddress' $addressesJson) +bscTokenBridge=$(jq --raw-output '.chains."4".contracts.tokenBridgeEmitterAddress' $addressesJson) + +solNFTBridge=$(jq --raw-output '.chains."1".contracts.nftBridgeEmitterAddress' $addressesJson) +ethNFTBridge=$(jq --raw-output '.chains."2".contracts.nftBridgeEmitterAddress' $addressesJson) +terraNFTBridge=$(jq --raw-output '.chains."3".contracts.nftBridgeEmitterAddress' $addressesJson) + +# generate the registration VAAs + +# fetch dependencies for the clients/token_bridge script that generates token bridge registration VAAs +if [[ ! -d ./clients/token_bridge/node_modules ]]; then + echo "going to install node modules in clients/token_bridge" + npm ci --prefix clients/token_bridge && npm run build --prefix clients/token_bridge +fi +# create token bridge registration VAAs +echo "generating VAAs for token bridges" +solTokenBridgeVAA=$(npm --prefix clients/token_bridge run --silent main -- generate_register_chain_vaa 1 0x${solTokenBridge} --guardian_secret ${guardiansPrivateCSV}) +ethTokenBridgeVAA=$(npm --prefix clients/token_bridge run --silent main -- generate_register_chain_vaa 2 0x${ethTokenBridge} --guardian_secret ${guardiansPrivateCSV} ) +terraTokenBridgeVAA=$(npm --prefix clients/token_bridge run --silent main -- generate_register_chain_vaa 3 0x${terraTokenBridge} --guardian_secret ${guardiansPrivateCSV}) +bscTokenBridgeVAA=$(npm --prefix clients/token_bridge run --silent main -- generate_register_chain_vaa 4 0x${bscTokenBridge} --guardian_secret ${guardiansPrivateCSV}) + + +# fetch dependencies for the clients/nft_bridge script that generates nft bridge registration VAAs +if [[ ! -d ./clients/nft_bridge/node_modules ]]; then + echo "going to install node modules in clients/nft_bridge" + npm ci --prefix clients/nft_bridge && npm run build --prefix clients/nft_bridge +fi +# create nft bridge registration VAAs +echo "generating VAAs for nft bridges" +solNFTBridgeVAA=$(npm --prefix clients/nft_bridge run --silent main -- generate_register_chain_vaa 1 0x${solNFTBridge} --guardian_secret ${guardiansPrivateCSV}) +ethNFTBridgeVAA=$(npm --prefix clients/nft_bridge run --silent main -- generate_register_chain_vaa 2 0x${ethNFTBridge} --guardian_secret ${guardiansPrivateCSV}) +terraNFTBridgeVAA=$(npm --prefix clients/nft_bridge run --silent main -- generate_register_chain_vaa 3 0x${terraNFTBridge} --guardian_secret ${guardiansPrivateCSV}) + + +# write the registration VAAs to env files +echo "updating .env files" + +# solana token bridge +sed -i "/REGISTER_SOL_TOKEN_BRIDGE_VAA=/c\REGISTER_SOL_TOKEN_BRIDGE_VAA=$solTokenBridgeVAA" ./ethereum/.env +echo "REGISTER_SOL_TOKEN_BRIDGE_VAA=$solTokenBridgeVAA" >> ./scripts/.env +# solana nft bridge +sed -i "/REGISTER_SOL_NFT_BRIDGE_VAA=/c\REGISTER_SOL_NFT_BRIDGE_VAA=$solNFTBridgeVAA" ./ethereum/.env +echo "REGISTER_SOL_NFT_BRIDGE_VAA=$solNFTBridgeVAA" >> ./scripts/.env + + +# ethereum token bridge +sed -i "/REGISTER_ETH_TOKEN_BRIDGE_VAA=/c\REGISTER_ETH_TOKEN_BRIDGE_VAA=$ethTokenBridgeVAA" ./ethereum/.env +echo "REGISTER_ETH_TOKEN_BRIDGE_VAA=$ethTokenBridgeVAA" >> ./scripts/.env +# ethereum nft bridge +sed -i "/REGISTER_ETH_NFT_BRIDGE_VAA=/c\REGISTER_ETH_NFT_BRIDGE_VAA=$ethNFTBridgeVAA" ./ethereum/.env +echo "REGISTER_ETH_NFT_BRIDGE_VAA=$ethNFTBridgeVAA" >> ./scripts/.env + + +# terra token bridge +sed -i "/REGISTER_TERRA_TOKEN_BRIDGE_VAA=/c\REGISTER_TERRA_TOKEN_BRIDGE_VAA=$terraTokenBridgeVAA" ./ethereum/.env +echo "REGISTER_TERRA_TOKEN_BRIDGE_VAA=$terraTokenBridgeVAA" >> ./scripts/.env +# terra nft bridge +sed -i "/REGISTER_TERRA_NFT_BRIDGE_VAA=/c\REGISTER_TERRA_NFT_BRIDGE_VAA=$terraNFTBridgeVAA" ./ethereum/.env +echo "REGISTER_TERRA_NFT_BRIDGE_VAA=$terraNFTBridgeVAA" >> ./scripts/.env + + +# bsc token bridge +sed -i "/REGISTER_BSC_TOKEN_BRIDGE_VAA=/c\REGISTER_BSC_TOKEN_BRIDGE_VAA=$bscTokenBridgeVAA" ./ethereum/.env +echo "REGISTER_BSC_TOKEN_BRIDGE_VAA=$bscTokenBridgeVAA" >> ./scripts/.env + + +# copy the local .env file to the solana & terra dirs +cp ./scripts/.env ./solana +cp ./scripts/.env ./terra + + +echo "guardian set init complete!"