Skip to content

Commit

Permalink
Merge branch 'main' into add-simple-integration-mock
Browse files Browse the repository at this point in the history
  • Loading branch information
1kresh committed Jan 22, 2025
2 parents b205279 + 812b814 commit 0d0c0bd
Show file tree
Hide file tree
Showing 16 changed files with 388 additions and 69 deletions.
2 changes: 1 addition & 1 deletion out/FullRestakeResetHook.sol/FullRestakeResetHook.json

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@symbioticfi/hooks",
"version": "1.0.0-devnet.1",
"description": "Symbiotic is a shared security protocol enabling decentralized networks to control and customize their own multi-asset restaking implementation.",
"description": "Symbiotic Hooks repository contains several basic on-slash hook implementations for different delegator types.",
"homepage": "https://symbiotic.fi/",
"bugs": "https://github.com/symbioticfi/hooks/issues",
"license": "MIT",
Expand All @@ -23,8 +23,8 @@
"security"
],
"dependencies": {
"@openzeppelin/contracts": "5.0.2",
"@openzeppelin/contracts-upgradeable": "5.0.2",
"@symbioticfi/core": "1.0.0-devnet.5"
"@openzeppelin/contracts": "5.1.0",
"@openzeppelin/contracts-upgradeable": "5.1.0",
"@symbioticfi/core": "1.0.0-devnet.9"
}
}
28 changes: 13 additions & 15 deletions src/contracts/fullRestakeDelegator/FullRestakeResetHook.sol
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,10 @@ contract FullRestakeResetHook is IFullRestakeResetHook {
*/
uint256 public immutable SLASH_COUNT;

mapping(address vault => mapping(address operator => CircularBuffer.Bytes32CircularBuffer buffer)) private
_slashings;
mapping(
address vault
=> mapping(bytes32 subnetwork => mapping(address operator => CircularBuffer.Bytes32CircularBuffer buffer))
) private _slashings;

constructor(uint48 period, uint256 slashCount) {
if (slashCount == 0) {
Expand Down Expand Up @@ -56,22 +58,18 @@ contract FullRestakeResetHook is IFullRestakeResetHook {
revert NotVaultDelegator();
}

uint256 slashCount = SLASH_COUNT;
if (_slashings[vault][operator].count() == 0) {
_slashings[vault][operator].setup(slashCount);
CircularBuffer.Bytes32CircularBuffer storage buffer = _slashings[vault][subnetwork][operator];
if (buffer.length() == 0) {
buffer.setup(SLASH_COUNT);
}

if (IFullRestakeDelegator(msg.sender).operatorNetworkLimit(subnetwork, operator) == 0) {
return;
}

_slashings[vault][operator].push(bytes32(uint256(Time.timestamp())));
buffer.push(bytes32(uint256(Time.timestamp())));

if (
_slashings[vault][operator].count() == slashCount
&& Time.timestamp() - uint256(_slashings[vault][operator].last(slashCount - 1)) <= PERIOD
) {
IFullRestakeDelegator(msg.sender).setOperatorNetworkLimit(subnetwork, operator, 0);
if (buffer.count() == SLASH_COUNT && Time.timestamp() - uint256(buffer.last(SLASH_COUNT - 1)) <= PERIOD) {
if (IFullRestakeDelegator(msg.sender).operatorNetworkLimit(subnetwork, operator) != 0) {
IFullRestakeDelegator(msg.sender).setOperatorNetworkLimit(subnetwork, operator, 0);
}
buffer.clear();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ pragma solidity 0.8.25;
import {INetworkRestakeRedistributeHook} from
"../../interfaces/networkRestakeDelegator/INetworkRestakeRedistributeHook.sol";

import {IBaseSlasher} from "@symbioticfi/core/src/interfaces/slasher/IBaseSlasher.sol";
import {IDelegatorHook} from "@symbioticfi/core/src/interfaces/delegator/IDelegatorHook.sol";
import {IEntity} from "@symbioticfi/core/src/interfaces/common/IEntity.sol";
import {INetworkRestakeDelegator} from "@symbioticfi/core/src/interfaces/delegator/INetworkRestakeDelegator.sol";
Expand Down
28 changes: 13 additions & 15 deletions src/contracts/networkRestakeDelegator/NetworkRestakeResetHook.sol
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,10 @@ contract NetworkRestakeResetHook is INetworkRestakeResetHook {
*/
uint256 public immutable SLASH_COUNT;

mapping(address vault => mapping(address operator => CircularBuffer.Bytes32CircularBuffer buffer)) private
_slashings;
mapping(
address vault
=> mapping(bytes32 subnetwork => mapping(address operator => CircularBuffer.Bytes32CircularBuffer buffer))
) private _slashings;

constructor(uint48 period, uint256 slashCount) {
if (slashCount == 0) {
Expand Down Expand Up @@ -56,22 +58,18 @@ contract NetworkRestakeResetHook is INetworkRestakeResetHook {
revert NotVaultDelegator();
}

uint256 slashCount = SLASH_COUNT;
if (_slashings[vault][operator].count() == 0) {
_slashings[vault][operator].setup(slashCount);
CircularBuffer.Bytes32CircularBuffer storage buffer = _slashings[vault][subnetwork][operator];
if (buffer.length() == 0) {
buffer.setup(SLASH_COUNT);
}

if (INetworkRestakeDelegator(msg.sender).operatorNetworkShares(subnetwork, operator) == 0) {
return;
}

_slashings[vault][operator].push(bytes32(uint256(Time.timestamp())));
buffer.push(bytes32(uint256(Time.timestamp())));

if (
_slashings[vault][operator].count() == slashCount
&& Time.timestamp() - uint256(_slashings[vault][operator].last(slashCount - 1)) <= PERIOD
) {
INetworkRestakeDelegator(msg.sender).setOperatorNetworkShares(subnetwork, operator, 0);
if (buffer.count() == SLASH_COUNT && Time.timestamp() - uint256(buffer.last(SLASH_COUNT - 1)) <= PERIOD) {
if (INetworkRestakeDelegator(msg.sender).operatorNetworkShares(subnetwork, operator) != 0) {
INetworkRestakeDelegator(msg.sender).setOperatorNetworkShares(subnetwork, operator, 0);
}
buffer.clear();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ contract OperatorSpecificResetHook is IOperatorSpecificResetHook {
*/
uint256 public immutable SLASH_COUNT;

mapping(address vault => CircularBuffer.Bytes32CircularBuffer buffer) private _slashings;
mapping(address vault => mapping(bytes32 subnetwork => CircularBuffer.Bytes32CircularBuffer buffer)) private
_slashings;

constructor(uint48 period, uint256 slashCount) {
if (slashCount == 0) {
Expand Down Expand Up @@ -55,22 +56,18 @@ contract OperatorSpecificResetHook is IOperatorSpecificResetHook {
revert NotVaultDelegator();
}

uint256 slashCount = SLASH_COUNT;
if (_slashings[vault].count() == 0) {
_slashings[vault].setup(slashCount);
CircularBuffer.Bytes32CircularBuffer storage buffer = _slashings[vault][subnetwork];
if (buffer.length() == 0) {
buffer.setup(SLASH_COUNT);
}

if (IOperatorSpecificDelegator(msg.sender).networkLimit(subnetwork) == 0) {
return;
}

_slashings[vault].push(bytes32(uint256(Time.timestamp())));
buffer.push(bytes32(uint256(Time.timestamp())));

if (
_slashings[vault].count() == slashCount
&& Time.timestamp() - uint256(_slashings[vault].last(slashCount - 1)) <= PERIOD
) {
IOperatorSpecificDelegator(msg.sender).setNetworkLimit(subnetwork, 0);
if (buffer.count() == SLASH_COUNT && Time.timestamp() - uint256(buffer.last(SLASH_COUNT - 1)) <= PERIOD) {
if (IOperatorSpecificDelegator(msg.sender).networkLimit(subnetwork) != 0) {
IOperatorSpecificDelegator(msg.sender).setNetworkLimit(subnetwork, 0);
}
buffer.clear();
}
}
}
1 change: 0 additions & 1 deletion test/fullRestakeDelegator/FullRestakeDecreaseHook.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ contract FullRestakeDecreaseHookTest is POCBaseTest {

function setUp() public override {
SYMBIOTIC_CORE_PROJECT_ROOT = "lib/core/";

super.setUp();
}

Expand Down
113 changes: 112 additions & 1 deletion test/fullRestakeDelegator/FullRestakeResetHook.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ contract FullRestakeResetHookTest is POCBaseTest {

function setUp() public override {
SYMBIOTIC_CORE_PROJECT_ROOT = "lib/core/";

super.setUp();
}

Expand Down Expand Up @@ -116,6 +115,118 @@ contract FullRestakeResetHookTest is POCBaseTest {
blockTimestamp = blockTimestamp + 3 days;
vm.warp(blockTimestamp);

_setOperatorNetworkLimit(delegator2, alice, network, alice, 0);

_slash(slasher2, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), "");

assertEq(delegator2.networkLimit(network.subnetwork(0)), type(uint256).max);
assertEq(delegator2.operatorNetworkLimit(network.subnetwork(0), alice), 0);

_setOperatorNetworkLimit(delegator2, alice, network, alice, operatorNetworkLimit1);

assertEq(delegator2.networkLimit(network.subnetwork(0)), type(uint256).max);
assertEq(delegator2.operatorNetworkLimit(network.subnetwork(0), alice), operatorNetworkLimit1);

blockTimestamp = blockTimestamp + 1;
vm.warp(blockTimestamp);

_slash(slasher2, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), "");

assertEq(delegator2.networkLimit(network.subnetwork(0)), type(uint256).max);
assertEq(delegator2.operatorNetworkLimit(network.subnetwork(0), alice), operatorNetworkLimit1);

blockTimestamp = blockTimestamp + 7 days;
vm.warp(blockTimestamp);

_slash(slasher2, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), "");

assertEq(delegator2.networkLimit(network.subnetwork(0)), type(uint256).max);
assertEq(delegator2.operatorNetworkLimit(network.subnetwork(0), alice), operatorNetworkLimit1);

blockTimestamp = blockTimestamp + 3 days;
vm.warp(blockTimestamp);

_slash(slasher2, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), "");

assertEq(delegator2.networkLimit(network.subnetwork(0)), type(uint256).max);
assertEq(delegator2.operatorNetworkLimit(network.subnetwork(0), alice), operatorNetworkLimit1);

blockTimestamp = blockTimestamp + 5 days;
vm.warp(blockTimestamp);

_slash(slasher2, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), "");

assertEq(delegator2.networkLimit(network.subnetwork(0)), type(uint256).max);
assertEq(delegator2.operatorNetworkLimit(network.subnetwork(0), alice), operatorNetworkLimit1);

blockTimestamp = blockTimestamp + 3 days;
vm.warp(blockTimestamp);

_setOperatorNetworkLimit(delegator2, alice, network, alice, 0);

_slash(slasher2, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), "");

_setOperatorNetworkLimit(delegator2, alice, network, alice, operatorNetworkLimit1);

assertEq(delegator2.networkLimit(network.subnetwork(0)), type(uint256).max);
assertEq(delegator2.operatorNetworkLimit(network.subnetwork(0), alice), operatorNetworkLimit1);

blockTimestamp = blockTimestamp + 3 days;
vm.warp(blockTimestamp);

_slash(slasher2, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), "");

assertEq(delegator2.networkLimit(network.subnetwork(0)), type(uint256).max);
assertEq(delegator2.operatorNetworkLimit(network.subnetwork(0), alice), 0);

_setOperatorNetworkLimit(delegator2, alice, network, alice, operatorNetworkLimit1);

assertEq(delegator2.networkLimit(network.subnetwork(0)), type(uint256).max);
assertEq(delegator2.operatorNetworkLimit(network.subnetwork(0), alice), operatorNetworkLimit1);

blockTimestamp = blockTimestamp + 1;
vm.warp(blockTimestamp);

_slash(slasher2, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), "");

assertEq(delegator2.networkLimit(network.subnetwork(0)), type(uint256).max);
assertEq(delegator2.operatorNetworkLimit(network.subnetwork(0), alice), operatorNetworkLimit1);

blockTimestamp = blockTimestamp + 7 days;
vm.warp(blockTimestamp);

_slash(slasher2, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), "");

assertEq(delegator2.networkLimit(network.subnetwork(0)), type(uint256).max);
assertEq(delegator2.operatorNetworkLimit(network.subnetwork(0), alice), operatorNetworkLimit1);

blockTimestamp = blockTimestamp + 3 days;
vm.warp(blockTimestamp);

_slash(slasher2, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), "");

assertEq(delegator2.networkLimit(network.subnetwork(0)), type(uint256).max);
assertEq(delegator2.operatorNetworkLimit(network.subnetwork(0), alice), operatorNetworkLimit1);

blockTimestamp = blockTimestamp + 5 days;
vm.warp(blockTimestamp);

_slash(slasher2, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), "");

assertEq(delegator2.networkLimit(network.subnetwork(0)), type(uint256).max);
assertEq(delegator2.operatorNetworkLimit(network.subnetwork(0), alice), operatorNetworkLimit1);

blockTimestamp = blockTimestamp + 3 days;
vm.warp(blockTimestamp);

_slash(slasher2, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), "");

assertEq(delegator2.networkLimit(network.subnetwork(0)), type(uint256).max);
assertEq(delegator2.operatorNetworkLimit(network.subnetwork(0), alice), operatorNetworkLimit1);

blockTimestamp = blockTimestamp + 3 days;
vm.warp(blockTimestamp);

_slash(slasher2, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), "");

assertEq(delegator2.networkLimit(network.subnetwork(0)), type(uint256).max);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ contract NetworkRestakeDecreaseHookTest is POCBaseTest {

function setUp() public override {
SYMBIOTIC_CORE_PROJECT_ROOT = "lib/core/";

super.setUp();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ contract NetworkRestakeRedistributeHookTest is POCBaseTest {

function setUp() public override {
SYMBIOTIC_CORE_PROJECT_ROOT = "lib/core/";

super.setUp();
}

Expand Down
Loading

0 comments on commit 0d0c0bd

Please sign in to comment.