AccessControlDefaultAdminRules.sol 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. // SPDX-License-Identifier: MIT
  2. // OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControlDefaultAdminRules.sol)
  3. pragma solidity ^0.8.19;
  4. import {AccessControl, IAccessControl} from "./AccessControl.sol";
  5. import {IAccessControlDefaultAdminRules} from "./IAccessControlDefaultAdminRules.sol";
  6. import {SafeCast} from "../utils/math/SafeCast.sol";
  7. import {Math} from "../utils/math/Math.sol";
  8. import {IERC5313} from "../interfaces/IERC5313.sol";
  9. /**
  10. * @dev Extension of {AccessControl} that allows specifying special rules to manage
  11. * the `DEFAULT_ADMIN_ROLE` holder, which is a sensitive role with special permissions
  12. * over other roles that may potentially have privileged rights in the system.
  13. *
  14. * If a specific role doesn't have an admin role assigned, the holder of the
  15. * `DEFAULT_ADMIN_ROLE` will have the ability to grant it and revoke it.
  16. *
  17. * This contract implements the following risk mitigations on top of {AccessControl}:
  18. *
  19. * * Only one account holds the `DEFAULT_ADMIN_ROLE` since deployment until it's potentially renounced.
  20. * * Enforces a 2-step process to transfer the `DEFAULT_ADMIN_ROLE` to another account.
  21. * * Enforces a configurable delay between the two steps, with the ability to cancel before the transfer is accepted.
  22. * * The delay can be changed by scheduling, see {changeDefaultAdminDelay}.
  23. * * It is not possible to use another role to manage the `DEFAULT_ADMIN_ROLE`.
  24. *
  25. * Example usage:
  26. *
  27. * ```solidity
  28. * contract MyToken is AccessControlDefaultAdminRules {
  29. * constructor() AccessControlDefaultAdminRules(
  30. * 3 days,
  31. * msg.sender // Explicit initial `DEFAULT_ADMIN_ROLE` holder
  32. * ) {}
  33. * }
  34. * ```
  35. *
  36. * _Available since v4.9._
  37. */
  38. abstract contract AccessControlDefaultAdminRules is IAccessControlDefaultAdminRules, IERC5313, AccessControl {
  39. // pending admin pair read/written together frequently
  40. address private _pendingDefaultAdmin;
  41. uint48 private _pendingDefaultAdminSchedule; // 0 == unset
  42. uint48 private _currentDelay;
  43. address private _currentDefaultAdmin;
  44. // pending delay pair read/written together frequently
  45. uint48 private _pendingDelay;
  46. uint48 private _pendingDelaySchedule; // 0 == unset
  47. /**
  48. * @dev Sets the initial values for {defaultAdminDelay} and {defaultAdmin} address.
  49. */
  50. constructor(uint48 initialDelay, address initialDefaultAdmin) {
  51. if (initialDefaultAdmin == address(0)) {
  52. revert AccessControlInvalidDefaultAdmin(address(0));
  53. }
  54. _currentDelay = initialDelay;
  55. _grantRole(DEFAULT_ADMIN_ROLE, initialDefaultAdmin);
  56. }
  57. /**
  58. * @dev See {IERC165-supportsInterface}.
  59. */
  60. function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
  61. return interfaceId == type(IAccessControlDefaultAdminRules).interfaceId || super.supportsInterface(interfaceId);
  62. }
  63. /**
  64. * @dev See {IERC5313-owner}.
  65. */
  66. function owner() public view virtual returns (address) {
  67. return defaultAdmin();
  68. }
  69. ///
  70. /// Override AccessControl role management
  71. ///
  72. /**
  73. * @dev See {AccessControl-grantRole}. Reverts for `DEFAULT_ADMIN_ROLE`.
  74. */
  75. function grantRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) {
  76. if (role == DEFAULT_ADMIN_ROLE) {
  77. revert AccessControlEnforcedDefaultAdminRules();
  78. }
  79. super.grantRole(role, account);
  80. }
  81. /**
  82. * @dev See {AccessControl-revokeRole}. Reverts for `DEFAULT_ADMIN_ROLE`.
  83. */
  84. function revokeRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) {
  85. if (role == DEFAULT_ADMIN_ROLE) {
  86. revert AccessControlEnforcedDefaultAdminRules();
  87. }
  88. super.revokeRole(role, account);
  89. }
  90. /**
  91. * @dev See {AccessControl-renounceRole}.
  92. *
  93. * For the `DEFAULT_ADMIN_ROLE`, it only allows renouncing in two steps by first calling
  94. * {beginDefaultAdminTransfer} to the `address(0)`, so it's required that the {pendingDefaultAdmin} schedule
  95. * has also passed when calling this function.
  96. *
  97. * After its execution, it will not be possible to call `onlyRole(DEFAULT_ADMIN_ROLE)` functions.
  98. *
  99. * NOTE: Renouncing `DEFAULT_ADMIN_ROLE` will leave the contract without a {defaultAdmin},
  100. * thereby disabling any functionality that is only available for it, and the possibility of reassigning a
  101. * non-administrated role.
  102. */
  103. function renounceRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) {
  104. if (role == DEFAULT_ADMIN_ROLE && account == defaultAdmin()) {
  105. (address newDefaultAdmin, uint48 schedule) = pendingDefaultAdmin();
  106. if (newDefaultAdmin != address(0) || !_isScheduleSet(schedule) || !_hasSchedulePassed(schedule)) {
  107. revert AccessControlEnforcedDefaultAdminDelay(schedule);
  108. }
  109. delete _pendingDefaultAdminSchedule;
  110. }
  111. super.renounceRole(role, account);
  112. }
  113. /**
  114. * @dev See {AccessControl-_grantRole}.
  115. *
  116. * For `DEFAULT_ADMIN_ROLE`, it only allows granting if there isn't already a {defaultAdmin} or if the
  117. * role has been previously renounced.
  118. *
  119. * NOTE: Exposing this function through another mechanism may make the `DEFAULT_ADMIN_ROLE`
  120. * assignable again. Make sure to guarantee this is the expected behavior in your implementation.
  121. */
  122. function _grantRole(bytes32 role, address account) internal virtual override {
  123. if (role == DEFAULT_ADMIN_ROLE) {
  124. if (defaultAdmin() != address(0)) {
  125. revert AccessControlEnforcedDefaultAdminRules();
  126. }
  127. _currentDefaultAdmin = account;
  128. }
  129. super._grantRole(role, account);
  130. }
  131. /**
  132. * @dev See {AccessControl-_revokeRole}.
  133. */
  134. function _revokeRole(bytes32 role, address account) internal virtual override {
  135. if (role == DEFAULT_ADMIN_ROLE && account == defaultAdmin()) {
  136. delete _currentDefaultAdmin;
  137. }
  138. super._revokeRole(role, account);
  139. }
  140. /**
  141. * @dev See {AccessControl-_setRoleAdmin}. Reverts for `DEFAULT_ADMIN_ROLE`.
  142. */
  143. function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual override {
  144. if (role == DEFAULT_ADMIN_ROLE) {
  145. revert AccessControlEnforcedDefaultAdminRules();
  146. }
  147. super._setRoleAdmin(role, adminRole);
  148. }
  149. ///
  150. /// AccessControlDefaultAdminRules accessors
  151. ///
  152. /**
  153. * @inheritdoc IAccessControlDefaultAdminRules
  154. */
  155. function defaultAdmin() public view virtual returns (address) {
  156. return _currentDefaultAdmin;
  157. }
  158. /**
  159. * @inheritdoc IAccessControlDefaultAdminRules
  160. */
  161. function pendingDefaultAdmin() public view virtual returns (address newAdmin, uint48 schedule) {
  162. return (_pendingDefaultAdmin, _pendingDefaultAdminSchedule);
  163. }
  164. /**
  165. * @inheritdoc IAccessControlDefaultAdminRules
  166. */
  167. function defaultAdminDelay() public view virtual returns (uint48) {
  168. uint48 schedule = _pendingDelaySchedule;
  169. return (_isScheduleSet(schedule) && _hasSchedulePassed(schedule)) ? _pendingDelay : _currentDelay;
  170. }
  171. /**
  172. * @inheritdoc IAccessControlDefaultAdminRules
  173. */
  174. function pendingDefaultAdminDelay() public view virtual returns (uint48 newDelay, uint48 schedule) {
  175. schedule = _pendingDelaySchedule;
  176. return (_isScheduleSet(schedule) && !_hasSchedulePassed(schedule)) ? (_pendingDelay, schedule) : (0, 0);
  177. }
  178. /**
  179. * @inheritdoc IAccessControlDefaultAdminRules
  180. */
  181. function defaultAdminDelayIncreaseWait() public view virtual returns (uint48) {
  182. return 5 days;
  183. }
  184. ///
  185. /// AccessControlDefaultAdminRules public and internal setters for defaultAdmin/pendingDefaultAdmin
  186. ///
  187. /**
  188. * @inheritdoc IAccessControlDefaultAdminRules
  189. */
  190. function beginDefaultAdminTransfer(address newAdmin) public virtual onlyRole(DEFAULT_ADMIN_ROLE) {
  191. _beginDefaultAdminTransfer(newAdmin);
  192. }
  193. /**
  194. * @dev See {beginDefaultAdminTransfer}.
  195. *
  196. * Internal function without access restriction.
  197. */
  198. function _beginDefaultAdminTransfer(address newAdmin) internal virtual {
  199. uint48 newSchedule = SafeCast.toUint48(block.timestamp) + defaultAdminDelay();
  200. _setPendingDefaultAdmin(newAdmin, newSchedule);
  201. emit DefaultAdminTransferScheduled(newAdmin, newSchedule);
  202. }
  203. /**
  204. * @inheritdoc IAccessControlDefaultAdminRules
  205. */
  206. function cancelDefaultAdminTransfer() public virtual onlyRole(DEFAULT_ADMIN_ROLE) {
  207. _cancelDefaultAdminTransfer();
  208. }
  209. /**
  210. * @dev See {cancelDefaultAdminTransfer}.
  211. *
  212. * Internal function without access restriction.
  213. */
  214. function _cancelDefaultAdminTransfer() internal virtual {
  215. _setPendingDefaultAdmin(address(0), 0);
  216. }
  217. /**
  218. * @inheritdoc IAccessControlDefaultAdminRules
  219. */
  220. function acceptDefaultAdminTransfer() public virtual {
  221. (address newDefaultAdmin, ) = pendingDefaultAdmin();
  222. if (_msgSender() != newDefaultAdmin) {
  223. // Enforce newDefaultAdmin explicit acceptance.
  224. revert AccessControlInvalidDefaultAdmin(_msgSender());
  225. }
  226. _acceptDefaultAdminTransfer();
  227. }
  228. /**
  229. * @dev See {acceptDefaultAdminTransfer}.
  230. *
  231. * Internal function without access restriction.
  232. */
  233. function _acceptDefaultAdminTransfer() internal virtual {
  234. (address newAdmin, uint48 schedule) = pendingDefaultAdmin();
  235. if (!_isScheduleSet(schedule) || !_hasSchedulePassed(schedule)) {
  236. revert AccessControlEnforcedDefaultAdminDelay(schedule);
  237. }
  238. _revokeRole(DEFAULT_ADMIN_ROLE, defaultAdmin());
  239. _grantRole(DEFAULT_ADMIN_ROLE, newAdmin);
  240. delete _pendingDefaultAdmin;
  241. delete _pendingDefaultAdminSchedule;
  242. }
  243. ///
  244. /// AccessControlDefaultAdminRules public and internal setters for defaultAdminDelay/pendingDefaultAdminDelay
  245. ///
  246. /**
  247. * @inheritdoc IAccessControlDefaultAdminRules
  248. */
  249. function changeDefaultAdminDelay(uint48 newDelay) public virtual onlyRole(DEFAULT_ADMIN_ROLE) {
  250. _changeDefaultAdminDelay(newDelay);
  251. }
  252. /**
  253. * @dev See {changeDefaultAdminDelay}.
  254. *
  255. * Internal function without access restriction.
  256. */
  257. function _changeDefaultAdminDelay(uint48 newDelay) internal virtual {
  258. uint48 newSchedule = SafeCast.toUint48(block.timestamp) + _delayChangeWait(newDelay);
  259. _setPendingDelay(newDelay, newSchedule);
  260. emit DefaultAdminDelayChangeScheduled(newDelay, newSchedule);
  261. }
  262. /**
  263. * @inheritdoc IAccessControlDefaultAdminRules
  264. */
  265. function rollbackDefaultAdminDelay() public virtual onlyRole(DEFAULT_ADMIN_ROLE) {
  266. _rollbackDefaultAdminDelay();
  267. }
  268. /**
  269. * @dev See {rollbackDefaultAdminDelay}.
  270. *
  271. * Internal function without access restriction.
  272. */
  273. function _rollbackDefaultAdminDelay() internal virtual {
  274. _setPendingDelay(0, 0);
  275. }
  276. /**
  277. * @dev Returns the amount of seconds to wait after the `newDelay` will
  278. * become the new {defaultAdminDelay}.
  279. *
  280. * The value returned guarantees that if the delay is reduced, it will go into effect
  281. * after a wait that honors the previously set delay.
  282. *
  283. * See {defaultAdminDelayIncreaseWait}.
  284. */
  285. function _delayChangeWait(uint48 newDelay) internal view virtual returns (uint48) {
  286. uint48 currentDelay = defaultAdminDelay();
  287. // When increasing the delay, we schedule the delay change to occur after a period of "new delay" has passed, up
  288. // to a maximum given by defaultAdminDelayIncreaseWait, by default 5 days. For example, if increasing from 1 day
  289. // to 3 days, the new delay will come into effect after 3 days. If increasing from 1 day to 10 days, the new
  290. // delay will come into effect after 5 days. The 5 day wait period is intended to be able to fix an error like
  291. // using milliseconds instead of seconds.
  292. //
  293. // When decreasing the delay, we wait the difference between "current delay" and "new delay". This guarantees
  294. // that an admin transfer cannot be made faster than "current delay" at the time the delay change is scheduled.
  295. // For example, if decreasing from 10 days to 3 days, the new delay will come into effect after 7 days.
  296. return
  297. newDelay > currentDelay
  298. ? uint48(Math.min(newDelay, defaultAdminDelayIncreaseWait())) // no need to safecast, both inputs are uint48
  299. : currentDelay - newDelay;
  300. }
  301. ///
  302. /// Private setters
  303. ///
  304. /**
  305. * @dev Setter of the tuple for pending admin and its schedule.
  306. *
  307. * May emit a DefaultAdminTransferCanceled event.
  308. */
  309. function _setPendingDefaultAdmin(address newAdmin, uint48 newSchedule) private {
  310. (, uint48 oldSchedule) = pendingDefaultAdmin();
  311. _pendingDefaultAdmin = newAdmin;
  312. _pendingDefaultAdminSchedule = newSchedule;
  313. // An `oldSchedule` from `pendingDefaultAdmin()` is only set if it hasn't been accepted.
  314. if (_isScheduleSet(oldSchedule)) {
  315. // Emit for implicit cancellations when another default admin was scheduled.
  316. emit DefaultAdminTransferCanceled();
  317. }
  318. }
  319. /**
  320. * @dev Setter of the tuple for pending delay and its schedule.
  321. *
  322. * May emit a DefaultAdminDelayChangeCanceled event.
  323. */
  324. function _setPendingDelay(uint48 newDelay, uint48 newSchedule) private {
  325. uint48 oldSchedule = _pendingDelaySchedule;
  326. if (_isScheduleSet(oldSchedule)) {
  327. if (_hasSchedulePassed(oldSchedule)) {
  328. // Materialize a virtual delay
  329. _currentDelay = _pendingDelay;
  330. } else {
  331. // Emit for implicit cancellations when another delay was scheduled.
  332. emit DefaultAdminDelayChangeCanceled();
  333. }
  334. }
  335. _pendingDelay = newDelay;
  336. _pendingDelaySchedule = newSchedule;
  337. }
  338. ///
  339. /// Private helpers
  340. ///
  341. /**
  342. * @dev Defines if an `schedule` is considered set. For consistency purposes.
  343. */
  344. function _isScheduleSet(uint48 schedule) private pure returns (bool) {
  345. return schedule != 0;
  346. }
  347. /**
  348. * @dev Defines if an `schedule` is considered passed. For consistency purposes.
  349. */
  350. function _hasSchedulePassed(uint48 schedule) private view returns (bool) {
  351. return schedule < block.timestamp;
  352. }
  353. }