Crowdsale.buyTokens is now nonReentrant. (#1438)
(cherry picked from commit 6d415c508b)
This commit is contained in:
committed by
Leo Arias
parent
ecae7608f9
commit
1a4009f817
@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user