123456789101112131415161718192021222324252627282930313233343536373839 |
- pragma solidity ^0.4.24;
- /**
- * @title Helps contracts guard against reentrancy attacks.
- * @author Remco Bloemen <remco@2π.com>, Eenae <alexey@mixbytes.io>
- * @dev If you mark a function `nonReentrant`, you should also
- * mark it `external`.
- */
- 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.
- */
- uint private reentrancyLock = REENTRANCY_GUARD_FREE;
- /**
- * @dev Prevents a contract from calling itself, directly or indirectly.
- * If you mark a function `nonReentrant`, you should also
- * mark it `external`. Calling one `nonReentrant` function from
- * another is not supported. Instead, you can implement a
- * `private` function doing the actual work, and an `external`
- * wrapper marked as `nonReentrant`.
- */
- modifier nonReentrant() {
- require(reentrancyLock == REENTRANCY_GUARD_FREE);
- reentrancyLock = REENTRANCY_GUARD_LOCKED;
- _;
- reentrancyLock = REENTRANCY_GUARD_FREE;
- }
- }
|