// SPDX-License-Identifier: UNLICENSED pragma solidity =0.8.18; import "./IGuardable.sol"; library GuardHelper { // 00000000(192 0's repeated)111(64times) // (64 default on, 192 default off) bytes32 internal constant DEFAULT_PRIVILEGES = bytes32(uint256(2 ** 64 - 1)); function requiredPrivileges(address account) internal view returns (bytes32 privileges) { // call to account with no code returns true // call to account with code and no function returns false // call to account with code and function returns true (bool success, bytes memory returndata) = account.staticcall(abi.encodePacked(IGuardable.requiredPrivileges.selector)); privileges = (success && (account.code.length > 0)) ? bytes32(returndata) : DEFAULT_PRIVILEGES; } function check(bytes32 privileges, bytes32 query) internal pure returns (bool) { return privileges & query == query; } function mergePrivileges(bytes32 privileges1, bytes32 privileges2) internal pure returns (bytes32) { return privileges1 | privileges2; } function mergePrivileges(bytes32 privileges1, bytes32 privileges2, bytes32 privileges3) internal pure returns (bytes32) { return privileges1 | privileges2 | privileges3; } function switchOn(uint256[] memory ids, bytes32 base) internal pure returns (bytes32 result) { result = base; for (uint256 i; i < ids.length; ++i) { result = result | bytes32(2 ** ids[i]); } } function switchOff(uint256[] memory ids, bytes32 base) internal pure returns (bytes32 result) { result = base; for (uint256 i; i < ids.length; ++i) { result = result & bytes32(type(uint256).max - 2 ** ids[i]); } } }