40 lines
1.7 KiB
Solidity
40 lines
1.7 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
|
|
pragma solidity ^0.8.20;
|
|
|
|
import "../patched/access/manager/IAccessManager.sol";
|
|
import "../patched/access/manager/AccessManaged.sol";
|
|
|
|
contract AccessManagedHarness is AccessManaged {
|
|
bytes internal SOME_FUNCTION_CALLDATA = abi.encodeCall(this.someFunction, ());
|
|
|
|
constructor(address initialAuthority) AccessManaged(initialAuthority) {}
|
|
|
|
function someFunction() public restricted {
|
|
// Sanity for FV: the msg.data when calling this function should be the same as the data used when checking
|
|
// the schedule. This is a reformulation of `msg.data == SOME_FUNCTION_CALLDATA` that focuses on the operation
|
|
// hash for this call.
|
|
require(
|
|
IAccessManager(authority()).hashOperation(_msgSender(), address(this), msg.data) ==
|
|
IAccessManager(authority()).hashOperation(_msgSender(), address(this), SOME_FUNCTION_CALLDATA)
|
|
);
|
|
}
|
|
|
|
function authority_canCall_immediate(address caller) public view returns (bool result) {
|
|
(result, ) = AuthorityUtils.canCallWithDelay(authority(), caller, address(this), this.someFunction.selector);
|
|
}
|
|
|
|
function authority_canCall_delay(address caller) public view returns (uint32 result) {
|
|
(, result) = AuthorityUtils.canCallWithDelay(authority(), caller, address(this), this.someFunction.selector);
|
|
}
|
|
|
|
function authority_getSchedule(address caller) public view returns (uint48) {
|
|
IAccessManager manager = IAccessManager(authority());
|
|
return manager.getSchedule(manager.hashOperation(caller, address(this), SOME_FUNCTION_CALLDATA));
|
|
}
|
|
|
|
function _hasCode(address account) public view returns (bool) {
|
|
return account.code.length > 0;
|
|
}
|
|
}
|