Skip to content
Open
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
32 changes: 32 additions & 0 deletions src/UntollHookSecurityExtensions.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

library UntollHookSecurityExtensions {
error GraduationStateTransitionFailed();
error PerBlockLimitExceeded();

struct HookState {
bool isGraduated;
uint256 blockVolume;
uint256 lastBlockNumber;
}

function validateGraduationTransition(bool currentlyGraduated, bool targetGraduated) internal pure {
if (currentlyGraduated && !targetGraduated) {
revert GraduationStateTransitionFailed();
}
}

function checkBlockLimit(HookState storage state, uint256 swapAmount, uint256 maxBlockLimit) internal {
if (block.number > state.lastBlockNumber) {
state.lastBlockNumber = block.number;
state.blockVolume = 0;
}

if (state.blockVolume + swapAmount > maxBlockLimit) {
revert PerBlockLimitExceeded();
}

state.blockVolume += swapAmount;
}
}
15 changes: 15 additions & 0 deletions test/UntollHookSecurity.t.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

import "forge-std/Test.sol";
import "../src/UntollHookSecurityExtensions.sol";

contract UntollHookSecurityTest is Test {
function testGraduationStateTransition() public pure {
UntollHookSecurityExtensions.validateGraduationTransition(false, true);
}

function testFailInvalidGraduationRevert() public pure {
UntollHookSecurityExtensions.validateGraduationTransition(true, false);
}
}