167 lines
4.3 KiB
Bash
Executable File
167 lines
4.3 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# This is a script for upgrading contracts on the Aptos network.
|
|
# It supports all of devnet (localhost), testnet, and mainnet.
|
|
#
|
|
# A VAA may be provided, in which case the script uses that.
|
|
# Otherwise, in devnet, it generates a VAA using the devnet guardian secret.
|
|
# In testnet, it generates a VAA using the testnet guardian secret as long as
|
|
# it's set in the environment variable GUARDIAN_SECRET.
|
|
# In mainnet, a VAA is required.
|
|
|
|
set -eo pipefail
|
|
|
|
usage() {
|
|
cat <<-EOF >&2
|
|
Usage: ${0##*/} <network> <module> [OPTIONS]
|
|
|
|
Perform a contract upgrade.
|
|
|
|
Positional arguments:
|
|
<network> Network to deploy to (devnet, testnet, mainnet)
|
|
<module> Module to upgrade (Core, TokenBridge, NFTBridge)
|
|
|
|
Options:
|
|
--vaa VAA to submit (required for mainnet)
|
|
--yes Skip confirmation prompt
|
|
EOF
|
|
exit 1
|
|
}
|
|
|
|
# cd to script directory so that we can run this script from anywhere
|
|
cd "$(dirname "$0")"
|
|
|
|
# Check if the jq binary is available.
|
|
if ! command -v jq >/dev/null; then
|
|
echo "jq not found, please install it"
|
|
exit 1
|
|
fi
|
|
|
|
# If positional args are missing, print help message and exit
|
|
if [ $# -lt 2 ]; then
|
|
usage
|
|
fi
|
|
|
|
# Get positional arguments
|
|
NETWORK="$1"
|
|
shift
|
|
MODULE="$1"
|
|
shift
|
|
|
|
yes=false
|
|
|
|
# Parse options
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--vaa)
|
|
VAA="$2"
|
|
shift 2
|
|
;;
|
|
--yes)
|
|
yes=true
|
|
shift
|
|
;;
|
|
--) # end of options
|
|
shift
|
|
break
|
|
;;
|
|
-*)
|
|
echo "Error: Unsupported option $1" >&2
|
|
usage
|
|
;;
|
|
*) # anything else
|
|
echo "Error: Unsupported argument $1" >&2
|
|
usage
|
|
;;
|
|
esac
|
|
done
|
|
|
|
case "$MODULE" in
|
|
Core)
|
|
DIR="../wormhole"
|
|
LOWER_MODULE="wormhole"
|
|
;;
|
|
TokenBridge)
|
|
DIR="../token_bridge"
|
|
LOWER_MODULE="token_bridge"
|
|
;;
|
|
NFTBridge)
|
|
DIR="../nft_bridge"
|
|
LOWER_MODULE="nft_bridge"
|
|
;;
|
|
*) echo "unsupported module $MODULE" >&2
|
|
usage
|
|
;;
|
|
esac
|
|
|
|
NAMED_ADDRS="$(./named_addresses $NETWORK)"
|
|
HASH=$(worm aptos hash-contracts $DIR --named-addresses "$NAMED_ADDRS")
|
|
|
|
if [ "$NETWORK" = testnet ]; then
|
|
[ -z "$GUARDIAN_SECRET" ] && echo "GUARDIAN_SECRET unset" >&2 && exit 1
|
|
|
|
elif [ "$NETWORK" = devnet ]; then
|
|
GUARDIAN_SECRET=cfb12303a19cde580bb4dd771639b0d26bc68353645571a8cff516ab2ee113a0
|
|
|
|
elif [ "$NETWORK" = mainnet ]; then
|
|
# VAA is required for mainnet
|
|
if [ -z "$VAA" ]; then
|
|
echo "VAA required for mainnet. Pass it in with the --vaa flag." >&2
|
|
echo "To generate a draft governance proposal, run" >&2
|
|
echo " ../../scripts/contract-upgrade-governance.sh -c aptos --address $HASH --module $LOWER_MODULE" >&2
|
|
exit 1
|
|
fi
|
|
else
|
|
usage
|
|
fi
|
|
|
|
# if VAA is not set, generate it
|
|
[ -z "$VAA" ] && VAA=$(worm generate upgrade -c aptos -a "$HASH" -m "$MODULE" -g $GUARDIAN_SECRET)
|
|
|
|
# parse VAA
|
|
VAA_JSON=$(worm parse "$VAA")
|
|
|
|
# sanity check VAA
|
|
check_payload_value() {
|
|
key="$1"
|
|
expected_value="$2"
|
|
|
|
payload_value=$(echo "$VAA_JSON" | jq -r ".payload.$key")
|
|
|
|
if [ "$payload_value" != "$expected_value" ]; then
|
|
echo "VAA payload: expected $key $expected_value, got $payload_value" >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# here we make sure the VAA is for the hash we expect
|
|
check_payload_value "type" "ContractUpgrade"
|
|
check_payload_value "chain" "$(worm info chain-id aptos)"
|
|
check_payload_value "module" "$MODULE"
|
|
check_payload_value "address" "0x$HASH"
|
|
|
|
echo "VAA is a valid ContractUpgrade VAA for $MODULE"
|
|
|
|
# Ask for confirmation
|
|
if [ "$yes" = false ]; then
|
|
read -p "Upgrade $MODULE to $HASH? [y/N] " -n 1 -r
|
|
echo
|
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
echo "Aborting"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
echo "Submitting VAA: $VAA"
|
|
|
|
# TODO: --contract-address should not be neded after the sdk has these addresses
|
|
CONTRACT_ADDR=$(worm info contract "$NETWORK" aptos "$MODULE")
|
|
worm submit --network "$NETWORK" "$VAA" --contract-address "$CONTRACT_ADDR"
|
|
worm aptos upgrade $DIR --network "$NETWORK" --contract-address "$CONTRACT_ADDR" --named-addresses "$NAMED_ADDRS"
|
|
worm aptos migrate --network "$NETWORK" --contract-address "$CONTRACT_ADDR"
|
|
|
|
echo "Successfully upgraded $MODULE to $HASH"
|
|
# if network is mainnet or testnet, print explorer link
|
|
[ "$NETWORK" = mainnet ] || [ "$NETWORK" = testnet ] &&
|
|
echo "Check it out at https://explorer.aptoslabs.com/account/$CONTRACT_ADDR?network=$NETWORK"
|