mirror of
https://github.com/datahaven-xyz/datahaven
synced 2026-05-23 17:28:23 +00:00
## Summary
Implements storage layout testing for the upgradeable
`DataHavenServiceManager` contract to prevent state
corruption during proxy upgrades.
## Changes
### New Files
- **`contracts/storage-snapshots/DataHavenServiceManager.storage.json`**
- Baseline storage layout
snapshot
- **`contracts/storage-snapshots/README.md`** - Documentation for
updating snapshots and known
limitations
- **`contracts/scripts/check-storage-layout.sh`** - CI script that
compares current layout against
snapshot
- **`contracts/test/storage/StorageLayout.t.sol`** - Upgrade simulation
tests verifying state
preservation
- **`.github/workflows/task-storage-layout.yml`** - CI workflow for
storage layout checks
### Modified Files
- **`.github/workflows/CI.yml`** - Added `storage-layout` job to run in
parallel with other checks
## How It Works
**Two-pronged approach:**
1. **Snapshot Diff** - Compares current storage layout against committed
snapshot using `forge inspect`.
Catches unintended variable reordering, type changes, or gap
modifications.
2. **Upgrade Simulation** - Foundry tests that populate state, perform a
proxy upgrade, and verify all
values survive:
- `test_upgradePreservesState` - Verifies core state variables
- `test_upgradePreservesValidatorMappings` - Verifies
`validatorEthAddressToSolochainAddress` mapping
- `test_upgradePreservesMultipleValidators` - Verifies
`validatorsAllowlist` with multiple entries
- `test_functionalityAfterUpgrade` - Verifies contract remains
functional post-upgrade
## Normalization
The snapshot comparison normalizes JSON to avoid false positives:
- Removes `astId` (changes with compiler runs)
- Removes `contract` (contains full file path)
- Removes `.types` section (contains unstable AST IDs embedded in type
keys)
- Sorts by slot number
## Usage
```bash
# Check storage layout against snapshot
./scripts/check-storage-layout.sh
# Run upgrade simulation tests
forge test --match-contract StorageLayoutTest -vvv
# Update snapshot (when intentionally changing storage)
forge inspect DataHavenServiceManager storage --json >
storage-snapshots/DataHavenServiceManager.storage.json
```
## Test Plan
- ./scripts/check-storage-layout.sh passes
- forge test --match-contract StorageLayoutTest -vvv passes (4 tests)
- CI workflow runs successfully
51 lines
1.2 KiB
YAML
51 lines
1.2 KiB
YAML
# Storage Layout Check: Validates storage layout for upgradeable contracts
|
|
#
|
|
# Overview:
|
|
# 1. Compares current storage layout against committed snapshot
|
|
# 2. Runs upgrade simulation tests to verify state preservation
|
|
|
|
name: Storage Layout Check
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
workflow_call:
|
|
|
|
# Explicit minimal permissions
|
|
permissions:
|
|
contents: read
|
|
|
|
env:
|
|
FOUNDRY_PROFILE: ci
|
|
|
|
jobs:
|
|
check:
|
|
name: Storage Layout
|
|
runs-on: ubuntu-latest
|
|
defaults:
|
|
run:
|
|
working-directory: contracts
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
submodules: recursive
|
|
|
|
- name: Install Foundry
|
|
uses: foundry-rs/foundry-toolchain@v1
|
|
with:
|
|
version: v1.4.3
|
|
|
|
- name: Build contracts
|
|
run: forge build --extra-output storageLayout
|
|
|
|
- name: Negative check storage layout (should fail)
|
|
run: |
|
|
chmod +x scripts/check-storage-layout-negative.sh
|
|
./scripts/check-storage-layout-negative.sh
|
|
|
|
- name: Check storage layout
|
|
run: |
|
|
chmod +x scripts/check-storage-layout.sh
|
|
./scripts/check-storage-layout.sh
|
|
|
|
- name: Run upgrade simulation tests
|
|
run: forge test --match-contract StorageLayoutTest -vvv
|