123456789101112131415161718192021222324252627282930313233343536 |
- // SPDX-License-Identifier: MIT
- // OpenZeppelin Contracts (last updated v5.3.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) {
- bytes memory data = abi.encodeCall(IAuthority.canCall, (caller, target, selector));
- assembly ("memory-safe") {
- mstore(0x00, 0x00)
- mstore(0x20, 0x00)
- if staticcall(gas(), authority, add(data, 0x20), mload(data), 0x00, 0x40) {
- immediate := mload(0x00)
- delay := mload(0x20)
- // If delay does not fit in a uint32, return 0 (no delay)
- // equivalent to: if gt(delay, 0xFFFFFFFF) { delay := 0 }
- delay := mul(delay, iszero(shr(32, delay)))
- }
- }
- }
- }
|