Files
proxmox/docs/06-besu/COMPILATION_RECOMMENDATIONS.md
defiQUG fbda1b4beb
Some checks failed
Deploy to Phoenix / deploy (push) Has been cancelled
docs: Ledger Live integration, contract deploy learnings, NEXT_STEPS updates
- ADD_CHAIN138_TO_LEDGER_LIVE: Ledger form done; public code review repo bis-innovations/LedgerLive; init/push commands
- CONTRACT_DEPLOYMENT_RUNBOOK: Chain 138 gas price 1 gwei, 36-addr check, TransactionMirror workaround
- CONTRACT_*: AddressMapper, MirrorManager deployed 2026-02-12; 36-address on-chain check
- NEXT_STEPS_FOR_YOU: Ledger done; steps completable now (no LAN); run-completable-tasks-from-anywhere
- MASTER_INDEX, OPERATOR_OPTIONAL, SMART_CONTRACTS_INVENTORY_SIMPLE: updates
- LEDGER_BLOCKCHAIN_INTEGRATION_COMPLETE: bis-innovations/LedgerLive reference

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 15:46:57 -08:00

311 lines
7.1 KiB
Markdown

# Compilation Recommendations for Large Contract Project
**Last Updated:** 2026-01-31
**Document Version:** 1.0
**Status:** Active Documentation
---
**Date**: 2025-01-19
**Issue**: Compilation timing out for 266 contract files
**Status**: Recommendations provided
---
## Problem Analysis
### Current Situation
- **Total files**: 266 Solidity files
- **Contract files**: 148 contracts
- **Deployment scripts**: 10+ scripts
- **Compilation**: Timing out (30 minute timeout exceeded)
- **Configuration**: `via_ir = true`, `optimizer = true`, `optimizer_runs = 200`
### VM Resources
- **Memory**: 16GB (5.3GB used, 8.9GB free, 10GB available)
- **CPU**: 4 cores
- **Disk**: 196GB (5.6GB used, 181GB free)
**Resources are sufficient** - the issue is compilation strategy, not resources.
---
## Recommendations
### 1. Compile Only What's Needed for Deployment (RECOMMENDED)
Instead of compiling all 266 files, compile only the contracts needed for the specific deployment scripts.
#### Strategy A: Compile by Deployment Script
```bash
# Compile only WETH9 Bridge contracts
forge build --force script/DeployCCIPWETH9Bridge.s.sol
# Compile only WETH10 Bridge contracts
forge build --force script/DeployCCIPWETH10Bridge.s.sol
# Compile only LINK deployment
forge build --force script/DeployLinkToCanonicalAddress.s.sol
```
#### Strategy B: Use Selective Import Compilation
Foundry automatically compiles only what's needed for each script, but you can help it by:
```bash
# Compile with explicit script
forge script script/DeployCCIPWETH9Bridge.s.sol:DeployCCIPWETH9Bridge --dry-run
# This will compile only what's needed
```
### 2. Optimize Compiler Settings for Faster Compilation
Create a compilation profile optimized for speed vs. gas optimization:
```toml
[profile.fast]
optimizer = true
optimizer_runs = 1 # Minimal optimization for faster compilation
via_ir = false # Disable IR for faster compilation (if no stack too deep errors)
```
Usage:
```bash
forge build --profile fast
```
**Trade-off**: Larger bytecode, more gas, but much faster compilation.
### 3. Increase Memory Limits
Set higher memory limits for Solidity compiler:
```toml
[profile.default]
solc = "0.8.20"
optimizer = true
optimizer_runs = 200
via_ir = true
# Add memory settings
[evm]
memory_limit = "1gb" # Increase if needed
```
### 4. Compile in Stages
Break compilation into stages:
```bash
# Stage 1: Compile core contracts only
forge build --force contracts/bridge/trustless/
# Stage 2: Compile bridge contracts
forge build --force contracts/bridge/
# Stage 3: Compile deployment scripts
forge build --force script/
```
### 5. Use Incremental Compilation
Leverage Foundry's incremental compilation by not using `--force`:
```bash
# First compilation (may take longer)
forge build
# Subsequent compilations (only changed files)
forge build # Much faster
```
### 6. Compile Deployment Scripts Only
For deployment purposes, you only need the deployment scripts compiled:
```bash
# Compile deployment scripts and their dependencies only
forge build script/DeployCCIPWETH9Bridge.s.sol script/DeployCCIPWETH10Bridge.s.sol script/DeployLinkToCanonicalAddress.s.sol
```
### 7. Adjust Optimizer Settings
Reduce optimizer runs for faster compilation:
```toml
[profile.deploy]
optimizer = true
optimizer_runs = 100 # Reduced from 200 for faster compilation
via_ir = true
```
### 8. Split Compilation with Cache
Use Foundry's cache more effectively:
```bash
# Clear cache first (fresh start)
forge clean
# Compile with explicit output
forge build --force --sizes
# This shows sizes and helps identify large contracts
```
---
## Recommended Approach for Deployment
### Option 1: Compile Script-Specific (FASTEST)
```bash
# In VM
cd /home/intlc/projects/proxmox/smom-dbis-138
# Compile and deploy WETH9 Bridge (only compiles what's needed)
forge script script/DeployCCIPWETH9Bridge.s.sol:DeployCCIPWETH9Bridge \
--rpc-url http://localhost:8545 \
--broadcast \
--private-key $PRIVATE_KEY \
--slow
# Compile and deploy WETH10 Bridge
forge script script/DeployCCIPWETH10Bridge.s.sol:DeployCCIPWETH10Bridge \
--rpc-url http://localhost:8545 \
--broadcast \
--private-key $PRIVATE_KEY \
--slow
# Compile and deploy LINK
forge script script/DeployLinkToCanonicalAddress.s.sol:DeployLinkToCanonicalAddress \
--rpc-url http://localhost:8545 \
--broadcast \
--private-key $PRIVATE_KEY \
--slow
```
**Advantage**: Only compiles what each script needs, much faster.
### Option 2: Two-Stage Compilation
```bash
# Stage 1: Compile with fast profile (if created)
forge build --profile fast # Or compile incrementally without --force
# Stage 2: Deploy using deployment script
bash scripts/deploy-all-bridges-standalone.sh
```
### Option 3: Update Deployment Script to Compile Per Script
Modify `deploy-all-bridges-standalone.sh` to compile before each deployment:
```bash
# Before each forge script command, add:
echo "Compiling contracts for WETH9 Bridge..."
forge build script/DeployCCIPWETH9Bridge.s.sol --force 2>&1 | tail -10
```
---
## Compiler Settings Comparison
| Setting | Current | Fast Profile | Deploy Profile |
|---------|---------|--------------|----------------|
| optimizer | true | true | true |
| optimizer_runs | 200 | 1 | 100 |
| via_ir | true | false | true |
| Speed | Slow | Fast | Medium |
| Gas | Optimized | High | Medium |
| Use Case | Production | Development | Deployment |
---
## Implementation Steps
### Step 1: Create Fast Compilation Profile
Add to `foundry.toml`:
```toml
[profile.fast]
optimizer = true
optimizer_runs = 1
via_ir = false
```
### Step 2: Update Deployment Script
Modify deployment script to use selective compilation or fast profile.
### Step 3: Test Compilation
```bash
# Test fast compilation
forge build --profile fast
# Verify it completes within timeout
# Then use for deployment
```
---
## Alternative: Compile Locally and Copy
If VM compilation continues to timeout:
1. **Compile on local system** (which has more resources potentially)
2. **Copy compiled artifacts** to VM:
```bash
# On local system
cd smom-dbis-138
forge build --force
# Copy out/ and cache/ to VM
tar czf compiled-artifacts.tar.gz out/ cache/
scp compiled-artifacts.tar.gz root@192.168.11.10:/tmp/
# In VM
cd /home/intlc/projects/proxmox/smom-dbis-138
tar xzf /tmp/compiled-artifacts.tar.gz
```
3. **Deploy using pre-compiled artifacts**
---
## Recommended Solution for Current Deployment
**For immediate deployment**, use **Option 1: Script-Specific Compilation**:
```bash
# Each forge script command will compile only what's needed
forge script script/DeployCCIPWETH9Bridge.s.sol:DeployCCIPWETH9Bridge \
--rpc-url http://localhost:8545 \
--broadcast \
--private-key $PRIVATE_KEY \
--slow \
-vvv
```
This avoids the need to compile all 266 files upfront.
---
## Monitoring Compilation Progress
```bash
# Watch compilation progress
forge build --force 2>&1 | tee compilation.log
# In another terminal, monitor
tail -f compilation.log | grep -E "Compiling|Error|Success"
```
---
**Status**: Recommendations ready for implementation
**Next**: Update deployment strategy to use script-specific compilation