Commit 1200969e by Alex Committed by Nicolás Venturo

Refactor/reentrancy guard gas optimization #1056 (#1057)

* optimizing ReentrancyGuard gas usage

* style fixed
parent 90b98a7b
...@@ -3,16 +3,23 @@ pragma solidity ^0.4.24; ...@@ -3,16 +3,23 @@ pragma solidity ^0.4.24;
/** /**
* @title Helps contracts guard against reentrancy attacks. * @title Helps contracts guard against reentrancy attacks.
* @author Remco Bloemen <remco@2π.com> * @author Remco Bloemen <remco@2π.com>, Eenae <alexey@mixbytes.io>
* @dev If you mark a function `nonReentrant`, you should also * @dev If you mark a function `nonReentrant`, you should also
* mark it `external`. * mark it `external`.
*/ */
contract ReentrancyGuard { contract ReentrancyGuard {
/// @dev Constant for unlocked guard state - non-zero to prevent extra gas costs.
/// See: https://github.com/OpenZeppelin/openzeppelin-solidity/issues/1056
uint private constant REENTRANCY_GUARD_FREE = 1;
/// @dev Constant for locked guard state
uint private constant REENTRANCY_GUARD_LOCKED = 2;
/** /**
* @dev We use a single lock for the whole contract. * @dev We use a single lock for the whole contract.
*/ */
bool private reentrancyLock = false; uint private reentrancyLock = REENTRANCY_GUARD_FREE;
/** /**
* @dev Prevents a contract from calling itself, directly or indirectly. * @dev Prevents a contract from calling itself, directly or indirectly.
...@@ -23,10 +30,10 @@ contract ReentrancyGuard { ...@@ -23,10 +30,10 @@ contract ReentrancyGuard {
* wrapper marked as `nonReentrant`. * wrapper marked as `nonReentrant`.
*/ */
modifier nonReentrant() { modifier nonReentrant() {
require(!reentrancyLock); require(reentrancyLock == REENTRANCY_GUARD_FREE);
reentrancyLock = true; reentrancyLock = REENTRANCY_GUARD_LOCKED;
_; _;
reentrancyLock = false; reentrancyLock = REENTRANCY_GUARD_FREE;
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment