From a39e5f4ec2a8f84a12b8a7193928c6277c4c9545 Mon Sep 17 00:00:00 2001 From: blockgroot <170620375+blockgroot@users.noreply.github.com> Date: Thu, 17 Oct 2024 08:13:10 +0000 Subject: [PATCH] feat: change min ONO requirement --- contracts/StaderOracle.sol | 5 ++- test/foundry_tests/StaderOracle.t.sol | 51 +++++++++++++++------------ 2 files changed, 32 insertions(+), 24 deletions(-) diff --git a/contracts/StaderOracle.sol b/contracts/StaderOracle.sol index bec4b6e2..b90cd898 100644 --- a/contracts/StaderOracle.sol +++ b/contracts/StaderOracle.sol @@ -29,7 +29,7 @@ contract StaderOracle is IStaderOracle, AccessControlUpgradeable, PausableUpgrad uint256 public constant MAX_ER_UPDATE_FREQUENCY = 7200 * 7; // 7 days uint256 public constant ER_CHANGE_MAX_BPS = 10_000; uint256 public override erChangeLimit; - uint256 public constant MIN_TRUSTED_NODES = 5; + uint256 public constant MIN_TRUSTED_NODES = 3; uint256 public override trustedNodeChangeCoolingPeriod; /// @inheritdoc IStaderOracle @@ -119,6 +119,9 @@ contract StaderOracle is IStaderOracle, AccessControlUpgradeable, PausableUpgrad if (block.number < lastTrustedNodeCountChangeBlock + trustedNodeChangeCoolingPeriod) { revert CooldownNotComplete(); } + if (trustedNodesCount == MIN_TRUSTED_NODES) { + revert InsufficientTrustedNodes(); + } lastTrustedNodeCountChangeBlock = block.number; isTrustedNode[_nodeAddress] = false; diff --git a/test/foundry_tests/StaderOracle.t.sol b/test/foundry_tests/StaderOracle.t.sol index b818690d..8af812af 100644 --- a/test/foundry_tests/StaderOracle.t.sol +++ b/test/foundry_tests/StaderOracle.t.sol @@ -125,6 +125,7 @@ contract StaderOracleTest is Test { } function test_add_remove_trustedNode() public { + // Tests for adding nodes address trustedNode = vm.addr(123); assertEq(staderOracle.trustedNodesCount(), 0); assertFalse(staderOracle.isTrustedNode(trustedNode)); @@ -139,16 +140,6 @@ contract StaderOracleTest is Test { assertEq(staderOracle.trustedNodesCount(), 1); assertTrue(staderOracle.isTrustedNode(trustedNode)); - vm.expectRevert(IStaderOracle.NodeNotTrusted.selector); - vm.prank(staderManager); - staderOracle.removeTrustedNode(vm.addr(567)); - - vm.prank(staderManager); - staderOracle.removeTrustedNode(trustedNode); - - assertEq(staderOracle.trustedNodesCount(), 0); - assertFalse(staderOracle.isTrustedNode(trustedNode)); - // lets update trustedNode cooling period vm.expectRevert(UtilLib.CallerNotManager.selector); staderOracle.updateTrustedNodeChangeCoolingPeriod(100); @@ -157,22 +148,36 @@ contract StaderOracleTest is Test { staderOracle.updateTrustedNodeChangeCoolingPeriod(100); vm.expectRevert(IStaderOracle.CooldownNotComplete.selector); - staderOracle.addTrustedNode(vm.addr(78)); + staderOracle.addTrustedNode(vm.addr(77)); - // wait for 100 blocks + // wait for 100 blocks each time to add node + vm.roll(block.number + 100); + staderOracle.addTrustedNode(vm.addr(77)); vm.roll(block.number + 100); staderOracle.addTrustedNode(vm.addr(78)); - assertEq(staderOracle.trustedNodesCount(), 1); + vm.roll(block.number + 100); + staderOracle.addTrustedNode(vm.addr(79)); + assertEq(staderOracle.trustedNodesCount(), 4); + assertTrue(staderOracle.isTrustedNode(vm.addr(77))); assertTrue(staderOracle.isTrustedNode(vm.addr(78))); + assertTrue(staderOracle.isTrustedNode(vm.addr(79))); + + // Tests for removing nodes + vm.expectRevert(IStaderOracle.NodeNotTrusted.selector); + staderOracle.removeTrustedNode(vm.addr(567)); vm.expectRevert(IStaderOracle.CooldownNotComplete.selector); - staderOracle.removeTrustedNode(vm.addr(78)); + staderOracle.removeTrustedNode(vm.addr(77)); // wait for 100 blocks vm.roll(block.number + 100); + staderOracle.removeTrustedNode(vm.addr(77)); + assertEq(staderOracle.trustedNodesCount(), 3); + assertFalse(staderOracle.isTrustedNode(vm.addr(77))); + + vm.roll(block.number + 100); + vm.expectRevert(IStaderOracle.InsufficientTrustedNodes.selector); staderOracle.removeTrustedNode(vm.addr(78)); - assertEq(staderOracle.trustedNodesCount(), 0); - assertFalse(staderOracle.isTrustedNode(vm.addr(78))); vm.stopPrank(); } @@ -189,7 +194,7 @@ contract StaderOracleTest is Test { vm.expectRevert(IStaderOracle.InsufficientTrustedNodes.selector); staderOracle.submitSDPrice(sdPriceData); - assertEq(staderOracle.MIN_TRUSTED_NODES(), 5); + assertEq(staderOracle.MIN_TRUSTED_NODES(), 3); address trustedNode2 = vm.addr(702); address trustedNode3 = vm.addr(703); address trustedNode4 = vm.addr(704); @@ -330,7 +335,7 @@ contract StaderOracleTest is Test { function test_submitSDPrice_manipulation_not_possible_by_minority_malicious_oracles() public { SDPriceData memory sdPriceData = SDPriceData({ reportingBlockNumber: 1212, sdPriceInETH: 1 }); - assertEq(staderOracle.MIN_TRUSTED_NODES(), 5); + assertEq(staderOracle.MIN_TRUSTED_NODES(), 3); address trustedNode1 = vm.addr(701); address trustedNode2 = vm.addr(702); address trustedNode3 = vm.addr(703); @@ -800,7 +805,7 @@ contract StaderOracleTest is Test { totalETHXSupply: 100 }); - assertEq(staderOracle.MIN_TRUSTED_NODES(), 5); + assertEq(staderOracle.MIN_TRUSTED_NODES(), 3); address trustedNode1 = vm.addr(701); address trustedNode2 = vm.addr(702); address trustedNode3 = vm.addr(703); @@ -1007,7 +1012,7 @@ contract StaderOracleTest is Test { sortedInvalidSignaturePubkeys: invalidSignaturePubkeys }); - assertEq(staderOracle.MIN_TRUSTED_NODES(), 5); + assertEq(staderOracle.MIN_TRUSTED_NODES(), 3); address trustedNode1 = vm.addr(701); address trustedNode2 = vm.addr(702); address trustedNode3 = vm.addr(703); @@ -1082,7 +1087,7 @@ contract StaderOracleTest is Test { sortedPubkeys: sortedPubkeys }); - assertEq(staderOracle.MIN_TRUSTED_NODES(), 5); + assertEq(staderOracle.MIN_TRUSTED_NODES(), 3); address trustedNode1 = vm.addr(701); address trustedNode2 = vm.addr(702); address trustedNode3 = vm.addr(703); @@ -1162,7 +1167,7 @@ contract StaderOracleTest is Test { sortedPubkeys: sortedPubkeys }); - assertEq(staderOracle.MIN_TRUSTED_NODES(), 5); + assertEq(staderOracle.MIN_TRUSTED_NODES(), 3); address trustedNode1 = vm.addr(701); address trustedNode2 = vm.addr(702); address trustedNode3 = vm.addr(703); @@ -1232,7 +1237,7 @@ contract StaderOracleTest is Test { slashedValidatorsCount: 4 }); - assertEq(staderOracle.MIN_TRUSTED_NODES(), 5); + assertEq(staderOracle.MIN_TRUSTED_NODES(), 3); address trustedNode1 = vm.addr(701); address trustedNode2 = vm.addr(702); address trustedNode3 = vm.addr(703);