Crowdsale.buyTokens is now nonReentrant. (#1438)

pull/1453/head
Nicolás Venturo 6 years ago committed by Leo Arias
parent a936cbf5fb
commit 6d415c508b
  1. 7
      contracts/crowdsale/Crowdsale.sol
  2. 9
      contracts/utils/ReentrancyGuard.sol

@ -3,6 +3,7 @@ pragma solidity ^0.4.24;
import "../token/ERC20/IERC20.sol"; import "../token/ERC20/IERC20.sol";
import "../math/SafeMath.sol"; import "../math/SafeMath.sol";
import "../token/ERC20/SafeERC20.sol"; import "../token/ERC20/SafeERC20.sol";
import "../utils/ReentrancyGuard.sol";
/** /**
* @title Crowdsale * @title Crowdsale
@ -16,7 +17,7 @@ import "../token/ERC20/SafeERC20.sol";
* the methods to add functionality. Consider using 'super' where appropriate to concatenate * the methods to add functionality. Consider using 'super' where appropriate to concatenate
* behavior. * behavior.
*/ */
contract Crowdsale { contract Crowdsale is ReentrancyGuard {
using SafeMath for uint256; using SafeMath for uint256;
using SafeERC20 for IERC20; using SafeERC20 for IERC20;
@ -111,9 +112,11 @@ contract Crowdsale {
/** /**
* @dev low level token purchase ***DO NOT OVERRIDE*** * @dev low level token purchase ***DO NOT OVERRIDE***
* This function has a non-reentrancy guard, so it shouldn't be called by
* another `nonReentrant` function.
* @param beneficiary Recipient of the token purchase * @param beneficiary Recipient of the token purchase
*/ */
function buyTokens(address beneficiary) public payable { function buyTokens(address beneficiary) public nonReentrant payable {
uint256 weiAmount = msg.value; uint256 weiAmount = msg.value;
_preValidatePurchase(beneficiary, weiAmount); _preValidatePurchase(beneficiary, weiAmount);

@ -19,11 +19,10 @@ contract ReentrancyGuard {
/** /**
* @dev Prevents a contract from calling itself, directly or indirectly. * @dev Prevents a contract from calling itself, directly or indirectly.
* If you mark a function `nonReentrant`, you should also * Calling a `nonReentrant` function from another `nonReentrant`
* mark it `external`. Calling one `nonReentrant` function from * function is not supported. It is possible to prevent this from happening
* another is not supported. Instead, you can implement a * by making the `nonReentrant` function external, and make it call a
* `private` function doing the actual work, and an `external` * `private` function that does the actual work.
* wrapper marked as `nonReentrant`.
*/ */
modifier nonReentrant() { modifier nonReentrant() {
_guardCounter += 1; _guardCounter += 1;

Loading…
Cancel
Save