# Ethereum Mainnet Contract Verification - Automated Solution

**Date**: $(date)  
**Purpose**: Complete automated solution for verifying all Ethereum Mainnet contracts  
**Status**: ✅ **READY TO USE**

---

## 🚀 Quick Start

### Option 1: Master Script (Recommended)

Run the master script that tries all methods automatically:

```bash
cd /home/intlc/projects/proxmox
./scripts/verify-all-mainnet-contracts.sh
```

This script will:
1. Try Python script (Standard JSON via API) - **Most Reliable**
2. Try bash script (Standard JSON via API)
3. Try comprehensive bash script (multiple methods)
4. Try Forge verification (fallback)
5. Provide manual instructions if all fail

### Option 2: Python Script (Best for Standard JSON)

```bash
cd /home/intlc/projects/proxmox
python3 scripts/verify-ethereum-mainnet.py
```

### Option 3: Bash Script with Standard JSON

```bash
cd /home/intlc/projects/proxmox
./scripts/verify-ethereum-mainnet-standard-json.sh
```

---

## 📋 Prerequisites

### Required Environment Variables

Ensure these are set in `/home/intlc/projects/smom-dbis-138/.env`:

```bash
ETHERSCAN_API_KEY=your_etherscan_api_key_here
ETHEREUM_MAINNET_RPC=your_ethereum_mainnet_rpc_url
```

### Required Tools

- **Python 3** (for Python script)
- **Foundry** (`cast`, `forge` commands)
- **curl** (for API requests)
- **jq** (optional, for JSON parsing)

Install Foundry if needed:
```bash
curl -L https://foundry.paradigm.xyz | bash
foundryup
```

---

## 🔧 Available Scripts

### 1. `verify-all-mainnet-contracts.sh` (Master Script)

**Purpose**: Orchestrates all verification methods  
**Usage**: `./scripts/verify-all-mainnet-contracts.sh`

**Features**:
- Tries multiple verification methods automatically
- Falls back to next method if one fails
- Provides comprehensive error reporting
- Includes manual verification instructions

### 2. `verify-ethereum-mainnet.py` (Python Script)

**Purpose**: Direct Etherscan API verification using Standard JSON  
**Usage**: `python3 scripts/verify-ethereum-mainnet.py`

**Features**:
- Uses Etherscan API directly
- Handles Standard JSON encoding properly
- Monitors verification status
- Checks if already verified before attempting

**Advantages**:
- Most reliable for Standard JSON Input
- Proper JSON encoding/escaping
- Better error handling
- Status monitoring

### 3. `verify-ethereum-mainnet-standard-json.sh` (Bash Script)

**Purpose**: Bash implementation of Standard JSON verification  
**Usage**: `./scripts/verify-ethereum-mainnet-standard-json.sh [address]`

**Features**:
- Uses Etherscan API
- Standard JSON Input method
- Status checking
- Manual verification fallback

### 4. `verify-all-ethereum-mainnet-contracts.sh` (Comprehensive Script)

**Purpose**: Comprehensive verification with multiple fallback methods  
**Usage**: `./scripts/verify-all-ethereum-mainnet-contracts.sh`

**Features**:
- Multiple verification methods
- Status tracking
- Documentation updates
- Detailed logging

### 5. `verify-contract-etherscan.sh` (Original Script)

**Purpose**: Forge-based verification (fallback method)  
**Usage**: `./scripts/verify-contract-etherscan.sh`

**Features**:
- Uses Foundry's `forge verify-contract`
- Direct contract verification
- May not work with `via-ir` enabled contracts

---

## 📊 Current Contracts

### CCIPWETH9Bridge

| Property | Value |
|----------|-------|
| **Address** | `0x89dd12025bfCD38A168455A44B400e913ED33BE2` |
| **Status** | ⚠️ **NOT VERIFIED** |
| **Issue** | Bytecode mismatch (deployed with `via-ir`) |
| **Solution** | Use Standard JSON Input method |

**Constructor Arguments**:
```
0x00000000000000000000000080226fc0ee2b096224eeac085bb9a8cba1146f7d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
```

**Standard JSON File**: `docs/CCIPWETH9Bridge_standard_json.json`

---

## 🔍 Verification Methods Explained

### Method 1: Standard JSON Input (Recommended)

**Why**: Contract was deployed with `via-ir` enabled, which requires Standard JSON Input for verification.

**How it works**:
1. Loads Standard JSON file with `viaIR: true` setting
2. Submits to Etherscan API with proper encoding
3. Monitors verification status
4. Confirms when verified

**Advantages**:
- Handles `via-ir` correctly
- Most reliable for complex contracts
- Proper compiler settings matching

### Method 2: Forge Verification (Fallback)

**Why**: Direct verification using Foundry tools.

**Limitations**:
- May not support `via-ir` properly
- May have bytecode mismatch issues
- Less reliable for this specific contract

**When to use**: If Standard JSON methods fail

---

## ✅ Verification Checklist

Before running scripts:

- [ ] `ETHERSCAN_API_KEY` set in `.env`
- [ ] `ETHEREUM_MAINNET_RPC` set in `.env`
- [ ] Python 3 installed (for Python script)
- [ ] Foundry installed (for fallback methods)
- [ ] Standard JSON file exists: `docs/CCIPWETH9Bridge_standard_json.json`
- [ ] Contract exists on Ethereum Mainnet (check with `cast code`)

After running scripts:

- [ ] Check Etherscan: https://etherscan.io/address/0x89dd12025bfcd38a168455a44b400e913ed33be2#code
- [ ] Verify source code is visible
- [ ] Verify constructor arguments are correct
- [ ] Verify contract functions are accessible

---

## 🐛 Troubleshooting

### Issue: "ETHERSCAN_API_KEY not set"

**Solution**: Add to `/home/intlc/projects/smom-dbis-138/.env`:
```bash
ETHERSCAN_API_KEY=your_api_key_here
```

### Issue: "Contract not found on Ethereum Mainnet"

**Solution**: 
- Verify RPC URL is correct
- Check contract address is correct
- Ensure contract was actually deployed

### Issue: "Verification failed: Invalid JSON"

**Solution**: 
- Check Standard JSON file is valid
- Ensure file path is correct
- Try Python script (better JSON handling)

### Issue: "Bytecode mismatch"

**Solution**: 
- Use Standard JSON Input method (handles `via-ir`)
- Ensure Standard JSON includes `viaIR: true`
- Verify compiler version matches (0.8.20)

### Issue: "Already verified"

**Status**: ✅ **SUCCESS** - Contract is already verified!

---

## 📝 Manual Verification (If All Scripts Fail)

If all automated methods fail, verify manually:

1. **Navigate to Etherscan**:
   https://etherscan.io/address/0x89dd12025bfcd38a168455a44b400e913ed33be2#code

2. **Click "Contract" tab → "Verify and Publish"**

3. **Select "Standard JSON Input"**

4. **Upload Standard JSON file**:
   - File: `docs/CCIPWETH9Bridge_standard_json.json`
   - Or copy contents and paste

5. **Enter Constructor Arguments**:
   ```
   0x00000000000000000000000080226fc0ee2b096224eeac085bb9a8cba1146f7d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
   ```

6. **Click "Verify and Publish"**

7. **Wait for verification** (usually 30-60 seconds)

---

## 📚 Related Files

- **Verification Status**: `docs/ETHEREUM_MAINNET_CONTRACTS_VERIFICATION_STATUS.md`
- **Standard JSON**: `docs/CCIPWETH9Bridge_standard_json.json`
- **Flattened Contract**: `docs/CCIPWETH9Bridge_flattened.sol`
- **Verification Guide**: `docs/ETHERSCAN_VERIFICATION_DETAILS.md`

---

## 🎯 Expected Results

### Successful Verification

After successful verification, you should see:

1. ✅ Contract source code visible on Etherscan
2. ✅ Constructor arguments displayed correctly
3. ✅ All contract functions accessible
4. ✅ "Contract" tab shows verified status
5. ✅ Green checkmark on contract page

### Verification Status

Check status via API:
```bash
curl "https://api.etherscan.io/api?module=contract&action=getsourcecode&address=0x89dd12025bfCD38A168455A44B400e913ED33BE2&apikey=YOUR_API_KEY"
```

If `SourceCode` field is not empty, contract is verified.

---

## 🔄 Updating Documentation

After successful verification, update:

1. **Status Document**: `docs/ETHEREUM_MAINNET_CONTRACTS_VERIFICATION_STATUS.md`
   - Change status from "NOT VERIFIED" to "VERIFIED"
   - Update summary counts
   - Add verification date

2. **This Document**: Add any new issues or solutions encountered

---

## 💡 Tips

1. **Use Python Script First**: Most reliable for Standard JSON
2. **Check Status Before Running**: Scripts check if already verified
3. **Monitor Etherscan**: Verification can take 30-60 seconds
4. **Keep API Key Secure**: Don't commit `.env` file to git
5. **Standard JSON is Key**: Required for `via-ir` contracts

---

**Last Updated**: $(date)  
**Status**: ✅ **AUTOMATED SOLUTION READY**

