mirror of openzeppelin-contracts
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
// OpenZeppelin Contracts (last updated v5.0.0) (access/manager/AuthorityUtils.sol)
|
|
|
|
|
|
|
|
pragma solidity ^0.8.20;
|
|
|
|
|
|
|
|
import {IAuthority} from "./IAuthority.sol";
|
|
|
|
|
|
|
|
library AuthorityUtils {
|
|
|
|
/**
|
|
|
|
* @dev Since `AccessManager` implements an extended IAuthority interface, invoking `canCall` with backwards compatibility
|
|
|
|
* for the preexisting `IAuthority` interface requires special care to avoid reverting on insufficient return data.
|
|
|
|
* This helper function takes care of invoking `canCall` in a backwards compatible way without reverting.
|
|
|
|
*/
|
|
|
|
function canCallWithDelay(
|
|
|
|
address authority,
|
|
|
|
address caller,
|
|
|
|
address target,
|
|
|
|
bytes4 selector
|
|
|
|
) internal view returns (bool immediate, uint32 delay) {
|
|
|
|
(bool success, bytes memory data) = authority.staticcall(
|
|
|
|
abi.encodeCall(IAuthority.canCall, (caller, target, selector))
|
|
|
|
);
|
|
|
|
if (success) {
|
|
|
|
if (data.length >= 0x40) {
|
|
|
|
(immediate, delay) = abi.decode(data, (bool, uint32));
|
|
|
|
} else if (data.length >= 0x20) {
|
|
|
|
immediate = abi.decode(data, (bool));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return (immediate, delay);
|
|
|
|
}
|
|
|
|
}
|