Skip to content

Commit 622bcac

Browse files
committed
Enhance deploy.sh and sync.sh scripts:
- Added checks for REFERENCE_DIAMOND existence and implemented confirmation prompts for deployments in non-local environments. - Improved logging and error handling in sync.sh, including environment validation and reference diamond checks. - Introduced functions for logging and validating environment variables, ensuring required variables are set before proceeding. - Updated address handling to prompt for updates if contract addresses change after deployment.
1 parent 4d8210b commit 622bcac

File tree

2 files changed

+357
-122
lines changed

2 files changed

+357
-122
lines changed

scripts/deploy_factory.sh

Lines changed: 166 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ while [[ "$#" -gt 0 ]]; do
1313
shift
1414
done
1515

16-
1716
# Constructs env file path based on environment
1817
# Example: .env.local, .env.dev, .env.prod
1918
USE_ENV_FILE=".env.$ENVIRONMENT"
@@ -29,6 +28,73 @@ set -a
2928
source "$USE_ENV_FILE"
3029
set +a
3130

31+
# Check if REFERENCE_DIAMOND exists and has code
32+
if [ ! -z "$REFERENCE_DIAMOND" ]; then
33+
echo "Checking if reference diamond exists at $REFERENCE_DIAMOND..."
34+
REMOTE_RPC=${RPC_URL:-"http://localhost:8545"}
35+
CONTRACT_CHECK=$(curl -s -X POST -H "Content-Type: application/json" --data "{\"jsonrpc\":\"2.0\",\"method\":\"eth_getCode\",\"params\":[\"$REFERENCE_DIAMOND\", \"latest\"],\"id\":1}" $REMOTE_RPC)
36+
37+
if [[ $CONTRACT_CHECK == *"\"result\":\"0x\""* ]]; then
38+
echo "⚠️ No implementation found at REFERENCE_DIAMOND address: $REFERENCE_DIAMOND"
39+
echo "This will deploy new implementations of:"
40+
echo "- Reference Diamond"
41+
echo "- All Facets"
42+
echo "RPC URL: $RPC_URL"
43+
44+
if [ "$ENVIRONMENT" != "local" ]; then
45+
read -p "Deploy new implementation? (yes/no): " -r
46+
echo
47+
if [[ ! $REPLY =~ ^[Yy][Ee][Ss]$ ]]; then
48+
echo "Deployment cancelled"
49+
exit 1
50+
fi
51+
52+
# Additional confirmation for non-local
53+
read -p "Type 'I understand' to proceed with deployment to $ENVIRONMENT: " -r
54+
echo
55+
if [[ ! $REPLY == "I understand" ]]; then
56+
echo "Deployment cancelled"
57+
exit 1
58+
fi
59+
else
60+
read -p "Deploy new implementation? (y/N): " -r
61+
echo
62+
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
63+
echo "Deployment cancelled"
64+
exit 1
65+
fi
66+
fi
67+
68+
# Clear REFERENCE_DIAMOND to trigger new deployment
69+
REFERENCE_DIAMOND=""
70+
else
71+
echo "✅ Found existing reference diamond"
72+
echo "Options:"
73+
echo "1. Use existing implementation"
74+
echo "2. Deploy new implementation (will deploy new Reference Diamond and all Facets)"
75+
76+
read -p "Choose option (1/2): " -r
77+
echo
78+
79+
if [[ $REPLY == "2" ]]; then
80+
if [ "$ENVIRONMENT" != "local" ]; then
81+
# Additional confirmation for non-local
82+
read -p "Type 'I understand' to proceed with deployment to $ENVIRONMENT: " -r
83+
echo
84+
if [[ ! $REPLY == "I understand" ]]; then
85+
echo "Deployment cancelled"
86+
exit 1
87+
fi
88+
fi
89+
# Clear REFERENCE_DIAMOND to trigger new deployment
90+
REFERENCE_DIAMOND=""
91+
elif [[ $REPLY != "1" ]]; then
92+
echo "Invalid option. Deployment cancelled"
93+
exit 1
94+
fi
95+
fi
96+
fi
97+
3298
# Creates a temporary copy of env file in the chain directory
3399
# TEMP will be something like /your/path/chain/.env
34100
TEMP=$PWD/chain/.env
@@ -37,7 +103,7 @@ cp "$USE_ENV_FILE" "$TEMP"
37103
trap "rm $TEMP" EXIT
38104

39105
# Add confirmation step for non-local environments
40-
if [ "$ENVIRONMENT" != "local" ]; then
106+
if [ "$ENVIRONMENT" != "local" ] && [ -z "$REFERENCE_DIAMOND" ]; then
41107
echo "⚠️ You are about to deploy to $ENVIRONMENT environment"
42108
echo "RPC URL will be: $RPC_URL"
43109
read -p "Are you sure you want to continue? (y/N) " -n 1 -r
@@ -50,12 +116,12 @@ fi
50116

51117
# Changes to chain directory and runs the forge deploy script
52118
cd chain
53-
echo $RPC_URL
54-
echo $CHAIN_ID
119+
echo "RPC URL: $RPC_URL"
120+
echo "Chain ID: $CHAIN_ID"
55121

56122
# Deploy contracts
57-
echo "Deploying with DeployFactory.s.sol on Chain ID: $CHAIN_ID using RPC URL: $RPC_URL"
58-
DEPLOY_OUTPUT=$(forge script script/DeployFactory.s.sol --broadcast --rpc-url $RPC_URL --private-key $PRIVATE_KEY --chain-id $CHAIN_ID)
123+
echo "Deploying with REFERENCE_DIAMOND=${REFERENCE_DIAMOND:-empty}"
124+
DEPLOY_OUTPUT=$(REFERENCE_DIAMOND=$REFERENCE_DIAMOND forge script script/DeployFactory.s.sol --broadcast --rpc-url $RPC_URL --private-key $PRIVATE_KEY --chain-id $CHAIN_ID)
59125
echo "$DEPLOY_OUTPUT"
60126

61127
# Extract all addresses
@@ -73,7 +139,8 @@ WARRANT_FACET=$(echo "$DEPLOY_OUTPUT" | grep "WARRANT_FACET=" | cut -d'=' -f2 |
73139
STAKEHOLDER_NFT_FACET=$(echo "$DEPLOY_OUTPUT" | grep "STAKEHOLDER_NFT_FACET=" | cut -d'=' -f2 | tr -d ' ')
74140
ACCESS_CONTROL_FACET=$(echo "$DEPLOY_OUTPUT" | grep "ACCESS_CONTROL_FACET=" | cut -d'=' -f2 | tr -d ' ')
75141

76-
142+
# Display new addresses
143+
echo "New contract addresses:"
77144
echo "FACTORY_ADDRESS: $FACTORY_ADDRESS"
78145
echo "REFERENCE_DIAMOND: $REFERENCE_DIAMOND"
79146
echo "DIAMOND_LOUPE_FACET: $DIAMOND_LOUPE_FACET"
@@ -88,6 +155,98 @@ echo "WARRANT_FACET: $WARRANT_FACET"
88155
echo "STAKEHOLDER_NFT_FACET: $STAKEHOLDER_NFT_FACET"
89156
echo "ACCESS_CONTROL_FACET: $ACCESS_CONTROL_FACET"
90157

158+
# Check if addresses have changed
159+
ADDRESSES_CHANGED=false
160+
if [ "$FACTORY_ADDRESS" != "$(grep '^FACTORY_ADDRESS=' "$USE_ENV_FILE" | cut -d'=' -f2)" ] || \
161+
[ "$REFERENCE_DIAMOND" != "$(grep '^REFERENCE_DIAMOND=' "$USE_ENV_FILE" | cut -d'=' -f2)" ]; then
162+
ADDRESSES_CHANGED=true
163+
fi
164+
165+
# If addresses changed, prompt for update
166+
if [ "$ADDRESSES_CHANGED" = true ]; then
167+
echo -e "\n⚠️ Contract addresses have changed"
168+
echo "Would you like to update $USE_ENV_FILE with the new addresses?"
169+
if [ "$ENVIRONMENT" != "local" ]; then
170+
read -p "Update addresses in $USE_ENV_FILE? (yes/no): " -r
171+
echo
172+
if [[ ! $REPLY =~ ^[Yy][Ee][Ss]$ ]]; then
173+
echo "Skipping address update"
174+
else
175+
echo "Updating $USE_ENV_FILE with new addresses..."
176+
177+
# Go back to project root directory
178+
cd ..
179+
180+
# Create backup
181+
cp "$USE_ENV_FILE" "${USE_ENV_FILE}.backup"
182+
183+
# Update addresses using temp file to handle BSD/GNU sed differences
184+
temp_file=$(mktemp)
185+
if grep -q "^FACTORY_ADDRESS=" "$USE_ENV_FILE"; then
186+
sed "s|^FACTORY_ADDRESS=.*|FACTORY_ADDRESS=$FACTORY_ADDRESS|" "$USE_ENV_FILE" > "$temp_file"
187+
else
188+
# If FACTORY_ADDRESS doesn't exist, append it
189+
echo "FACTORY_ADDRESS=$FACTORY_ADDRESS" >> "$USE_ENV_FILE"
190+
fi
191+
mv "$temp_file" "$USE_ENV_FILE"
192+
193+
temp_file=$(mktemp)
194+
if grep -q "^REFERENCE_DIAMOND=" "$USE_ENV_FILE"; then
195+
sed "s|^REFERENCE_DIAMOND=.*|REFERENCE_DIAMOND=$REFERENCE_DIAMOND|" "$USE_ENV_FILE" > "$temp_file"
196+
else
197+
# If REFERENCE_DIAMOND doesn't exist, append it
198+
echo "REFERENCE_DIAMOND=$REFERENCE_DIAMOND" >> "$USE_ENV_FILE"
199+
fi
200+
mv "$temp_file" "$USE_ENV_FILE"
201+
202+
echo "✅ Updated $USE_ENV_FILE with new contract addresses"
203+
echo "Backup saved as ${USE_ENV_FILE}.backup"
204+
205+
# Go back to chain directory for the rest of the script
206+
cd chain
207+
fi
208+
else
209+
read -p "Update addresses in $USE_ENV_FILE? (y/N): " -r
210+
echo
211+
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
212+
echo "Skipping address update"
213+
else
214+
echo "Updating $USE_ENV_FILE with new addresses..."
215+
216+
# Go back to project root directory
217+
cd ..
218+
219+
# Create backup
220+
cp "$USE_ENV_FILE" "${USE_ENV_FILE}.backup"
221+
222+
# Update addresses using temp file to handle BSD/GNU sed differences
223+
temp_file=$(mktemp)
224+
if grep -q "^FACTORY_ADDRESS=" "$USE_ENV_FILE"; then
225+
sed "s|^FACTORY_ADDRESS=.*|FACTORY_ADDRESS=$FACTORY_ADDRESS|" "$USE_ENV_FILE" > "$temp_file"
226+
else
227+
# If FACTORY_ADDRESS doesn't exist, append it
228+
echo "FACTORY_ADDRESS=$FACTORY_ADDRESS" >> "$USE_ENV_FILE"
229+
fi
230+
mv "$temp_file" "$USE_ENV_FILE"
231+
232+
temp_file=$(mktemp)
233+
if grep -q "^REFERENCE_DIAMOND=" "$USE_ENV_FILE"; then
234+
sed "s|^REFERENCE_DIAMOND=.*|REFERENCE_DIAMOND=$REFERENCE_DIAMOND|" "$USE_ENV_FILE" > "$temp_file"
235+
else
236+
# If REFERENCE_DIAMOND doesn't exist, append it
237+
echo "REFERENCE_DIAMOND=$REFERENCE_DIAMOND" >> "$USE_ENV_FILE"
238+
fi
239+
mv "$temp_file" "$USE_ENV_FILE"
240+
241+
echo "✅ Updated $USE_ENV_FILE with new contract addresses"
242+
echo "Backup saved as ${USE_ENV_FILE}.backup"
243+
244+
# Go back to chain directory for the rest of the script
245+
cd chain
246+
fi
247+
fi
248+
fi
249+
91250
# Only attempt verification for non-local environments
92251
if [ "$ENVIRONMENT" != "local" ]; then
93252
echo "Waiting for deployment to be confirmed..."

0 commit comments

Comments
 (0)