Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
c3f3ddd
Automate upgrade safety check in CI pipeline
RonTuretzky Jul 22, 2025
b035efa
chore: ci/cd init
RonTuretzky Jul 22, 2025
1e875e1
Fix incorrect order of parent initializer calls in ButteredBread.sol
RonTuretzky Jul 22, 2025
4d908b1
Merge remote-tracking branch 'ron/issue-149-fix' into 141-automate-up…
RonTuretzky Jul 23, 2025
b0a6a98
Update flattened ButteredBread contract after merge
RonTuretzky Jul 23, 2025
d456847
Simplify upgrade validation - remove contract flattening
RonTuretzky Aug 6, 2025
44509d0
Revert "Simplify upgrade validation - remove contract flattening"
RonTuretzky Aug 6, 2025
10fb6be
Remove contract flattening from upgrade validation
RonTuretzky Aug 6, 2025
dd2586e
Add automated contract flattening after validation passes
RonTuretzky Aug 9, 2025
df26c4c
update (#160)
RonTuretzky Aug 9, 2025
aee2498
update (#161)
RonTuretzky Aug 9, 2025
3ad35e6
Merge branch 'dev' into 141-automate-upgrade-safety-check-in-ci-pipeline
RonTuretzky Aug 9, 2025
2cbfd42
Merge branch '141-automate-upgrade-safety-check-in-ci-pipeline' of ht…
RonTuretzky Aug 9, 2025
35422e5
Refactor upgrade validation to use flattened contracts
RonTuretzky Aug 9, 2025
45328a1
Fix upgrade validation for initial deployment
RonTuretzky Aug 9, 2025
7211f34
Simplify flattened contracts workflow
RonTuretzky Aug 10, 2025
3faa4f7
Add initial flattened contracts for upgrade validation
RonTuretzky Aug 10, 2025
b3eac0f
Apply bagelface's review feedback
RonTuretzky Aug 19, 2025
e7f3dcf
Add release branches to PR workflow triggers
RonTuretzky Aug 19, 2025
6b4d601
Update workflow to run on any PR from branches containing 'release'
RonTuretzky Aug 19, 2025
89c834a
Fix workflow conditions to properly run on release branches
RonTuretzky Aug 19, 2025
bd03348
Fix workflow to check target branch for 'release' as well
RonTuretzky Aug 19, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 99 additions & 2 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,26 @@
name: test

on: workflow_dispatch
on:
workflow_dispatch:
pull_request:
push:
branches: [ dev, main ]

env:
FOUNDRY_PROFILE: ci

jobs:
check:
# Only run on: pushes to dev/main, PRs to/from branches with 'release' or to dev/main, or manual trigger
if: |
github.event_name == 'workflow_dispatch' ||
github.event_name == 'push' ||
(github.event_name == 'pull_request' &&
(github.base_ref == 'dev' ||
github.base_ref == 'main' ||
contains(github.head_ref, 'release') ||
contains(github.base_ref, 'release')))

strategy:
fail-fast: true

Expand All @@ -20,7 +34,7 @@ jobs:
- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
with:
version: nightly
version: stable

- name: Run Forge build
run: |
Expand All @@ -32,3 +46,86 @@ jobs:
run: |
forge test -vvv
id: test

upgrade-safety:
# Only run on: pushes to dev/main, PRs to/from branches with 'release' or to dev/main, or manual trigger
if: |
github.event_name == 'workflow_dispatch' ||
github.event_name == 'push' ||
(github.event_name == 'pull_request' &&
(github.base_ref == 'dev' ||
github.base_ref == 'main' ||
contains(github.head_ref, 'release') ||
contains(github.base_ref, 'release')))

name: Upgrade Safety Check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: recursive

- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
with:
version: stable

- name: Run upgrade safety validation
run: |
forge clean && forge build

# Check if previous flattened contracts exist
if [ -d "test/upgrades/previous" ] && ls test/upgrades/previous/*.sol 1> /dev/null 2>&1; then
echo "Previous contracts found, running upgrade validation..."
forge script script/upgrades/ValidateUpgrade.s.sol
else
echo "No previous contracts found, skipping upgrade validation (initial deployment)"
fi

flatten:
name: Flatten and Track Contracts
runs-on: ubuntu-latest
needs: [check, upgrade-safety] # Only run after tests and validation pass

# Only run on push to dev branch, not on PRs or main
if: github.event_name == 'push' && github.ref == 'refs/heads/dev'

permissions:
contents: write

steps:
- uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0

- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
with:
version: stable

- name: Create flattened contracts directory
run: mkdir -p test/upgrades/current

- name: Flatten all top-level contracts
run: |
# Find all Solidity files directly under src/, not nested
for contract in $(find src -maxdepth 1 -type f -name "*.sol"); do
name=$(basename "$contract")
forge flatten "$contract" > "test/upgrades/current/$name"
done

# Backup for future upgrade validations
rm -rf test/upgrades/previous
cp -r test/upgrades/current test/upgrades/previous

echo "Flattened contracts saved to test/upgrades/current/"
echo "Previous version backed up to test/upgrades/previous/"


- name: Commit flattened contracts
uses: stefanzweifel/git-auto-commit-action@v5
with:
file_pattern: test/upgrades/**/*.sol
commit_message: "chore: auto-flatten contracts after validation passes [skip ci]"
push_options: '--follow-tags'
25 changes: 20 additions & 5 deletions script/upgrades/ValidateUpgrade.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,28 @@ import {Script} from "forge-std/Script.sol";
import {Options} from "openzeppelin-foundry-upgrades/Options.sol";
import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol";
import {YieldDistributor} from "../../src/YieldDistributor.sol";
import {ButteredBread} from "../../src/ButteredBread.sol";
import {VotingMultipliers} from "../../src/VotingMultipliers.sol";

contract DeployYieldDistributor is Script {
contract ValidateUpgrade is Script {
function run() external {
vm.startBroadcast();
Options memory opts;
opts.referenceContract = "v1.0.4/YieldDistributor.sol:YieldDistributor";
Upgrades.validateUpgrade("YieldDistributor.sol:YieldDistributor", opts);

// Validate YieldDistributor upgrade
Options memory yieldOpts;
yieldOpts.referenceContract = "test/upgrades/previous/YieldDistributor.sol:YieldDistributor";
Upgrades.validateUpgrade("YieldDistributor.sol:YieldDistributor", yieldOpts);

// Validate ButteredBread upgrade
Options memory breadOpts;
breadOpts.referenceContract = "test/upgrades/previous/ButteredBread.sol:ButteredBread";
Upgrades.validateUpgrade("ButteredBread.sol:ButteredBread", breadOpts);

// Validate VotingMultipliers upgrade
Options memory votingOpts;
votingOpts.referenceContract = "test/upgrades/previous/VotingMultipliers.sol:VotingMultipliers";
Upgrades.validateUpgrade("VotingMultipliers.sol:VotingMultipliers", votingOpts);

vm.stopBroadcast();
}
}
}
Loading