|
@@ -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 {
|
|
* wrapper marked as `nonReentrant`.
|
|
* wrapper marked as `nonReentrant`.
|
|
*/
|
|
*/
|
|
modifier nonReentrant() {
|
|
modifier nonReentrant() {
|
|
- require(!reentrancyLock);
|
|
|
|
- reentrancyLock = true;
|
|
|
|
|
|
+ require(reentrancyLock == REENTRANCY_GUARD_FREE);
|
|
|
|
+ reentrancyLock = REENTRANCY_GUARD_LOCKED;
|
|
_;
|
|
_;
|
|
- reentrancyLock = false;
|
|
|
|
|
|
+ reentrancyLock = REENTRANCY_GUARD_FREE;
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|