From c8188c0bbd091a4992148e5f92d8c79ee6acdba6 Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Tue, 24 Aug 2021 16:09:39 -0300 Subject: [PATCH] Add additional isOperationReady check in TimelockController (cherry picked from commit cec4f2ef57495d8b1742d62846da212515d99dd5) --- CHANGELOG.md | 4 ++++ contracts/access/TimelockController.sol | 7 ++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8589a6ef8c6..5d4a1094bbb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 3.4.2 + + * `TimelockController`: Add additional isOperationReady check. + ## 3.4.1 (2021-03-03) * `ERC721`: made `_approve` an internal function (was private). diff --git a/contracts/access/TimelockController.sol b/contracts/access/TimelockController.sol index aa80f855677..f7464bddf26 100644 --- a/contracts/access/TimelockController.sol +++ b/contracts/access/TimelockController.sol @@ -227,7 +227,7 @@ contract TimelockController is AccessControl { */ function execute(address target, uint256 value, bytes calldata data, bytes32 predecessor, bytes32 salt) public payable virtual onlyRole(EXECUTOR_ROLE) { bytes32 id = hashOperation(target, value, data, predecessor, salt); - _beforeCall(predecessor); + _beforeCall(id, predecessor); _call(id, 0, target, value, data); _afterCall(id); } @@ -246,7 +246,7 @@ contract TimelockController is AccessControl { require(targets.length == datas.length, "TimelockController: length mismatch"); bytes32 id = hashOperationBatch(targets, values, datas, predecessor, salt); - _beforeCall(predecessor); + _beforeCall(id, predecessor); for (uint256 i = 0; i < targets.length; ++i) { _call(id, i, targets[i], values[i], datas[i]); } @@ -256,7 +256,8 @@ contract TimelockController is AccessControl { /** * @dev Checks before execution of an operation's calls. */ - function _beforeCall(bytes32 predecessor) private view { + function _beforeCall(bytes32 id, bytes32 predecessor) private view { + require(isOperationReady(id), "TimelockController: operation is not ready"); require(predecessor == bytes32(0) || isOperationDone(predecessor), "TimelockController: missing dependency"); }