1+ #! /bin/bash
2+
3+ # Test verification script for Monad network
4+ # This script creates a random variant of a contract, deploys it, and verifies it
5+ # Usage: bash testVerification.sh
6+
7+ # Hardcoded values
8+ PRIVATE_KEY=" 0xb8a3bc8bbf5b070e5f69a25fad00bb92b0caf66b3e73c2fbd117ba1992c1b07c"
9+ ETHERSCAN_API_KEY=" 2JUT3R7ZG7Z3CRZZUK3TP2W4DMN1DG3P3Z"
10+
11+ # Default values
12+ DEFAULT_SOURCE_FILE=" src/Counter.sol:Counter"
13+
14+ # Parse arguments with defaults
15+ SOURCE_FILE=" ${1:- $DEFAULT_SOURCE_FILE } "
16+
17+ # Extract contract name and file path
18+ CONTRACT_NAME=$( echo " $SOURCE_FILE " | cut -d' :' -f2)
19+ ORIGINAL_FILE=$( echo " $SOURCE_FILE " | cut -d' :' -f1)
20+
21+ # Generate random suffix for test contract (macOS compatible)
22+ RANDOM_SUFFIX=$( date +%s) $( jot -r 1 1000 9999)
23+ TEST_CONTRACT_NAME=" ${CONTRACT_NAME} Test${RANDOM_SUFFIX} "
24+ TEST_FILE=" src/${TEST_CONTRACT_NAME} .sol"
25+ TEST_SOURCE_FILE=" ${TEST_FILE} :${TEST_CONTRACT_NAME} "
26+
27+
28+
29+ echo " =========================================="
30+ echo " 🧪 VERIFICATION TEST WORKFLOW"
31+ echo " =========================================="
32+ echo " Original: $ORIGINAL_FILE "
33+ echo " Test Contract: $TEST_CONTRACT_NAME "
34+ echo " Test File: $TEST_FILE "
35+ echo " Using hardcoded private key"
36+ echo " =========================================="
37+
38+ # Step 1: Create a modified version of the contract
39+ echo " "
40+ echo " 🔧 [1/4] CREATING RANDOM CONTRACT VARIANT..."
41+ echo " =========================================="
42+
43+ if [ ! -f " $ORIGINAL_FILE " ]; then
44+ echo " 💥 ERROR: Original file $ORIGINAL_FILE not found!"
45+ exit 1
46+ fi
47+
48+ # Generate random function names (macOS compatible)
49+ FUNC1_NAME=" randomFunction$( jot -r 1 100 999) "
50+ FUNC2_NAME=" testFunction$( jot -r 1 100 999) "
51+ FUNC3_NAME=" dummyFunction$( jot -r 1 100 999) "
52+
53+ # Generate random values (macOS compatible)
54+ RANDOM_VALUE1=$( jot -r 1 1 1000)
55+ RANDOM_VALUE2=$( jot -r 1 1001 2000)
56+ RANDOM_VALUE3=$( jot -r 1 2001 3000)
57+
58+ # Read the original contract and replace contract name
59+ ORIGINAL_CONTENT=$( cat " $ORIGINAL_FILE " )
60+
61+ # Replace contract name
62+ MODIFIED_CONTENT=$( echo " $ORIGINAL_CONTENT " | sed " s/contract ${CONTRACT_NAME} /contract ${TEST_CONTRACT_NAME} /g" )
63+
64+ # Create a temporary file and write the modified content without the last closing brace
65+ echo " $MODIFIED_CONTENT " | sed ' $d' > " $TEST_FILE "
66+
67+ # Add the random functions and the closing brace
68+ cat >> " $TEST_FILE " << EOF
69+
70+ // Random test functions to make this contract unique
71+ function ${FUNC1_NAME} () public pure returns (uint256) {
72+ return ${RANDOM_VALUE1} ;
73+ }
74+
75+ function ${FUNC2_NAME} (uint256 _input) public pure returns (uint256) {
76+ return _input + ${RANDOM_VALUE2} ;
77+ }
78+
79+ function ${FUNC3_NAME} () public view returns (string memory) {
80+ return "Test function ${RANDOM_VALUE3} ";
81+ }
82+ }
83+ EOF
84+
85+ echo " ✅ Created test contract: $TEST_CONTRACT_NAME "
86+ echo " 📄 Added random functions: $FUNC1_NAME , $FUNC2_NAME , $FUNC3_NAME "
87+
88+ # Show a preview of the generated contract
89+ echo " "
90+ echo " 📄 Contract preview (last 15 lines):"
91+ tail -15 " $TEST_FILE "
92+
93+ # Step 2: Compile the test contract (exclude tests to avoid conflicts)
94+ echo " "
95+ echo " 🔨 [2/4] COMPILING TEST CONTRACT..."
96+ echo " =========================================="
97+
98+ if ! forge build --skip test ; then
99+ echo " 💥 COMPILATION FAILED!"
100+ echo " Cleaning up..."
101+ rm -f " $TEST_FILE "
102+ exit 1
103+ fi
104+
105+ echo " ✅ Compilation successful!"
106+
107+ # Step 3: Deploy the test contract
108+ echo " "
109+ echo " 📦 [3/4] DEPLOYING TEST CONTRACT..."
110+ echo " =========================================="
111+
112+ DEPLOY_CMD=" forge create $TEST_SOURCE_FILE --private-key $PRIVATE_KEY --broadcast"
113+ echo " Running: forge create $TEST_SOURCE_FILE --private-key [HIDDEN] --broadcast"
114+ echo " "
115+
116+ # Capture the deploy output
117+ DEPLOY_OUTPUT=$( eval " $DEPLOY_CMD " 2>&1 )
118+ DEPLOY_EXIT_CODE=$?
119+
120+ echo " $DEPLOY_OUTPUT "
121+
122+ if [ $DEPLOY_EXIT_CODE -ne 0 ]; then
123+ echo " "
124+ echo " 💥 DEPLOYMENT FAILED!"
125+ echo " Exit code: $DEPLOY_EXIT_CODE "
126+ echo " Cleaning up..."
127+ rm -f " $TEST_FILE "
128+ exit 1
129+ fi
130+
131+ # Extract the deployed contract address from the output
132+ CONTRACT_ADDRESS=$( echo " $DEPLOY_OUTPUT " | grep " Deployed to:" | awk ' {print $3}' )
133+
134+ if [ -z " $CONTRACT_ADDRESS " ]; then
135+ echo " "
136+ echo " 💥 FAILED TO EXTRACT CONTRACT ADDRESS!"
137+ echo " Could not find 'Deployed to:' in the output"
138+ echo " Cleaning up..."
139+ rm -f " $TEST_FILE "
140+ exit 1
141+ fi
142+
143+ echo " "
144+ echo " ✅ DEPLOYMENT SUCCESSFUL!"
145+ echo " 📍 Contract Address: $CONTRACT_ADDRESS "
146+
147+ # Step 4: Verify the test contract
148+ echo " "
149+ echo " 🔍 [4/4] VERIFYING TEST CONTRACT..."
150+ echo " =========================================="
151+
152+ # Wait a moment for the transaction to be mined and indexed
153+ echo " ⏳ Waiting 3 seconds for transaction to be indexed..."
154+ sleep 3
155+
156+ # Track verification results
157+ ETHERSCAN_SUCCESS=false
158+ SOURCIFY_SUCCESS=false
159+ SOCIALSCAN_SUCCESS=false
160+
161+ # 1. Etherscan Verification (only if API key is available)
162+ if [ -n " $ETHERSCAN_API_KEY " ]; then
163+ echo " "
164+ echo " 🔍 [1/3] Verifying on Etherscan..."
165+ if forge verify-contract --watch --chain 10143 " $CONTRACT_ADDRESS " " $TEST_CONTRACT_NAME " --verifier etherscan --etherscan-api-key " $ETHERSCAN_API_KEY " ; then
166+ ETHERSCAN_SUCCESS=true
167+ fi
168+ else
169+ echo " "
170+ echo " ⏭️ [1/3] Skipping Etherscan (no API key)"
171+ fi
172+
173+ # 2. Monad Explorer (Sourcify) Verification
174+ echo " "
175+ echo " 🔍 [2/3] Verifying on Monad Explorer (Sourcify)..."
176+ if forge verify-contract \
177+ " $CONTRACT_ADDRESS " \
178+ " $TEST_CONTRACT_NAME " \
179+ --chain 10143 \
180+ --verifier sourcify \
181+ --verifier-url https://sourcify-api-monad.blockvision.org; then
182+ SOURCIFY_SUCCESS=true
183+ fi
184+
185+ # 3. Socialscan Verification
186+ echo " "
187+ echo " 🔍 [3/3] Verifying on Socialscan..."
188+ if forge verify-contract \
189+ " $CONTRACT_ADDRESS " \
190+ " $TEST_CONTRACT_NAME " \
191+ --chain 10143 \
192+ --watch \
193+ --etherscan-api-key test \
194+ --verifier-url https://api.socialscan.io/monad-testnet/v1/explorer/command_api/contract \
195+ --verifier etherscan; then
196+ SOCIALSCAN_SUCCESS=true
197+ fi
198+
199+ # Final Summary
200+ echo " "
201+ echo " =========================================="
202+ echo " 📊 VERIFICATION TEST SUMMARY"
203+ echo " =========================================="
204+ echo " 🧪 Test Contract: $TEST_CONTRACT_NAME "
205+ echo " 📍 Contract Address: $CONTRACT_ADDRESS "
206+ echo " 🔧 Random Functions: $FUNC1_NAME , $FUNC2_NAME , $FUNC3_NAME "
207+ echo " "
208+
209+ if [ -n " $ETHERSCAN_API_KEY " ]; then
210+ if [ " $ETHERSCAN_SUCCESS " = true ]; then
211+ echo " ✅ Etherscan: SUCCESS"
212+ else
213+ echo " ❌ Etherscan: FAILED"
214+ fi
215+ else
216+ echo " ⏭️ Etherscan: SKIPPED (no API key)"
217+ fi
218+
219+ if [ " $SOURCIFY_SUCCESS " = true ]; then
220+ echo " ✅ Monad Explorer (Sourcify): SUCCESS"
221+ else
222+ echo " ❌ Monad Explorer (Sourcify): FAILED"
223+ fi
224+
225+ if [ " $SOCIALSCAN_SUCCESS " = true ]; then
226+ echo " ✅ Socialscan: SUCCESS"
227+ else
228+ echo " ❌ Socialscan: FAILED"
229+ fi
230+
231+ echo " =========================================="
232+
233+ # Calculate overall success
234+ TOTAL_SUCCESS=0
235+ TOTAL_ATTEMPTED=0
236+
237+ if [ -n " $ETHERSCAN_API_KEY " ]; then
238+ TOTAL_ATTEMPTED=$(( TOTAL_ATTEMPTED + 1 ))
239+ if [ " $ETHERSCAN_SUCCESS " = true ]; then
240+ TOTAL_SUCCESS=$(( TOTAL_SUCCESS + 1 ))
241+ fi
242+ fi
243+
244+ TOTAL_ATTEMPTED=$(( TOTAL_ATTEMPTED + 1 ))
245+ if [ " $SOURCIFY_SUCCESS " = true ]; then
246+ TOTAL_SUCCESS=$(( TOTAL_SUCCESS + 1 ))
247+ fi
248+
249+ TOTAL_ATTEMPTED=$(( TOTAL_ATTEMPTED + 1 ))
250+ if [ " $SOCIALSCAN_SUCCESS " = true ]; then
251+ TOTAL_SUCCESS=$(( TOTAL_SUCCESS + 1 ))
252+ fi
253+
254+ echo " 🎯 Test Result: $TOTAL_SUCCESS /$TOTAL_ATTEMPTED verifications successful"
255+
256+ # Cleanup
257+ echo " "
258+ echo " 🧹 CLEANING UP..."
259+ echo " Removing test file: $TEST_FILE "
260+ rm -f " $TEST_FILE "
261+
262+ if [ $TOTAL_SUCCESS -eq $TOTAL_ATTEMPTED ]; then
263+ echo " 🎉 All verification tests passed!"
264+ exit 0
265+ elif [ $TOTAL_SUCCESS -gt 0 ]; then
266+ echo " ⚠️ Partial success - some verifications failed"
267+ exit 0
268+ else
269+ echo " 💥 All verification tests failed"
270+ exit 1
271+ fi
0 commit comments