AccessControlDefaultAdminRules.sol 14 KB

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