feat: demonstrate state-preserving V2 upgrade

This commit is contained in:
golem
2026-08-21 15:31:40 -06:00
parent ca6a99b913
commit 94f2ad6e09
16 changed files with 1082 additions and 36 deletions
+23 -4
View File
@@ -2,26 +2,45 @@
pragma solidity 0.8.35;
import {BankTestBase} from "./helpers/BankTestBase.sol";
import {BankHandler} from "./helpers/BankHandler.sol";
import {BankV2} from "../src/BankV2.sol";
import {Options, Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol";
import {BankV2Handler} from "./helpers/BankV2Handler.sol";
contract BankInvariantTest is BankTestBase {
BankHandler internal handler;
BankV2Handler internal handler;
function setUp() public override {
super.setUp();
Options memory opts;
opts.referenceContract = "BankV1.sol:BankV1";
Upgrades.upgradeProxy(proxy, "BankV2.sol:BankV2", "", opts, owner);
BankV2 bankV2 = BankV2(proxy);
handler = new BankHandler(token, bank);
handler = new BankV2Handler(token, bankV2);
vm.prank(owner);
token.transferOwnership(address(handler));
targetContract(address(handler));
bytes4[] memory selectors = new bytes4[](3);
bytes4[] memory selectors = new bytes4[](4);
selectors[0] = handler.deposit.selector;
selectors[1] = handler.withdraw.selector;
selectors[2] = handler.donate.selector;
selectors[3] = handler.transfer.selector;
targetSelector(FuzzSelector({addr: address(handler), selectors: selectors}));
}
function testHandlerExecutesDeterministicTrackedTransfer() public {
handler.deposit(0, 40e6);
handler.transfer(0, 0, 15e6);
assertEq(bank.balanceOf(handler.actorAt(0)), 25e6);
assertEq(bank.balanceOf(handler.actorAt(1)), 15e6);
assertEq(handler.ghostTransferred(), 15e6);
assertEq(bank.totalLiabilities(), 40e6);
assertEq(token.balanceOf(address(bank)), 40e6);
}
function invariant_liabilitiesEqualTrackedBalances() public view {
uint256 sum;
for (uint256 i; i < handler.actorCount(); ++i) {