* 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.
79 lines
2.7 KiB
Solidity
79 lines
2.7 KiB
Solidity
pragma solidity ^0.5.2;
|
|
|
|
import "../validation/TimedCrowdsale.sol";
|
|
import "../../math/SafeMath.sol";
|
|
|
|
/**
|
|
* @title IncreasingPriceCrowdsale
|
|
* @dev Extension of Crowdsale contract that increases the price of tokens linearly in time.
|
|
* Note that what should be provided to the constructor is the initial and final _rates_, that is,
|
|
* the amount of tokens per wei contributed. Thus, the initial rate must be greater than the final rate.
|
|
*/
|
|
contract IncreasingPriceCrowdsale is TimedCrowdsale {
|
|
using SafeMath for uint256;
|
|
|
|
uint256 private _initialRate;
|
|
uint256 private _finalRate;
|
|
|
|
/**
|
|
* @dev Constructor, takes initial and final rates of tokens received per wei contributed.
|
|
* @param initialRate Number of tokens a buyer gets per wei at the start of the crowdsale
|
|
* @param finalRate Number of tokens a buyer gets per wei at the end of the crowdsale
|
|
*/
|
|
constructor (uint256 initialRate, uint256 finalRate) public {
|
|
require(finalRate > 0);
|
|
require(initialRate > finalRate);
|
|
_initialRate = initialRate;
|
|
_finalRate = finalRate;
|
|
}
|
|
|
|
/**
|
|
* The base rate function is overridden to revert, since this crowdsale doesn't use it, and
|
|
* all calls to it are a mistake.
|
|
*/
|
|
function rate() public view returns (uint256) {
|
|
revert();
|
|
}
|
|
|
|
/**
|
|
* @return the initial rate of the crowdsale.
|
|
*/
|
|
function initialRate() public view returns (uint256) {
|
|
return _initialRate;
|
|
}
|
|
|
|
/**
|
|
* @return the final rate of the crowdsale.
|
|
*/
|
|
function finalRate() public view returns (uint256) {
|
|
return _finalRate;
|
|
}
|
|
|
|
/**
|
|
* @dev Returns the rate of tokens per wei at the present time.
|
|
* Note that, as price _increases_ with time, the rate _decreases_.
|
|
* @return The number of tokens a buyer gets per wei at a given time
|
|
*/
|
|
function getCurrentRate() public view returns (uint256) {
|
|
if (!isOpen()) {
|
|
return 0;
|
|
}
|
|
|
|
// solhint-disable-next-line not-rely-on-time
|
|
uint256 elapsedTime = block.timestamp.sub(openingTime());
|
|
uint256 timeRange = closingTime().sub(openingTime());
|
|
uint256 rateRange = _initialRate.sub(_finalRate);
|
|
return _initialRate.sub(elapsedTime.mul(rateRange).div(timeRange));
|
|
}
|
|
|
|
/**
|
|
* @dev Overrides parent method taking into account variable rate.
|
|
* @param weiAmount The value in wei to be converted into tokens
|
|
* @return The number of tokens _weiAmount wei will buy at present time
|
|
*/
|
|
function _getTokenAmount(uint256 weiAmount) internal view returns (uint256) {
|
|
uint256 currentRate = getCurrentRate();
|
|
return currentRate.mul(weiAmount);
|
|
}
|
|
}
|