mirror of openzeppelin-contracts
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openzeppelin-contracts/contracts/crowdsale/distribution/RefundableCrowdsale.sol

83 lines
2.6 KiB

pragma solidity ^0.5.7;
Crowdsale refactor and add new models (#744) * Basic idea * Fine tuning idea * Add comments / tidy up Crowdsale base class * fixed TimedCrowdsale constructor * added simple crowdsale test * added HODL directory under home to store unused contracts. ugly hack to solve Crowdsale selection in tests, better way? * Capped no longer inherits from Timed, added capReached() method (replacing hasEnded()) * added SafeMath in TimedCrowdsale for safety, CHECK whether it is inherited from Crowdsale * several fixes related to separating Capped from Timed. functions renamed, mocks changed. Capped tests passing * added TimedCrowdsaleImpl.sol, TimedCrowdsale tests, passed * added Whitelisted implementation and test, passed. * removed unnecessary super constructor call in WhitelistedCrowdsale, removed unused dependencies in tests * renamed UserCappedCrowdsale to IndividuallyCappedCrowdsale, implemented IndividuallyCappedCrowdsaleImpl.sol and corresponding tests, passed. * homogeneized use of using SafeMath for uint256 across validation crowdsales. checked that it IS indeed inherited, but leaving it there as per Frans suggestion. * adding questions.md where I track questions, bugs and progress * modified VariablePriceCrowdsale, added Impl. * finished VariablePrice, fixed sign, added test, passing. * changed VariablePrice to IncreasingPrice, added corresponding require() * MintedCrowdsale done, mock implemented, test passing * PremintedCrowdsale done, mocks, tests passing * checked FinalizableCrowdsale * PostDeliveryCrowdsale done, mock, tests passing. * RefundableCrowdsale done. Detached Vault. modified mock and test, passing * renamed crowdsale-refactor to crowdsale in contracts and test * deleted HODL old contracts * polished variable names in tests * fixed typos and removed comments in tests * Renamed 'crowdsale-refactor' to 'crowdsale' in all imports * Fix minor param naming issues in Crowdsale functions and added documentation to Crowdsale.sol * Added documentation to Crowdsale extensions * removed residual comments and progress tracking files * added docs for validation crowdsales * Made user promises in PostDeliveryCrowdsale public so that users can query their promised token balance. * added docs for distribution crowdsales * renamed PremintedCrowdsale to AllowanceCrowdsale * added allowance check function and corresponding test. fixed filename in AllowanceCrowdsale mock. * spilt Crowdsale _postValidatePurchase in _postValidatePurchase and _updatePurchasingState. changed IndividuallyCappedCrowdsale accordingly. * polished tests for linter, salve Travis * polished IncreasingPriceCrowdsale.sol for linter. * renamed and polished for linter WhitelistedCrowdsale test. * fixed indentation in IncreasingPriceCrowdsaleImpl.sol for linter * fixed ignoring token.mint return value in MintedCrowdsale.sol * expanded docs throughout, fixed minor issues * extended test coverage for IndividuallyCappedCrowdsale * Extended WhitelistedCrwodsale test coverage * roll back decoupling of RefundVault in RefundableCrowdsale * moved cap exceedance checks in Capped and IndividuallyCapped crowdsales to _preValidatePurchase to save gas * revert name change, IndividuallyCapped to UserCapped * extended docs. * added crowd whitelisting with tests * added group capping, plus tests * added modifiers in TimedCrowdsale and WhitelistedCrowdsale * polished tests for linter * moved check of whitelisted to modifier, mainly for testing coverage * fixed minor ordering/polishingafter review * modified TimedCrowdsale modifier/constructor ordering * unchanged truffle-config.js * changed indentation of visibility modifier in mocks * changed naming of modifier and function to use Open/Closed for TimedCrowdsale * changed ordering of constructor calls in SampleCrowdsale * changed startTime and endTime to openingTime and closingTime throughout * fixed exceeding line lenght for linter * renamed _emitTokens to _deliverTokens * renamed addCrowdToWhitelist to addManyToWhitelist * renamed UserCappedCrowdsale to IndividuallyCappedCrowdsale
7 years ago
import "../../math/SafeMath.sol";
import "./FinalizableCrowdsale.sol";
import "../../payment/escrow/RefundEscrow.sol";
/**
* @title RefundableCrowdsale
Nonfunctional typos #1643 (#1652) * Add IntelliJ IDE config to .gitignore * Fix variable name in ERC20 function comments * Fix typos in Arrays function comment * Fix typos in ownership test names * Fix typo in Pausable test name * Fix grammar in Ownable function comment * Fix grammar in Crowdsale contract comment * Fix typo in Counters contract comment * Fix typo in ERC721Enumerable comment * Fix typo in ERC721PausedToken test name * Fix typo in Crowdsale function comment * Fix typo in IncreasingPriceCrowdsale function comment * Fix grammar in IncreasingPriceCrowdsale test name * Fix typo in AllowanceCrowdsale test name * Fix typo in RefundEscrow function comment * Fix typo in ERC20Migrator contract comment * Fix typos in SignatureBouncer comments * Fix typo in SignedSafeMath test name * Fix typo in TokenVesting contract comment * Move Ownable comment from @notice section to @dev The Ownable contract has a comment explaining that renouncing ownership will prevent execution of functions with the onlyOwner modifier. This commit moves that comment to the @dev section and replaces it with a description suitable for a generic user. * Clarify purpose of ERC20 transfer function * Clarify registration of ERC721Enumerable interface * Clarify purpose of AllowanceCrowdsale test * Increase specificity of inheritance comments FinalizableCrowdsale and RefundableCrowsale both have comments indicating that they are extensions of the Crowdsale contract. This commit refines those comments to the most immediate ancestor ( TimedCrowdsale and RefundableCrowdsale respectively ) * Remove unused parameter in PaymentSplitter test * Rename parameter in SignatureBouncer functions The SignatureBouncer contract has modifiers to validate the message sender is authorised to perform an action. They pass msg.sender to internal functions as the variable `account`, but the function comments refer to the variable as `sender` This commit changes the variable name to `sender` * Clarify comments in SignatureBouncer functions The SignatureBouncer has comments that use the description `sender` to refer to the variable `account`. This commit updates the comments for consistency. Maintainer Note: this reverts changes in the previous commit, which renamed the variable `account` instead.
6 years ago
* @dev Extension of FinalizableCrowdsale contract that adds a funding goal, and the possibility of users
* getting a refund if goal is not met.
*
* Deprecated, use RefundablePostDeliveryCrowdsale instead. Note that if you allow tokens to be traded before the goal
* is met, then an attack is possible in which the attacker purchases tokens from the crowdsale and when they sees that
* the goal is unlikely to be met, they sell their tokens (possibly at a discount). The attacker will be refunded when
* the crowdsale is finalized, and the users that purchased from them will be left with worthless tokens.
*/
contract RefundableCrowdsale is FinalizableCrowdsale {
using SafeMath for uint256;
// minimum amount of funds to be raised in weis
uint256 private _goal;
// refund escrow used to hold funds while crowdsale is running
RefundEscrow private _escrow;
/**
* @dev Constructor, creates RefundEscrow.
* @param goal Funding goal
*/
constructor (uint256 goal) public {
require(goal > 0, "RefundableCrowdsale: goal is 0");
_escrow = new RefundEscrow(wallet());
_goal = goal;
}
/**
* @return minimum amount of funds to be raised in wei.
*/
function goal() public view returns (uint256) {
return _goal;
}
/**
* @dev Investors can claim refunds here if crowdsale is unsuccessful.
* @param refundee Whose refund will be claimed.
*/
function claimRefund(address payable refundee) public {
require(finalized(), "RefundableCrowdsale: not finalized");
require(!goalReached(), "RefundableCrowdsale: goal reached");
_escrow.withdraw(refundee);
}
/**
* @dev Checks whether funding goal was reached.
* @return Whether funding goal was reached
*/
function goalReached() public view returns (bool) {
return weiRaised() >= _goal;
}
/**
* @dev Escrow finalization task, called when finalize() is called.
*/
function _finalization() internal {
if (goalReached()) {
_escrow.close();
_escrow.beneficiaryWithdraw();
} else {
_escrow.enableRefunds();
}
super._finalization();
}
/**
* @dev Overrides Crowdsale fund forwarding, sending funds to escrow.
*/
function _forwardFunds() internal {
_escrow.deposit.value(msg.value)(msg.sender);
}
}