1+ #! /bin/bash
2+ # Complete local testing workflow with Anvil
3+
4+ set -e
5+
6+ echo " 🔧 Starting complete local testing workflow..."
7+
8+ # Check if anvil is available
9+ if ! command -v anvil & > /dev/null; then
10+ echo " ❌ Error: anvil not found. Install Foundry first:"
11+ echo " curl -L https://foundry.paradigm.xyz | bash"
12+ echo " foundryup"
13+ exit 1
14+ fi
15+
16+ # Clean up any existing processes
17+ echo " 🧹 Cleaning up existing processes..."
18+ pkill -f " anvil" || true
19+ pkill -f " ts-node src/main.ts" || true
20+ sleep 1
21+
22+ # Start Anvil in the background
23+ echo " 🚀 Starting Anvil local node..."
24+ anvil --host 0.0.0.0 --port 8545 --accounts 10 --balance 1000 > anvil.log 2>&1 &
25+ ANVIL_PID=$!
26+
27+ # Wait for Anvil to start
28+ echo " ⏳ Waiting for Anvil to start..."
29+ sleep 3
30+
31+ # Deploy contracts
32+ echo " 📦 Deploying contracts..."
33+ PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \
34+ ETHERSCAN_API_KEY=dummy \
35+ forge script script/Deploy.s.sol:DeployScript --broadcast --rpc-url http://127.0.0.1:8545 > deploy.log 2>&1
36+
37+ if [ $? -ne 0 ]; then
38+ echo " ❌ Contract deployment failed. Check deploy.log"
39+ kill $ANVIL_PID
40+ exit 1
41+ fi
42+
43+ # Extract contract addresses from deployment logs
44+ KMS_ADDR=$( grep " DstackKms proxy deployed to:" deploy.log | awk ' {print $NF}' || echo " " )
45+
46+ if [ -z " $KMS_ADDR " ]; then
47+ echo " ❌ Could not extract KMS contract address from deployment"
48+ echo " 💡 Check deploy.log for deployment details"
49+ kill $ANVIL_PID
50+ exit 1
51+ fi
52+
53+ echo " ✅ Contracts deployed!"
54+ echo " KMS Address: $KMS_ADDR "
55+
56+ # Set environment variables
57+ export ETH_RPC_URL=http://127.0.0.1:8545
58+ export KMS_CONTRACT_ADDR=$KMS_ADDR
59+
60+ # Build TypeScript
61+ echo " 🔨 Building TypeScript..."
62+ npm run build
63+
64+ # Start the API server in background
65+ echo " 🌐 Starting API server..."
66+ npm run dev > server.log 2>&1 &
67+ SERVER_PID=$!
68+
69+ # Wait for server to start
70+ echo " ⏳ Waiting for API server to start..."
71+ sleep 5
72+
73+ # Test the API
74+ echo " 🧪 Testing API endpoints..."
75+
76+ # Inline API test
77+ node -e "
78+ const mockBootInfo = {
79+ tcbStatus: 'UpToDate',
80+ advisoryIds: [],
81+ mrAggregated: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
82+ osImageHash: '0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd',
83+ mrSystem: '0x9012901290129012901290129012901290129012901290129012901290129012',
84+ appId: '0x9012345678901234567890123456789012345678',
85+ composeHash: '0xabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd',
86+ instanceId: '0x3456789012345678901234567890123456789012',
87+ deviceId: '0xef12ef12ef12ef12ef12ef12ef12ef12ef12ef12ef12ef12ef12ef12ef12ef12'
88+ };
89+
90+ async function testAPI() {
91+ const baseUrl = 'http://127.0.0.1:8000';
92+ console.log('1️⃣ Health check...');
93+ const health = await fetch(baseUrl + '/');
94+ console.log(' Status:', health.status);
95+
96+ console.log('2️⃣ App authorization...');
97+ const app = await fetch(baseUrl + '/bootAuth/app', {
98+ method: 'POST',
99+ headers: { 'Content-Type': 'application/json' },
100+ body: JSON.stringify(mockBootInfo)
101+ });
102+ console.log(' Status:', app.status);
103+
104+ console.log('3️⃣ KMS authorization...');
105+ const kms = await fetch(baseUrl + '/bootAuth/kms', {
106+ method: 'POST',
107+ headers: { 'Content-Type': 'application/json' },
108+ body: JSON.stringify(mockBootInfo)
109+ });
110+ console.log(' Status:', kms.status);
111+
112+ console.log('4️⃣ Invalid request...');
113+ const invalid = await fetch(baseUrl + '/bootAuth/app', {
114+ method: 'POST',
115+ headers: { 'Content-Type': 'application/json' },
116+ body: JSON.stringify({ mrAggregated: '0x1234' })
117+ });
118+ console.log(' Status:', invalid.status);
119+ }
120+
121+ testAPI().then(() => console.log('✅ API tests completed!')).catch(console.error);
122+ " "
123+
124+ echo " "
125+ echo " ✅ All tests completed successfully! "
126+ echo " "
127+ echo " 📊 Services running:"
128+ echo " Anvil: PID $ANVIL_PID (http://127.0.0.1:8545)"
129+ echo " API Server: PID $SERVER_PID (http://127.0.0.1:8000)"
130+ echo " KMS Contract: $KMS_ADDR "
131+ echo " "
132+ echo " 🔍 Logs available in:"
133+ echo " Anvil: anvil.log"
134+ echo " Deployment: deploy.log"
135+ echo " Server: server.log"
136+ echo " "
137+ echo " 🛑 To stop services:"
138+ echo " kill $ANVIL_PID $SERVER_PID "
139+
140+ # Function to cleanup on exit
141+ cleanup() {
142+ echo " "
143+ echo " 🛑 Stopping services..."
144+ kill $ANVIL_PID $SERVER_PID 2>/dev/null || true
145+ echo " ✅ Cleanup completed"
146+ }
147+
148+ # Set trap to cleanup on script exit
149+ trap cleanup EXIT
150+
151+ # Keep script running or exit based on argument
152+ if [ " $1 " = " --keep-running" ]; then
153+ echo " 🔄 Services will keep running. Press Ctrl+C to stop."
154+ wait
155+ else
156+ echo " ℹ️ Use ' --keep-running' to keep services running"
157+ echo " 🛑 Stopping services in 10 seconds..."
158+ sleep 10
159+ fi
0 commit comments