Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
O
openzeppelin-contracts-upgradeable
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
俞永鹏
openzeppelin-contracts-upgradeable
Commits
4d7c3cca
Commit
4d7c3cca
authored
Jan 24, 2018
by
Santiago Palladino
Committed by
Francisco Giordano
Jan 24, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Move token creation outside of crowdsale contract (#690)
Fixes #358
parent
05413470
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
39 additions
and
34 deletions
+39
-34
Crowdsale.sol
contracts/crowdsale/Crowdsale.sol
+6
-9
SampleCrowdsale.sol
contracts/examples/SampleCrowdsale.sol
+2
-7
CappedCrowdsaleImpl.sol
contracts/mocks/CappedCrowdsaleImpl.sol
+3
-2
FinalizableCrowdsaleImpl.sol
contracts/mocks/FinalizableCrowdsaleImpl.sol
+3
-2
RefundableCrowdsaleImpl.sol
contracts/mocks/RefundableCrowdsaleImpl.sol
+3
-2
CappedCrowdsale.test.js
test/crowdsale/CappedCrowdsale.test.js
+3
-3
Crowdsale.test.js
test/crowdsale/Crowdsale.test.js
+3
-3
FinalizableCrowdsale.test.js
test/crowdsale/FinalizableCrowdsale.test.js
+5
-3
RefundableCrowdsale.test.js
test/crowdsale/RefundableCrowdsale.test.js
+6
-1
SampleCrowdsale.test.js
test/examples/SampleCrowdsale.test.js
+5
-2
No files found.
contracts/crowdsale/Crowdsale.sol
View file @
4d7c3cca
...
...
@@ -10,7 +10,9 @@ import "../math/SafeMath.sol";
* Crowdsales have a start and end timestamps, where investors can make
* token purchases and the crowdsale will assign them tokens based
* on a token per ETH rate. Funds collected are forwarded to a wallet
* as they arrive.
* as they arrive. The contract requires a MintableToken that will be
* minted as contributions arrive, note that the crowdsale contract
* must be owner of the token in order to be able to mint it.
*/
contract Crowdsale {
using SafeMath for uint256;
...
...
@@ -41,17 +43,18 @@ contract Crowdsale {
event TokenPurchase(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount);
function Crowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, address _wallet) public {
function Crowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, address _wallet
, MintableToken _token
) public {
require(_startTime >= now);
require(_endTime >= _startTime);
require(_rate > 0);
require(_wallet != address(0));
require(_token != address(0));
token = createTokenContract();
startTime = _startTime;
endTime = _endTime;
rate = _rate;
wallet = _wallet;
token = _token;
}
// fallback function can be used to buy tokens
...
...
@@ -83,12 +86,6 @@ contract Crowdsale {
return now > endTime;
}
// creates the token to be sold.
// override this method to have crowdsale of a specific mintable token.
function createTokenContract() internal returns (MintableToken) {
return new MintableToken();
}
// Override this method to have a way to add business logic to your crowdsale when buying
function getTokenAmount(uint256 weiAmount) internal view returns(uint256) {
return weiAmount.mul(rate);
...
...
contracts/examples/SampleCrowdsale.sol
View file @
4d7c3cca
...
...
@@ -32,19 +32,14 @@ contract SampleCrowdsaleToken is MintableToken {
*/
contract SampleCrowdsale is CappedCrowdsale, RefundableCrowdsale {
function SampleCrowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, uint256 _goal, uint256 _cap, address _wallet) public
function SampleCrowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, uint256 _goal, uint256 _cap, address _wallet
, MintableToken _token
) public
CappedCrowdsale(_cap)
FinalizableCrowdsale()
RefundableCrowdsale(_goal)
Crowdsale(_startTime, _endTime, _rate, _wallet)
Crowdsale(_startTime, _endTime, _rate, _wallet
, _token
)
{
//As goal needs to be met for a successful crowdsale
//the value needs to less or equal than a cap which is limit for accepted funds
require(_goal <= _cap);
}
function createTokenContract() internal returns (MintableToken) {
return new SampleCrowdsaleToken();
}
}
contracts/mocks/CappedCrowdsaleImpl.sol
View file @
4d7c3cca
...
...
@@ -11,9 +11,10 @@ contract CappedCrowdsaleImpl is CappedCrowdsale {
uint256 _endTime,
uint256 _rate,
address _wallet,
uint256 _cap
uint256 _cap,
MintableToken _token
) public
Crowdsale(_startTime, _endTime, _rate, _wallet)
Crowdsale(_startTime, _endTime, _rate, _wallet
, _token
)
CappedCrowdsale(_cap)
{
}
...
...
contracts/mocks/FinalizableCrowdsaleImpl.sol
View file @
4d7c3cca
...
...
@@ -10,9 +10,10 @@ contract FinalizableCrowdsaleImpl is FinalizableCrowdsale {
uint256 _startTime,
uint256 _endTime,
uint256 _rate,
address _wallet
address _wallet,
MintableToken _token
) public
Crowdsale(_startTime, _endTime, _rate, _wallet)
Crowdsale(_startTime, _endTime, _rate, _wallet
, _token
)
{
}
...
...
contracts/mocks/RefundableCrowdsaleImpl.sol
View file @
4d7c3cca
...
...
@@ -11,9 +11,10 @@ contract RefundableCrowdsaleImpl is RefundableCrowdsale {
uint256 _endTime,
uint256 _rate,
address _wallet,
uint256 _goal
uint256 _goal,
MintableToken _token
) public
Crowdsale(_startTime, _endTime, _rate, _wallet)
Crowdsale(_startTime, _endTime, _rate, _wallet
, _token
)
RefundableCrowdsale(_goal)
{
}
...
...
test/crowdsale/CappedCrowdsale.test.js
View file @
4d7c3cca
...
...
@@ -29,9 +29,9 @@ contract('CappedCrowdsale', function ([_, wallet]) {
this
.
startTime
=
latestTime
()
+
duration
.
weeks
(
1
);
this
.
endTime
=
this
.
startTime
+
duration
.
weeks
(
1
);
this
.
crowdsale
=
await
CappedCrowdsale
.
new
(
this
.
startTime
,
this
.
endTime
,
rate
,
wallet
,
cap
);
this
.
token
=
MintableToken
.
at
(
await
this
.
crowdsale
.
token
()
);
this
.
token
=
await
MintableToken
.
new
(
);
this
.
crowdsale
=
await
CappedCrowdsale
.
new
(
this
.
startTime
,
this
.
endTime
,
rate
,
wallet
,
cap
,
this
.
token
.
address
);
await
this
.
token
.
transferOwnership
(
this
.
crowdsale
.
address
);
});
describe
(
'creating a valid crowdsale'
,
function
()
{
...
...
test/crowdsale/Crowdsale.test.js
View file @
4d7c3cca
...
...
@@ -30,9 +30,9 @@ contract('Crowdsale', function ([_, investor, wallet, purchaser]) {
this
.
endTime
=
this
.
startTime
+
duration
.
weeks
(
1
);
this
.
afterEndTime
=
this
.
endTime
+
duration
.
seconds
(
1
);
this
.
crowdsale
=
await
Crowdsale
.
new
(
this
.
startTime
,
this
.
endTime
,
rate
,
wallet
);
this
.
token
=
MintableToken
.
at
(
await
this
.
crowdsale
.
token
()
);
this
.
token
=
await
MintableToken
.
new
(
);
this
.
crowdsale
=
await
Crowdsale
.
new
(
this
.
startTime
,
this
.
endTime
,
rate
,
wallet
,
this
.
token
.
address
);
await
this
.
token
.
transferOwnership
(
this
.
crowdsale
.
address
);
});
it
(
'should be token owner'
,
async
function
()
{
...
...
test/crowdsale/FinalizableCrowdsale.test.js
View file @
4d7c3cca
...
...
@@ -26,9 +26,11 @@ contract('FinalizableCrowdsale', function ([_, owner, wallet, thirdparty]) {
this
.
endTime
=
this
.
startTime
+
duration
.
weeks
(
1
);
this
.
afterEndTime
=
this
.
endTime
+
duration
.
seconds
(
1
);
this
.
crowdsale
=
await
FinalizableCrowdsale
.
new
(
this
.
startTime
,
this
.
endTime
,
rate
,
wallet
,
{
from
:
owner
});
this
.
token
=
MintableToken
.
at
(
await
this
.
crowdsale
.
token
());
this
.
token
=
await
MintableToken
.
new
();
this
.
crowdsale
=
await
FinalizableCrowdsale
.
new
(
this
.
startTime
,
this
.
endTime
,
rate
,
wallet
,
this
.
token
.
address
,
{
from
:
owner
}
);
await
this
.
token
.
transferOwnership
(
this
.
crowdsale
.
address
);
});
it
(
'cannot be finalized before ending'
,
async
function
()
{
...
...
test/crowdsale/RefundableCrowdsale.test.js
View file @
4d7c3cca
...
...
@@ -12,6 +12,7 @@ require('chai')
.
should
();
const
RefundableCrowdsale
=
artifacts
.
require
(
'mocks/RefundableCrowdsaleImpl.sol'
);
const
MintableToken
=
artifacts
.
require
(
'MintableToken'
);
contract
(
'RefundableCrowdsale'
,
function
([
_
,
owner
,
wallet
,
investor
])
{
const
rate
=
new
BigNumber
(
1000
);
...
...
@@ -28,7 +29,11 @@ contract('RefundableCrowdsale', function ([_, owner, wallet, investor]) {
this
.
endTime
=
this
.
startTime
+
duration
.
weeks
(
1
);
this
.
afterEndTime
=
this
.
endTime
+
duration
.
seconds
(
1
);
this
.
crowdsale
=
await
RefundableCrowdsale
.
new
(
this
.
startTime
,
this
.
endTime
,
rate
,
wallet
,
goal
,
{
from
:
owner
});
this
.
token
=
await
MintableToken
.
new
();
this
.
crowdsale
=
await
RefundableCrowdsale
.
new
(
this
.
startTime
,
this
.
endTime
,
rate
,
wallet
,
goal
,
this
.
token
.
address
,
{
from
:
owner
}
);
await
this
.
token
.
transferOwnership
(
this
.
crowdsale
.
address
);
});
describe
(
'creating a valid crowdsale'
,
function
()
{
...
...
test/examples/SampleCrowdsale.test.js
View file @
4d7c3cca
...
...
@@ -29,8 +29,11 @@ contract('SampleCrowdsale', function ([owner, wallet, investor]) {
this
.
endTime
=
this
.
startTime
+
duration
.
weeks
(
1
);
this
.
afterEndTime
=
this
.
endTime
+
duration
.
seconds
(
1
);
this
.
crowdsale
=
await
SampleCrowdsale
.
new
(
this
.
startTime
,
this
.
endTime
,
RATE
,
GOAL
,
CAP
,
wallet
);
this
.
token
=
SampleCrowdsaleToken
.
at
(
await
this
.
crowdsale
.
token
());
this
.
token
=
await
SampleCrowdsaleToken
.
new
();
this
.
crowdsale
=
await
SampleCrowdsale
.
new
(
this
.
startTime
,
this
.
endTime
,
RATE
,
GOAL
,
CAP
,
wallet
,
this
.
token
.
address
);
await
this
.
token
.
transferOwnership
(
this
.
crowdsale
.
address
);
});
it
(
'should create crowdsale with correct parameters'
,
async
function
()
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment