@@ -13,7 +13,6 @@ while [[ "$#" -gt 0 ]]; do
13
13
shift
14
14
done
15
15
16
-
17
16
# Constructs env file path based on environment
18
17
# Example: .env.local, .env.dev, .env.prod
19
18
USE_ENV_FILE=" .env.$ENVIRONMENT "
@@ -29,6 +28,73 @@ set -a
29
28
source " $USE_ENV_FILE "
30
29
set +a
31
30
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
+
32
98
# Creates a temporary copy of env file in the chain directory
33
99
# TEMP will be something like /your/path/chain/.env
34
100
TEMP=$PWD /chain/.env
@@ -37,7 +103,7 @@ cp "$USE_ENV_FILE" "$TEMP"
37
103
trap " rm $TEMP " EXIT
38
104
39
105
# Add confirmation step for non-local environments
40
- if [ " $ENVIRONMENT " != " local" ]; then
106
+ if [ " $ENVIRONMENT " != " local" ] && [ -z " $REFERENCE_DIAMOND " ] ; then
41
107
echo " ⚠️ You are about to deploy to $ENVIRONMENT environment"
42
108
echo " RPC URL will be: $RPC_URL "
43
109
read -p " Are you sure you want to continue? (y/N) " -n 1 -r
50
116
51
117
# Changes to chain directory and runs the forge deploy script
52
118
cd chain
53
- echo $RPC_URL
54
- echo $CHAIN_ID
119
+ echo " RPC URL: $RPC_URL "
120
+ echo " Chain ID: $CHAIN_ID "
55
121
56
122
# 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 )
59
125
echo " $DEPLOY_OUTPUT "
60
126
61
127
# Extract all addresses
@@ -73,7 +139,8 @@ WARRANT_FACET=$(echo "$DEPLOY_OUTPUT" | grep "WARRANT_FACET=" | cut -d'=' -f2 |
73
139
STAKEHOLDER_NFT_FACET=$( echo " $DEPLOY_OUTPUT " | grep " STAKEHOLDER_NFT_FACET=" | cut -d' =' -f2 | tr -d ' ' )
74
140
ACCESS_CONTROL_FACET=$( echo " $DEPLOY_OUTPUT " | grep " ACCESS_CONTROL_FACET=" | cut -d' =' -f2 | tr -d ' ' )
75
141
76
-
142
+ # Display new addresses
143
+ echo " New contract addresses:"
77
144
echo " FACTORY_ADDRESS: $FACTORY_ADDRESS "
78
145
echo " REFERENCE_DIAMOND: $REFERENCE_DIAMOND "
79
146
echo " DIAMOND_LOUPE_FACET: $DIAMOND_LOUPE_FACET "
@@ -88,6 +155,98 @@ echo "WARRANT_FACET: $WARRANT_FACET"
88
155
echo " STAKEHOLDER_NFT_FACET: $STAKEHOLDER_NFT_FACET "
89
156
echo " ACCESS_CONTROL_FACET: $ACCESS_CONTROL_FACET "
90
157
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
+
91
250
# Only attempt verification for non-local environments
92
251
if [ " $ENVIRONMENT " != " local" ]; then
93
252
echo " Waiting for deployment to be confirmed..."
0 commit comments