Skip to content

Commit 0d6a720

Browse files
committed
evm: add immutables check
1 parent da1f654 commit 0d6a720

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

evm/src/NativeTransfers/NonFungibleNttManager.sol

+9-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ contract NonFungibleNttManager is INonFungibleNttManager, ManagerBase {
2727

2828
// The number of bytes each NFT token ID occupies in the payload. All tokenIDs must fit within
2929
// this width.
30-
uint8 immutable tokenIdWidth;
30+
uint8 public immutable tokenIdWidth;
3131

3232
// =============== Setup =================================================================
3333

@@ -56,6 +56,14 @@ contract NonFungibleNttManager is INonFungibleNttManager, ManagerBase {
5656
_checkTransceiversInvariants();
5757
}
5858

59+
/// ============== Invariants =============================================
60+
61+
/// @dev When we add new immutables, this function should be updated
62+
function _checkImmutables() internal view override {
63+
super._checkImmutables();
64+
assert(this.tokenIdWidth() == tokenIdWidth);
65+
}
66+
5967
// =============== Storage ==============================================================
6068

6169
bytes32 private constant PEERS_SLOT = bytes32(uint256(keccak256("nonFungibleNtt.peers")) - 1);

evm/test/NonFungibleNttManager.t.sol

+37
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,43 @@ contract TestNonFungibleNttManager is Test {
144144

145145
// ================================== Admin Tests ==================================
146146

147+
function test_cannotDeployWithInvalidTokenIdWidth(uint8 _tokenIdWidth) public {
148+
vm.assume(
149+
_tokenIdWidth != 1 && _tokenIdWidth != 2 && _tokenIdWidth != 4 && _tokenIdWidth != 8
150+
&& _tokenIdWidth != 16 && _tokenIdWidth != 32
151+
);
152+
153+
vm.expectRevert(
154+
abi.encodeWithSelector(
155+
INonFungibleNttManager.InvalidTokenIdWidth.selector, _tokenIdWidth
156+
)
157+
);
158+
NonFungibleNttManager implementation = new NonFungibleNttManager(
159+
address(nftOne), _tokenIdWidth, IManagerBase.Mode.BURNING, chainIdOne
160+
);
161+
}
162+
163+
/// @dev We perform an upgrade with the existing tokenIdWidth to show that upgrades
164+
/// are possible with the same tokenIdWidth. There is no specific error thrown when
165+
/// the immutables check throws.
166+
function test_cannotUpgradeWithDifferentTokenIdWidth() public {
167+
vm.startPrank(owner);
168+
{
169+
NonFungibleNttManager newImplementation = new NonFungibleNttManager(
170+
address(nftOne), tokenIdWidth, IManagerBase.Mode.LOCKING, chainIdOne
171+
);
172+
managerOne.upgrade(address(newImplementation));
173+
}
174+
175+
uint8 newTokenIdWidth = 4;
176+
NonFungibleNttManager newImplementation = new NonFungibleNttManager(
177+
address(nftOne), newTokenIdWidth, IManagerBase.Mode.LOCKING, chainIdOne
178+
);
179+
180+
vm.expectRevert();
181+
managerOne.upgrade(address(newImplementation));
182+
}
183+
147184
function test_cannotInitalizeNotDeployer() public {
148185
// Don't initialize.
149186
vm.prank(owner);

0 commit comments

Comments
 (0)