diff --git a/src/OptimisticTokenVotingPlugin.sol b/src/OptimisticTokenVotingPlugin.sol index 9a8a2a3..f79ea3f 100644 --- a/src/OptimisticTokenVotingPlugin.sol +++ b/src/OptimisticTokenVotingPlugin.sol @@ -208,7 +208,8 @@ contract OptimisticTokenVotingPlugin is // The last L2 block is too old TaikoData.Block memory _block = taikoL1.getBlock(_id - 1); - if (_block.proposedAt < (block.timestamp - governanceSettings.l2InactivityPeriod)) return false; + // proposedAt < (block.timestamp - l2InactivityPeriod), written as a sum + if ((_block.proposedAt + governanceSettings.l2InactivityPeriod) < block.timestamp) return false; return true; } diff --git a/test/OptimisticTokenVotingPlugin.t.sol b/test/OptimisticTokenVotingPlugin.t.sol index a00c964..73b3204 100644 --- a/test/OptimisticTokenVotingPlugin.t.sol +++ b/test/OptimisticTokenVotingPlugin.t.sol @@ -510,6 +510,32 @@ contract OptimisticTokenVotingPluginTest is AragonTest { assertEq(optimisticPlugin.isMember(randomWallet), false, "Random wallet should not be a member"); } + function test_IsL2AvailableReturnsTheRightValues() public { + assertEq(optimisticPlugin.isL2Available(), true, "isL2Available should be true"); + + // paused + (, optimisticPlugin,,, votingToken,) = builder.withPausedTaikoL1().build(); + assertEq(optimisticPlugin.isL2Available(), false, "isL2Available should be false"); + + // out of sync + (, optimisticPlugin,,, votingToken,) = builder.withOutOfSyncTaikoL1().build(); + assertEq(optimisticPlugin.isL2Available(), false, "isL2Available should be false"); + + // out of sync: diff below lowerl2InactivityPeriod + setTime(5 minutes); + assertEq(optimisticPlugin.isL2Available(), true, "isL2Available should be true"); + + // out of sync: still within the period + setTime(50 days); + (, optimisticPlugin,,, votingToken,) = builder.withL2InactivityPeriod(50 days).build(); + assertEq(optimisticPlugin.isL2Available(), true, "isL2Available should be true"); + + // out of sync: over + setTime(50 days + 1); + (, optimisticPlugin,,, votingToken,) = builder.withL2InactivityPeriod(50 days).build(); + assertEq(optimisticPlugin.isL2Available(), false, "isL2Available should be false"); + } + // Create proposal function test_CreateProposalRevertsWhenCalledByANonProposer() public { switchTo(bob); diff --git a/test/mocks/TaikoL1Mock.sol b/test/mocks/TaikoL1Mock.sol index 9697f89..0657623 100644 --- a/test/mocks/TaikoL1Mock.sol +++ b/test/mocks/TaikoL1Mock.sol @@ -35,7 +35,7 @@ contract TaikoL1WithOldLastBlock is TaikoL1 { } function slotB() public pure override returns (TaikoData.SlotB memory result) { - result.numBlocks = 0; + result.numBlocks = 1; } function getBlock(uint64 _blockId) public pure override returns (TaikoData.Block memory result) {