feat: comprehensive audit infrastructure and Phase 1 refactoring
This commit includes: ## Audit & Testing Infrastructure - scripts/audit.sh: 12-section comprehensive codebase audit - scripts/test.sh: 7 test types (unit, integration, race, bench, coverage, contracts, pkg) - scripts/check-compliance.sh: SPEC.md compliance validation - scripts/check-docs.sh: Documentation coverage checker - scripts/dev.sh: Unified development script with all commands ## Documentation - SPEC.md: Authoritative technical specification - docs/AUDIT_AND_TESTING.md: Complete testing guide (600+ lines) - docs/SCRIPTS_REFERENCE.md: All scripts documented (700+ lines) - docs/README.md: Documentation index and navigation - docs/DEVELOPMENT_SETUP.md: Environment setup guide - docs/REFACTORING_PLAN.md: Systematic refactoring plan ## Phase 1 Refactoring (Critical Fixes) - pkg/validation/helpers.go: Validation functions for addresses/amounts - pkg/sequencer/selector_registry.go: Thread-safe selector registry - pkg/sequencer/reader.go: Fixed race conditions with atomic metrics - pkg/sequencer/swap_filter.go: Fixed race conditions, added error logging - pkg/sequencer/decoder.go: Added address validation ## Changes Summary - Fixed race conditions on 13 metric counters (atomic operations) - Added validation at all ingress points - Eliminated silent error handling - Created selector registry for future ABI migration - Reduced SPEC.md violations from 7 to 5 Build Status: ✅ All packages compile Compliance: ✅ No race conditions, no silent failures Documentation: ✅ 1,700+ lines across 5 comprehensive guides 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
120
scripts/generate-bindings-in-container.sh
Executable file
120
scripts/generate-bindings-in-container.sh
Executable file
@@ -0,0 +1,120 @@
|
||||
#!/bin/sh
|
||||
# Generate Go bindings from Foundry-built contract ABIs
|
||||
# This script runs INSIDE the go-dev container
|
||||
|
||||
set -e
|
||||
|
||||
echo "🔧 Generating Go bindings from Foundry contract ABIs"
|
||||
echo "===================================================="
|
||||
echo ""
|
||||
|
||||
# Check if abigen is available
|
||||
if ! command -v abigen > /dev/null 2>&1; then
|
||||
echo "⚠️ abigen not found, installing..."
|
||||
go install github.com/ethereum/go-ethereum/cmd/abigen@v1.13.15
|
||||
fi
|
||||
|
||||
# Ensure contracts are built
|
||||
if [ ! -d "contracts/out" ]; then
|
||||
echo "❌ contracts/out directory not found"
|
||||
echo " Run: ./scripts/dev.sh forge-build"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Function to generate binding from Foundry artifact
|
||||
generate_binding_from_artifact() {
|
||||
local artifact_path=$1
|
||||
local pkg_name=$2
|
||||
local type_name=$3
|
||||
local output_file=$4
|
||||
|
||||
echo "📄 Generating $type_name from $artifact_path..."
|
||||
|
||||
# Extract ABI from Foundry artifact JSON
|
||||
local temp_abi="/tmp/$(basename $artifact_path .json)_abi.json"
|
||||
jq '.abi' "$artifact_path" > "$temp_abi"
|
||||
|
||||
# Generate binding
|
||||
abigen \
|
||||
--abi="$temp_abi" \
|
||||
--pkg="$pkg_name" \
|
||||
--type="$type_name" \
|
||||
--out="$output_file"
|
||||
|
||||
rm "$temp_abi"
|
||||
echo " ✅ Generated: $output_file"
|
||||
}
|
||||
|
||||
# Create bindings directories
|
||||
mkdir -p bindings/uniswap_v2
|
||||
mkdir -p bindings/uniswap_v3
|
||||
mkdir -p bindings/camelot
|
||||
mkdir -p bindings/balancer
|
||||
mkdir -p bindings/curve
|
||||
mkdir -p bindings/kyber
|
||||
|
||||
echo "🦄 Uniswap V2 Bindings"
|
||||
echo "---------------------"
|
||||
|
||||
# Find UniswapV2 artifacts in contracts/out
|
||||
UNISWAP_V2_ROUTER_ARTIFACT=$(find contracts/out -name "IUniswapV2Router02.json" -o -name "UniswapV2Router02.json" | head -1)
|
||||
UNISWAP_V2_PAIR_ARTIFACT=$(find contracts/out -name "IUniswapV2Pair.json" -o -name "UniswapV2Pair.json" | head -1)
|
||||
|
||||
if [ -n "$UNISWAP_V2_ROUTER_ARTIFACT" ]; then
|
||||
generate_binding_from_artifact \
|
||||
"$UNISWAP_V2_ROUTER_ARTIFACT" \
|
||||
"uniswap_v2" \
|
||||
"UniswapV2Router" \
|
||||
"bindings/uniswap_v2/router.go"
|
||||
else
|
||||
echo " ⚠️ UniswapV2Router artifact not found, skipping"
|
||||
fi
|
||||
|
||||
if [ -n "$UNISWAP_V2_PAIR_ARTIFACT" ]; then
|
||||
generate_binding_from_artifact \
|
||||
"$UNISWAP_V2_PAIR_ARTIFACT" \
|
||||
"uniswap_v2" \
|
||||
"UniswapV2Pair" \
|
||||
"bindings/uniswap_v2/pair.go"
|
||||
else
|
||||
echo " ⚠️ UniswapV2Pair artifact not found, skipping"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "🦄 Uniswap V3 Bindings"
|
||||
echo "---------------------"
|
||||
|
||||
# Find UniswapV3 artifacts
|
||||
UNISWAP_V3_ROUTER_ARTIFACT=$(find contracts/out -name "ISwapRouter.json" -o -name "SwapRouter.json" | head -1)
|
||||
UNISWAP_V3_POOL_ARTIFACT=$(find contracts/out -name "IUniswapV3Pool.json" -o -name "UniswapV3Pool.json" | head -1)
|
||||
|
||||
if [ -n "$UNISWAP_V3_ROUTER_ARTIFACT" ]; then
|
||||
generate_binding_from_artifact \
|
||||
"$UNISWAP_V3_ROUTER_ARTIFACT" \
|
||||
"uniswap_v3" \
|
||||
"SwapRouter" \
|
||||
"bindings/uniswap_v3/router.go"
|
||||
else
|
||||
echo " ⚠️ SwapRouter artifact not found, skipping"
|
||||
fi
|
||||
|
||||
if [ -n "$UNISWAP_V3_POOL_ARTIFACT" ]; then
|
||||
generate_binding_from_artifact \
|
||||
"$UNISWAP_V3_POOL_ARTIFACT" \
|
||||
"uniswap_v3" \
|
||||
"UniswapV3Pool" \
|
||||
"bindings/uniswap_v3/pool.go"
|
||||
else
|
||||
echo " ⚠️ UniswapV3Pool artifact not found, skipping"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "✅ Binding generation complete!"
|
||||
echo ""
|
||||
echo "Generated bindings:"
|
||||
find bindings -name "*.go" -type f | sort
|
||||
|
||||
echo ""
|
||||
echo "💡 Import in your Go code:"
|
||||
echo " import \"github.com/your-org/mev-bot/bindings/uniswap_v2\""
|
||||
echo " import \"github.com/your-org/mev-bot/bindings/uniswap_v3\""
|
||||
Reference in New Issue
Block a user