simulate_upgrade 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #!/bin/bash
  2. set -euo pipefail
  3. function usage() {
  4. cat <<EOF >&2
  5. Usage:
  6. $(basename "$0") [-h] [-m s] [-c s] [-x] [-k] [-d] [-a s] [-l s] -- Simulate an upgrade on a fork of mainnet, and check for any errors.
  7. where:
  8. -h show this help text
  9. -m module (bridge, token_bridge, nft_bridge)
  10. -c chain name
  11. -x run anvil
  12. -d don't compile contract first
  13. -k keep anvil alive
  14. -l file to loge to (by default creates a new tmp file)
  15. -a new code address (by default it builds the most recent contract in the repository)
  16. EOF
  17. exit 1
  18. }
  19. before=$(mktemp)
  20. after=$(mktemp)
  21. ### Parse command line options
  22. address=""
  23. module=""
  24. chain_name=""
  25. run_anvil=false
  26. skip_compile=false
  27. keepalive_anvil=false
  28. anvil_out=$(mktemp)
  29. while getopts ':hm:c:a:xkdl:' option; do
  30. case "$option" in
  31. h) usage
  32. ;;
  33. m) module=$OPTARG
  34. ;;
  35. a) address=$OPTARG
  36. ;;
  37. c) chain_name=$OPTARG
  38. ;;
  39. x) run_anvil=true
  40. ;;
  41. d) skip_compile=true
  42. ;;
  43. l) anvil_out=$OPTARG
  44. ;;
  45. k) keepalive_anvil=true
  46. run_anvil=true
  47. ;;
  48. :) printf "missing argument for -%s\n" "$OPTARG" >&2
  49. usage
  50. ;;
  51. \?) printf "illegal option: -%s\n" "$OPTARG" >&2
  52. usage
  53. ;;
  54. esac
  55. done
  56. shift $((OPTIND - 1))
  57. [ -z "$chain_name" ] && usage
  58. [ -z "$module" ] && usage
  59. CORE=$(worm contract mainnet "$chain_name" Core)
  60. echo "core: $CORE"
  61. GUARDIAN_ADDRESS=0xbeFA429d57cD18b7F8A4d91A2da9AB4AF05d0FBe
  62. GUARDIAN_SECRET=cfb12303a19cde580bb4dd771639b0d26bc68353645571a8cff516ab2ee113a0
  63. ANVIL_PID=""
  64. function clean_up () {
  65. ARG=$?
  66. [ -n "$ANVIL_PID" ] && kill "$ANVIL_PID"
  67. exit $ARG
  68. }
  69. trap clean_up EXIT
  70. #TODO: make RPC an optional argument
  71. HOST="http://localhost"
  72. PORT="8545"
  73. RPC="$HOST:$PORT"
  74. if [[ $run_anvil = true ]]; then
  75. anvil --port $PORT --fork-url "$(worm rpc mainnet $chain_name)" --mnemonic "myth like bonus scare over problem client lizard pioneer submit female collect" > "$anvil_out" &
  76. ANVIL_PID=$!
  77. echo "🍴 Forking mainnet..."
  78. echo "Anvil logs in $anvil_out"
  79. sleep 5
  80. # ps | grep "$ANVIL_PID"
  81. fi
  82. MODULE=""
  83. SCRIPT=""
  84. case "$module" in
  85. bridge|core)
  86. MODULE=Core
  87. SCRIPT="scripts/deploy_core_bridge.js"
  88. ;;
  89. token_bridge)
  90. MODULE=TokenBridge
  91. SCRIPT="scripts/deploy_token_bridge.js"
  92. ;;
  93. nft_bridge)
  94. MODULE=NFTBridge
  95. SCRIPT="scripts/deploy_nft_bridge.js"
  96. ;;
  97. *) echo "unknown module $module" >&2
  98. usage
  99. ;;
  100. esac
  101. CONTRACT=$(worm contract mainnet "$chain_name" "$MODULE")
  102. if [[ -n "$address" ]]; then
  103. new_implementation="$address"
  104. else
  105. if [[ $skip_compile = false ]]; then
  106. echo "🛠 Compiling contract..."
  107. build_output=$(npm run build) || ( echo "$build_output" && exit 1 )
  108. fi
  109. printf "⬆️ Deploying implementation..."
  110. deploy_output=$(npx truffle exec $SCRIPT --network development) || ( echo "$deploy_output" && exit 1 )
  111. new_implementation=$(echo "$deploy_output" | grep "address:" | cut -d' ' -f3)
  112. fi
  113. printf " %s\n" "$new_implementation"
  114. vaa=$(worm generate upgrade -c "$chain_name" -a "$new_implementation" -m $MODULE -g "$GUARDIAN_SECRET")
  115. echo "💂 Overriding guardian set with $GUARDIAN_ADDRESS"
  116. worm evm hijack -g "$GUARDIAN_ADDRESS" -i 0 -a "$CORE" --rpc "$RPC"> /dev/null
  117. echo "🔍 Querying old contract state"
  118. worm evm info -c "$chain_name" -m $MODULE -n devnet -a "$CONTRACT" --rpc "$RPC" | grep -v '"implementation":' > "$before"
  119. echo "🤝 Submitting VAA"
  120. worm submit "$vaa" -n devnet -a "$CONTRACT" --rpc "$RPC" > /dev/null
  121. echo "🔍 Querying new contract state"
  122. worm evm info -c "$chain_name" -m $MODULE -n devnet -a "$CONTRACT" --rpc "$RPC" | grep -v '"implementation":' > "$after"
  123. git diff --no-index "$before" "$after" --exit-code && echo "✅ Upgrade simulation successful" || exit 1
  124. if [[ $keepalive_anvil = true ]]; then
  125. echo "Listening on $RPC"
  126. # tail -f "$anvil_out"
  127. wait "$ANVIL_PID"
  128. fi