diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index 3c99862118..1869ccf191 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -1,4 +1,4 @@ -name: lint and check format +name: Lint and Check Format on: workflow_dispatch: pull_request: diff --git a/.github/workflows/storage-report.yml b/.github/workflows/storage-report.yml new file mode 100644 index 0000000000..f99082670f --- /dev/null +++ b/.github/workflows/storage-report.yml @@ -0,0 +1,39 @@ +name: Check Storage Layout +on: + workflow_dispatch: + pull_request: + push: + branches: + - "dev" +jobs: + check_storage: + runs-on: "ubuntu-latest" + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: "Generate and prepare the storage reports for current branch" + run: | + bash bin/storage-report.sh pr + + - name: Checkout dev + env: + TARGET: ${{ github.event.pull_request.base.sha }} + run: | + git fetch origin $TARGET + git checkout $TARGET + + - name: "Generate and prepare the storage reports for target branch" + run: | + bash bin/storage-report.sh target + + - name: Compare outputs + run: | + if ! diff --unified pr target; then + echo "::warning::Differences found between PR and target branch storage layouts" + fi \ No newline at end of file diff --git a/Makefile b/Makefile index f4278d456c..4b68d11c90 100644 --- a/Makefile +++ b/Makefile @@ -43,3 +43,6 @@ all-in-docker: gha-docker: docker run -v $(PWD):/build -w /build --rm -i ${CONTAINER_NAME}:latest bash -c "make gha" + +storage-report: + bash "bin/storage-report.sh" "docs/storage-report/" diff --git a/bin/storage-report.sh b/bin/storage-report.sh new file mode 100644 index 0000000000..642db7236f --- /dev/null +++ b/bin/storage-report.sh @@ -0,0 +1,45 @@ +#!/bin/sh + +# Default output directory +OUTPUT_DIR=${1:-docs/storage-report} + +# Function to print messages +log() { + echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] $1" +} + +# Function to print error messages +error() { + echo "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] $1" >&2 +} + +log "Starting the storage report generation." + +# Create the output directory if it doesn't exist +if ! mkdir -p "$OUTPUT_DIR"; then + error "Failed to create output directory: $OUTPUT_DIR" + exit 1 +fi + +log "Output directory is set to: $OUTPUT_DIR" + +# Loop through Solidity files and generate storage report +# NOTE: Ignores `src/contracts/interfaces` & `src/contracts/libraries` since they "should" not contain storage logic. +for file in $(find src/contracts -name "*.sol" ! -path "src/contracts/interfaces/*" ! -path "src/contracts/libraries/*"); do + contract_name=$(basename "$file" .sol) + + # Check if the file exists and is readable + if [ ! -r "$file" ]; then + error "Cannot read file: $file" + continue + fi + + log "Processing contract: $contract_name" + + # Run forge inspect and capture errors + if ! forge inspect "$contract_name" storage --pretty > "$OUTPUT_DIR/$contract_name.md"; then + error "Failed to generate storage report for contract: $contract_name" + else + log "Storage report generated for contract: $contract_name" + fi +done \ No newline at end of file