Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
9 changes: 9 additions & 0 deletions src/swarms/FleetIdentityUpgradeable.sol
Original file line number Diff line number Diff line change
Expand Up @@ -732,6 +732,15 @@ contract FleetIdentityUpgradeable is
return (uint32(countryCode) << uint32(ADMIN_SHIFT)) | uint32(adminCode);
}

// ══════════════════════════════════════════════
// Version
// ══════════════════════════════════════════════

/// @notice Returns the contract version for upgrade verification.
function version() external pure virtual returns (string memory) {
return "1.0.0";
}

// ══════════════════════════════════════════════
// UUPS Authorization
// ══════════════════════════════════════════════
Expand Down
2 changes: 1 addition & 1 deletion test/upgrade-demo/TestUpgradeOnAnvil.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import {SwarmRegistryL1Upgradeable} from "../../src/swarms/SwarmRegistryL1Upgrad

/// @dev Mock V2 that adds version() - inherits from V1 to preserve storage layout
contract FleetIdentityUpgradeableV2 is FleetIdentityUpgradeable {
function version() external pure returns (string memory) {
function version() external pure override returns (string memory) {
return "2.0.0";
}
}
Expand Down
20 changes: 17 additions & 3 deletions test/upgradeable/UpgradeableContracts.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,8 @@ contract FleetIdentityUpgradeableV2Mock is FleetIdentityUpgradeable {
fleetMetadata[tokenId] = metadata;
}

function version() external pure returns (string memory) {
return "V2";
function version() external pure override returns (string memory) {
return "2.0.0";
}
}

Expand Down Expand Up @@ -259,6 +259,10 @@ contract UpgradeableContractsTest is Test {
assertEq(fleetIdentity.symbol(), "SFID");
}

function test_FleetIdentity_Version() public view {
assertEq(fleetIdentity.version(), "1.0.0");
}

function test_FleetIdentity_CannotReinitialize() public {
vm.expectRevert(Initializable.InvalidInitialization.selector);
fleetIdentity.initialize(attacker, address(bondToken), BASE_BOND, 0);
Expand Down Expand Up @@ -289,7 +293,7 @@ contract UpgradeableContractsTest is Test {

// Verify upgrade
FleetIdentityUpgradeableV2Mock v2 = FleetIdentityUpgradeableV2Mock(fleetIdentityProxy);
assertEq(v2.version(), "V2");
assertEq(v2.version(), "2.0.0");
assertGt(v2.v2InitializedAt(), 0);

// Verify old state preserved
Expand All @@ -301,6 +305,16 @@ contract UpgradeableContractsTest is Test {
assertEq(v2.fleetMetadata(tokenId), "metadata://test");
}

function test_FleetIdentity_VersionChangesAfterUpgrade() public {
assertEq(fleetIdentity.version(), "1.0.0");

FleetIdentityUpgradeableV2Mock v2Impl = new FleetIdentityUpgradeableV2Mock();
vm.prank(owner);
fleetIdentity.upgradeToAndCall(address(v2Impl), "");

assertEq(FleetIdentityUpgradeableV2Mock(fleetIdentityProxy).version(), "2.0.0");
}

function test_FleetIdentity_NonOwnerCannotUpgrade() public {
FleetIdentityUpgradeableV2Mock v2Impl = new FleetIdentityUpgradeableV2Mock();

Expand Down
Loading