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
86628468
Commit
86628468
authored
Nov 24, 2017
by
Matt Condon
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: apply eslint --fix across project
parent
6ea0577b
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
53 changed files
with
729 additions
and
797 deletions
+729
-797
.eslintrc
.eslintrc
+2
-0
1_initial_migration.js
migrations/1_initial_migration.js
+2
-2
2_deploy_contracts.js
migrations/2_deploy_contracts.js
+3
-3
package-lock.json
package-lock.json
+0
-0
BasicToken.js
test/BasicToken.js
+9
-11
Bounty.js
test/Bounty.js
+22
-26
BurnableToken.js
test/BurnableToken.js
+20
-21
CanReclaimToken.js
test/CanReclaimToken.js
+7
-7
CappedCrowdsale.js
test/CappedCrowdsale.js
+49
-57
CappedToken.js
test/CappedToken.js
+12
-14
Claimable.js
test/Claimable.js
+13
-13
Contactable.js
test/Contactable.js
+7
-7
Crowdsale.js
test/Crowdsale.js
+91
-100
DayLimit.js
test/DayLimit.js
+15
-17
DelayedClaimble.js
test/DelayedClaimble.js
+9
-11
Destructible.js
test/Destructible.js
+7
-10
DetailedERC20.js
test/DetailedERC20.js
+4
-4
ECRecovery.js
test/ECRecovery.js
+8
-10
FinalizableCrowdsale.js
test/FinalizableCrowdsale.js
+37
-40
HasNoContracts.js
test/HasNoContracts.js
+5
-5
HasNoEther.js
test/HasNoEther.js
+12
-12
HasNoTokens.js
test/HasNoTokens.js
+6
-6
LimitBalance.js
test/LimitBalance.js
+16
-18
MerkleProof.js
test/MerkleProof.js
+19
-19
MintableToken.js
test/MintableToken.js
+7
-9
Ownable.js
test/Ownable.js
+11
-12
Pausable.js
test/Pausable.js
+10
-14
PausableToken.js
test/PausableToken.js
+10
-10
PullPayment.js
test/PullPayment.js
+12
-13
ReentrancyGuard.js
test/ReentrancyGuard.js
+6
-6
RefundVault.js
test/RefundVault.js
+33
-35
RefundableCrowdsale.js
test/RefundableCrowdsale.js
+50
-54
SafeERC20.js
test/SafeERC20.js
+0
-1
SafeMath.js
test/SafeMath.js
+15
-17
SampleCrowdsale.js
test/SampleCrowdsale.js
+16
-19
SplitPayment.js
test/SplitPayment.js
+45
-45
StandardToken.js
test/StandardToken.js
+25
-28
TokenDestructible.js
test/TokenDestructible.js
+8
-9
TokenTimelock.js
test/TokenTimelock.js
+34
-37
TokenVesting.js
test/TokenVesting.js
+4
-6
EVMRevert.js
test/helpers/EVMRevert.js
+1
-1
EVMThrow.js
test/helpers/EVMThrow.js
+1
-1
advanceToBlock.js
test/helpers/advanceToBlock.js
+7
-7
assertJump.js
test/helpers/assertJump.js
+2
-2
assertRevert.js
test/helpers/assertRevert.js
+2
-2
ether.js
test/helpers/ether.js
+2
-2
expectThrow.js
test/helpers/expectThrow.js
+1
-1
hashMessage.js
test/helpers/hashMessage.js
+2
-2
increaseTime.js
test/helpers/increaseTime.js
+16
-16
latestTime.js
test/helpers/latestTime.js
+1
-1
merkleTree.js
test/helpers/merkleTree.js
+18
-18
transactionMined.js
test/helpers/transactionMined.js
+4
-5
truffle-config.js
truffle-config.js
+11
-11
No files found.
.eslintrc
View file @
86628468
...
@@ -26,6 +26,8 @@
...
@@ -26,6 +26,8 @@
// Code style
// Code style
"indent": [2, 2],
"indent": [2, 2],
"quotes": [2, "single"],
"quotes": [2, "single"],
"semi": ["error", "always"],
"space-before-function-paren": ["error", "always"],
"no-use-before-define": 0,
"no-use-before-define": 0,
"eqeqeq": [2, "smart"],
"eqeqeq": [2, "smart"],
"dot-notation": [2, {"allowKeywords": true, "allowPattern": ""}],
"dot-notation": [2, {"allowKeywords": true, "allowPattern": ""}],
...
...
migrations/1_initial_migration.js
View file @
86628468
var
Migrations
=
artifacts
.
require
(
"./Migrations.sol"
);
var
Migrations
=
artifacts
.
require
(
'./Migrations.sol'
);
module
.
exports
=
function
(
deployer
)
{
module
.
exports
=
function
(
deployer
)
{
deployer
.
deploy
(
Migrations
);
deployer
.
deploy
(
Migrations
);
};
};
migrations/2_deploy_contracts.js
View file @
86628468
//var Ownable = artifacts.require("ownership/Ownable.sol");
//
var Ownable = artifacts.require("ownership/Ownable.sol");
// NOTE: Use this file to easily deploy the contracts you're writing.
// NOTE: Use this file to easily deploy the contracts you're writing.
// (but make sure to reset this file before committing
// (but make sure to reset this file before committing
// with `git checkout HEAD -- migrations/2_deploy_contracts.js`)
// with `git checkout HEAD -- migrations/2_deploy_contracts.js`)
module
.
exports
=
function
(
deployer
)
{
module
.
exports
=
function
(
deployer
)
{
//deployer.deploy(Ownable);
//
deployer.deploy(Ownable);
};
};
package-lock.json
View file @
86628468
This diff is collapsed.
Click to expand it.
test/BasicToken.js
View file @
86628468
const
assertRevert
=
require
(
'./helpers/assertRevert'
);
const
assertRevert
=
require
(
'./helpers/assertRevert'
);
var
BasicTokenMock
=
artifacts
.
require
(
"./helpers/BasicTokenMock.sol"
);
var
BasicTokenMock
=
artifacts
.
require
(
'./helpers/BasicTokenMock.sol'
);
contract
(
'BasicToken'
,
function
(
accounts
)
{
contract
(
'BasicToken'
,
function
(
accounts
)
{
it
(
'should return the correct totalSupply after construction'
,
async
function
()
{
it
(
"should return the correct totalSupply after construction"
,
async
function
()
{
let
token
=
await
BasicTokenMock
.
new
(
accounts
[
0
],
100
);
let
token
=
await
BasicTokenMock
.
new
(
accounts
[
0
],
100
);
let
totalSupply
=
await
token
.
totalSupply
();
let
totalSupply
=
await
token
.
totalSupply
();
assert
.
equal
(
totalSupply
,
100
);
assert
.
equal
(
totalSupply
,
100
);
})
})
;
it
(
"should return correct balances after transfer"
,
async
function
()
{
it
(
'should return correct balances after transfer'
,
async
function
()
{
let
token
=
await
BasicTokenMock
.
new
(
accounts
[
0
],
100
);
let
token
=
await
BasicTokenMock
.
new
(
accounts
[
0
],
100
);
let
transfer
=
await
token
.
transfer
(
accounts
[
1
],
100
);
let
transfer
=
await
token
.
transfer
(
accounts
[
1
],
100
);
...
@@ -22,24 +21,23 @@ contract('BasicToken', function(accounts) {
...
@@ -22,24 +21,23 @@ contract('BasicToken', function(accounts) {
assert
.
equal
(
secondAccountBalance
,
100
);
assert
.
equal
(
secondAccountBalance
,
100
);
});
});
it
(
'should throw an error when trying to transfer more than balance'
,
async
function
()
{
it
(
'should throw an error when trying to transfer more than balance'
,
async
function
()
{
let
token
=
await
BasicTokenMock
.
new
(
accounts
[
0
],
100
);
let
token
=
await
BasicTokenMock
.
new
(
accounts
[
0
],
100
);
try
{
try
{
let
transfer
=
await
token
.
transfer
(
accounts
[
1
],
101
);
let
transfer
=
await
token
.
transfer
(
accounts
[
1
],
101
);
assert
.
fail
(
'should have thrown before'
);
assert
.
fail
(
'should have thrown before'
);
}
catch
(
error
)
{
}
catch
(
error
)
{
assertRevert
(
error
);
assertRevert
(
error
);
}
}
});
});
it
(
'should throw an error when trying to transfer to 0x0'
,
async
function
()
{
it
(
'should throw an error when trying to transfer to 0x0'
,
async
function
()
{
let
token
=
await
BasicTokenMock
.
new
(
accounts
[
0
],
100
);
let
token
=
await
BasicTokenMock
.
new
(
accounts
[
0
],
100
);
try
{
try
{
let
transfer
=
await
token
.
transfer
(
0x0
,
100
);
let
transfer
=
await
token
.
transfer
(
0x0
,
100
);
assert
.
fail
(
'should have thrown before'
);
assert
.
fail
(
'should have thrown before'
);
}
catch
(
error
)
{
}
catch
(
error
)
{
assertRevert
(
error
);
assertRevert
(
error
);
}
}
});
});
});
});
test/Bounty.js
View file @
86628468
'use strict'
;
let
sendReward
=
function
(
sender
,
receiver
,
value
)
{
let
sendReward
=
function
(
sender
,
receiver
,
value
)
{
web3
.
eth
.
sendTransaction
({
web3
.
eth
.
sendTransaction
({
from
:
sender
,
from
:
sender
,
to
:
receiver
,
to
:
receiver
,
value
:
value
value
:
value
,
});
});
};
};
var
SecureTargetBounty
=
artifacts
.
require
(
'helpers/SecureTargetBounty.sol'
);
var
SecureTargetBounty
=
artifacts
.
require
(
'helpers/SecureTargetBounty.sol'
);
var
InsecureTargetBounty
=
artifacts
.
require
(
'helpers/InsecureTargetBounty.sol'
);
var
InsecureTargetBounty
=
artifacts
.
require
(
'helpers/InsecureTargetBounty.sol'
);
function
awaitEvent
(
event
,
handler
)
{
function
awaitEvent
(
event
,
handler
)
{
return
new
Promise
((
resolve
,
reject
)
=>
{
return
new
Promise
((
resolve
,
reject
)
=>
{
function
wrappedHandler
(...
args
)
{
function
wrappedHandler
(...
args
)
{
Promise
.
resolve
(
handler
(...
args
)).
then
(
resolve
).
catch
(
reject
);
Promise
.
resolve
(
handler
(...
args
)).
then
(
resolve
).
catch
(
reject
);
}
}
...
@@ -20,9 +19,8 @@ function awaitEvent(event, handler) {
...
@@ -20,9 +19,8 @@ function awaitEvent(event, handler) {
});
});
}
}
contract
(
'Bounty'
,
function
(
accounts
)
{
contract
(
'Bounty'
,
function
(
accounts
)
{
it
(
'sets reward'
,
async
function
()
{
it
(
'sets reward'
,
async
function
()
{
let
owner
=
accounts
[
0
];
let
owner
=
accounts
[
0
];
let
reward
=
web3
.
toWei
(
1
,
'ether'
);
let
reward
=
web3
.
toWei
(
1
,
'ether'
);
let
bounty
=
await
SecureTargetBounty
.
new
();
let
bounty
=
await
SecureTargetBounty
.
new
();
...
@@ -31,7 +29,7 @@ contract('Bounty', function(accounts) {
...
@@ -31,7 +29,7 @@ contract('Bounty', function(accounts) {
assert
.
equal
(
reward
,
web3
.
eth
.
getBalance
(
bounty
.
address
).
toNumber
());
assert
.
equal
(
reward
,
web3
.
eth
.
getBalance
(
bounty
.
address
).
toNumber
());
});
});
it
(
'empties itself when destroyed'
,
async
function
()
{
it
(
'empties itself when destroyed'
,
async
function
()
{
let
owner
=
accounts
[
0
];
let
owner
=
accounts
[
0
];
let
reward
=
web3
.
toWei
(
1
,
'ether'
);
let
reward
=
web3
.
toWei
(
1
,
'ether'
);
let
bounty
=
await
SecureTargetBounty
.
new
();
let
bounty
=
await
SecureTargetBounty
.
new
();
...
@@ -43,16 +41,15 @@ contract('Bounty', function(accounts) {
...
@@ -43,16 +41,15 @@ contract('Bounty', function(accounts) {
assert
.
equal
(
0
,
web3
.
eth
.
getBalance
(
bounty
.
address
).
toNumber
());
assert
.
equal
(
0
,
web3
.
eth
.
getBalance
(
bounty
.
address
).
toNumber
());
});
});
describe
(
'Against secure contract'
,
function
(){
describe
(
'Against secure contract'
,
function
()
{
it
(
'cannot claim reward'
,
async
function
()
{
it
(
'cannot claim reward'
,
async
function
(){
let
owner
=
accounts
[
0
];
let
owner
=
accounts
[
0
];
let
researcher
=
accounts
[
1
];
let
researcher
=
accounts
[
1
];
let
reward
=
web3
.
toWei
(
1
,
'ether'
);
let
reward
=
web3
.
toWei
(
1
,
'ether'
);
let
bounty
=
await
SecureTargetBounty
.
new
();
let
bounty
=
await
SecureTargetBounty
.
new
();
let
event
=
bounty
.
TargetCreated
({});
let
event
=
bounty
.
TargetCreated
({});
let
watcher
=
async
function
(
err
,
result
)
{
let
watcher
=
async
function
(
err
,
result
)
{
event
.
stopWatching
();
event
.
stopWatching
();
if
(
err
)
{
throw
err
;
}
if
(
err
)
{
throw
err
;
}
...
@@ -63,35 +60,34 @@ contract('Bounty', function(accounts) {
...
@@ -63,35 +60,34 @@ contract('Bounty', function(accounts) {
web3
.
eth
.
getBalance
(
bounty
.
address
).
toNumber
());
web3
.
eth
.
getBalance
(
bounty
.
address
).
toNumber
());
try
{
try
{
await
bounty
.
claim
(
targetAddress
,
{
from
:
researcher
});
await
bounty
.
claim
(
targetAddress
,
{
from
:
researcher
});
assert
.
isTrue
(
false
);
// should never reach here
assert
.
isTrue
(
false
);
// should never reach here
}
catch
(
error
)
{
}
catch
(
error
)
{
let
reClaimedBounty
=
await
bounty
.
claimed
.
call
();
let
reClaimedBounty
=
await
bounty
.
claimed
.
call
();
assert
.
isFalse
(
reClaimedBounty
);
assert
.
isFalse
(
reClaimedBounty
);
}
}
try
{
try
{
await
bounty
.
withdrawPayments
({
from
:
researcher
});
await
bounty
.
withdrawPayments
({
from
:
researcher
});
assert
.
isTrue
(
false
);
// should never reach here
assert
.
isTrue
(
false
);
// should never reach here
}
catch
(
err
)
{
}
catch
(
err
)
{
assert
.
equal
(
reward
,
assert
.
equal
(
reward
,
web3
.
eth
.
getBalance
(
bounty
.
address
).
toNumber
());
web3
.
eth
.
getBalance
(
bounty
.
address
).
toNumber
());
}
}
};
};
bounty
.
createTarget
({
from
:
researcher
});
bounty
.
createTarget
({
from
:
researcher
});
await
awaitEvent
(
event
,
watcher
);
await
awaitEvent
(
event
,
watcher
);
});
});
});
});
describe
(
'Against broken contract'
,
function
()
{
describe
(
'Against broken contract'
,
function
()
{
it
(
'claims reward'
,
async
function
()
{
it
(
'claims reward'
,
async
function
()
{
let
owner
=
accounts
[
0
];
let
owner
=
accounts
[
0
];
let
researcher
=
accounts
[
1
];
let
researcher
=
accounts
[
1
];
let
reward
=
web3
.
toWei
(
1
,
'ether'
);
let
reward
=
web3
.
toWei
(
1
,
'ether'
);
let
bounty
=
await
InsecureTargetBounty
.
new
();
let
bounty
=
await
InsecureTargetBounty
.
new
();
let
event
=
bounty
.
TargetCreated
({});
let
event
=
bounty
.
TargetCreated
({});
let
watcher
=
async
function
(
err
,
result
)
{
let
watcher
=
async
function
(
err
,
result
)
{
event
.
stopWatching
();
event
.
stopWatching
();
if
(
err
)
{
throw
err
;
}
if
(
err
)
{
throw
err
;
}
let
targetAddress
=
result
.
args
.
createdAddress
;
let
targetAddress
=
result
.
args
.
createdAddress
;
...
@@ -99,16 +95,16 @@ contract('Bounty', function(accounts) {
...
@@ -99,16 +95,16 @@ contract('Bounty', function(accounts) {
assert
.
equal
(
reward
,
web3
.
eth
.
getBalance
(
bounty
.
address
).
toNumber
());
assert
.
equal
(
reward
,
web3
.
eth
.
getBalance
(
bounty
.
address
).
toNumber
());
await
bounty
.
claim
(
targetAddress
,
{
from
:
researcher
});
await
bounty
.
claim
(
targetAddress
,
{
from
:
researcher
});
let
claim
=
await
bounty
.
claimed
.
call
();
let
claim
=
await
bounty
.
claimed
.
call
();
assert
.
isTrue
(
claim
);
assert
.
isTrue
(
claim
);
await
bounty
.
withdrawPayments
({
from
:
researcher
});
await
bounty
.
withdrawPayments
({
from
:
researcher
});
assert
.
equal
(
0
,
web3
.
eth
.
getBalance
(
bounty
.
address
).
toNumber
());
assert
.
equal
(
0
,
web3
.
eth
.
getBalance
(
bounty
.
address
).
toNumber
());
};
};
bounty
.
createTarget
({
from
:
researcher
});
bounty
.
createTarget
({
from
:
researcher
});
await
awaitEvent
(
event
,
watcher
);
await
awaitEvent
(
event
,
watcher
);
});
});
});
});
...
...
test/BurnableToken.js
View file @
86628468
'use strict'
const
EVMRevert
=
require
(
'./helpers/EVMRevert.js'
)
const
EVMRevert
=
require
(
'./helpers/EVMRevert.js'
)
;
const
BurnableTokenMock
=
artifacts
.
require
(
"./helpers/BurnableTokenMock.sol"
)
const
BurnableTokenMock
=
artifacts
.
require
(
'./helpers/BurnableTokenMock.sol'
);
const
BigNumber
=
web3
.
BigNumber
const
BigNumber
=
web3
.
BigNumber
;
require
(
'chai'
)
require
(
'chai'
)
.
use
(
require
(
'chai-as-promised'
))
.
use
(
require
(
'chai-as-promised'
))
.
use
(
require
(
'chai-bignumber'
)(
BigNumber
))
.
use
(
require
(
'chai-bignumber'
)(
BigNumber
))
.
should
()
.
should
()
;
const
expect
=
require
(
'chai'
).
expect
const
expect
=
require
(
'chai'
).
expect
;
contract
(
'BurnableToken'
,
function
(
accounts
)
{
contract
(
'BurnableToken'
,
function
(
accounts
)
{
let
token
let
token
;
let
expectedTokenSupply
=
new
BigNumber
(
999
)
let
expectedTokenSupply
=
new
BigNumber
(
999
);
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
token
=
await
BurnableTokenMock
.
new
(
accounts
[
0
],
1000
)
token
=
await
BurnableTokenMock
.
new
(
accounts
[
0
],
1000
);
})
});
it
(
'owner should be able to burn tokens'
,
async
function
()
{
it
(
'owner should be able to burn tokens'
,
async
function
()
{
const
{
logs
}
=
await
token
.
burn
(
1
,
{
from
:
accounts
[
0
]
})
const
{
logs
}
=
await
token
.
burn
(
1
,
{
from
:
accounts
[
0
]
});
const
balance
=
await
token
.
balanceOf
(
accounts
[
0
])
const
balance
=
await
token
.
balanceOf
(
accounts
[
0
]);
balance
.
should
.
be
.
bignumber
.
equal
(
expectedTokenSupply
)
balance
.
should
.
be
.
bignumber
.
equal
(
expectedTokenSupply
);
const
totalSupply
=
await
token
.
totalSupply
()
const
totalSupply
=
await
token
.
totalSupply
();
totalSupply
.
should
.
be
.
bignumber
.
equal
(
expectedTokenSupply
)
totalSupply
.
should
.
be
.
bignumber
.
equal
(
expectedTokenSupply
);
const
event
=
logs
.
find
(
e
=>
e
.
event
===
'Burn'
)
const
event
=
logs
.
find
(
e
=>
e
.
event
===
'Burn'
);
expect
(
event
).
to
.
exist
expect
(
event
).
to
.
exist
;
})
});
it
(
'cannot burn more tokens than your balance'
,
async
function
()
{
it
(
'cannot burn more tokens than your balance'
,
async
function
()
{
await
token
.
burn
(
2000
,
{
from
:
accounts
[
0
]
})
await
token
.
burn
(
2000
,
{
from
:
accounts
[
0
]
})
.
should
.
be
.
rejectedWith
(
EVMRevert
)
.
should
.
be
.
rejectedWith
(
EVMRevert
);
})
});
})
})
;
test/CanReclaimToken.js
View file @
86628468
'use strict'
;
import
expectThrow
from
'./helpers/expectThrow'
;
import
expectThrow
from
'./helpers/expectThrow'
;
import
toPromise
from
'./helpers/toPromise'
;
import
toPromise
from
'./helpers/toPromise'
;
const
CanReclaimToken
=
artifacts
.
require
(
'../contracts/ownership/CanReclaimToken.sol'
);
const
CanReclaimToken
=
artifacts
.
require
(
'../contracts/ownership/CanReclaimToken.sol'
);
const
BasicTokenMock
=
artifacts
.
require
(
"./helpers/BasicTokenMock.sol"
);
const
BasicTokenMock
=
artifacts
.
require
(
'./helpers/BasicTokenMock.sol'
);
contract
(
'CanReclaimToken'
,
function
(
accounts
)
{
contract
(
'CanReclaimToken'
,
function
(
accounts
)
{
let
token
=
null
;
let
token
=
null
;
let
canReclaimToken
=
null
;
let
canReclaimToken
=
null
;
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
// Create contract and token
// Create contract and token
token
=
await
BasicTokenMock
.
new
(
accounts
[
0
],
100
);
token
=
await
BasicTokenMock
.
new
(
accounts
[
0
],
100
);
canReclaimToken
=
await
CanReclaimToken
.
new
();
canReclaimToken
=
await
CanReclaimToken
.
new
();
...
@@ -18,7 +18,7 @@ contract('CanReclaimToken', function(accounts) {
...
@@ -18,7 +18,7 @@ contract('CanReclaimToken', function(accounts) {
assert
.
equal
(
startBalance
,
10
);
assert
.
equal
(
startBalance
,
10
);
});
});
it
(
'should allow owner to reclaim tokens'
,
async
function
()
{
it
(
'should allow owner to reclaim tokens'
,
async
function
()
{
const
ownerStartBalance
=
await
token
.
balanceOf
(
accounts
[
0
]);
const
ownerStartBalance
=
await
token
.
balanceOf
(
accounts
[
0
]);
await
canReclaimToken
.
reclaimToken
(
token
.
address
);
await
canReclaimToken
.
reclaimToken
(
token
.
address
);
const
ownerFinalBalance
=
await
token
.
balanceOf
(
accounts
[
0
]);
const
ownerFinalBalance
=
await
token
.
balanceOf
(
accounts
[
0
]);
...
@@ -27,9 +27,9 @@ contract('CanReclaimToken', function(accounts) {
...
@@ -27,9 +27,9 @@ contract('CanReclaimToken', function(accounts) {
assert
.
equal
(
ownerFinalBalance
-
ownerStartBalance
,
10
);
assert
.
equal
(
ownerFinalBalance
-
ownerStartBalance
,
10
);
});
});
it
(
'should allow only owner to reclaim tokens'
,
async
function
()
{
it
(
'should allow only owner to reclaim tokens'
,
async
function
()
{
await
expectThrow
(
await
expectThrow
(
canReclaimToken
.
reclaimToken
(
token
.
address
,
{
from
:
accounts
[
1
]
}),
canReclaimToken
.
reclaimToken
(
token
.
address
,
{
from
:
accounts
[
1
]
}),
);
);
});
});
});
});
test/CappedCrowdsale.js
View file @
86628468
import
ether
from
'./helpers/ether'
import
ether
from
'./helpers/ether'
;
import
{
advanceBlock
}
from
'./helpers/advanceToBlock'
import
{
advanceBlock
}
from
'./helpers/advanceToBlock'
;
import
{
increaseTimeTo
,
duration
}
from
'./helpers/increaseTime'
import
{
increaseTimeTo
,
duration
}
from
'./helpers/increaseTime'
;
import
latestTime
from
'./helpers/latestTime'
import
latestTime
from
'./helpers/latestTime'
;
import
EVMRevert
from
'./helpers/EVMRevert'
import
EVMRevert
from
'./helpers/EVMRevert'
;
const
BigNumber
=
web3
.
BigNumber
const
BigNumber
=
web3
.
BigNumber
;
require
(
'chai'
)
require
(
'chai'
)
.
use
(
require
(
'chai-as-promised'
))
.
use
(
require
(
'chai-as-promised'
))
.
use
(
require
(
'chai-bignumber'
)(
BigNumber
))
.
use
(
require
(
'chai-bignumber'
)(
BigNumber
))
.
should
()
.
should
()
;
const
CappedCrowdsale
=
artifacts
.
require
(
'./helpers/CappedCrowdsaleImpl.sol'
)
const
CappedCrowdsale
=
artifacts
.
require
(
'./helpers/CappedCrowdsaleImpl.sol'
)
;
const
MintableToken
=
artifacts
.
require
(
'MintableToken'
)
const
MintableToken
=
artifacts
.
require
(
'MintableToken'
)
;
contract
(
'CappedCrowdsale'
,
function
([
_
,
wallet
])
{
contract
(
'CappedCrowdsale'
,
function
([
_
,
wallet
])
{
const
rate
=
new
BigNumber
(
1000
);
const
rate
=
new
BigNumber
(
1000
)
const
cap
=
ether
(
300
);
const
lessThanCap
=
ether
(
60
);
const
cap
=
ether
(
300
)
before
(
async
function
()
{
const
lessThanCap
=
ether
(
60
)
// Advance to the next block to correctly read time in the solidity "now" function interpreted by testrpc
await
advanceBlock
();
before
(
async
function
()
{
});
//Advance to the next block to correctly read time in the solidity "now" function interpreted by testrpc
await
advanceBlock
()
})
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
this
.
startTime
=
latestTime
()
+
duration
.
weeks
(
1
);
this
.
startTime
=
latestTime
()
+
duration
.
weeks
(
1
);
this
.
endTime
=
this
.
startTime
+
duration
.
weeks
(
1
);
this
.
endTime
=
this
.
startTime
+
duration
.
weeks
(
1
);
this
.
crowdsale
=
await
CappedCrowdsale
.
new
(
this
.
startTime
,
this
.
endTime
,
rate
,
wallet
,
cap
)
this
.
crowdsale
=
await
CappedCrowdsale
.
new
(
this
.
startTime
,
this
.
endTime
,
rate
,
wallet
,
cap
)
;
this
.
token
=
MintableToken
.
at
(
await
this
.
crowdsale
.
token
())
this
.
token
=
MintableToken
.
at
(
await
this
.
crowdsale
.
token
())
;
})
})
;
describe
(
'creating a valid crowdsale'
,
function
()
{
describe
(
'creating a valid crowdsale'
,
function
()
{
it
(
'should fail with zero cap'
,
async
function
()
{
it
(
'should fail with zero cap'
,
async
function
()
{
await
CappedCrowdsale
.
new
(
this
.
startTime
,
this
.
endTime
,
rate
,
wallet
,
0
).
should
.
be
.
rejectedWith
(
EVMRevert
);
await
CappedCrowdsale
.
new
(
this
.
startTime
,
this
.
endTime
,
rate
,
wallet
,
0
).
should
.
be
.
rejectedWith
(
EVMRevert
);
})
});
});
});
describe
(
'accepting payments'
,
function
()
{
describe
(
'accepting payments'
,
function
()
{
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
await
increaseTimeTo
(
this
.
startTime
)
await
increaseTimeTo
(
this
.
startTime
)
;
})
})
;
it
(
'should accept payments within cap'
,
async
function
()
{
it
(
'should accept payments within cap'
,
async
function
()
{
await
this
.
crowdsale
.
send
(
cap
.
minus
(
lessThanCap
)).
should
.
be
.
fulfilled
await
this
.
crowdsale
.
send
(
cap
.
minus
(
lessThanCap
)).
should
.
be
.
fulfilled
;
await
this
.
crowdsale
.
send
(
lessThanCap
).
should
.
be
.
fulfilled
await
this
.
crowdsale
.
send
(
lessThanCap
).
should
.
be
.
fulfilled
;
})
})
;
it
(
'should reject payments outside cap'
,
async
function
()
{
it
(
'should reject payments outside cap'
,
async
function
()
{
await
this
.
crowdsale
.
send
(
cap
)
await
this
.
crowdsale
.
send
(
cap
)
;
await
this
.
crowdsale
.
send
(
1
).
should
.
be
.
rejectedWith
(
EVMRevert
)
await
this
.
crowdsale
.
send
(
1
).
should
.
be
.
rejectedWith
(
EVMRevert
)
;
})
})
;
it
(
'should reject payments that exceed cap'
,
async
function
()
{
it
(
'should reject payments that exceed cap'
,
async
function
()
{
await
this
.
crowdsale
.
send
(
cap
.
plus
(
1
)).
should
.
be
.
rejectedWith
(
EVMRevert
)
await
this
.
crowdsale
.
send
(
cap
.
plus
(
1
)).
should
.
be
.
rejectedWith
(
EVMRevert
);
})
});
});
})
describe
(
'ending'
,
function
()
{
describe
(
'ending'
,
function
()
{
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
await
increaseTimeTo
(
this
.
startTime
)
await
increaseTimeTo
(
this
.
startTime
)
;
})
})
;
it
(
'should not be ended if under cap'
,
async
function
()
{
it
(
'should not be ended if under cap'
,
async
function
()
{
let
hasEnded
=
await
this
.
crowdsale
.
hasEnded
()
let
hasEnded
=
await
this
.
crowdsale
.
hasEnded
()
;
hasEnded
.
should
.
equal
(
false
)
hasEnded
.
should
.
equal
(
false
)
;
await
this
.
crowdsale
.
send
(
lessThanCap
)
await
this
.
crowdsale
.
send
(
lessThanCap
)
;
hasEnded
=
await
this
.
crowdsale
.
hasEnded
()
hasEnded
=
await
this
.
crowdsale
.
hasEnded
()
;
hasEnded
.
should
.
equal
(
false
)
hasEnded
.
should
.
equal
(
false
)
;
})
})
;
it
(
'should not be ended if just under cap'
,
async
function
()
{
it
(
'should not be ended if just under cap'
,
async
function
()
{
await
this
.
crowdsale
.
send
(
cap
.
minus
(
1
))
await
this
.
crowdsale
.
send
(
cap
.
minus
(
1
))
;
let
hasEnded
=
await
this
.
crowdsale
.
hasEnded
()
let
hasEnded
=
await
this
.
crowdsale
.
hasEnded
()
;
hasEnded
.
should
.
equal
(
false
)
hasEnded
.
should
.
equal
(
false
)
;
})
})
;
it
(
'should be ended if cap reached'
,
async
function
()
{
it
(
'should be ended if cap reached'
,
async
function
()
{
await
this
.
crowdsale
.
send
(
cap
)
await
this
.
crowdsale
.
send
(
cap
);
let
hasEnded
=
await
this
.
crowdsale
.
hasEnded
()
let
hasEnded
=
await
this
.
crowdsale
.
hasEnded
();
hasEnded
.
should
.
equal
(
true
)
hasEnded
.
should
.
equal
(
true
);
})
});
});
})
});
})
test/CappedToken.js
View file @
86628468
'use strict'
;
import
expectThrow
from
'./helpers/expectThrow'
;
import
expectThrow
from
'./helpers/expectThrow'
;
import
ether
from
'./helpers/ether'
;
import
ether
from
'./helpers/ether'
;
var
CappedToken
=
artifacts
.
require
(
'../contracts/Tokens/CappedToken.sol'
);
var
CappedToken
=
artifacts
.
require
(
'../contracts/Tokens/CappedToken.sol'
);
const
BigNumber
=
web3
.
BigNumber
const
BigNumber
=
web3
.
BigNumber
;
contract
(
'Capped'
,
function
(
accounts
)
{
contract
(
'Capped'
,
function
(
accounts
)
{
const
cap
=
ether
(
1000
);
const
cap
=
ether
(
1000
);
let
token
;
let
token
;
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
token
=
await
CappedToken
.
new
(
cap
);
token
=
await
CappedToken
.
new
(
cap
);
})
})
;
it
(
'should start with the correct cap'
,
async
function
()
{
it
(
'should start with the correct cap'
,
async
function
()
{
let
_cap
=
await
token
.
cap
();
let
_cap
=
await
token
.
cap
();
assert
(
cap
.
eq
(
_cap
));
assert
(
cap
.
eq
(
_cap
));
})
})
;
it
(
'should mint when amount is less than cap'
,
async
function
()
{
it
(
'should mint when amount is less than cap'
,
async
function
()
{
const
result
=
await
token
.
mint
(
accounts
[
0
],
100
);
const
result
=
await
token
.
mint
(
accounts
[
0
],
100
);
assert
.
equal
(
result
.
logs
[
0
].
event
,
'Mint'
);
assert
.
equal
(
result
.
logs
[
0
].
event
,
'Mint'
);
})
})
;
it
(
'should fail to mint if the ammount exceeds the cap'
,
async
function
()
{
it
(
'should fail to mint if the ammount exceeds the cap'
,
async
function
()
{
await
token
.
mint
(
accounts
[
0
],
cap
.
sub
(
1
));
await
token
.
mint
(
accounts
[
0
],
cap
.
sub
(
1
));
await
expectThrow
(
token
.
mint
(
accounts
[
0
],
100
));
await
expectThrow
(
token
.
mint
(
accounts
[
0
],
100
));
})
})
;
it
(
'should fail to mint after cap is reached'
,
async
function
()
{
it
(
'should fail to mint after cap is reached'
,
async
function
()
{
await
token
.
mint
(
accounts
[
0
],
cap
);
await
token
.
mint
(
accounts
[
0
],
cap
);
await
expectThrow
(
token
.
mint
(
accounts
[
0
],
1
));
await
expectThrow
(
token
.
mint
(
accounts
[
0
],
1
));
})
});
});
});
test/Claimable.js
View file @
86628468
'use strict'
;
const
assertRevert
=
require
(
'./helpers/assertRevert'
);
const
assertRevert
=
require
(
'./helpers/assertRevert'
);
var
Claimable
=
artifacts
.
require
(
'../contracts/ownership/Claimable.sol'
);
var
Claimable
=
artifacts
.
require
(
'../contracts/ownership/Claimable.sol'
);
contract
(
'Claimable'
,
function
(
accounts
)
{
contract
(
'Claimable'
,
function
(
accounts
)
{
let
claimable
;
let
claimable
;
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
claimable
=
await
Claimable
.
new
();
claimable
=
await
Claimable
.
new
();
});
});
it
(
'should have an owner'
,
async
function
()
{
it
(
'should have an owner'
,
async
function
()
{
let
owner
=
await
claimable
.
owner
();
let
owner
=
await
claimable
.
owner
();
assert
.
isTrue
(
owner
!==
0
);
assert
.
isTrue
(
owner
!==
0
);
});
});
it
(
'changes pendingOwner after transfer'
,
async
function
()
{
it
(
'changes pendingOwner after transfer'
,
async
function
()
{
let
newOwner
=
accounts
[
1
];
let
newOwner
=
accounts
[
1
];
await
claimable
.
transferOwnership
(
newOwner
);
await
claimable
.
transferOwnership
(
newOwner
);
let
pendingOwner
=
await
claimable
.
pendingOwner
();
let
pendingOwner
=
await
claimable
.
pendingOwner
();
...
@@ -23,23 +23,23 @@ contract('Claimable', function(accounts) {
...
@@ -23,23 +23,23 @@ contract('Claimable', function(accounts) {
assert
.
isTrue
(
pendingOwner
===
newOwner
);
assert
.
isTrue
(
pendingOwner
===
newOwner
);
});
});
it
(
'should prevent to claimOwnership from no pendingOwner'
,
async
function
()
{
it
(
'should prevent to claimOwnership from no pendingOwner'
,
async
function
()
{
try
{
try
{
await
claimable
.
claimOwnership
({
from
:
accounts
[
2
]
});
await
claimable
.
claimOwnership
({
from
:
accounts
[
2
]
});
assert
.
fail
(
'should have thrown before'
);
assert
.
fail
(
'should have thrown before'
);
}
catch
(
error
)
{
}
catch
(
error
)
{
assertRevert
(
error
);
assertRevert
(
error
);
}
}
});
});
it
(
'should prevent non-owners from transfering'
,
async
function
()
{
it
(
'should prevent non-owners from transfering'
,
async
function
()
{
const
other
=
accounts
[
2
];
const
other
=
accounts
[
2
];
const
owner
=
await
claimable
.
owner
.
call
();
const
owner
=
await
claimable
.
owner
.
call
();
assert
.
isTrue
(
owner
!==
other
);
assert
.
isTrue
(
owner
!==
other
);
try
{
try
{
await
claimable
.
transferOwnership
(
other
,
{
from
:
other
});
await
claimable
.
transferOwnership
(
other
,
{
from
:
other
});
assert
.
fail
(
'should have thrown before'
);
assert
.
fail
(
'should have thrown before'
);
}
catch
(
error
)
{
}
catch
(
error
)
{
assertRevert
(
error
);
assertRevert
(
error
);
}
}
});
});
...
@@ -52,8 +52,8 @@ contract('Claimable', function(accounts) {
...
@@ -52,8 +52,8 @@ contract('Claimable', function(accounts) {
await
claimable
.
transferOwnership
(
newOwner
);
await
claimable
.
transferOwnership
(
newOwner
);
});
});
it
(
'changes allow pending owner to claim ownership'
,
async
function
()
{
it
(
'changes allow pending owner to claim ownership'
,
async
function
()
{
await
claimable
.
claimOwnership
({
from
:
newOwner
});
await
claimable
.
claimOwnership
({
from
:
newOwner
});
let
owner
=
await
claimable
.
owner
();
let
owner
=
await
claimable
.
owner
();
assert
.
isTrue
(
owner
===
newOwner
);
assert
.
isTrue
(
owner
===
newOwner
);
...
...
test/Contactable.js
View file @
86628468
'use strict'
;
const
assertRevert
=
require
(
'./helpers/assertRevert'
);
const
assertRevert
=
require
(
'./helpers/assertRevert'
);
var
Contactable
=
artifacts
.
require
(
'../contracts/ownership/Contactable.sol'
);
var
Contactable
=
artifacts
.
require
(
'../contracts/ownership/Contactable.sol'
);
contract
(
'Contactable'
,
function
(
accounts
)
{
contract
(
'Contactable'
,
function
(
accounts
)
{
let
contactable
;
let
contactable
;
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
contactable
=
await
Contactable
.
new
();
contactable
=
await
Contactable
.
new
();
});
});
it
(
'should have an empty contact info'
,
async
function
()
{
it
(
'should have an empty contact info'
,
async
function
()
{
let
info
=
await
contactable
.
contactInformation
();
let
info
=
await
contactable
.
contactInformation
();
assert
.
isTrue
(
info
==
""
);
assert
.
isTrue
(
info
==
''
);
});
});
describe
(
'after setting the contact information'
,
function
()
{
describe
(
'after setting the contact information'
,
function
()
{
let
contactInfo
=
"contact information"
let
contactInfo
=
'contact information'
;
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
await
contactable
.
setContactInformation
(
contactInfo
);
await
contactable
.
setContactInformation
(
contactInfo
);
});
});
it
(
'should return the setted contact information'
,
async
function
()
{
it
(
'should return the setted contact information'
,
async
function
()
{
let
info
=
await
contactable
.
contactInformation
();
let
info
=
await
contactable
.
contactInformation
();
assert
.
isTrue
(
info
===
contactInfo
);
assert
.
isTrue
(
info
===
contactInfo
);
});
});
...
...
test/Crowdsale.js
View file @
86628468
import
ether
from
'./helpers/ether'
import
ether
from
'./helpers/ether'
;
import
{
advanceBlock
}
from
'./helpers/advanceToBlock'
import
{
advanceBlock
}
from
'./helpers/advanceToBlock'
;
import
{
increaseTimeTo
,
duration
}
from
'./helpers/increaseTime'
import
{
increaseTimeTo
,
duration
}
from
'./helpers/increaseTime'
;
import
latestTime
from
'./helpers/latestTime'
import
latestTime
from
'./helpers/latestTime'
;
import
EVMRevert
from
'./helpers/EVMRevert'
import
EVMRevert
from
'./helpers/EVMRevert'
;
const
BigNumber
=
web3
.
BigNumber
const
BigNumber
=
web3
.
BigNumber
;
const
should
=
require
(
'chai'
)
const
should
=
require
(
'chai'
)
.
use
(
require
(
'chai-as-promised'
))
.
use
(
require
(
'chai-as-promised'
))
.
use
(
require
(
'chai-bignumber'
)(
BigNumber
))
.
use
(
require
(
'chai-bignumber'
)(
BigNumber
))
.
should
()
.
should
()
;
const
Crowdsale
=
artifacts
.
require
(
'Crowdsale'
)
const
Crowdsale
=
artifacts
.
require
(
'Crowdsale'
)
;
const
MintableToken
=
artifacts
.
require
(
'MintableToken'
)
const
MintableToken
=
artifacts
.
require
(
'MintableToken'
)
;
contract
(
'Crowdsale'
,
function
([
_
,
investor
,
wallet
,
purchaser
])
{
contract
(
'Crowdsale'
,
function
([
_
,
investor
,
wallet
,
purchaser
])
{
const
rate
=
new
BigNumber
(
1000
);
const
value
=
ether
(
42
);
const
rate
=
new
BigNumber
(
1000
)
const
expectedTokenAmount
=
rate
.
mul
(
value
);
const
value
=
ether
(
42
)
const
expectedTokenAmount
=
rate
.
mul
(
value
)
before
(
async
function
()
{
// Advance to the next block to correctly read time in the solidity "now" function interpreted by testrpc
before
(
async
function
()
{
await
advanceBlock
();
//Advance to the next block to correctly read time in the solidity "now" function interpreted by testrpc
});
await
advanceBlock
()
})
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
this
.
startTime
=
latestTime
()
+
duration
.
weeks
(
1
);
this
.
startTime
=
latestTime
()
+
duration
.
weeks
(
1
);
this
.
endTime
=
this
.
startTime
+
duration
.
weeks
(
1
);
this
.
endTime
=
this
.
startTime
+
duration
.
weeks
(
1
);
this
.
afterEndTime
=
this
.
endTime
+
duration
.
seconds
(
1
)
this
.
afterEndTime
=
this
.
endTime
+
duration
.
seconds
(
1
);
this
.
crowdsale
=
await
Crowdsale
.
new
(
this
.
startTime
,
this
.
endTime
,
rate
,
wallet
)
this
.
crowdsale
=
await
Crowdsale
.
new
(
this
.
startTime
,
this
.
endTime
,
rate
,
wallet
)
;
this
.
token
=
MintableToken
.
at
(
await
this
.
crowdsale
.
token
())
this
.
token
=
MintableToken
.
at
(
await
this
.
crowdsale
.
token
())
;
})
})
;
it
(
'should be token owner'
,
async
function
()
{
it
(
'should be token owner'
,
async
function
()
{
const
owner
=
await
this
.
token
.
owner
()
const
owner
=
await
this
.
token
.
owner
()
;
owner
.
should
.
equal
(
this
.
crowdsale
.
address
)
owner
.
should
.
equal
(
this
.
crowdsale
.
address
)
;
})
})
;
it
(
'should be ended only after end'
,
async
function
()
{
it
(
'should be ended only after end'
,
async
function
()
{
let
ended
=
await
this
.
crowdsale
.
hasEnded
()
let
ended
=
await
this
.
crowdsale
.
hasEnded
()
;
ended
.
should
.
equal
(
false
)
ended
.
should
.
equal
(
false
)
;
await
increaseTimeTo
(
this
.
afterEndTime
)
await
increaseTimeTo
(
this
.
afterEndTime
)
;
ended
=
await
this
.
crowdsale
.
hasEnded
()
ended
=
await
this
.
crowdsale
.
hasEnded
()
;
ended
.
should
.
equal
(
true
)
ended
.
should
.
equal
(
true
)
;
})
})
;
describe
(
'accepting payments'
,
function
()
{
describe
(
'accepting payments'
,
function
()
{
it
(
'should reject payments before start'
,
async
function
()
{
it
(
'should reject payments before start'
,
async
function
()
{
await
this
.
crowdsale
.
send
(
value
).
should
.
be
.
rejectedWith
(
EVMRevert
)
await
this
.
crowdsale
.
send
(
value
).
should
.
be
.
rejectedWith
(
EVMRevert
)
;
await
this
.
crowdsale
.
buyTokens
(
investor
,
{
from
:
purchaser
,
value
:
value
}).
should
.
be
.
rejectedWith
(
EVMRevert
)
await
this
.
crowdsale
.
buyTokens
(
investor
,
{
from
:
purchaser
,
value
:
value
}).
should
.
be
.
rejectedWith
(
EVMRevert
);
})
})
;
it
(
'should accept payments after start'
,
async
function
()
{
it
(
'should accept payments after start'
,
async
function
()
{
await
increaseTimeTo
(
this
.
startTime
)
await
increaseTimeTo
(
this
.
startTime
)
;
await
this
.
crowdsale
.
send
(
value
).
should
.
be
.
fulfilled
await
this
.
crowdsale
.
send
(
value
).
should
.
be
.
fulfilled
;
await
this
.
crowdsale
.
buyTokens
(
investor
,
{
value
:
value
,
from
:
purchaser
}).
should
.
be
.
fulfilled
await
this
.
crowdsale
.
buyTokens
(
investor
,
{
value
:
value
,
from
:
purchaser
}).
should
.
be
.
fulfilled
;
})
})
;
it
(
'should reject payments after end'
,
async
function
()
{
it
(
'should reject payments after end'
,
async
function
()
{
await
increaseTimeTo
(
this
.
afterEndTime
)
await
increaseTimeTo
(
this
.
afterEndTime
);
await
this
.
crowdsale
.
send
(
value
).
should
.
be
.
rejectedWith
(
EVMRevert
)
await
this
.
crowdsale
.
send
(
value
).
should
.
be
.
rejectedWith
(
EVMRevert
);
await
this
.
crowdsale
.
buyTokens
(
investor
,
{
value
:
value
,
from
:
purchaser
}).
should
.
be
.
rejectedWith
(
EVMRevert
)
await
this
.
crowdsale
.
buyTokens
(
investor
,
{
value
:
value
,
from
:
purchaser
}).
should
.
be
.
rejectedWith
(
EVMRevert
);
})
});
});
})
describe
(
'high-level purchase'
,
function
()
{
describe
(
'high-level purchase'
,
function
()
{
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
await
increaseTimeTo
(
this
.
startTime
);
await
increaseTimeTo
(
this
.
startTime
)
});
})
it
(
'should log purchase'
,
async
function
()
{
it
(
'should log purchase'
,
async
function
()
{
const
{
logs
}
=
await
this
.
crowdsale
.
sendTransaction
({
value
:
value
,
from
:
investor
})
const
{
logs
}
=
await
this
.
crowdsale
.
sendTransaction
({
value
:
value
,
from
:
investor
});
const
event
=
logs
.
find
(
e
=>
e
.
event
===
'TokenPurchase'
)
const
event
=
logs
.
find
(
e
=>
e
.
event
===
'TokenPurchase'
)
;
should
.
exist
(
event
)
should
.
exist
(
event
)
;
event
.
args
.
purchaser
.
should
.
equal
(
investor
)
event
.
args
.
purchaser
.
should
.
equal
(
investor
)
;
event
.
args
.
beneficiary
.
should
.
equal
(
investor
)
event
.
args
.
beneficiary
.
should
.
equal
(
investor
)
;
event
.
args
.
value
.
should
.
be
.
bignumber
.
equal
(
value
)
event
.
args
.
value
.
should
.
be
.
bignumber
.
equal
(
value
)
;
event
.
args
.
amount
.
should
.
be
.
bignumber
.
equal
(
expectedTokenAmount
)
event
.
args
.
amount
.
should
.
be
.
bignumber
.
equal
(
expectedTokenAmount
)
;
})
})
;
it
(
'should increase totalSupply'
,
async
function
()
{
it
(
'should increase totalSupply'
,
async
function
()
{
await
this
.
crowdsale
.
send
(
value
)
await
this
.
crowdsale
.
send
(
value
)
;
const
totalSupply
=
await
this
.
token
.
totalSupply
()
const
totalSupply
=
await
this
.
token
.
totalSupply
()
;
totalSupply
.
should
.
be
.
bignumber
.
equal
(
expectedTokenAmount
)
totalSupply
.
should
.
be
.
bignumber
.
equal
(
expectedTokenAmount
)
;
})
})
;
it
(
'should assign tokens to sender'
,
async
function
()
{
it
(
'should assign tokens to sender'
,
async
function
()
{
await
this
.
crowdsale
.
sendTransaction
({
value
:
value
,
from
:
investor
})
await
this
.
crowdsale
.
sendTransaction
({
value
:
value
,
from
:
investor
});
let
balance
=
await
this
.
token
.
balanceOf
(
investor
);
let
balance
=
await
this
.
token
.
balanceOf
(
investor
);
balance
.
should
.
be
.
bignumber
.
equal
(
expectedTokenAmount
)
balance
.
should
.
be
.
bignumber
.
equal
(
expectedTokenAmount
)
;
})
})
;
it
(
'should forward funds to wallet'
,
async
function
()
{
it
(
'should forward funds to wallet'
,
async
function
()
{
const
pre
=
web3
.
eth
.
getBalance
(
wallet
)
const
pre
=
web3
.
eth
.
getBalance
(
wallet
);
await
this
.
crowdsale
.
sendTransaction
({
value
,
from
:
investor
})
await
this
.
crowdsale
.
sendTransaction
({
value
,
from
:
investor
});
const
post
=
web3
.
eth
.
getBalance
(
wallet
)
const
post
=
web3
.
eth
.
getBalance
(
wallet
);
post
.
minus
(
pre
).
should
.
be
.
bignumber
.
equal
(
value
)
post
.
minus
(
pre
).
should
.
be
.
bignumber
.
equal
(
value
);
})
});
});
})
describe
(
'low-level purchase'
,
function
()
{
describe
(
'low-level purchase'
,
function
()
{
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
await
increaseTimeTo
(
this
.
startTime
);
await
increaseTimeTo
(
this
.
startTime
)
});
})
it
(
'should log purchase'
,
async
function
()
{
it
(
'should log purchase'
,
async
function
()
{
const
{
logs
}
=
await
this
.
crowdsale
.
buyTokens
(
investor
,
{
value
:
value
,
from
:
purchaser
})
const
{
logs
}
=
await
this
.
crowdsale
.
buyTokens
(
investor
,
{
value
:
value
,
from
:
purchaser
});
const
event
=
logs
.
find
(
e
=>
e
.
event
===
'TokenPurchase'
)
const
event
=
logs
.
find
(
e
=>
e
.
event
===
'TokenPurchase'
)
;
should
.
exist
(
event
)
should
.
exist
(
event
)
;
event
.
args
.
purchaser
.
should
.
equal
(
purchaser
)
event
.
args
.
purchaser
.
should
.
equal
(
purchaser
)
;
event
.
args
.
beneficiary
.
should
.
equal
(
investor
)
event
.
args
.
beneficiary
.
should
.
equal
(
investor
)
;
event
.
args
.
value
.
should
.
be
.
bignumber
.
equal
(
value
)
event
.
args
.
value
.
should
.
be
.
bignumber
.
equal
(
value
)
;
event
.
args
.
amount
.
should
.
be
.
bignumber
.
equal
(
expectedTokenAmount
)
event
.
args
.
amount
.
should
.
be
.
bignumber
.
equal
(
expectedTokenAmount
)
;
})
})
;
it
(
'should increase totalSupply'
,
async
function
()
{
it
(
'should increase totalSupply'
,
async
function
()
{
await
this
.
crowdsale
.
buyTokens
(
investor
,
{
value
,
from
:
purchaser
})
await
this
.
crowdsale
.
buyTokens
(
investor
,
{
value
,
from
:
purchaser
});
const
totalSupply
=
await
this
.
token
.
totalSupply
()
const
totalSupply
=
await
this
.
token
.
totalSupply
()
;
totalSupply
.
should
.
be
.
bignumber
.
equal
(
expectedTokenAmount
)
totalSupply
.
should
.
be
.
bignumber
.
equal
(
expectedTokenAmount
)
;
})
})
;
it
(
'should assign tokens to beneficiary'
,
async
function
()
{
it
(
'should assign tokens to beneficiary'
,
async
function
()
{
await
this
.
crowdsale
.
buyTokens
(
investor
,
{
value
,
from
:
purchaser
})
await
this
.
crowdsale
.
buyTokens
(
investor
,
{
value
,
from
:
purchaser
});
const
balance
=
await
this
.
token
.
balanceOf
(
investor
)
const
balance
=
await
this
.
token
.
balanceOf
(
investor
)
;
balance
.
should
.
be
.
bignumber
.
equal
(
expectedTokenAmount
)
balance
.
should
.
be
.
bignumber
.
equal
(
expectedTokenAmount
)
;
})
})
;
it
(
'should forward funds to wallet'
,
async
function
()
{
it
(
'should forward funds to wallet'
,
async
function
()
{
const
pre
=
web3
.
eth
.
getBalance
(
wallet
)
const
pre
=
web3
.
eth
.
getBalance
(
wallet
);
await
this
.
crowdsale
.
buyTokens
(
investor
,
{
value
,
from
:
purchaser
})
await
this
.
crowdsale
.
buyTokens
(
investor
,
{
value
,
from
:
purchaser
});
const
post
=
web3
.
eth
.
getBalance
(
wallet
)
const
post
=
web3
.
eth
.
getBalance
(
wallet
);
post
.
minus
(
pre
).
should
.
be
.
bignumber
.
equal
(
value
)
post
.
minus
(
pre
).
should
.
be
.
bignumber
.
equal
(
value
);
})
});
});
})
});
})
test/DayLimit.js
View file @
86628468
'use strict'
;
const
assertRevert
=
require
(
'./helpers/assertRevert'
);
const
assertRevert
=
require
(
'./helpers/assertRevert'
);
import
latestTime
from
'./helpers/latestTime'
import
latestTime
from
'./helpers/latestTime'
;
import
{
increaseTimeTo
,
duration
}
from
'./helpers/increaseTime'
import
{
increaseTimeTo
,
duration
}
from
'./helpers/increaseTime'
;
var
DayLimitMock
=
artifacts
.
require
(
'./helpers/DayLimitMock.sol'
);
var
DayLimitMock
=
artifacts
.
require
(
'./helpers/DayLimitMock.sol'
);
contract
(
'DayLimit'
,
function
(
accounts
)
{
contract
(
'DayLimit'
,
function
(
accounts
)
{
let
dayLimit
;
let
dayLimit
;
let
initLimit
=
10
;
let
initLimit
=
10
;
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
this
.
startTime
=
latestTime
();
this
.
startTime
=
latestTime
();
dayLimit
=
await
DayLimitMock
.
new
(
initLimit
);
dayLimit
=
await
DayLimitMock
.
new
(
initLimit
);
});
});
it
(
'should construct with the passed daily limit'
,
async
function
()
{
it
(
'should construct with the passed daily limit'
,
async
function
()
{
let
dailyLimit
=
await
dayLimit
.
dailyLimit
();
let
dailyLimit
=
await
dayLimit
.
dailyLimit
();
assert
.
equal
(
initLimit
,
dailyLimit
);
assert
.
equal
(
initLimit
,
dailyLimit
);
});
});
it
(
'should be able to spend if daily limit is not reached'
,
async
function
()
{
it
(
'should be able to spend if daily limit is not reached'
,
async
function
()
{
await
dayLimit
.
attemptSpend
(
8
);
await
dayLimit
.
attemptSpend
(
8
);
let
spentToday
=
await
dayLimit
.
spentToday
();
let
spentToday
=
await
dayLimit
.
spentToday
();
assert
.
equal
(
spentToday
,
8
);
assert
.
equal
(
spentToday
,
8
);
...
@@ -30,7 +29,7 @@ contract('DayLimit', function(accounts) {
...
@@ -30,7 +29,7 @@ contract('DayLimit', function(accounts) {
assert
.
equal
(
spentToday
,
10
);
assert
.
equal
(
spentToday
,
10
);
});
});
it
(
'should prevent spending if daily limit is reached'
,
async
function
()
{
it
(
'should prevent spending if daily limit is reached'
,
async
function
()
{
await
dayLimit
.
attemptSpend
(
8
);
await
dayLimit
.
attemptSpend
(
8
);
let
spentToday
=
await
dayLimit
.
spentToday
();
let
spentToday
=
await
dayLimit
.
spentToday
();
assert
.
equal
(
spentToday
,
8
);
assert
.
equal
(
spentToday
,
8
);
...
@@ -38,12 +37,12 @@ contract('DayLimit', function(accounts) {
...
@@ -38,12 +37,12 @@ contract('DayLimit', function(accounts) {
try
{
try
{
await
dayLimit
.
attemptSpend
(
3
);
await
dayLimit
.
attemptSpend
(
3
);
assert
.
fail
(
'should have thrown before'
);
assert
.
fail
(
'should have thrown before'
);
}
catch
(
error
)
{
}
catch
(
error
)
{
assertRevert
(
error
);
assertRevert
(
error
);
}
}
});
});
it
(
'should allow spending if daily limit is reached and then set higher'
,
async
function
()
{
it
(
'should allow spending if daily limit is reached and then set higher'
,
async
function
()
{
await
dayLimit
.
attemptSpend
(
8
);
await
dayLimit
.
attemptSpend
(
8
);
let
spentToday
=
await
dayLimit
.
spentToday
();
let
spentToday
=
await
dayLimit
.
spentToday
();
assert
.
equal
(
spentToday
,
8
);
assert
.
equal
(
spentToday
,
8
);
...
@@ -51,7 +50,7 @@ contract('DayLimit', function(accounts) {
...
@@ -51,7 +50,7 @@ contract('DayLimit', function(accounts) {
try
{
try
{
await
dayLimit
.
attemptSpend
(
3
);
await
dayLimit
.
attemptSpend
(
3
);
assert
.
fail
(
'should have thrown before'
);
assert
.
fail
(
'should have thrown before'
);
}
catch
(
error
)
{
}
catch
(
error
)
{
assertRevert
(
error
);
assertRevert
(
error
);
}
}
spentToday
=
await
dayLimit
.
spentToday
();
spentToday
=
await
dayLimit
.
spentToday
();
...
@@ -63,7 +62,7 @@ contract('DayLimit', function(accounts) {
...
@@ -63,7 +62,7 @@ contract('DayLimit', function(accounts) {
assert
.
equal
(
spentToday
,
11
);
assert
.
equal
(
spentToday
,
11
);
});
});
it
(
'should allow spending if daily limit is reached and then amount spent is reset'
,
async
function
()
{
it
(
'should allow spending if daily limit is reached and then amount spent is reset'
,
async
function
()
{
await
dayLimit
.
attemptSpend
(
8
);
await
dayLimit
.
attemptSpend
(
8
);
let
spentToday
=
await
dayLimit
.
spentToday
();
let
spentToday
=
await
dayLimit
.
spentToday
();
assert
.
equal
(
spentToday
,
8
);
assert
.
equal
(
spentToday
,
8
);
...
@@ -71,7 +70,7 @@ contract('DayLimit', function(accounts) {
...
@@ -71,7 +70,7 @@ contract('DayLimit', function(accounts) {
try
{
try
{
await
dayLimit
.
attemptSpend
(
3
);
await
dayLimit
.
attemptSpend
(
3
);
assert
.
fail
(
'should have thrown before'
);
assert
.
fail
(
'should have thrown before'
);
}
catch
(
error
)
{
}
catch
(
error
)
{
assertRevert
(
error
);
assertRevert
(
error
);
}
}
spentToday
=
await
dayLimit
.
spentToday
();
spentToday
=
await
dayLimit
.
spentToday
();
...
@@ -83,7 +82,7 @@ contract('DayLimit', function(accounts) {
...
@@ -83,7 +82,7 @@ contract('DayLimit', function(accounts) {
assert
.
equal
(
spentToday
,
3
);
assert
.
equal
(
spentToday
,
3
);
});
});
it
(
'should allow spending if daily limit is reached and then the next has come'
,
async
function
()
{
it
(
'should allow spending if daily limit is reached and then the next has come'
,
async
function
()
{
let
limit
=
10
;
let
limit
=
10
;
let
dayLimit
=
await
DayLimitMock
.
new
(
limit
);
let
dayLimit
=
await
DayLimitMock
.
new
(
limit
);
...
@@ -94,7 +93,7 @@ contract('DayLimit', function(accounts) {
...
@@ -94,7 +93,7 @@ contract('DayLimit', function(accounts) {
try
{
try
{
await
dayLimit
.
attemptSpend
(
3
);
await
dayLimit
.
attemptSpend
(
3
);
assert
.
fail
(
'should have thrown before'
);
assert
.
fail
(
'should have thrown before'
);
}
catch
(
error
)
{
}
catch
(
error
)
{
assertRevert
(
error
);
assertRevert
(
error
);
}
}
spentToday
=
await
dayLimit
.
spentToday
();
spentToday
=
await
dayLimit
.
spentToday
();
...
@@ -106,5 +105,4 @@ contract('DayLimit', function(accounts) {
...
@@ -106,5 +105,4 @@ contract('DayLimit', function(accounts) {
spentToday
=
await
dayLimit
.
spentToday
();
spentToday
=
await
dayLimit
.
spentToday
();
assert
.
equal
(
spentToday
,
3
);
assert
.
equal
(
spentToday
,
3
);
});
});
});
});
test/DelayedClaimble.js
View file @
86628468
'use strict'
;
var
DelayedClaimable
=
artifacts
.
require
(
'../contracts/ownership/DelayedClaimable.sol'
);
var
DelayedClaimable
=
artifacts
.
require
(
'../contracts/ownership/DelayedClaimable.sol'
);
contract
(
'DelayedClaimable'
,
function
(
accounts
)
{
contract
(
'DelayedClaimable'
,
function
(
accounts
)
{
var
delayedClaimable
;
var
delayedClaimable
;
beforeEach
(
function
()
{
beforeEach
(
function
()
{
return
DelayedClaimable
.
new
().
then
(
function
(
deployed
)
{
return
DelayedClaimable
.
new
().
then
(
function
(
deployed
)
{
delayedClaimable
=
deployed
;
delayedClaimable
=
deployed
;
});
});
});
});
it
(
'can set claim blocks'
,
async
function
()
{
it
(
'can set claim blocks'
,
async
function
()
{
await
delayedClaimable
.
transferOwnership
(
accounts
[
2
]);
await
delayedClaimable
.
transferOwnership
(
accounts
[
2
]);
await
delayedClaimable
.
setLimits
(
0
,
1000
);
await
delayedClaimable
.
setLimits
(
0
,
1000
);
let
end
=
await
delayedClaimable
.
end
();
let
end
=
await
delayedClaimable
.
end
();
...
@@ -20,7 +19,7 @@ contract('DelayedClaimable', function(accounts) {
...
@@ -20,7 +19,7 @@ contract('DelayedClaimable', function(accounts) {
assert
.
equal
(
start
,
0
);
assert
.
equal
(
start
,
0
);
});
});
it
(
'changes pendingOwner after transfer successful'
,
async
function
()
{
it
(
'changes pendingOwner after transfer successful'
,
async
function
()
{
await
delayedClaimable
.
transferOwnership
(
accounts
[
2
]);
await
delayedClaimable
.
transferOwnership
(
accounts
[
2
]);
await
delayedClaimable
.
setLimits
(
0
,
1000
);
await
delayedClaimable
.
setLimits
(
0
,
1000
);
let
end
=
await
delayedClaimable
.
end
();
let
end
=
await
delayedClaimable
.
end
();
...
@@ -29,12 +28,12 @@ contract('DelayedClaimable', function(accounts) {
...
@@ -29,12 +28,12 @@ contract('DelayedClaimable', function(accounts) {
assert
.
equal
(
start
,
0
);
assert
.
equal
(
start
,
0
);
let
pendingOwner
=
await
delayedClaimable
.
pendingOwner
();
let
pendingOwner
=
await
delayedClaimable
.
pendingOwner
();
assert
.
equal
(
pendingOwner
,
accounts
[
2
]);
assert
.
equal
(
pendingOwner
,
accounts
[
2
]);
await
delayedClaimable
.
claimOwnership
({
from
:
accounts
[
2
]
});
await
delayedClaimable
.
claimOwnership
({
from
:
accounts
[
2
]
});
let
owner
=
await
delayedClaimable
.
owner
();
let
owner
=
await
delayedClaimable
.
owner
();
assert
.
equal
(
owner
,
accounts
[
2
]);
assert
.
equal
(
owner
,
accounts
[
2
]);
});
});
it
(
'changes pendingOwner after transfer fails'
,
async
function
()
{
it
(
'changes pendingOwner after transfer fails'
,
async
function
()
{
await
delayedClaimable
.
transferOwnership
(
accounts
[
1
]);
await
delayedClaimable
.
transferOwnership
(
accounts
[
1
]);
await
delayedClaimable
.
setLimits
(
100
,
110
);
await
delayedClaimable
.
setLimits
(
100
,
110
);
let
end
=
await
delayedClaimable
.
end
();
let
end
=
await
delayedClaimable
.
end
();
...
@@ -45,7 +44,7 @@ contract('DelayedClaimable', function(accounts) {
...
@@ -45,7 +44,7 @@ contract('DelayedClaimable', function(accounts) {
assert
.
equal
(
pendingOwner
,
accounts
[
1
]);
assert
.
equal
(
pendingOwner
,
accounts
[
1
]);
var
err
=
null
;
var
err
=
null
;
try
{
try
{
await
delayedClaimable
.
claimOwnership
({
from
:
accounts
[
1
]
});
await
delayedClaimable
.
claimOwnership
({
from
:
accounts
[
1
]
});
}
catch
(
error
)
{
}
catch
(
error
)
{
err
=
error
;
err
=
error
;
}
}
...
@@ -54,7 +53,7 @@ contract('DelayedClaimable', function(accounts) {
...
@@ -54,7 +53,7 @@ contract('DelayedClaimable', function(accounts) {
assert
.
isTrue
(
owner
!==
accounts
[
1
]);
assert
.
isTrue
(
owner
!==
accounts
[
1
]);
});
});
it
(
'set end and start invalid values fail'
,
async
function
()
{
it
(
'set end and start invalid values fail'
,
async
function
()
{
await
delayedClaimable
.
transferOwnership
(
accounts
[
1
]);
await
delayedClaimable
.
transferOwnership
(
accounts
[
1
]);
var
err
=
null
;
var
err
=
null
;
try
{
try
{
...
@@ -64,5 +63,4 @@ contract('DelayedClaimable', function(accounts) {
...
@@ -64,5 +63,4 @@ contract('DelayedClaimable', function(accounts) {
}
}
assert
.
isFalse
(
err
.
message
.
search
(
'revert'
)
===
-
1
);
assert
.
isFalse
(
err
.
message
.
search
(
'revert'
)
===
-
1
);
});
});
});
});
test/Destructible.js
View file @
86628468
'use strict'
;
var
Destructible
=
artifacts
.
require
(
'../contracts/lifecycle/Destructible.sol'
);
var
Destructible
=
artifacts
.
require
(
'../contracts/lifecycle/Destructible.sol'
);
require
(
'./helpers/transactionMined.js'
);
require
(
'./helpers/transactionMined.js'
);
contract
(
'Destructible'
,
function
(
accounts
)
{
contract
(
'Destructible'
,
function
(
accounts
)
{
it
(
'should send balance to owner after destruction'
,
async
function
()
{
it
(
'should send balance to owner after destruction'
,
async
function
()
{
let
destructible
=
await
Destructible
.
new
({
from
:
accounts
[
0
],
value
:
web3
.
toWei
(
'10'
,
'ether'
)
});
let
destructible
=
await
Destructible
.
new
({
from
:
accounts
[
0
],
value
:
web3
.
toWei
(
'10'
,
'ether'
)});
let
owner
=
await
destructible
.
owner
();
let
owner
=
await
destructible
.
owner
();
let
initBalance
=
web3
.
eth
.
getBalance
(
owner
);
let
initBalance
=
web3
.
eth
.
getBalance
(
owner
);
await
destructible
.
destroy
({
from
:
owner
});
await
destructible
.
destroy
({
from
:
owner
});
let
newBalance
=
web3
.
eth
.
getBalance
(
owner
);
let
newBalance
=
web3
.
eth
.
getBalance
(
owner
);
assert
.
isTrue
(
newBalance
>
initBalance
);
assert
.
isTrue
(
newBalance
>
initBalance
);
});
});
it
(
'should send balance to recepient after destruction'
,
async
function
()
{
it
(
'should send balance to recepient after destruction'
,
async
function
()
{
let
destructible
=
await
Destructible
.
new
({
from
:
accounts
[
0
],
value
:
web3
.
toWei
(
'10'
,
'ether'
)
});
let
destructible
=
await
Destructible
.
new
({
from
:
accounts
[
0
],
value
:
web3
.
toWei
(
'10'
,
'ether'
)
});
let
owner
=
await
destructible
.
owner
();
let
owner
=
await
destructible
.
owner
();
let
initBalance
=
web3
.
eth
.
getBalance
(
accounts
[
1
]);
let
initBalance
=
web3
.
eth
.
getBalance
(
accounts
[
1
]);
await
destructible
.
destroyAndSend
(
accounts
[
1
],
{
from
:
owner
}
);
await
destructible
.
destroyAndSend
(
accounts
[
1
],
{
from
:
owner
}
);
let
newBalance
=
web3
.
eth
.
getBalance
(
accounts
[
1
]);
let
newBalance
=
web3
.
eth
.
getBalance
(
accounts
[
1
]);
assert
.
isTrue
(
newBalance
.
greaterThan
(
initBalance
));
assert
.
isTrue
(
newBalance
.
greaterThan
(
initBalance
));
});
});
});
});
test/DetailedERC20.js
View file @
86628468
...
@@ -10,11 +10,11 @@ const DetailedERC20Mock = artifacts.require('./helpers/DetailedERC20Mock.sol');
...
@@ -10,11 +10,11 @@ const DetailedERC20Mock = artifacts.require('./helpers/DetailedERC20Mock.sol');
contract
(
'DetailedERC20'
,
accounts
=>
{
contract
(
'DetailedERC20'
,
accounts
=>
{
let
detailedERC20
=
null
;
let
detailedERC20
=
null
;
const
_name
=
"My Detailed ERC20"
;
const
_name
=
'My Detailed ERC20'
;
const
_symbol
=
"MDT"
;
const
_symbol
=
'MDT'
;
const
_decimals
=
18
;
const
_decimals
=
18
;
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
detailedERC20
=
await
DetailedERC20Mock
.
new
(
_name
,
_symbol
,
_decimals
);
detailedERC20
=
await
DetailedERC20Mock
.
new
(
_name
,
_symbol
,
_decimals
);
});
});
...
@@ -30,6 +30,6 @@ contract('DetailedERC20', accounts => {
...
@@ -30,6 +30,6 @@ contract('DetailedERC20', accounts => {
it
(
'has an amount of decimals'
,
async
function
()
{
it
(
'has an amount of decimals'
,
async
function
()
{
const
decimals
=
await
detailedERC20
.
decimals
();
const
decimals
=
await
detailedERC20
.
decimals
();
decimals
.
should
.
be
.
bignumber
.
equal
(
_decimals
)
decimals
.
should
.
be
.
bignumber
.
equal
(
_decimals
)
;
});
});
});
});
test/ECRecovery.js
View file @
86628468
var
ECRecovery
=
artifacts
.
require
(
"../contracts/ECRecovery.sol"
);
var
ECRecovery
=
artifacts
.
require
(
'../contracts/ECRecovery.sol'
);
var
utils
=
require
(
'ethereumjs-util'
);
var
utils
=
require
(
'ethereumjs-util'
);
var
hashMessage
=
require
(
'./helpers/hashMessage.js'
);
var
hashMessage
=
require
(
'./helpers/hashMessage.js'
);
contract
(
'ECRecovery'
,
function
(
accounts
)
{
contract
(
'ECRecovery'
,
function
(
accounts
)
{
let
ecrecovery
;
let
ecrecovery
;
before
(
async
function
()
{
before
(
async
function
()
{
ecrecovery
=
await
ECRecovery
.
new
();
ecrecovery
=
await
ECRecovery
.
new
();
});
});
it
(
"recover v0"
,
async
function
()
{
it
(
'recover v0'
,
async
function
()
{
// Signature generated outside testrpc with method web3.eth.sign(signer, message)
// Signature generated outside testrpc with method web3.eth.sign(signer, message)
let
signer
=
'0x2cc1166f6212628a0deef2b33befb2187d35b86c'
;
let
signer
=
'0x2cc1166f6212628a0deef2b33befb2187d35b86c'
;
let
message
=
'0x7dbaf558b0a1a5dc7a67202117ab143c1d8605a983e4a743bc06fcc03162dc0d'
;
// web3.sha3('OpenZeppelin')
let
message
=
'0x7dbaf558b0a1a5dc7a67202117ab143c1d8605a983e4a743bc06fcc03162dc0d'
;
// web3.sha3('OpenZeppelin')
...
@@ -18,7 +17,7 @@ contract('ECRecovery', function(accounts) {
...
@@ -18,7 +17,7 @@ contract('ECRecovery', function(accounts) {
assert
.
equal
(
signer
,
await
ecrecovery
.
recover
(
message
,
signature
));
assert
.
equal
(
signer
,
await
ecrecovery
.
recover
(
message
,
signature
));
});
});
it
(
"recover v1"
,
async
function
()
{
it
(
'recover v1'
,
async
function
()
{
// Signature generated outside testrpc with method web3.eth.sign(signer, message)
// Signature generated outside testrpc with method web3.eth.sign(signer, message)
let
signer
=
'0x1e318623ab09fe6de3c9b8672098464aeda9100e'
;
let
signer
=
'0x1e318623ab09fe6de3c9b8672098464aeda9100e'
;
let
message
=
'0x7dbaf558b0a1a5dc7a67202117ab143c1d8605a983e4a743bc06fcc03162dc0d'
;
// web3.sha3('OpenZeppelin')
let
message
=
'0x7dbaf558b0a1a5dc7a67202117ab143c1d8605a983e4a743bc06fcc03162dc0d'
;
// web3.sha3('OpenZeppelin')
...
@@ -26,7 +25,7 @@ contract('ECRecovery', function(accounts) {
...
@@ -26,7 +25,7 @@ contract('ECRecovery', function(accounts) {
assert
.
equal
(
signer
,
await
ecrecovery
.
recover
(
message
,
signature
));
assert
.
equal
(
signer
,
await
ecrecovery
.
recover
(
message
,
signature
));
});
});
it
(
"recover using web3.eth.sign()"
,
async
function
()
{
it
(
'recover using web3.eth.sign()'
,
async
function
()
{
// Create the signature using account[0]
// Create the signature using account[0]
const
signature
=
web3
.
eth
.
sign
(
web3
.
eth
.
accounts
[
0
],
web3
.
sha3
(
'OpenZeppelin'
));
const
signature
=
web3
.
eth
.
sign
(
web3
.
eth
.
accounts
[
0
],
web3
.
sha3
(
'OpenZeppelin'
));
...
@@ -34,7 +33,7 @@ contract('ECRecovery', function(accounts) {
...
@@ -34,7 +33,7 @@ contract('ECRecovery', function(accounts) {
assert
.
equal
(
web3
.
eth
.
accounts
[
0
],
await
ecrecovery
.
recover
(
hashMessage
(
'OpenZeppelin'
),
signature
));
assert
.
equal
(
web3
.
eth
.
accounts
[
0
],
await
ecrecovery
.
recover
(
hashMessage
(
'OpenZeppelin'
),
signature
));
});
});
it
(
"recover using web3.eth.sign() should return wrong signer"
,
async
function
()
{
it
(
'recover using web3.eth.sign() should return wrong signer'
,
async
function
()
{
// Create the signature using account[0]
// Create the signature using account[0]
const
signature
=
web3
.
eth
.
sign
(
web3
.
eth
.
accounts
[
0
],
web3
.
sha3
(
'OpenZeppelin'
));
const
signature
=
web3
.
eth
.
sign
(
web3
.
eth
.
accounts
[
0
],
web3
.
sha3
(
'OpenZeppelin'
));
...
@@ -42,7 +41,7 @@ contract('ECRecovery', function(accounts) {
...
@@ -42,7 +41,7 @@ contract('ECRecovery', function(accounts) {
assert
.
notEqual
(
web3
.
eth
.
accounts
[
0
],
await
ecrecovery
.
recover
(
hashMessage
(
'Test'
),
signature
));
assert
.
notEqual
(
web3
.
eth
.
accounts
[
0
],
await
ecrecovery
.
recover
(
hashMessage
(
'Test'
),
signature
));
});
});
it
(
"recover should fail when a wrong hash is sent"
,
async
function
()
{
it
(
'recover should fail when a wrong hash is sent'
,
async
function
()
{
// Create the signature using account[0]
// Create the signature using account[0]
let
signature
=
web3
.
eth
.
sign
(
web3
.
eth
.
accounts
[
0
],
web3
.
sha3
(
'OpenZeppelin'
));
let
signature
=
web3
.
eth
.
sign
(
web3
.
eth
.
accounts
[
0
],
web3
.
sha3
(
'OpenZeppelin'
));
...
@@ -51,5 +50,4 @@ contract('ECRecovery', function(accounts) {
...
@@ -51,5 +50,4 @@ contract('ECRecovery', function(accounts) {
await
ecrecovery
.
recover
(
hashMessage
(
'OpenZeppelin'
).
substring
(
2
),
signature
)
await
ecrecovery
.
recover
(
hashMessage
(
'OpenZeppelin'
).
substring
(
2
),
signature
)
);
);
});
});
});
});
test/FinalizableCrowdsale.js
View file @
86628468
import
{
advanceBlock
}
from
'./helpers/advanceToBlock'
import
{
advanceBlock
}
from
'./helpers/advanceToBlock'
;
import
{
increaseTimeTo
,
duration
}
from
'./helpers/increaseTime'
import
{
increaseTimeTo
,
duration
}
from
'./helpers/increaseTime'
;
import
latestTime
from
'./helpers/latestTime'
import
latestTime
from
'./helpers/latestTime'
;
import
EVMRevert
from
'./helpers/EVMRevert'
import
EVMRevert
from
'./helpers/EVMRevert'
;
const
BigNumber
=
web3
.
BigNumber
const
BigNumber
=
web3
.
BigNumber
;
const
should
=
require
(
'chai'
)
const
should
=
require
(
'chai'
)
.
use
(
require
(
'chai-as-promised'
))
.
use
(
require
(
'chai-as-promised'
))
.
use
(
require
(
'chai-bignumber'
)(
BigNumber
))
.
use
(
require
(
'chai-bignumber'
)(
BigNumber
))
.
should
()
.
should
()
;
const
FinalizableCrowdsale
=
artifacts
.
require
(
'./helpers/FinalizableCrowdsaleImpl.sol'
)
const
FinalizableCrowdsale
=
artifacts
.
require
(
'./helpers/FinalizableCrowdsaleImpl.sol'
)
;
const
MintableToken
=
artifacts
.
require
(
'MintableToken'
)
const
MintableToken
=
artifacts
.
require
(
'MintableToken'
)
;
contract
(
'FinalizableCrowdsale'
,
function
([
_
,
owner
,
wallet
,
thirdparty
])
{
contract
(
'FinalizableCrowdsale'
,
function
([
_
,
owner
,
wallet
,
thirdparty
])
{
const
rate
=
new
BigNumber
(
1000
);
const
rate
=
new
BigNumber
(
1000
)
before
(
async
function
()
{
// Advance to the next block to correctly read time in the solidity "now" function interpreted by testrpc
before
(
async
function
()
{
await
advanceBlock
();
//Advance to the next block to correctly read time in the solidity "now" function interpreted by testrpc
});
await
advanceBlock
()
})
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
this
.
startTime
=
latestTime
()
+
duration
.
weeks
(
1
)
this
.
startTime
=
latestTime
()
+
duration
.
weeks
(
1
);
this
.
endTime
=
this
.
startTime
+
duration
.
weeks
(
1
)
this
.
endTime
=
this
.
startTime
+
duration
.
weeks
(
1
);
this
.
afterEndTime
=
this
.
endTime
+
duration
.
seconds
(
1
)
this
.
afterEndTime
=
this
.
endTime
+
duration
.
seconds
(
1
);
this
.
crowdsale
=
await
FinalizableCrowdsale
.
new
(
this
.
startTime
,
this
.
endTime
,
rate
,
wallet
,
{
from
:
owner
})
this
.
crowdsale
=
await
FinalizableCrowdsale
.
new
(
this
.
startTime
,
this
.
endTime
,
rate
,
wallet
,
{
from
:
owner
});
this
.
token
=
MintableToken
.
at
(
await
this
.
crowdsale
.
token
())
this
.
token
=
MintableToken
.
at
(
await
this
.
crowdsale
.
token
())
;
})
})
;
it
(
'cannot be finalized before ending'
,
async
function
()
{
it
(
'cannot be finalized before ending'
,
async
function
()
{
await
this
.
crowdsale
.
finalize
({
from
:
owner
}).
should
.
be
.
rejectedWith
(
EVMRevert
)
await
this
.
crowdsale
.
finalize
({
from
:
owner
}).
should
.
be
.
rejectedWith
(
EVMRevert
);
})
})
;
it
(
'cannot be finalized by third party after ending'
,
async
function
()
{
it
(
'cannot be finalized by third party after ending'
,
async
function
()
{
await
increaseTimeTo
(
this
.
afterEndTime
)
await
increaseTimeTo
(
this
.
afterEndTime
)
;
await
this
.
crowdsale
.
finalize
({
from
:
thirdparty
}).
should
.
be
.
rejectedWith
(
EVMRevert
)
await
this
.
crowdsale
.
finalize
({
from
:
thirdparty
}).
should
.
be
.
rejectedWith
(
EVMRevert
);
})
})
;
it
(
'can be finalized by owner after ending'
,
async
function
()
{
it
(
'can be finalized by owner after ending'
,
async
function
()
{
await
increaseTimeTo
(
this
.
afterEndTime
)
await
increaseTimeTo
(
this
.
afterEndTime
)
;
await
this
.
crowdsale
.
finalize
({
from
:
owner
}).
should
.
be
.
fulfilled
await
this
.
crowdsale
.
finalize
({
from
:
owner
}).
should
.
be
.
fulfilled
;
})
})
;
it
(
'cannot be finalized twice'
,
async
function
()
{
it
(
'cannot be finalized twice'
,
async
function
()
{
await
increaseTimeTo
(
this
.
afterEndTime
)
await
increaseTimeTo
(
this
.
afterEndTime
)
;
await
this
.
crowdsale
.
finalize
({
from
:
owner
})
await
this
.
crowdsale
.
finalize
({
from
:
owner
});
await
this
.
crowdsale
.
finalize
({
from
:
owner
}).
should
.
be
.
rejectedWith
(
EVMRevert
)
await
this
.
crowdsale
.
finalize
({
from
:
owner
}).
should
.
be
.
rejectedWith
(
EVMRevert
);
})
})
;
it
(
'logs finalized'
,
async
function
()
{
it
(
'logs finalized'
,
async
function
()
{
await
increaseTimeTo
(
this
.
afterEndTime
)
await
increaseTimeTo
(
this
.
afterEndTime
);
const
{
logs
}
=
await
this
.
crowdsale
.
finalize
({
from
:
owner
})
const
{
logs
}
=
await
this
.
crowdsale
.
finalize
({
from
:
owner
});
const
event
=
logs
.
find
(
e
=>
e
.
event
===
'Finalized'
)
const
event
=
logs
.
find
(
e
=>
e
.
event
===
'Finalized'
);
should
.
exist
(
event
)
should
.
exist
(
event
);
})
});
});
})
test/HasNoContracts.js
View file @
86628468
'use strict'
;
import
expectThrow
from
'./helpers/expectThrow'
;
import
expectThrow
from
'./helpers/expectThrow'
;
import
toPromise
from
'./helpers/toPromise'
;
import
toPromise
from
'./helpers/toPromise'
;
const
Ownable
=
artifacts
.
require
(
'../contracts/ownership/Ownable.sol'
);
const
Ownable
=
artifacts
.
require
(
'../contracts/ownership/Ownable.sol'
);
...
@@ -6,7 +6,7 @@ const HasNoContracts = artifacts.require(
...
@@ -6,7 +6,7 @@ const HasNoContracts = artifacts.require(
'../contracts/ownership/HasNoContracts.sol'
,
'../contracts/ownership/HasNoContracts.sol'
,
);
);
contract
(
'HasNoContracts'
,
function
(
accounts
)
{
contract
(
'HasNoContracts'
,
function
(
accounts
)
{
let
hasNoContracts
=
null
;
let
hasNoContracts
=
null
;
let
ownable
=
null
;
let
ownable
=
null
;
...
@@ -21,15 +21,15 @@ contract('HasNoContracts', function(accounts) {
...
@@ -21,15 +21,15 @@ contract('HasNoContracts', function(accounts) {
assert
.
equal
(
owner
,
hasNoContracts
.
address
);
assert
.
equal
(
owner
,
hasNoContracts
.
address
);
});
});
it
(
'should allow owner to reclaim contracts'
,
async
function
()
{
it
(
'should allow owner to reclaim contracts'
,
async
function
()
{
await
hasNoContracts
.
reclaimContract
(
ownable
.
address
);
await
hasNoContracts
.
reclaimContract
(
ownable
.
address
);
const
owner
=
await
ownable
.
owner
();
const
owner
=
await
ownable
.
owner
();
assert
.
equal
(
owner
,
accounts
[
0
]);
assert
.
equal
(
owner
,
accounts
[
0
]);
});
});
it
(
'should allow only owner to reclaim contracts'
,
async
function
()
{
it
(
'should allow only owner to reclaim contracts'
,
async
function
()
{
await
expectThrow
(
await
expectThrow
(
hasNoContracts
.
reclaimContract
(
ownable
.
address
,
{
from
:
accounts
[
1
]
}),
hasNoContracts
.
reclaimContract
(
ownable
.
address
,
{
from
:
accounts
[
1
]
}),
);
);
});
});
});
});
test/HasNoEther.js
View file @
86628468
'use strict'
;
import
expectThrow
from
'./helpers/expectThrow'
;
import
expectThrow
from
'./helpers/expectThrow'
;
import
toPromise
from
'./helpers/toPromise'
;
import
toPromise
from
'./helpers/toPromise'
;
const
HasNoEther
=
artifacts
.
require
(
'../contracts/lifecycle/HasNoEther.sol'
);
const
HasNoEther
=
artifacts
.
require
(
'../contracts/lifecycle/HasNoEther.sol'
);
const
HasNoEtherTest
=
artifacts
.
require
(
'../helpers/HasNoEtherTest.sol'
);
const
HasNoEtherTest
=
artifacts
.
require
(
'../helpers/HasNoEtherTest.sol'
);
const
ForceEther
=
artifacts
.
require
(
'../helpers/ForceEther.sol'
);
const
ForceEther
=
artifacts
.
require
(
'../helpers/ForceEther.sol'
);
contract
(
'HasNoEther'
,
function
(
accounts
)
{
contract
(
'HasNoEther'
,
function
(
accounts
)
{
const
amount
=
web3
.
toWei
(
'1'
,
'ether'
);
const
amount
=
web3
.
toWei
(
'1'
,
'ether'
);
it
(
'should be constructorable'
,
async
function
()
{
it
(
'should be constructorable'
,
async
function
()
{
let
hasNoEther
=
await
HasNoEtherTest
.
new
();
let
hasNoEther
=
await
HasNoEtherTest
.
new
();
});
});
it
(
'should not accept ether in constructor'
,
async
function
()
{
it
(
'should not accept ether in constructor'
,
async
function
()
{
await
expectThrow
(
HasNoEtherTest
.
new
({
value
:
amount
}));
await
expectThrow
(
HasNoEtherTest
.
new
({
value
:
amount
}));
});
});
it
(
'should not accept ether'
,
async
function
()
{
it
(
'should not accept ether'
,
async
function
()
{
let
hasNoEther
=
await
HasNoEtherTest
.
new
();
let
hasNoEther
=
await
HasNoEtherTest
.
new
();
await
expectThrow
(
await
expectThrow
(
...
@@ -28,14 +28,14 @@ contract('HasNoEther', function(accounts) {
...
@@ -28,14 +28,14 @@ contract('HasNoEther', function(accounts) {
);
);
});
});
it
(
'should allow owner to reclaim ether'
,
async
function
()
{
it
(
'should allow owner to reclaim ether'
,
async
function
()
{
// Create contract
// Create contract
let
hasNoEther
=
await
HasNoEtherTest
.
new
();
let
hasNoEther
=
await
HasNoEtherTest
.
new
();
const
startBalance
=
await
web3
.
eth
.
getBalance
(
hasNoEther
.
address
);
const
startBalance
=
await
web3
.
eth
.
getBalance
(
hasNoEther
.
address
);
assert
.
equal
(
startBalance
,
0
);
assert
.
equal
(
startBalance
,
0
);
// Force ether into it
// Force ether into it
let
forceEther
=
await
ForceEther
.
new
({
value
:
amount
});
let
forceEther
=
await
ForceEther
.
new
({
value
:
amount
});
await
forceEther
.
destroyAndSend
(
hasNoEther
.
address
);
await
forceEther
.
destroyAndSend
(
hasNoEther
.
address
);
const
forcedBalance
=
await
web3
.
eth
.
getBalance
(
hasNoEther
.
address
);
const
forcedBalance
=
await
web3
.
eth
.
getBalance
(
hasNoEther
.
address
);
assert
.
equal
(
forcedBalance
,
amount
);
assert
.
equal
(
forcedBalance
,
amount
);
...
@@ -49,17 +49,17 @@ contract('HasNoEther', function(accounts) {
...
@@ -49,17 +49,17 @@ contract('HasNoEther', function(accounts) {
assert
.
isAbove
(
ownerFinalBalance
,
ownerStartBalance
);
assert
.
isAbove
(
ownerFinalBalance
,
ownerStartBalance
);
});
});
it
(
'should allow only owner to reclaim ether'
,
async
function
()
{
it
(
'should allow only owner to reclaim ether'
,
async
function
()
{
// Create contract
// Create contract
let
hasNoEther
=
await
HasNoEtherTest
.
new
({
from
:
accounts
[
0
]
});
let
hasNoEther
=
await
HasNoEtherTest
.
new
({
from
:
accounts
[
0
]
});
// Force ether into it
// Force ether into it
let
forceEther
=
await
ForceEther
.
new
({
value
:
amount
});
let
forceEther
=
await
ForceEther
.
new
({
value
:
amount
});
await
forceEther
.
destroyAndSend
(
hasNoEther
.
address
);
await
forceEther
.
destroyAndSend
(
hasNoEther
.
address
);
const
forcedBalance
=
await
web3
.
eth
.
getBalance
(
hasNoEther
.
address
);
const
forcedBalance
=
await
web3
.
eth
.
getBalance
(
hasNoEther
.
address
);
assert
.
equal
(
forcedBalance
,
amount
);
assert
.
equal
(
forcedBalance
,
amount
);
// Reclaim
// Reclaim
await
expectThrow
(
hasNoEther
.
reclaimEther
({
from
:
accounts
[
1
]
}));
await
expectThrow
(
hasNoEther
.
reclaimEther
({
from
:
accounts
[
1
]
}));
});
});
});
});
test/HasNoTokens.js
View file @
86628468
'use strict'
;
import
expectThrow
from
'./helpers/expectThrow'
;
import
expectThrow
from
'./helpers/expectThrow'
;
import
toPromise
from
'./helpers/toPromise'
;
import
toPromise
from
'./helpers/toPromise'
;
const
HasNoTokens
=
artifacts
.
require
(
'../contracts/lifecycle/HasNoTokens.sol'
);
const
HasNoTokens
=
artifacts
.
require
(
'../contracts/lifecycle/HasNoTokens.sol'
);
const
ERC23TokenMock
=
artifacts
.
require
(
'./helpers/ERC23TokenMock.sol'
);
const
ERC23TokenMock
=
artifacts
.
require
(
'./helpers/ERC23TokenMock.sol'
);
contract
(
'HasNoTokens'
,
function
(
accounts
)
{
contract
(
'HasNoTokens'
,
function
(
accounts
)
{
let
hasNoTokens
=
null
;
let
hasNoTokens
=
null
;
let
token
=
null
;
let
token
=
null
;
...
@@ -19,11 +19,11 @@ contract('HasNoTokens', function(accounts) {
...
@@ -19,11 +19,11 @@ contract('HasNoTokens', function(accounts) {
assert
.
equal
(
startBalance
,
10
);
assert
.
equal
(
startBalance
,
10
);
});
});
it
(
'should not accept ERC23 tokens'
,
async
function
()
{
it
(
'should not accept ERC23 tokens'
,
async
function
()
{
await
expectThrow
(
token
.
transferERC23
(
hasNoTokens
.
address
,
10
,
''
));
await
expectThrow
(
token
.
transferERC23
(
hasNoTokens
.
address
,
10
,
''
));
});
});
it
(
'should allow owner to reclaim tokens'
,
async
function
()
{
it
(
'should allow owner to reclaim tokens'
,
async
function
()
{
const
ownerStartBalance
=
await
token
.
balanceOf
(
accounts
[
0
]);
const
ownerStartBalance
=
await
token
.
balanceOf
(
accounts
[
0
]);
await
hasNoTokens
.
reclaimToken
(
token
.
address
);
await
hasNoTokens
.
reclaimToken
(
token
.
address
);
const
ownerFinalBalance
=
await
token
.
balanceOf
(
accounts
[
0
]);
const
ownerFinalBalance
=
await
token
.
balanceOf
(
accounts
[
0
]);
...
@@ -32,9 +32,9 @@ contract('HasNoTokens', function(accounts) {
...
@@ -32,9 +32,9 @@ contract('HasNoTokens', function(accounts) {
assert
.
equal
(
ownerFinalBalance
-
ownerStartBalance
,
10
);
assert
.
equal
(
ownerFinalBalance
-
ownerStartBalance
,
10
);
});
});
it
(
'should allow only owner to reclaim tokens'
,
async
function
()
{
it
(
'should allow only owner to reclaim tokens'
,
async
function
()
{
await
expectThrow
(
await
expectThrow
(
hasNoTokens
.
reclaimToken
(
token
.
address
,
{
from
:
accounts
[
1
]
}),
hasNoTokens
.
reclaimToken
(
token
.
address
,
{
from
:
accounts
[
1
]
}),
);
);
});
});
});
});
test/LimitBalance.js
View file @
86628468
'use strict'
;
var
LimitBalanceMock
=
artifacts
.
require
(
'helpers/LimitBalanceMock.sol'
);
var
LimitBalanceMock
=
artifacts
.
require
(
'helpers/LimitBalanceMock.sol'
);
const
assertRevert
=
require
(
'./helpers/assertRevert'
);
const
assertRevert
=
require
(
'./helpers/assertRevert'
);
contract
(
'LimitBalance'
,
function
(
accounts
)
{
contract
(
'LimitBalance'
,
function
(
accounts
)
{
let
lb
;
let
lb
;
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
lb
=
await
LimitBalanceMock
.
new
();
lb
=
await
LimitBalanceMock
.
new
();
});
});
let
LIMIT
=
1000
;
let
LIMIT
=
1000
;
it
(
'should expose limit'
,
async
function
()
{
it
(
'should expose limit'
,
async
function
()
{
let
limit
=
await
lb
.
limit
();
let
limit
=
await
lb
.
limit
();
assert
.
equal
(
limit
,
LIMIT
);
assert
.
equal
(
limit
,
LIMIT
);
});
});
it
(
'should allow sending below limit'
,
async
function
()
{
it
(
'should allow sending below limit'
,
async
function
()
{
let
amount
=
1
;
let
amount
=
1
;
await
lb
.
limitedDeposit
({
value
:
amount
});
await
lb
.
limitedDeposit
({
value
:
amount
});
assert
.
equal
(
web3
.
eth
.
getBalance
(
lb
.
address
),
amount
);
assert
.
equal
(
web3
.
eth
.
getBalance
(
lb
.
address
),
amount
);
});
});
it
(
'shouldnt allow sending above limit'
,
async
function
()
{
it
(
'shouldnt allow sending above limit'
,
async
function
()
{
let
amount
=
1110
;
let
amount
=
1110
;
try
{
try
{
await
lb
.
limitedDeposit
({
value
:
amount
});
await
lb
.
limitedDeposit
({
value
:
amount
});
assert
.
fail
(
'should have thrown before'
);
assert
.
fail
(
'should have thrown before'
);
}
catch
(
error
)
{
}
catch
(
error
)
{
assertRevert
(
error
);
assertRevert
(
error
);
}
}
});
});
it
(
'should allow multiple sends below limit'
,
async
function
()
{
it
(
'should allow multiple sends below limit'
,
async
function
()
{
let
amount
=
500
;
let
amount
=
500
;
await
lb
.
limitedDeposit
({
value
:
amount
});
await
lb
.
limitedDeposit
({
value
:
amount
});
assert
.
equal
(
web3
.
eth
.
getBalance
(
lb
.
address
),
amount
);
assert
.
equal
(
web3
.
eth
.
getBalance
(
lb
.
address
),
amount
);
await
lb
.
limitedDeposit
({
value
:
amount
});
await
lb
.
limitedDeposit
({
value
:
amount
});
assert
.
equal
(
web3
.
eth
.
getBalance
(
lb
.
address
),
amount
*
2
);
assert
.
equal
(
web3
.
eth
.
getBalance
(
lb
.
address
),
amount
*
2
);
});
});
it
(
'shouldnt allow multiple sends above limit'
,
async
function
()
{
it
(
'shouldnt allow multiple sends above limit'
,
async
function
()
{
let
amount
=
500
;
let
amount
=
500
;
await
lb
.
limitedDeposit
({
value
:
amount
});
await
lb
.
limitedDeposit
({
value
:
amount
});
assert
.
equal
(
web3
.
eth
.
getBalance
(
lb
.
address
),
amount
);
assert
.
equal
(
web3
.
eth
.
getBalance
(
lb
.
address
),
amount
);
try
{
try
{
await
lb
.
limitedDeposit
({
value
:
amount
+
1
});
await
lb
.
limitedDeposit
({
value
:
amount
+
1
});
assert
.
fail
(
'should have thrown before'
);
assert
.
fail
(
'should have thrown before'
);
}
catch
(
error
)
{
}
catch
(
error
)
{
assertRevert
(
error
);
assertRevert
(
error
);
}
}
});
});
});
});
test/MerkleProof.js
View file @
86628468
var
MerkleProof
=
artifacts
.
require
(
"./MerkleProof.sol"
);
var
MerkleProof
=
artifacts
.
require
(
'./MerkleProof.sol'
);
import
MerkleTree
from
"./helpers/merkleTree.js"
;
import
MerkleTree
from
'./helpers/merkleTree.js'
;
import
{
sha3
,
bufferToHex
}
from
"ethereumjs-util"
;
import
{
sha3
,
bufferToHex
}
from
'ethereumjs-util'
;
contract
(
'MerkleProof'
,
function
(
accounts
)
{
contract
(
'MerkleProof'
,
function
(
accounts
)
{
let
merkleProof
;
let
merkleProof
;
before
(
async
function
()
{
before
(
async
function
()
{
merkleProof
=
await
MerkleProof
.
new
();
merkleProof
=
await
MerkleProof
.
new
();
});
});
describe
(
"verifyProof"
,
function
()
{
describe
(
'verifyProof'
,
function
()
{
it
(
"should return true for a valid Merkle proof"
,
async
function
()
{
it
(
'should return true for a valid Merkle proof'
,
async
function
()
{
const
elements
=
[
"a"
,
"b"
,
"c"
,
"d"
];
const
elements
=
[
'a'
,
'b'
,
'c'
,
'd'
];
const
merkleTree
=
new
MerkleTree
(
elements
);
const
merkleTree
=
new
MerkleTree
(
elements
);
const
root
=
merkleTree
.
getHexRoot
();
const
root
=
merkleTree
.
getHexRoot
();
...
@@ -22,28 +22,28 @@ contract('MerkleProof', function(accounts) {
...
@@ -22,28 +22,28 @@ contract('MerkleProof', function(accounts) {
const
leaf
=
bufferToHex
(
sha3
(
elements
[
0
]));
const
leaf
=
bufferToHex
(
sha3
(
elements
[
0
]));
const
result
=
await
merkleProof
.
verifyProof
(
proof
,
root
,
leaf
);
const
result
=
await
merkleProof
.
verifyProof
(
proof
,
root
,
leaf
);
assert
.
isOk
(
result
,
"verifyProof did not return true for a valid proof"
);
assert
.
isOk
(
result
,
'verifyProof did not return true for a valid proof'
);
});
});
it
(
"should return false for an invalid Merkle proof"
,
async
function
()
{
it
(
'should return false for an invalid Merkle proof'
,
async
function
()
{
const
correctElements
=
[
"a"
,
"b"
,
"c"
]
const
correctElements
=
[
'a'
,
'b'
,
'c'
];
const
correctMerkleTree
=
new
MerkleTree
(
correctElements
);
const
correctMerkleTree
=
new
MerkleTree
(
correctElements
);
const
correctRoot
=
correctMerkleTree
.
getHexRoot
();
const
correctRoot
=
correctMerkleTree
.
getHexRoot
();
const
correctLeaf
=
bufferToHex
(
sha3
(
correctElements
[
0
]));
const
correctLeaf
=
bufferToHex
(
sha3
(
correctElements
[
0
]));
const
badElements
=
[
"d"
,
"e"
,
"f"
]
const
badElements
=
[
'd'
,
'e'
,
'f'
];
const
badMerkleTree
=
new
MerkleTree
(
badElements
)
const
badMerkleTree
=
new
MerkleTree
(
badElements
)
;
const
badProof
=
badMerkleTree
.
getHexProof
(
badElements
[
0
])
const
badProof
=
badMerkleTree
.
getHexProof
(
badElements
[
0
])
;
const
result
=
await
merkleProof
.
verifyProof
(
badProof
,
correctRoot
,
correctLeaf
);
const
result
=
await
merkleProof
.
verifyProof
(
badProof
,
correctRoot
,
correctLeaf
);
assert
.
isNotOk
(
result
,
"verifyProof did not return false for an invalid proof"
);
assert
.
isNotOk
(
result
,
'verifyProof did not return false for an invalid proof'
);
});
});
it
(
"should return false for a Merkle proof of invalid length"
,
async
function
()
{
it
(
'should return false for a Merkle proof of invalid length'
,
async
function
()
{
const
elements
=
[
"a"
,
"b"
,
"c"
]
const
elements
=
[
'a'
,
'b'
,
'c'
];
const
merkleTree
=
new
MerkleTree
(
elements
);
const
merkleTree
=
new
MerkleTree
(
elements
);
const
root
=
merkleTree
.
getHexRoot
();
const
root
=
merkleTree
.
getHexRoot
();
...
@@ -54,7 +54,7 @@ contract('MerkleProof', function(accounts) {
...
@@ -54,7 +54,7 @@ contract('MerkleProof', function(accounts) {
const
leaf
=
bufferToHex
(
sha3
(
elements
[
0
]));
const
leaf
=
bufferToHex
(
sha3
(
elements
[
0
]));
const
result
=
await
merkleProof
.
verifyProof
(
badProof
,
root
,
leaf
);
const
result
=
await
merkleProof
.
verifyProof
(
badProof
,
root
,
leaf
);
assert
.
isNotOk
(
result
,
"verifyProof did not return false for proof of invalid length"
);
assert
.
isNotOk
(
result
,
'verifyProof did not return false for proof of invalid length'
);
})
})
;
});
});
});
});
test/MintableToken.js
View file @
86628468
'use strict'
;
import
expectThrow
from
'./helpers/expectThrow'
;
import
expectThrow
from
'./helpers/expectThrow'
;
var
MintableToken
=
artifacts
.
require
(
'../contracts/Tokens/MintableToken.sol'
);
var
MintableToken
=
artifacts
.
require
(
'../contracts/Tokens/MintableToken.sol'
);
contract
(
'Mintable'
,
function
(
accounts
)
{
contract
(
'Mintable'
,
function
(
accounts
)
{
let
token
;
let
token
;
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
token
=
await
MintableToken
.
new
();
token
=
await
MintableToken
.
new
();
});
});
it
(
'should start with a totalSupply of 0'
,
async
function
()
{
it
(
'should start with a totalSupply of 0'
,
async
function
()
{
let
totalSupply
=
await
token
.
totalSupply
();
let
totalSupply
=
await
token
.
totalSupply
();
assert
.
equal
(
totalSupply
,
0
);
assert
.
equal
(
totalSupply
,
0
);
});
});
it
(
'should return mintingFinished false after construction'
,
async
function
()
{
it
(
'should return mintingFinished false after construction'
,
async
function
()
{
let
mintingFinished
=
await
token
.
mintingFinished
();
let
mintingFinished
=
await
token
.
mintingFinished
();
assert
.
equal
(
mintingFinished
,
false
);
assert
.
equal
(
mintingFinished
,
false
);
});
});
it
(
'should mint a given amount of tokens to a given address'
,
async
function
()
{
it
(
'should mint a given amount of tokens to a given address'
,
async
function
()
{
const
result
=
await
token
.
mint
(
accounts
[
0
],
100
);
const
result
=
await
token
.
mint
(
accounts
[
0
],
100
);
assert
.
equal
(
result
.
logs
[
0
].
event
,
'Mint'
);
assert
.
equal
(
result
.
logs
[
0
].
event
,
'Mint'
);
assert
.
equal
(
result
.
logs
[
0
].
args
.
to
.
valueOf
(),
accounts
[
0
]);
assert
.
equal
(
result
.
logs
[
0
].
args
.
to
.
valueOf
(),
accounts
[
0
]);
...
@@ -35,12 +34,11 @@ contract('Mintable', function(accounts) {
...
@@ -35,12 +34,11 @@ contract('Mintable', function(accounts) {
let
totalSupply
=
await
token
.
totalSupply
();
let
totalSupply
=
await
token
.
totalSupply
();
assert
(
totalSupply
,
100
);
assert
(
totalSupply
,
100
);
})
})
;
it
(
'should fail to mint after call to finishMinting'
,
async
function
()
{
it
(
'should fail to mint after call to finishMinting'
,
async
function
()
{
await
token
.
finishMinting
();
await
token
.
finishMinting
();
assert
.
equal
(
await
token
.
mintingFinished
(),
true
);
assert
.
equal
(
await
token
.
mintingFinished
(),
true
);
await
expectThrow
(
token
.
mint
(
accounts
[
0
],
100
));
await
expectThrow
(
token
.
mint
(
accounts
[
0
],
100
));
})
});
});
});
test/Ownable.js
View file @
86628468
'use strict'
;
const
assertRevert
=
require
(
'./helpers/assertRevert'
);
const
assertRevert
=
require
(
'./helpers/assertRevert'
);
var
Ownable
=
artifacts
.
require
(
'../contracts/ownership/Ownable.sol'
);
var
Ownable
=
artifacts
.
require
(
'../contracts/ownership/Ownable.sol'
);
contract
(
'Ownable'
,
function
(
accounts
)
{
contract
(
'Ownable'
,
function
(
accounts
)
{
let
ownable
;
let
ownable
;
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
ownable
=
await
Ownable
.
new
();
ownable
=
await
Ownable
.
new
();
});
});
it
(
'should have an owner'
,
async
function
()
{
it
(
'should have an owner'
,
async
function
()
{
let
owner
=
await
ownable
.
owner
();
let
owner
=
await
ownable
.
owner
();
assert
.
isTrue
(
owner
!==
0
);
assert
.
isTrue
(
owner
!==
0
);
});
});
it
(
'changes owner after transfer'
,
async
function
()
{
it
(
'changes owner after transfer'
,
async
function
()
{
let
other
=
accounts
[
1
];
let
other
=
accounts
[
1
];
await
ownable
.
transferOwnership
(
other
);
await
ownable
.
transferOwnership
(
other
);
let
owner
=
await
ownable
.
owner
();
let
owner
=
await
ownable
.
owner
();
...
@@ -23,26 +23,25 @@ contract('Ownable', function(accounts) {
...
@@ -23,26 +23,25 @@ contract('Ownable', function(accounts) {
assert
.
isTrue
(
owner
===
other
);
assert
.
isTrue
(
owner
===
other
);
});
});
it
(
'should prevent non-owners from transfering'
,
async
function
()
{
it
(
'should prevent non-owners from transfering'
,
async
function
()
{
const
other
=
accounts
[
2
];
const
other
=
accounts
[
2
];
const
owner
=
await
ownable
.
owner
.
call
();
const
owner
=
await
ownable
.
owner
.
call
();
assert
.
isTrue
(
owner
!==
other
);
assert
.
isTrue
(
owner
!==
other
);
try
{
try
{
await
ownable
.
transferOwnership
(
other
,
{
from
:
other
});
await
ownable
.
transferOwnership
(
other
,
{
from
:
other
});
assert
.
fail
(
'should have thrown before'
);
assert
.
fail
(
'should have thrown before'
);
}
catch
(
error
)
{
}
catch
(
error
)
{
assertRevert
(
error
);
assertRevert
(
error
);
}
}
});
});
it
(
'should guard ownership against stuck state'
,
async
function
()
{
it
(
'should guard ownership against stuck state'
,
async
function
()
{
let
originalOwner
=
await
ownable
.
owner
();
let
originalOwner
=
await
ownable
.
owner
();
try
{
try
{
await
ownable
.
transferOwnership
(
null
,
{
from
:
originalOwner
});
await
ownable
.
transferOwnership
(
null
,
{
from
:
originalOwner
});
assert
.
fail
();
assert
.
fail
();
}
catch
(
error
)
{
}
catch
(
error
)
{
assertRevert
(
error
);
assertRevert
(
error
);
}
}
});
});
});
});
test/Pausable.js
View file @
86628468
'use strict'
;
const
assertRevert
=
require
(
'./helpers/assertRevert'
);
const
assertRevert
=
require
(
'./helpers/assertRevert'
);
const
PausableMock
=
artifacts
.
require
(
'helpers/PausableMock.sol'
);
const
PausableMock
=
artifacts
.
require
(
'helpers/PausableMock.sol'
);
contract
(
'Pausable'
,
function
(
accounts
)
{
contract
(
'Pausable'
,
function
(
accounts
)
{
it
(
'can perform normal process in non-pause'
,
async
function
()
{
it
(
'can perform normal process in non-pause'
,
async
function
()
{
let
Pausable
=
await
PausableMock
.
new
();
let
Pausable
=
await
PausableMock
.
new
();
let
count0
=
await
Pausable
.
count
();
let
count0
=
await
Pausable
.
count
();
assert
.
equal
(
count0
,
0
);
assert
.
equal
(
count0
,
0
);
...
@@ -15,7 +13,7 @@ contract('Pausable', function(accounts) {
...
@@ -15,7 +13,7 @@ contract('Pausable', function(accounts) {
assert
.
equal
(
count1
,
1
);
assert
.
equal
(
count1
,
1
);
});
});
it
(
'can not perform normal process in pause'
,
async
function
()
{
it
(
'can not perform normal process in pause'
,
async
function
()
{
let
Pausable
=
await
PausableMock
.
new
();
let
Pausable
=
await
PausableMock
.
new
();
await
Pausable
.
pause
();
await
Pausable
.
pause
();
let
count0
=
await
Pausable
.
count
();
let
count0
=
await
Pausable
.
count
();
...
@@ -24,27 +22,26 @@ contract('Pausable', function(accounts) {
...
@@ -24,27 +22,26 @@ contract('Pausable', function(accounts) {
try
{
try
{
await
Pausable
.
normalProcess
();
await
Pausable
.
normalProcess
();
assert
.
fail
(
'should have thrown before'
);
assert
.
fail
(
'should have thrown before'
);
}
catch
(
error
)
{
}
catch
(
error
)
{
assertRevert
(
error
);
assertRevert
(
error
);
}
}
let
count1
=
await
Pausable
.
count
();
let
count1
=
await
Pausable
.
count
();
assert
.
equal
(
count1
,
0
);
assert
.
equal
(
count1
,
0
);
});
});
it
(
'can not take drastic measure in non-pause'
,
async
function
()
{
it
(
'can not take drastic measure in non-pause'
,
async
function
()
{
let
Pausable
=
await
PausableMock
.
new
();
let
Pausable
=
await
PausableMock
.
new
();
try
{
try
{
await
Pausable
.
drasticMeasure
();
await
Pausable
.
drasticMeasure
();
assert
.
fail
(
'should have thrown before'
);
assert
.
fail
(
'should have thrown before'
);
}
catch
(
error
)
{
}
catch
(
error
)
{
assertRevert
(
error
);
assertRevert
(
error
);
}
}
const
drasticMeasureTaken
=
await
Pausable
.
drasticMeasureTaken
();
const
drasticMeasureTaken
=
await
Pausable
.
drasticMeasureTaken
();
assert
.
isFalse
(
drasticMeasureTaken
);
assert
.
isFalse
(
drasticMeasureTaken
);
});
});
it
(
'can take a drastic measure in a pause'
,
async
function
()
{
it
(
'can take a drastic measure in a pause'
,
async
function
()
{
let
Pausable
=
await
PausableMock
.
new
();
let
Pausable
=
await
PausableMock
.
new
();
await
Pausable
.
pause
();
await
Pausable
.
pause
();
await
Pausable
.
drasticMeasure
();
await
Pausable
.
drasticMeasure
();
...
@@ -53,7 +50,7 @@ contract('Pausable', function(accounts) {
...
@@ -53,7 +50,7 @@ contract('Pausable', function(accounts) {
assert
.
isTrue
(
drasticMeasureTaken
);
assert
.
isTrue
(
drasticMeasureTaken
);
});
});
it
(
'should resume allowing normal process after pause is over'
,
async
function
()
{
it
(
'should resume allowing normal process after pause is over'
,
async
function
()
{
let
Pausable
=
await
PausableMock
.
new
();
let
Pausable
=
await
PausableMock
.
new
();
await
Pausable
.
pause
();
await
Pausable
.
pause
();
await
Pausable
.
unpause
();
await
Pausable
.
unpause
();
...
@@ -63,19 +60,18 @@ contract('Pausable', function(accounts) {
...
@@ -63,19 +60,18 @@ contract('Pausable', function(accounts) {
assert
.
equal
(
count0
,
1
);
assert
.
equal
(
count0
,
1
);
});
});
it
(
'should prevent drastic measure after pause is over'
,
async
function
()
{
it
(
'should prevent drastic measure after pause is over'
,
async
function
()
{
let
Pausable
=
await
PausableMock
.
new
();
let
Pausable
=
await
PausableMock
.
new
();
await
Pausable
.
pause
();
await
Pausable
.
pause
();
await
Pausable
.
unpause
();
await
Pausable
.
unpause
();
try
{
try
{
await
Pausable
.
drasticMeasure
();
await
Pausable
.
drasticMeasure
();
assert
.
fail
(
'should have thrown before'
);
assert
.
fail
(
'should have thrown before'
);
}
catch
(
error
)
{
}
catch
(
error
)
{
assertRevert
(
error
);
assertRevert
(
error
);
}
}
const
drasticMeasureTaken
=
await
Pausable
.
drasticMeasureTaken
();
const
drasticMeasureTaken
=
await
Pausable
.
drasticMeasureTaken
();
assert
.
isFalse
(
drasticMeasureTaken
);
assert
.
isFalse
(
drasticMeasureTaken
);
});
});
});
});
test/PausableToken.js
View file @
86628468
...
@@ -3,27 +3,27 @@
...
@@ -3,27 +3,27 @@
const
assertRevert
=
require
(
'./helpers/assertRevert'
);
const
assertRevert
=
require
(
'./helpers/assertRevert'
);
var
PausableTokenMock
=
artifacts
.
require
(
'./helpers/PausableTokenMock.sol'
);
var
PausableTokenMock
=
artifacts
.
require
(
'./helpers/PausableTokenMock.sol'
);
contract
(
'PausableToken'
,
function
(
accounts
)
{
contract
(
'PausableToken'
,
function
(
accounts
)
{
let
token
;
let
token
;
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
token
=
await
PausableTokenMock
.
new
(
accounts
[
0
],
100
);
token
=
await
PausableTokenMock
.
new
(
accounts
[
0
],
100
);
});
});
it
(
'should return paused false after construction'
,
async
function
()
{
it
(
'should return paused false after construction'
,
async
function
()
{
let
paused
=
await
token
.
paused
();
let
paused
=
await
token
.
paused
();
assert
.
equal
(
paused
,
false
);
assert
.
equal
(
paused
,
false
);
});
});
it
(
'should return paused true after pause'
,
async
function
()
{
it
(
'should return paused true after pause'
,
async
function
()
{
await
token
.
pause
();
await
token
.
pause
();
let
paused
=
await
token
.
paused
();
let
paused
=
await
token
.
paused
();
assert
.
equal
(
paused
,
true
);
assert
.
equal
(
paused
,
true
);
});
});
it
(
'should return paused false after pause and unpause'
,
async
function
()
{
it
(
'should return paused false after pause and unpause'
,
async
function
()
{
await
token
.
pause
();
await
token
.
pause
();
await
token
.
unpause
();
await
token
.
unpause
();
let
paused
=
await
token
.
paused
();
let
paused
=
await
token
.
paused
();
...
@@ -31,7 +31,7 @@ contract('PausableToken', function(accounts) {
...
@@ -31,7 +31,7 @@ contract('PausableToken', function(accounts) {
assert
.
equal
(
paused
,
false
);
assert
.
equal
(
paused
,
false
);
});
});
it
(
'should be able to transfer if transfers are unpaused'
,
async
function
()
{
it
(
'should be able to transfer if transfers are unpaused'
,
async
function
()
{
await
token
.
transfer
(
accounts
[
1
],
100
);
await
token
.
transfer
(
accounts
[
1
],
100
);
let
balance0
=
await
token
.
balanceOf
(
accounts
[
0
]);
let
balance0
=
await
token
.
balanceOf
(
accounts
[
0
]);
assert
.
equal
(
balance0
,
0
);
assert
.
equal
(
balance0
,
0
);
...
@@ -40,7 +40,7 @@ contract('PausableToken', function(accounts) {
...
@@ -40,7 +40,7 @@ contract('PausableToken', function(accounts) {
assert
.
equal
(
balance1
,
100
);
assert
.
equal
(
balance1
,
100
);
});
});
it
(
'should be able to transfer after transfers are paused and unpaused'
,
async
function
()
{
it
(
'should be able to transfer after transfers are paused and unpaused'
,
async
function
()
{
await
token
.
pause
();
await
token
.
pause
();
await
token
.
unpause
();
await
token
.
unpause
();
await
token
.
transfer
(
accounts
[
1
],
100
);
await
token
.
transfer
(
accounts
[
1
],
100
);
...
@@ -51,7 +51,7 @@ contract('PausableToken', function(accounts) {
...
@@ -51,7 +51,7 @@ contract('PausableToken', function(accounts) {
assert
.
equal
(
balance1
,
100
);
assert
.
equal
(
balance1
,
100
);
});
});
it
(
'should throw an error trying to transfer while transactions are paused'
,
async
function
()
{
it
(
'should throw an error trying to transfer while transactions are paused'
,
async
function
()
{
await
token
.
pause
();
await
token
.
pause
();
try
{
try
{
await
token
.
transfer
(
accounts
[
1
],
100
);
await
token
.
transfer
(
accounts
[
1
],
100
);
...
@@ -61,7 +61,7 @@ contract('PausableToken', function(accounts) {
...
@@ -61,7 +61,7 @@ contract('PausableToken', function(accounts) {
}
}
});
});
it
(
'should throw an error trying to transfer from another account while transactions are paused'
,
async
function
()
{
it
(
'should throw an error trying to transfer from another account while transactions are paused'
,
async
function
()
{
await
token
.
pause
();
await
token
.
pause
();
try
{
try
{
await
token
.
transferFrom
(
accounts
[
0
],
accounts
[
1
],
100
);
await
token
.
transferFrom
(
accounts
[
0
],
accounts
[
1
],
100
);
...
@@ -70,4 +70,4 @@ contract('PausableToken', function(accounts) {
...
@@ -70,4 +70,4 @@ contract('PausableToken', function(accounts) {
assertRevert
(
error
);
assertRevert
(
error
);
}
}
});
});
})
})
;
test/PullPayment.js
View file @
86628468
var
PullPaymentMock
=
artifacts
.
require
(
"./helpers/PullPaymentMock.sol"
);
var
PullPaymentMock
=
artifacts
.
require
(
'./helpers/PullPaymentMock.sol'
);
contract
(
'PullPayment'
,
function
(
accounts
)
{
contract
(
'PullPayment'
,
function
(
accounts
)
{
let
ppce
;
let
ppce
;
let
amount
=
17
*
1
e18
;
let
amount
=
17
*
1
e18
;
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
ppce
=
await
PullPaymentMock
.
new
({
value
:
amount
});
ppce
=
await
PullPaymentMock
.
new
({
value
:
amount
});
});
});
it
(
"can't call asyncSend externally"
,
async
function
()
{
it
(
'can
\'
t call asyncSend externally'
,
async
function
()
{
assert
.
isUndefined
(
ppce
.
asyncSend
);
assert
.
isUndefined
(
ppce
.
asyncSend
);
});
});
it
(
"can record an async payment correctly"
,
async
function
()
{
it
(
'can record an async payment correctly'
,
async
function
()
{
let
AMOUNT
=
100
;
let
AMOUNT
=
100
;
let
callSend
=
await
ppce
.
callSend
(
accounts
[
0
],
AMOUNT
);
let
callSend
=
await
ppce
.
callSend
(
accounts
[
0
],
AMOUNT
);
let
paymentsToAccount0
=
await
ppce
.
payments
(
accounts
[
0
]);
let
paymentsToAccount0
=
await
ppce
.
payments
(
accounts
[
0
]);
...
@@ -22,7 +22,7 @@ contract('PullPayment', function(accounts) {
...
@@ -22,7 +22,7 @@ contract('PullPayment', function(accounts) {
assert
.
equal
(
paymentsToAccount0
,
AMOUNT
);
assert
.
equal
(
paymentsToAccount0
,
AMOUNT
);
});
});
it
(
"can add multiple balances on one account"
,
async
function
()
{
it
(
'can add multiple balances on one account'
,
async
function
()
{
let
call1
=
await
ppce
.
callSend
(
accounts
[
0
],
200
);
let
call1
=
await
ppce
.
callSend
(
accounts
[
0
],
200
);
let
call2
=
await
ppce
.
callSend
(
accounts
[
0
],
300
);
let
call2
=
await
ppce
.
callSend
(
accounts
[
0
],
300
);
let
paymentsToAccount0
=
await
ppce
.
payments
(
accounts
[
0
]);
let
paymentsToAccount0
=
await
ppce
.
payments
(
accounts
[
0
]);
...
@@ -32,7 +32,7 @@ contract('PullPayment', function(accounts) {
...
@@ -32,7 +32,7 @@ contract('PullPayment', function(accounts) {
assert
.
equal
(
paymentsToAccount0
,
500
);
assert
.
equal
(
paymentsToAccount0
,
500
);
});
});
it
(
"can add balances on multiple accounts"
,
async
function
()
{
it
(
'can add balances on multiple accounts'
,
async
function
()
{
let
call1
=
await
ppce
.
callSend
(
accounts
[
0
],
200
);
let
call1
=
await
ppce
.
callSend
(
accounts
[
0
],
200
);
let
call2
=
await
ppce
.
callSend
(
accounts
[
1
],
300
);
let
call2
=
await
ppce
.
callSend
(
accounts
[
1
],
300
);
...
@@ -46,7 +46,7 @@ contract('PullPayment', function(accounts) {
...
@@ -46,7 +46,7 @@ contract('PullPayment', function(accounts) {
assert
.
equal
(
totalPayments
,
500
);
assert
.
equal
(
totalPayments
,
500
);
});
});
it
(
"can withdraw payment"
,
async
function
()
{
it
(
'can withdraw payment'
,
async
function
()
{
let
payee
=
accounts
[
1
];
let
payee
=
accounts
[
1
];
let
initialBalance
=
web3
.
eth
.
getBalance
(
payee
);
let
initialBalance
=
web3
.
eth
.
getBalance
(
payee
);
...
@@ -58,7 +58,7 @@ contract('PullPayment', function(accounts) {
...
@@ -58,7 +58,7 @@ contract('PullPayment', function(accounts) {
let
totalPayments
=
await
ppce
.
totalPayments
();
let
totalPayments
=
await
ppce
.
totalPayments
();
assert
.
equal
(
totalPayments
,
amount
);
assert
.
equal
(
totalPayments
,
amount
);
let
withdraw
=
await
ppce
.
withdrawPayments
({
from
:
payee
});
let
withdraw
=
await
ppce
.
withdrawPayments
({
from
:
payee
});
let
payment2
=
await
ppce
.
payments
(
payee
);
let
payment2
=
await
ppce
.
payments
(
payee
);
assert
.
equal
(
payment2
,
0
);
assert
.
equal
(
payment2
,
0
);
...
@@ -66,7 +66,6 @@ contract('PullPayment', function(accounts) {
...
@@ -66,7 +66,6 @@ contract('PullPayment', function(accounts) {
assert
.
equal
(
totalPayments
,
0
);
assert
.
equal
(
totalPayments
,
0
);
let
balance
=
web3
.
eth
.
getBalance
(
payee
);
let
balance
=
web3
.
eth
.
getBalance
(
payee
);
assert
(
Math
.
abs
(
balance
-
initialBalance
-
amount
)
<
1
e16
);
assert
(
Math
.
abs
(
balance
-
initialBalance
-
amount
)
<
1
e16
);
});
});
});
});
test/ReentrancyGuard.js
View file @
86628468
'use strict'
;
import
expectThrow
from
'./helpers/expectThrow'
;
import
expectThrow
from
'./helpers/expectThrow'
;
const
ReentrancyMock
=
artifacts
.
require
(
'./helper/ReentrancyMock.sol'
);
const
ReentrancyMock
=
artifacts
.
require
(
'./helper/ReentrancyMock.sol'
);
const
ReentrancyAttack
=
artifacts
.
require
(
'./helper/ReentrancyAttack.sol'
);
const
ReentrancyAttack
=
artifacts
.
require
(
'./helper/ReentrancyAttack.sol'
);
contract
(
'ReentrancyGuard'
,
function
(
accounts
)
{
contract
(
'ReentrancyGuard'
,
function
(
accounts
)
{
let
reentrancyMock
;
let
reentrancyMock
;
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
reentrancyMock
=
await
ReentrancyMock
.
new
();
reentrancyMock
=
await
ReentrancyMock
.
new
();
let
initialCounter
=
await
reentrancyMock
.
counter
();
let
initialCounter
=
await
reentrancyMock
.
counter
();
assert
.
equal
(
initialCounter
,
0
);
assert
.
equal
(
initialCounter
,
0
);
});
});
it
(
'should not allow remote callback'
,
async
function
()
{
it
(
'should not allow remote callback'
,
async
function
()
{
let
attacker
=
await
ReentrancyAttack
.
new
();
let
attacker
=
await
ReentrancyAttack
.
new
();
await
expectThrow
(
reentrancyMock
.
countAndCall
(
attacker
.
address
));
await
expectThrow
(
reentrancyMock
.
countAndCall
(
attacker
.
address
));
});
});
...
@@ -21,11 +21,11 @@ contract('ReentrancyGuard', function(accounts) {
...
@@ -21,11 +21,11 @@ contract('ReentrancyGuard', function(accounts) {
// I put them here as documentation, and to monitor any changes
// I put them here as documentation, and to monitor any changes
// in the side-effects.
// in the side-effects.
it
(
'should not allow local recursion'
,
async
function
()
{
it
(
'should not allow local recursion'
,
async
function
()
{
await
expectThrow
(
reentrancyMock
.
countLocalRecursive
(
10
));
await
expectThrow
(
reentrancyMock
.
countLocalRecursive
(
10
));
});
});
it
(
'should not allow indirect local recursion'
,
async
function
()
{
it
(
'should not allow indirect local recursion'
,
async
function
()
{
await
expectThrow
(
reentrancyMock
.
countThisRecursive
(
10
));
await
expectThrow
(
reentrancyMock
.
countThisRecursive
(
10
));
});
});
});
});
test/RefundVault.js
View file @
86628468
const
BigNumber
=
web3
.
BigNumber
const
BigNumber
=
web3
.
BigNumber
;
require
(
'chai'
)
require
(
'chai'
)
.
use
(
require
(
'chai-as-promised'
))
.
use
(
require
(
'chai-as-promised'
))
.
use
(
require
(
'chai-bignumber'
)(
BigNumber
))
.
use
(
require
(
'chai-bignumber'
)(
BigNumber
))
.
should
()
.
should
()
;
import
ether
from
'./helpers/ether'
import
ether
from
'./helpers/ether'
;
import
EVMRevert
from
'./helpers/EVMRevert'
import
EVMRevert
from
'./helpers/EVMRevert'
;
const
RefundVault
=
artifacts
.
require
(
'RefundVault'
)
const
RefundVault
=
artifacts
.
require
(
'RefundVault'
)
;
contract
(
'RefundVault'
,
function
([
_
,
owner
,
wallet
,
investor
])
{
contract
(
'RefundVault'
,
function
([
_
,
owner
,
wallet
,
investor
])
{
const
value
=
ether
(
42
);
const
value
=
ether
(
42
)
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
this
.
vault
=
await
RefundVault
.
new
(
wallet
,
{
from
:
owner
})
this
.
vault
=
await
RefundVault
.
new
(
wallet
,
{
from
:
owner
});
})
})
;
it
(
'should accept contributions'
,
async
function
()
{
it
(
'should accept contributions'
,
async
function
()
{
await
this
.
vault
.
deposit
(
investor
,
{
value
,
from
:
owner
}).
should
.
be
.
fulfilled
await
this
.
vault
.
deposit
(
investor
,
{
value
,
from
:
owner
}).
should
.
be
.
fulfilled
;
})
})
;
it
(
'should not refund contribution during active state'
,
async
function
()
{
it
(
'should not refund contribution during active state'
,
async
function
()
{
await
this
.
vault
.
deposit
(
investor
,
{
value
,
from
:
owner
})
await
this
.
vault
.
deposit
(
investor
,
{
value
,
from
:
owner
});
await
this
.
vault
.
refund
(
investor
).
should
.
be
.
rejectedWith
(
EVMRevert
)
await
this
.
vault
.
refund
(
investor
).
should
.
be
.
rejectedWith
(
EVMRevert
)
;
})
})
;
it
(
'only owner can enter refund mode'
,
async
function
()
{
it
(
'only owner can enter refund mode'
,
async
function
()
{
await
this
.
vault
.
enableRefunds
({
from
:
_
}).
should
.
be
.
rejectedWith
(
EVMRevert
)
await
this
.
vault
.
enableRefunds
({
from
:
_
}).
should
.
be
.
rejectedWith
(
EVMRevert
);
await
this
.
vault
.
enableRefunds
({
from
:
owner
}).
should
.
be
.
fulfilled
await
this
.
vault
.
enableRefunds
({
from
:
owner
}).
should
.
be
.
fulfilled
;
})
})
;
it
(
'should refund contribution after entering refund mode'
,
async
function
()
{
it
(
'should refund contribution after entering refund mode'
,
async
function
()
{
await
this
.
vault
.
deposit
(
investor
,
{
value
,
from
:
owner
})
await
this
.
vault
.
deposit
(
investor
,
{
value
,
from
:
owner
});
await
this
.
vault
.
enableRefunds
({
from
:
owner
})
await
this
.
vault
.
enableRefunds
({
from
:
owner
});
const
pre
=
web3
.
eth
.
getBalance
(
investor
)
const
pre
=
web3
.
eth
.
getBalance
(
investor
)
;
await
this
.
vault
.
refund
(
investor
)
await
this
.
vault
.
refund
(
investor
)
;
const
post
=
web3
.
eth
.
getBalance
(
investor
)
const
post
=
web3
.
eth
.
getBalance
(
investor
)
;
post
.
minus
(
pre
).
should
.
be
.
bignumber
.
equal
(
value
)
post
.
minus
(
pre
).
should
.
be
.
bignumber
.
equal
(
value
)
;
})
})
;
it
(
'only owner can close'
,
async
function
()
{
it
(
'only owner can close'
,
async
function
()
{
await
this
.
vault
.
close
({
from
:
_
}).
should
.
be
.
rejectedWith
(
EVMRevert
)
await
this
.
vault
.
close
({
from
:
_
}).
should
.
be
.
rejectedWith
(
EVMRevert
);
await
this
.
vault
.
close
({
from
:
owner
}).
should
.
be
.
fulfilled
await
this
.
vault
.
close
({
from
:
owner
}).
should
.
be
.
fulfilled
;
})
})
;
it
(
'should forward funds to wallet after closing'
,
async
function
()
{
it
(
'should forward funds to wallet after closing'
,
async
function
()
{
await
this
.
vault
.
deposit
(
investor
,
{
value
,
from
:
owner
})
await
this
.
vault
.
deposit
(
investor
,
{
value
,
from
:
owner
});
const
pre
=
web3
.
eth
.
getBalance
(
wallet
)
await
this
.
vault
.
close
({
from
:
owner
})
const
post
=
web3
.
eth
.
getBalance
(
wallet
)
post
.
minus
(
pre
).
should
.
be
.
bignumber
.
equal
(
value
)
const
pre
=
web3
.
eth
.
getBalance
(
wallet
);
})
await
this
.
vault
.
close
({
from
:
owner
});
const
post
=
web3
.
eth
.
getBalance
(
wallet
);
})
post
.
minus
(
pre
).
should
.
be
.
bignumber
.
equal
(
value
);
});
});
test/RefundableCrowdsale.js
View file @
86628468
import
ether
from
'./helpers/ether'
import
ether
from
'./helpers/ether'
;
import
{
advanceBlock
}
from
'./helpers/advanceToBlock'
import
{
advanceBlock
}
from
'./helpers/advanceToBlock'
;
import
{
increaseTimeTo
,
duration
}
from
'./helpers/increaseTime'
import
{
increaseTimeTo
,
duration
}
from
'./helpers/increaseTime'
;
import
latestTime
from
'./helpers/latestTime'
import
latestTime
from
'./helpers/latestTime'
;
import
EVMRevert
from
'./helpers/EVMRevert'
import
EVMRevert
from
'./helpers/EVMRevert'
;
const
BigNumber
=
web3
.
BigNumber
const
BigNumber
=
web3
.
BigNumber
;
require
(
'chai'
)
require
(
'chai'
)
.
use
(
require
(
'chai-as-promised'
))
.
use
(
require
(
'chai-as-promised'
))
.
use
(
require
(
'chai-bignumber'
)(
BigNumber
))
.
use
(
require
(
'chai-bignumber'
)(
BigNumber
))
.
should
()
.
should
()
;
const
RefundableCrowdsale
=
artifacts
.
require
(
'./helpers/RefundableCrowdsaleImpl.sol'
)
const
RefundableCrowdsale
=
artifacts
.
require
(
'./helpers/RefundableCrowdsaleImpl.sol'
)
;
contract
(
'RefundableCrowdsale'
,
function
([
_
,
owner
,
wallet
,
investor
])
{
contract
(
'RefundableCrowdsale'
,
function
([
_
,
owner
,
wallet
,
investor
])
{
const
rate
=
new
BigNumber
(
1000
);
const
goal
=
ether
(
800
);
const
lessThanGoal
=
ether
(
750
);
const
rate
=
new
BigNumber
(
1000
)
before
(
async
function
()
{
const
goal
=
ether
(
800
)
// Advance to the next block to correctly read time in the solidity "now" function interpreted by testrpc
const
lessThanGoal
=
ether
(
750
)
await
advanceBlock
();
});
before
(
async
function
()
{
//Advance to the next block to correctly read time in the solidity "now" function interpreted by testrpc
await
advanceBlock
()
})
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
this
.
startTime
=
latestTime
()
+
duration
.
weeks
(
1
)
this
.
startTime
=
latestTime
()
+
duration
.
weeks
(
1
)
;
this
.
endTime
=
this
.
startTime
+
duration
.
weeks
(
1
)
this
.
endTime
=
this
.
startTime
+
duration
.
weeks
(
1
);
this
.
afterEndTime
=
this
.
endTime
+
duration
.
seconds
(
1
)
this
.
afterEndTime
=
this
.
endTime
+
duration
.
seconds
(
1
)
;
this
.
crowdsale
=
await
RefundableCrowdsale
.
new
(
this
.
startTime
,
this
.
endTime
,
rate
,
wallet
,
goal
,
{
from
:
owner
})
this
.
crowdsale
=
await
RefundableCrowdsale
.
new
(
this
.
startTime
,
this
.
endTime
,
rate
,
wallet
,
goal
,
{
from
:
owner
});
})
})
;
describe
(
'creating a valid crowdsale'
,
function
()
{
describe
(
'creating a valid crowdsale'
,
function
()
{
it
(
'should fail with zero goal'
,
async
function
()
{
it
(
'should fail with zero goal'
,
async
function
()
{
await
RefundableCrowdsale
.
new
(
this
.
startTime
,
this
.
endTime
,
rate
,
wallet
,
0
,
{
from
:
owner
}).
should
.
be
.
rejectedWith
(
EVMRevert
);
await
RefundableCrowdsale
.
new
(
this
.
startTime
,
this
.
endTime
,
rate
,
wallet
,
0
,
{
from
:
owner
}).
should
.
be
.
rejectedWith
(
EVMRevert
);
})
});
});
});
it
(
'should deny refunds before end'
,
async
function
()
{
it
(
'should deny refunds before end'
,
async
function
()
{
await
this
.
crowdsale
.
claimRefund
({
from
:
investor
}).
should
.
be
.
rejectedWith
(
EVMRevert
)
await
this
.
crowdsale
.
claimRefund
({
from
:
investor
}).
should
.
be
.
rejectedWith
(
EVMRevert
);
await
increaseTimeTo
(
this
.
startTime
)
await
increaseTimeTo
(
this
.
startTime
)
;
await
this
.
crowdsale
.
claimRefund
({
from
:
investor
}).
should
.
be
.
rejectedWith
(
EVMRevert
)
await
this
.
crowdsale
.
claimRefund
({
from
:
investor
}).
should
.
be
.
rejectedWith
(
EVMRevert
);
})
})
;
it
(
'should deny refunds after end if goal was reached'
,
async
function
()
{
it
(
'should deny refunds after end if goal was reached'
,
async
function
()
{
await
increaseTimeTo
(
this
.
startTime
)
await
increaseTimeTo
(
this
.
startTime
)
;
await
this
.
crowdsale
.
sendTransaction
({
value
:
goal
,
from
:
investor
})
await
this
.
crowdsale
.
sendTransaction
({
value
:
goal
,
from
:
investor
});
await
increaseTimeTo
(
this
.
afterEndTime
)
await
increaseTimeTo
(
this
.
afterEndTime
)
;
await
this
.
crowdsale
.
claimRefund
({
from
:
investor
}).
should
.
be
.
rejectedWith
(
EVMRevert
)
await
this
.
crowdsale
.
claimRefund
({
from
:
investor
}).
should
.
be
.
rejectedWith
(
EVMRevert
);
})
})
;
it
(
'should allow refunds after end if goal was not reached'
,
async
function
()
{
it
(
'should allow refunds after end if goal was not reached'
,
async
function
()
{
await
increaseTimeTo
(
this
.
startTime
)
await
increaseTimeTo
(
this
.
startTime
)
;
await
this
.
crowdsale
.
sendTransaction
({
value
:
lessThanGoal
,
from
:
investor
})
await
this
.
crowdsale
.
sendTransaction
({
value
:
lessThanGoal
,
from
:
investor
});
await
increaseTimeTo
(
this
.
afterEndTime
)
await
increaseTimeTo
(
this
.
afterEndTime
)
;
await
this
.
crowdsale
.
finalize
({
from
:
owner
})
await
this
.
crowdsale
.
finalize
({
from
:
owner
});
const
pre
=
web3
.
eth
.
getBalance
(
investor
)
const
pre
=
web3
.
eth
.
getBalance
(
investor
)
;
await
this
.
crowdsale
.
claimRefund
({
from
:
investor
,
gasPrice
:
0
})
await
this
.
crowdsale
.
claimRefund
({
from
:
investor
,
gasPrice
:
0
})
.
should
.
be
.
fulfilled
.
should
.
be
.
fulfilled
;
const
post
=
web3
.
eth
.
getBalance
(
investor
)
const
post
=
web3
.
eth
.
getBalance
(
investor
)
;
post
.
minus
(
pre
).
should
.
be
.
bignumber
.
equal
(
lessThanGoal
)
post
.
minus
(
pre
).
should
.
be
.
bignumber
.
equal
(
lessThanGoal
)
;
})
})
;
it
(
'should forward funds to wallet after end if goal was reached'
,
async
function
()
{
it
(
'should forward funds to wallet after end if goal was reached'
,
async
function
()
{
await
increaseTimeTo
(
this
.
startTime
)
await
increaseTimeTo
(
this
.
startTime
)
;
await
this
.
crowdsale
.
sendTransaction
({
value
:
goal
,
from
:
investor
})
await
this
.
crowdsale
.
sendTransaction
({
value
:
goal
,
from
:
investor
});
await
increaseTimeTo
(
this
.
afterEndTime
)
await
increaseTimeTo
(
this
.
afterEndTime
)
;
const
pre
=
web3
.
eth
.
getBalance
(
wallet
)
const
pre
=
web3
.
eth
.
getBalance
(
wallet
)
;
await
this
.
crowdsale
.
finalize
({
from
:
owner
})
await
this
.
crowdsale
.
finalize
({
from
:
owner
});
const
post
=
web3
.
eth
.
getBalance
(
wallet
)
const
post
=
web3
.
eth
.
getBalance
(
wallet
)
;
post
.
minus
(
pre
).
should
.
be
.
bignumber
.
equal
(
goal
)
post
.
minus
(
pre
).
should
.
be
.
bignumber
.
equal
(
goal
);
})
});
});
})
test/SafeERC20.js
View file @
86628468
...
@@ -7,7 +7,6 @@ require('chai')
...
@@ -7,7 +7,6 @@ require('chai')
const
SafeERC20Helper
=
artifacts
.
require
(
'./helpers/SafeERC20Helper.sol'
);
const
SafeERC20Helper
=
artifacts
.
require
(
'./helpers/SafeERC20Helper.sol'
);
contract
(
'SafeERC20'
,
function
()
{
contract
(
'SafeERC20'
,
function
()
{
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
this
.
helper
=
await
SafeERC20Helper
.
new
();
this
.
helper
=
await
SafeERC20Helper
.
new
();
});
});
...
...
test/SafeMath.js
View file @
86628468
const
assertRevert
=
require
(
'./helpers/assertRevert'
);
const
assertRevert
=
require
(
'./helpers/assertRevert'
);
const
assertJump
=
require
(
'./helpers/assertJump'
);
const
assertJump
=
require
(
'./helpers/assertJump'
);
var
SafeMathMock
=
artifacts
.
require
(
"./helpers/SafeMathMock.sol"
);
var
SafeMathMock
=
artifacts
.
require
(
'./helpers/SafeMathMock.sol'
);
contract
(
'SafeMath'
,
function
(
accounts
)
{
contract
(
'SafeMath'
,
function
(
accounts
)
{
let
safeMath
;
let
safeMath
;
before
(
async
function
()
{
before
(
async
function
()
{
safeMath
=
await
SafeMathMock
.
new
();
safeMath
=
await
SafeMathMock
.
new
();
});
});
it
(
"multiplies correctly"
,
async
function
()
{
it
(
'multiplies correctly'
,
async
function
()
{
let
a
=
5678
;
let
a
=
5678
;
let
b
=
1234
;
let
b
=
1234
;
let
mult
=
await
safeMath
.
multiply
(
a
,
b
);
let
mult
=
await
safeMath
.
multiply
(
a
,
b
);
let
result
=
await
safeMath
.
result
();
let
result
=
await
safeMath
.
result
();
assert
.
equal
(
result
,
a
*
b
);
assert
.
equal
(
result
,
a
*
b
);
});
});
it
(
"adds correctly"
,
async
function
()
{
it
(
'adds correctly'
,
async
function
()
{
let
a
=
5678
;
let
a
=
5678
;
let
b
=
1234
;
let
b
=
1234
;
let
add
=
await
safeMath
.
add
(
a
,
b
);
let
add
=
await
safeMath
.
add
(
a
,
b
);
let
result
=
await
safeMath
.
result
();
let
result
=
await
safeMath
.
result
();
assert
.
equal
(
result
,
a
+
b
);
assert
.
equal
(
result
,
a
+
b
);
});
});
it
(
"subtracts correctly"
,
async
function
()
{
it
(
'subtracts correctly'
,
async
function
()
{
let
a
=
5678
;
let
a
=
5678
;
let
b
=
1234
;
let
b
=
1234
;
let
subtract
=
await
safeMath
.
subtract
(
a
,
b
);
let
subtract
=
await
safeMath
.
subtract
(
a
,
b
);
let
result
=
await
safeMath
.
result
();
let
result
=
await
safeMath
.
result
();
assert
.
equal
(
result
,
a
-
b
);
assert
.
equal
(
result
,
a
-
b
);
});
});
it
(
"should throw an error if subtraction result would be negative"
,
async
function
()
{
it
(
'should throw an error if subtraction result would be negative'
,
async
function
()
{
let
a
=
1234
;
let
a
=
1234
;
let
b
=
5678
;
let
b
=
5678
;
try
{
try
{
let
subtract
=
await
safeMath
.
subtract
(
a
,
b
);
let
subtract
=
await
safeMath
.
subtract
(
a
,
b
);
assert
.
fail
(
'should have thrown before'
);
assert
.
fail
(
'should have thrown before'
);
}
catch
(
error
)
{
}
catch
(
error
)
{
assertJump
(
error
);
assertJump
(
error
);
}
}
});
});
it
(
"should throw an error on addition overflow"
,
async
function
()
{
it
(
'should throw an error on addition overflow'
,
async
function
()
{
let
a
=
115792089237316195423570985008687907853269984665640564039457584007913129639935
;
let
a
=
115792089237316195423570985008687907853269984665640564039457584007913129639935
;
let
b
=
1
;
let
b
=
1
;
try
{
try
{
let
add
=
await
safeMath
.
add
(
a
,
b
);
let
add
=
await
safeMath
.
add
(
a
,
b
);
assert
.
fail
(
'should have thrown before'
);
assert
.
fail
(
'should have thrown before'
);
}
catch
(
error
)
{
}
catch
(
error
)
{
assertRevert
(
error
);
assertRevert
(
error
);
}
}
});
});
it
(
"should throw an error on multiplication overflow"
,
async
function
()
{
it
(
'should throw an error on multiplication overflow'
,
async
function
()
{
let
a
=
115792089237316195423570985008687907853269984665640564039457584007913129639933
;
let
a
=
115792089237316195423570985008687907853269984665640564039457584007913129639933
;
let
b
=
2
;
let
b
=
2
;
try
{
try
{
let
multiply
=
await
safeMath
.
multiply
(
a
,
b
);
let
multiply
=
await
safeMath
.
multiply
(
a
,
b
);
assert
.
fail
(
'should have thrown before'
);
assert
.
fail
(
'should have thrown before'
);
}
catch
(
error
)
{
}
catch
(
error
)
{
assertRevert
(
error
);
assertRevert
(
error
);
}
}
});
});
});
});
test/SampleCrowdsale.js
View file @
86628468
import
ether
from
'./helpers/ether'
import
ether
from
'./helpers/ether'
;
import
{
advanceBlock
}
from
'./helpers/advanceToBlock'
import
{
advanceBlock
}
from
'./helpers/advanceToBlock'
;
import
{
increaseTimeTo
,
duration
}
from
'./helpers/increaseTime'
import
{
increaseTimeTo
,
duration
}
from
'./helpers/increaseTime'
;
import
latestTime
from
'./helpers/latestTime'
import
latestTime
from
'./helpers/latestTime'
;
import
EVMRevert
from
'./helpers/EVMRevert'
import
EVMRevert
from
'./helpers/EVMRevert'
;
const
BigNumber
=
web3
.
BigNumber
;
const
BigNumber
=
web3
.
BigNumber
;
...
@@ -15,15 +15,14 @@ const SampleCrowdsale = artifacts.require('SampleCrowdsale');
...
@@ -15,15 +15,14 @@ const SampleCrowdsale = artifacts.require('SampleCrowdsale');
const
SampleCrowdsaleToken
=
artifacts
.
require
(
'SampleCrowdsaleToken'
);
const
SampleCrowdsaleToken
=
artifacts
.
require
(
'SampleCrowdsaleToken'
);
contract
(
'Crowdsale'
,
function
([
owner
,
wallet
,
investor
])
{
contract
(
'Crowdsale'
,
function
([
owner
,
wallet
,
investor
])
{
const
RATE
=
new
BigNumber
(
10
);
const
RATE
=
new
BigNumber
(
10
);
const
GOAL
=
ether
(
10
);
const
GOAL
=
ether
(
10
);
const
CAP
=
ether
(
20
);
const
CAP
=
ether
(
20
);
before
(
async
function
()
{
before
(
async
function
()
{
//Advance to the next block to correctly read time in the solidity "now" function interpreted by testrpc
//
Advance to the next block to correctly read time in the solidity "now" function interpreted by testrpc
await
advanceBlock
()
await
advanceBlock
()
;
})
})
;
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
this
.
startTime
=
latestTime
()
+
duration
.
weeks
(
1
);
this
.
startTime
=
latestTime
()
+
duration
.
weeks
(
1
);
...
@@ -34,7 +33,6 @@ contract('Crowdsale', function ([owner, wallet, investor]) {
...
@@ -34,7 +33,6 @@ contract('Crowdsale', function ([owner, wallet, investor]) {
this
.
token
=
SampleCrowdsaleToken
.
at
(
await
this
.
crowdsale
.
token
());
this
.
token
=
SampleCrowdsaleToken
.
at
(
await
this
.
crowdsale
.
token
());
});
});
it
(
'should create crowdsale with correct parameters'
,
async
function
()
{
it
(
'should create crowdsale with correct parameters'
,
async
function
()
{
this
.
crowdsale
.
should
.
exist
;
this
.
crowdsale
.
should
.
exist
;
this
.
token
.
should
.
exist
;
this
.
token
.
should
.
exist
;
...
@@ -49,7 +47,7 @@ contract('Crowdsale', function ([owner, wallet, investor]) {
...
@@ -49,7 +47,7 @@ contract('Crowdsale', function ([owner, wallet, investor]) {
it
(
'should not accept payments before start'
,
async
function
()
{
it
(
'should not accept payments before start'
,
async
function
()
{
await
this
.
crowdsale
.
send
(
ether
(
1
)).
should
.
be
.
rejectedWith
(
EVMRevert
);
await
this
.
crowdsale
.
send
(
ether
(
1
)).
should
.
be
.
rejectedWith
(
EVMRevert
);
await
this
.
crowdsale
.
buyTokens
(
investor
,
{
from
:
investor
,
value
:
ether
(
1
)
}).
should
.
be
.
rejectedWith
(
EVMRevert
);
await
this
.
crowdsale
.
buyTokens
(
investor
,
{
from
:
investor
,
value
:
ether
(
1
)
}).
should
.
be
.
rejectedWith
(
EVMRevert
);
});
});
it
(
'should accept payments during the sale'
,
async
function
()
{
it
(
'should accept payments during the sale'
,
async
function
()
{
...
@@ -57,7 +55,7 @@ contract('Crowdsale', function ([owner, wallet, investor]) {
...
@@ -57,7 +55,7 @@ contract('Crowdsale', function ([owner, wallet, investor]) {
const
expectedTokenAmount
=
RATE
.
mul
(
investmentAmount
);
const
expectedTokenAmount
=
RATE
.
mul
(
investmentAmount
);
await
increaseTimeTo
(
this
.
startTime
);
await
increaseTimeTo
(
this
.
startTime
);
await
this
.
crowdsale
.
buyTokens
(
investor
,
{
value
:
investmentAmount
,
from
:
investor
}).
should
.
be
.
fulfilled
;
await
this
.
crowdsale
.
buyTokens
(
investor
,
{
value
:
investmentAmount
,
from
:
investor
}).
should
.
be
.
fulfilled
;
(
await
this
.
token
.
balanceOf
(
investor
)).
should
.
be
.
bignumber
.
equal
(
expectedTokenAmount
);
(
await
this
.
token
.
balanceOf
(
investor
)).
should
.
be
.
bignumber
.
equal
(
expectedTokenAmount
);
(
await
this
.
token
.
totalSupply
()).
should
.
be
.
bignumber
.
equal
(
expectedTokenAmount
);
(
await
this
.
token
.
totalSupply
()).
should
.
be
.
bignumber
.
equal
(
expectedTokenAmount
);
...
@@ -66,7 +64,7 @@ contract('Crowdsale', function ([owner, wallet, investor]) {
...
@@ -66,7 +64,7 @@ contract('Crowdsale', function ([owner, wallet, investor]) {
it
(
'should reject payments after end'
,
async
function
()
{
it
(
'should reject payments after end'
,
async
function
()
{
await
increaseTimeTo
(
this
.
afterEnd
);
await
increaseTimeTo
(
this
.
afterEnd
);
await
this
.
crowdsale
.
send
(
ether
(
1
)).
should
.
be
.
rejectedWith
(
EVMRevert
);
await
this
.
crowdsale
.
send
(
ether
(
1
)).
should
.
be
.
rejectedWith
(
EVMRevert
);
await
this
.
crowdsale
.
buyTokens
(
investor
,
{
value
:
ether
(
1
),
from
:
investor
}).
should
.
be
.
rejectedWith
(
EVMRevert
);
await
this
.
crowdsale
.
buyTokens
(
investor
,
{
value
:
ether
(
1
),
from
:
investor
}).
should
.
be
.
rejectedWith
(
EVMRevert
);
});
});
it
(
'should reject payments over cap'
,
async
function
()
{
it
(
'should reject payments over cap'
,
async
function
()
{
...
@@ -81,7 +79,7 @@ contract('Crowdsale', function ([owner, wallet, investor]) {
...
@@ -81,7 +79,7 @@ contract('Crowdsale', function ([owner, wallet, investor]) {
const
beforeFinalization
=
web3
.
eth
.
getBalance
(
wallet
);
const
beforeFinalization
=
web3
.
eth
.
getBalance
(
wallet
);
await
increaseTimeTo
(
this
.
afterEndTime
);
await
increaseTimeTo
(
this
.
afterEndTime
);
await
this
.
crowdsale
.
finalize
({
from
:
owner
});
await
this
.
crowdsale
.
finalize
({
from
:
owner
});
const
afterFinalization
=
web3
.
eth
.
getBalance
(
wallet
);
const
afterFinalization
=
web3
.
eth
.
getBalance
(
wallet
);
afterFinalization
.
minus
(
beforeFinalization
).
should
.
be
.
bignumber
.
equal
(
GOAL
);
afterFinalization
.
minus
(
beforeFinalization
).
should
.
be
.
bignumber
.
equal
(
GOAL
);
...
@@ -91,14 +89,13 @@ contract('Crowdsale', function ([owner, wallet, investor]) {
...
@@ -91,14 +89,13 @@ contract('Crowdsale', function ([owner, wallet, investor]) {
const
balanceBeforeInvestment
=
web3
.
eth
.
getBalance
(
investor
);
const
balanceBeforeInvestment
=
web3
.
eth
.
getBalance
(
investor
);
await
increaseTimeTo
(
this
.
startTime
);
await
increaseTimeTo
(
this
.
startTime
);
await
this
.
crowdsale
.
sendTransaction
({
value
:
ether
(
1
),
from
:
investor
,
gasPrice
:
0
});
await
this
.
crowdsale
.
sendTransaction
({
value
:
ether
(
1
),
from
:
investor
,
gasPrice
:
0
});
await
increaseTimeTo
(
this
.
afterEndTime
);
await
increaseTimeTo
(
this
.
afterEndTime
);
await
this
.
crowdsale
.
finalize
({
from
:
owner
});
await
this
.
crowdsale
.
finalize
({
from
:
owner
});
await
this
.
crowdsale
.
claimRefund
({
from
:
investor
,
gasPrice
:
0
}).
should
.
be
.
fulfilled
;
await
this
.
crowdsale
.
claimRefund
({
from
:
investor
,
gasPrice
:
0
}).
should
.
be
.
fulfilled
;
const
balanceAfterRefund
=
web3
.
eth
.
getBalance
(
investor
);
const
balanceAfterRefund
=
web3
.
eth
.
getBalance
(
investor
);
balanceBeforeInvestment
.
should
.
be
.
bignumber
.
equal
(
balanceAfterRefund
);
balanceBeforeInvestment
.
should
.
be
.
bignumber
.
equal
(
balanceAfterRefund
);
});
});
});
});
test/SplitPayment.js
View file @
86628468
const
BigNumber
=
web3
.
BigNumber
const
BigNumber
=
web3
.
BigNumber
;
const
should
=
require
(
'chai'
)
const
should
=
require
(
'chai'
)
.
use
(
require
(
'chai-as-promised'
))
.
use
(
require
(
'chai-as-promised'
))
.
use
(
require
(
'chai-bignumber'
)(
BigNumber
))
.
use
(
require
(
'chai-bignumber'
)(
BigNumber
))
.
should
()
.
should
()
;
const
EVMThrow
=
require
(
'./helpers/EVMThrow.js'
)
const
EVMThrow
=
require
(
'./helpers/EVMThrow.js'
)
;
const
SplitPayment
=
artifacts
.
require
(
'../contracts/payment/SplitPayment.sol'
)
const
SplitPayment
=
artifacts
.
require
(
'../contracts/payment/SplitPayment.sol'
)
;
contract
(
'SplitPayment'
,
function
([
owner
,
payee1
,
payee2
,
payee3
,
nonpayee1
,
payer1
])
{
contract
(
'SplitPayment'
,
function
([
owner
,
payee1
,
payee2
,
payee3
,
nonpayee1
,
payer1
])
{
const
amount
=
web3
.
toWei
(
1.0
,
'ether'
)
const
amount
=
web3
.
toWei
(
1.0
,
'ether'
)
;
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
this
.
payees
=
[
payee1
,
payee2
,
payee3
]
this
.
payees
=
[
payee1
,
payee2
,
payee3
]
;
this
.
shares
=
[
20
,
10
,
70
]
this
.
shares
=
[
20
,
10
,
70
]
;
this
.
contract
=
await
SplitPayment
.
new
(
this
.
payees
,
this
.
shares
)
this
.
contract
=
await
SplitPayment
.
new
(
this
.
payees
,
this
.
shares
)
;
})
})
;
it
(
'should accept payments'
,
async
function
()
{
it
(
'should accept payments'
,
async
function
()
{
await
web3
.
eth
.
sendTransaction
({
from
:
owner
,
to
:
this
.
contract
.
address
,
value
:
amount
})
await
web3
.
eth
.
sendTransaction
({
from
:
owner
,
to
:
this
.
contract
.
address
,
value
:
amount
})
;
const
balance
=
web3
.
eth
.
getBalance
(
this
.
contract
.
address
)
const
balance
=
web3
.
eth
.
getBalance
(
this
.
contract
.
address
)
;
balance
.
should
.
be
.
bignumber
.
equal
(
amount
)
balance
.
should
.
be
.
bignumber
.
equal
(
amount
)
;
})
})
;
it
(
'should store shares if address is payee'
,
async
function
()
{
it
(
'should store shares if address is payee'
,
async
function
()
{
const
shares
=
await
this
.
contract
.
shares
.
call
(
payee1
)
const
shares
=
await
this
.
contract
.
shares
.
call
(
payee1
)
;
shares
.
should
.
be
.
bignumber
.
not
.
equal
(
0
)
shares
.
should
.
be
.
bignumber
.
not
.
equal
(
0
)
;
})
})
;
it
(
'should not store shares if address is not payee'
,
async
function
()
{
it
(
'should not store shares if address is not payee'
,
async
function
()
{
const
shares
=
await
this
.
contract
.
shares
.
call
(
nonpayee1
)
const
shares
=
await
this
.
contract
.
shares
.
call
(
nonpayee1
)
;
shares
.
should
.
be
.
bignumber
.
equal
(
0
)
shares
.
should
.
be
.
bignumber
.
equal
(
0
)
;
})
})
;
it
(
'should throw if no funds to claim'
,
async
function
()
{
it
(
'should throw if no funds to claim'
,
async
function
()
{
await
this
.
contract
.
claim
({
from
:
payee1
}).
should
.
be
.
rejectedWith
(
EVMThrow
)
await
this
.
contract
.
claim
({
from
:
payee1
}).
should
.
be
.
rejectedWith
(
EVMThrow
);
})
})
;
it
(
'should throw if non-payee want to claim'
,
async
function
()
{
it
(
'should throw if non-payee want to claim'
,
async
function
()
{
await
web3
.
eth
.
sendTransaction
({
from
:
payer1
,
to
:
this
.
contract
.
address
,
value
:
amount
})
await
web3
.
eth
.
sendTransaction
({
from
:
payer1
,
to
:
this
.
contract
.
address
,
value
:
amount
});
await
this
.
contract
.
claim
({
from
:
nonpayee1
}).
should
.
be
.
rejectedWith
(
EVMThrow
)
await
this
.
contract
.
claim
({
from
:
nonpayee1
}).
should
.
be
.
rejectedWith
(
EVMThrow
);
})
})
;
it
(
'should distribute funds to payees'
,
async
function
()
{
it
(
'should distribute funds to payees'
,
async
function
()
{
await
web3
.
eth
.
sendTransaction
({
from
:
payer1
,
to
:
this
.
contract
.
address
,
value
:
amount
})
await
web3
.
eth
.
sendTransaction
({
from
:
payer1
,
to
:
this
.
contract
.
address
,
value
:
amount
});
// receive funds
// receive funds
const
initBalance
=
web3
.
eth
.
getBalance
(
this
.
contract
.
address
)
const
initBalance
=
web3
.
eth
.
getBalance
(
this
.
contract
.
address
)
;
initBalance
.
should
.
be
.
bignumber
.
equal
(
amount
)
initBalance
.
should
.
be
.
bignumber
.
equal
(
amount
)
;
// distribute to payees
// distribute to payees
const
initAmount1
=
web3
.
eth
.
getBalance
(
payee1
)
const
initAmount1
=
web3
.
eth
.
getBalance
(
payee1
)
;
await
this
.
contract
.
claim
({
from
:
payee1
})
await
this
.
contract
.
claim
({
from
:
payee1
});
const
profit1
=
web3
.
eth
.
getBalance
(
payee1
)
-
initAmount1
const
profit1
=
web3
.
eth
.
getBalance
(
payee1
)
-
initAmount1
;
assert
(
Math
.
abs
(
profit1
-
web3
.
toWei
(
0.20
,
'ether'
))
<
1
e16
)
assert
(
Math
.
abs
(
profit1
-
web3
.
toWei
(
0.20
,
'ether'
))
<
1
e16
)
;
const
initAmount2
=
web3
.
eth
.
getBalance
(
payee2
)
const
initAmount2
=
web3
.
eth
.
getBalance
(
payee2
)
;
await
this
.
contract
.
claim
({
from
:
payee2
})
await
this
.
contract
.
claim
({
from
:
payee2
});
const
profit2
=
web3
.
eth
.
getBalance
(
payee2
)
-
initAmount2
const
profit2
=
web3
.
eth
.
getBalance
(
payee2
)
-
initAmount2
;
assert
(
Math
.
abs
(
profit2
-
web3
.
toWei
(
0.10
,
'ether'
))
<
1
e16
)
assert
(
Math
.
abs
(
profit2
-
web3
.
toWei
(
0.10
,
'ether'
))
<
1
e16
)
;
const
initAmount3
=
web3
.
eth
.
getBalance
(
payee3
)
const
initAmount3
=
web3
.
eth
.
getBalance
(
payee3
)
;
await
this
.
contract
.
claim
({
from
:
payee3
})
await
this
.
contract
.
claim
({
from
:
payee3
});
const
profit3
=
web3
.
eth
.
getBalance
(
payee3
)
-
initAmount3
const
profit3
=
web3
.
eth
.
getBalance
(
payee3
)
-
initAmount3
;
assert
(
Math
.
abs
(
profit3
-
web3
.
toWei
(
0.70
,
'ether'
))
<
1
e16
)
assert
(
Math
.
abs
(
profit3
-
web3
.
toWei
(
0.70
,
'ether'
))
<
1
e16
)
;
// end balance should be zero
// end balance should be zero
const
endBalance
=
web3
.
eth
.
getBalance
(
this
.
contract
.
address
)
const
endBalance
=
web3
.
eth
.
getBalance
(
this
.
contract
.
address
)
;
endBalance
.
should
.
be
.
bignumber
.
equal
(
0
)
endBalance
.
should
.
be
.
bignumber
.
equal
(
0
)
;
// check correct funds released accounting
// check correct funds released accounting
const
totalReleased
=
await
this
.
contract
.
totalReleased
.
call
()
const
totalReleased
=
await
this
.
contract
.
totalReleased
.
call
()
;
totalReleased
.
should
.
be
.
bignumber
.
equal
(
initBalance
)
totalReleased
.
should
.
be
.
bignumber
.
equal
(
initBalance
)
;
})
})
;
})
})
;
test/StandardToken.js
View file @
86628468
'use strict'
;
const
assertRevert
=
require
(
'./helpers/assertRevert'
);
const
assertRevert
=
require
(
'./helpers/assertRevert'
);
const
expectThrow
=
require
(
'./helpers/expectThrow'
);
const
expectThrow
=
require
(
'./helpers/expectThrow'
);
var
StandardTokenMock
=
artifacts
.
require
(
'./helpers/StandardTokenMock.sol'
);
var
StandardTokenMock
=
artifacts
.
require
(
'./helpers/StandardTokenMock.sol'
);
contract
(
'StandardToken'
,
function
(
accounts
)
{
contract
(
'StandardToken'
,
function
(
accounts
)
{
let
token
;
let
token
;
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
token
=
await
StandardTokenMock
.
new
(
accounts
[
0
],
100
);
token
=
await
StandardTokenMock
.
new
(
accounts
[
0
],
100
);
});
});
it
(
'should return the correct totalSupply after construction'
,
async
function
()
{
it
(
'should return the correct totalSupply after construction'
,
async
function
()
{
let
totalSupply
=
await
token
.
totalSupply
();
let
totalSupply
=
await
token
.
totalSupply
();
assert
.
equal
(
totalSupply
,
100
);
assert
.
equal
(
totalSupply
,
100
);
});
});
it
(
'should return the correct allowance amount after approval'
,
async
function
()
{
it
(
'should return the correct allowance amount after approval'
,
async
function
()
{
let
token
=
await
StandardTokenMock
.
new
();
let
token
=
await
StandardTokenMock
.
new
();
await
token
.
approve
(
accounts
[
1
],
100
);
await
token
.
approve
(
accounts
[
1
],
100
);
let
allowance
=
await
token
.
allowance
(
accounts
[
0
],
accounts
[
1
]);
let
allowance
=
await
token
.
allowance
(
accounts
[
0
],
accounts
[
1
]);
...
@@ -26,7 +24,7 @@ contract('StandardToken', function(accounts) {
...
@@ -26,7 +24,7 @@ contract('StandardToken', function(accounts) {
assert
.
equal
(
allowance
,
100
);
assert
.
equal
(
allowance
,
100
);
});
});
it
(
'should return correct balances after transfer'
,
async
function
()
{
it
(
'should return correct balances after transfer'
,
async
function
()
{
let
token
=
await
StandardTokenMock
.
new
(
accounts
[
0
],
100
);
let
token
=
await
StandardTokenMock
.
new
(
accounts
[
0
],
100
);
await
token
.
transfer
(
accounts
[
1
],
100
);
await
token
.
transfer
(
accounts
[
1
],
100
);
let
balance0
=
await
token
.
balanceOf
(
accounts
[
0
]);
let
balance0
=
await
token
.
balanceOf
(
accounts
[
0
]);
...
@@ -36,20 +34,20 @@ contract('StandardToken', function(accounts) {
...
@@ -36,20 +34,20 @@ contract('StandardToken', function(accounts) {
assert
.
equal
(
balance1
,
100
);
assert
.
equal
(
balance1
,
100
);
});
});
it
(
'should throw an error when trying to transfer more than balance'
,
async
function
()
{
it
(
'should throw an error when trying to transfer more than balance'
,
async
function
()
{
let
token
=
await
StandardTokenMock
.
new
(
accounts
[
0
],
100
);
let
token
=
await
StandardTokenMock
.
new
(
accounts
[
0
],
100
);
try
{
try
{
await
token
.
transfer
(
accounts
[
1
],
101
);
await
token
.
transfer
(
accounts
[
1
],
101
);
assert
.
fail
(
'should have thrown before'
);
assert
.
fail
(
'should have thrown before'
);
}
catch
(
error
)
{
}
catch
(
error
)
{
assertRevert
(
error
);
assertRevert
(
error
);
}
}
});
});
it
(
'should return correct balances after transfering from another account'
,
async
function
()
{
it
(
'should return correct balances after transfering from another account'
,
async
function
()
{
let
token
=
await
StandardTokenMock
.
new
(
accounts
[
0
],
100
);
let
token
=
await
StandardTokenMock
.
new
(
accounts
[
0
],
100
);
await
token
.
approve
(
accounts
[
1
],
100
);
await
token
.
approve
(
accounts
[
1
],
100
);
await
token
.
transferFrom
(
accounts
[
0
],
accounts
[
2
],
100
,
{
from
:
accounts
[
1
]
});
await
token
.
transferFrom
(
accounts
[
0
],
accounts
[
2
],
100
,
{
from
:
accounts
[
1
]
});
let
balance0
=
await
token
.
balanceOf
(
accounts
[
0
]);
let
balance0
=
await
token
.
balanceOf
(
accounts
[
0
]);
assert
.
equal
(
balance0
,
0
);
assert
.
equal
(
balance0
,
0
);
...
@@ -61,71 +59,70 @@ contract('StandardToken', function(accounts) {
...
@@ -61,71 +59,70 @@ contract('StandardToken', function(accounts) {
assert
.
equal
(
balance2
,
0
);
assert
.
equal
(
balance2
,
0
);
});
});
it
(
'should throw an error when trying to transfer more than allowed'
,
async
function
()
{
it
(
'should throw an error when trying to transfer more than allowed'
,
async
function
()
{
await
token
.
approve
(
accounts
[
1
],
99
);
await
token
.
approve
(
accounts
[
1
],
99
);
try
{
try
{
await
token
.
transferFrom
(
accounts
[
0
],
accounts
[
2
],
100
,
{
from
:
accounts
[
1
]
});
await
token
.
transferFrom
(
accounts
[
0
],
accounts
[
2
],
100
,
{
from
:
accounts
[
1
]
});
assert
.
fail
(
'should have thrown before'
);
assert
.
fail
(
'should have thrown before'
);
}
catch
(
error
)
{
}
catch
(
error
)
{
assertRevert
(
error
);
assertRevert
(
error
);
}
}
});
});
it
(
'should throw an error when trying to transferFrom more than _from has'
,
async
function
()
{
it
(
'should throw an error when trying to transferFrom more than _from has'
,
async
function
()
{
let
balance0
=
await
token
.
balanceOf
(
accounts
[
0
]);
let
balance0
=
await
token
.
balanceOf
(
accounts
[
0
]);
await
token
.
approve
(
accounts
[
1
],
99
);
await
token
.
approve
(
accounts
[
1
],
99
);
try
{
try
{
await
token
.
transferFrom
(
accounts
[
0
],
accounts
[
2
],
balance0
+
1
,
{
from
:
accounts
[
1
]
});
await
token
.
transferFrom
(
accounts
[
0
],
accounts
[
2
],
balance0
+
1
,
{
from
:
accounts
[
1
]
});
assert
.
fail
(
'should have thrown before'
);
assert
.
fail
(
'should have thrown before'
);
}
catch
(
error
)
{
}
catch
(
error
)
{
assertRevert
(
error
);
assertRevert
(
error
);
}
}
});
});
describe
(
'validating allowance updates to spender'
,
function
()
{
describe
(
'validating allowance updates to spender'
,
function
()
{
let
preApproved
;
let
preApproved
;
it
(
'should start with zero'
,
async
function
()
{
it
(
'should start with zero'
,
async
function
()
{
preApproved
=
await
token
.
allowance
(
accounts
[
0
],
accounts
[
1
]);
preApproved
=
await
token
.
allowance
(
accounts
[
0
],
accounts
[
1
]);
assert
.
equal
(
preApproved
,
0
);
assert
.
equal
(
preApproved
,
0
);
})
})
;
it
(
'should increase by 50 then decrease by 10'
,
async
function
()
{
it
(
'should increase by 50 then decrease by 10'
,
async
function
()
{
await
token
.
increaseApproval
(
accounts
[
1
],
50
);
await
token
.
increaseApproval
(
accounts
[
1
],
50
);
let
postIncrease
=
await
token
.
allowance
(
accounts
[
0
],
accounts
[
1
]);
let
postIncrease
=
await
token
.
allowance
(
accounts
[
0
],
accounts
[
1
]);
preApproved
.
plus
(
50
).
should
.
be
.
bignumber
.
equal
(
postIncrease
);
preApproved
.
plus
(
50
).
should
.
be
.
bignumber
.
equal
(
postIncrease
);
await
token
.
decreaseApproval
(
accounts
[
1
],
10
);
await
token
.
decreaseApproval
(
accounts
[
1
],
10
);
let
postDecrease
=
await
token
.
allowance
(
accounts
[
0
],
accounts
[
1
]);
let
postDecrease
=
await
token
.
allowance
(
accounts
[
0
],
accounts
[
1
]);
postIncrease
.
minus
(
10
).
should
.
be
.
bignumber
.
equal
(
postDecrease
);
postIncrease
.
minus
(
10
).
should
.
be
.
bignumber
.
equal
(
postDecrease
);
})
})
;
});
});
it
(
'should increase by 50 then set to 0 when decreasing by more than 50'
,
async
function
()
{
it
(
'should increase by 50 then set to 0 when decreasing by more than 50'
,
async
function
()
{
await
token
.
approve
(
accounts
[
1
],
50
);
await
token
.
approve
(
accounts
[
1
],
50
);
await
token
.
decreaseApproval
(
accounts
[
1
],
60
);
await
token
.
decreaseApproval
(
accounts
[
1
],
60
);
let
postDecrease
=
await
token
.
allowance
(
accounts
[
0
],
accounts
[
1
]);
let
postDecrease
=
await
token
.
allowance
(
accounts
[
0
],
accounts
[
1
]);
postDecrease
.
should
.
be
.
bignumber
.
equal
(
0
);
postDecrease
.
should
.
be
.
bignumber
.
equal
(
0
);
});
});
it
(
'should throw an error when trying to transfer to 0x0'
,
async
function
()
{
it
(
'should throw an error when trying to transfer to 0x0'
,
async
function
()
{
let
token
=
await
StandardTokenMock
.
new
(
accounts
[
0
],
100
);
let
token
=
await
StandardTokenMock
.
new
(
accounts
[
0
],
100
);
try
{
try
{
let
transfer
=
await
token
.
transfer
(
0x0
,
100
);
let
transfer
=
await
token
.
transfer
(
0x0
,
100
);
assert
.
fail
(
'should have thrown before'
);
assert
.
fail
(
'should have thrown before'
);
}
catch
(
error
)
{
}
catch
(
error
)
{
assertRevert
(
error
);
assertRevert
(
error
);
}
}
});
});
it
(
'should throw an error when trying to transferFrom to 0x0'
,
async
function
()
{
it
(
'should throw an error when trying to transferFrom to 0x0'
,
async
function
()
{
let
token
=
await
StandardTokenMock
.
new
(
accounts
[
0
],
100
);
let
token
=
await
StandardTokenMock
.
new
(
accounts
[
0
],
100
);
await
token
.
approve
(
accounts
[
1
],
100
);
await
token
.
approve
(
accounts
[
1
],
100
);
try
{
try
{
let
transfer
=
await
token
.
transferFrom
(
accounts
[
0
],
0x0
,
100
,
{
from
:
accounts
[
1
]
});
let
transfer
=
await
token
.
transferFrom
(
accounts
[
0
],
0x0
,
100
,
{
from
:
accounts
[
1
]
});
assert
.
fail
(
'should have thrown before'
);
assert
.
fail
(
'should have thrown before'
);
}
catch
(
error
)
{
}
catch
(
error
)
{
assertRevert
(
error
);
assertRevert
(
error
);
}
}
});
});
});
});
test/TokenDestructible.js
View file @
86628468
'use strict'
;
var
TokenDestructible
=
artifacts
.
require
(
'../contracts/lifecycle/TokenDestructible.sol'
);
var
TokenDestructible
=
artifacts
.
require
(
'../contracts/lifecycle/TokenDestructible.sol'
);
var
StandardTokenMock
=
artifacts
.
require
(
"./helpers/StandardTokenMock.sol"
);
var
StandardTokenMock
=
artifacts
.
require
(
'./helpers/StandardTokenMock.sol'
);
require
(
'./helpers/transactionMined.js'
);
require
(
'./helpers/transactionMined.js'
);
contract
(
'TokenDestructible'
,
function
(
accounts
)
{
contract
(
'TokenDestructible'
,
function
(
accounts
)
{
let
destructible
;
let
destructible
;
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
destructible
=
await
TokenDestructible
.
new
({
fron
:
accounts
[
0
],
value
:
web3
.
toWei
(
'10'
,
'ether'
)
});
destructible
=
await
TokenDestructible
.
new
({
fron
:
accounts
[
0
],
value
:
web3
.
toWei
(
'10'
,
'ether'
)
});
});
});
it
(
'should send balance to owner after destruction'
,
async
function
()
{
it
(
'should send balance to owner after destruction'
,
async
function
()
{
let
owner
=
await
destructible
.
owner
();
let
owner
=
await
destructible
.
owner
();
let
initBalance
=
web3
.
eth
.
getBalance
(
owner
);
let
initBalance
=
web3
.
eth
.
getBalance
(
owner
);
await
destructible
.
destroy
([],
{
from
:
owner
});
await
destructible
.
destroy
([],
{
from
:
owner
});
let
newBalance
=
web3
.
eth
.
getBalance
(
owner
);
let
newBalance
=
web3
.
eth
.
getBalance
(
owner
);
assert
.
isTrue
(
newBalance
>
initBalance
);
assert
.
isTrue
(
newBalance
>
initBalance
);
});
});
it
(
'should send tokens to owner after destruction'
,
async
function
()
{
it
(
'should send tokens to owner after destruction'
,
async
function
()
{
let
owner
=
await
destructible
.
owner
();
let
owner
=
await
destructible
.
owner
();
let
token
=
await
StandardTokenMock
.
new
(
destructible
.
address
,
100
);
let
token
=
await
StandardTokenMock
.
new
(
destructible
.
address
,
100
);
let
initContractBalance
=
await
token
.
balanceOf
(
destructible
.
address
);
let
initContractBalance
=
await
token
.
balanceOf
(
destructible
.
address
);
let
initOwnerBalance
=
await
token
.
balanceOf
(
owner
);
let
initOwnerBalance
=
await
token
.
balanceOf
(
owner
);
assert
.
equal
(
initContractBalance
,
100
);
assert
.
equal
(
initContractBalance
,
100
);
assert
.
equal
(
initOwnerBalance
,
0
);
assert
.
equal
(
initOwnerBalance
,
0
);
await
destructible
.
destroy
([
token
.
address
],
{
from
:
owner
});
await
destructible
.
destroy
([
token
.
address
],
{
from
:
owner
});
let
newContractBalance
=
await
token
.
balanceOf
(
destructible
.
address
);
let
newContractBalance
=
await
token
.
balanceOf
(
destructible
.
address
);
let
newOwnerBalance
=
await
token
.
balanceOf
(
owner
);
let
newOwnerBalance
=
await
token
.
balanceOf
(
owner
);
assert
.
equal
(
newContractBalance
,
0
);
assert
.
equal
(
newContractBalance
,
0
);
...
...
test/TokenTimelock.js
View file @
86628468
const
BigNumber
=
web3
.
BigNumber
const
BigNumber
=
web3
.
BigNumber
;
require
(
'chai'
)
require
(
'chai'
)
.
use
(
require
(
'chai-as-promised'
))
.
use
(
require
(
'chai-as-promised'
))
.
use
(
require
(
'chai-bignumber'
)(
BigNumber
))
.
use
(
require
(
'chai-bignumber'
)(
BigNumber
))
.
should
()
.
should
()
;
import
latestTime
from
'./helpers/latestTime'
;
import
{
increaseTimeTo
,
duration
}
from
'./helpers/increaseTime'
;
import
latestTime
from
'./helpers/latestTime'
const
MintableToken
=
artifacts
.
require
(
'MintableToken'
);
import
{
increaseTimeTo
,
duration
}
from
'./helpers/increaseTime'
const
TokenTimelock
=
artifacts
.
require
(
'TokenTimelock'
);
const
MintableToken
=
artifacts
.
require
(
'MintableToken'
)
const
TokenTimelock
=
artifacts
.
require
(
'TokenTimelock'
)
contract
(
'TokenTimelock'
,
function
([
_
,
owner
,
beneficiary
])
{
contract
(
'TokenTimelock'
,
function
([
_
,
owner
,
beneficiary
])
{
const
amount
=
new
BigNumber
(
100
);
const
amount
=
new
BigNumber
(
100
)
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
this
.
token
=
await
MintableToken
.
new
({
from
:
owner
})
this
.
token
=
await
MintableToken
.
new
({
from
:
owner
});
this
.
releaseTime
=
latestTime
()
+
duration
.
years
(
1
)
this
.
releaseTime
=
latestTime
()
+
duration
.
years
(
1
)
;
this
.
timelock
=
await
TokenTimelock
.
new
(
this
.
token
.
address
,
beneficiary
,
this
.
releaseTime
)
this
.
timelock
=
await
TokenTimelock
.
new
(
this
.
token
.
address
,
beneficiary
,
this
.
releaseTime
)
;
await
this
.
token
.
mint
(
this
.
timelock
.
address
,
amount
,
{
from
:
owner
})
await
this
.
token
.
mint
(
this
.
timelock
.
address
,
amount
,
{
from
:
owner
});
})
})
;
it
(
'cannot be released before time limit'
,
async
function
()
{
it
(
'cannot be released before time limit'
,
async
function
()
{
await
this
.
timelock
.
release
().
should
.
be
.
rejected
await
this
.
timelock
.
release
().
should
.
be
.
rejected
;
})
})
;
it
(
'cannot be released just before time limit'
,
async
function
()
{
it
(
'cannot be released just before time limit'
,
async
function
()
{
await
increaseTimeTo
(
this
.
releaseTime
-
duration
.
seconds
(
3
))
await
increaseTimeTo
(
this
.
releaseTime
-
duration
.
seconds
(
3
))
;
await
this
.
timelock
.
release
().
should
.
be
.
rejected
await
this
.
timelock
.
release
().
should
.
be
.
rejected
;
})
})
;
it
(
'can be released just after limit'
,
async
function
()
{
it
(
'can be released just after limit'
,
async
function
()
{
await
increaseTimeTo
(
this
.
releaseTime
+
duration
.
seconds
(
1
))
await
increaseTimeTo
(
this
.
releaseTime
+
duration
.
seconds
(
1
))
;
await
this
.
timelock
.
release
().
should
.
be
.
fulfilled
await
this
.
timelock
.
release
().
should
.
be
.
fulfilled
;
const
balance
=
await
this
.
token
.
balanceOf
(
beneficiary
)
const
balance
=
await
this
.
token
.
balanceOf
(
beneficiary
)
;
balance
.
should
.
be
.
bignumber
.
equal
(
amount
)
balance
.
should
.
be
.
bignumber
.
equal
(
amount
)
;
})
})
;
it
(
'can be released after time limit'
,
async
function
()
{
it
(
'can be released after time limit'
,
async
function
()
{
await
increaseTimeTo
(
this
.
releaseTime
+
duration
.
years
(
1
))
await
increaseTimeTo
(
this
.
releaseTime
+
duration
.
years
(
1
))
;
await
this
.
timelock
.
release
().
should
.
be
.
fulfilled
await
this
.
timelock
.
release
().
should
.
be
.
fulfilled
;
const
balance
=
await
this
.
token
.
balanceOf
(
beneficiary
)
const
balance
=
await
this
.
token
.
balanceOf
(
beneficiary
)
;
balance
.
should
.
be
.
bignumber
.
equal
(
amount
)
balance
.
should
.
be
.
bignumber
.
equal
(
amount
)
;
})
})
;
it
(
'cannot be released twice'
,
async
function
()
{
it
(
'cannot be released twice'
,
async
function
()
{
await
increaseTimeTo
(
this
.
releaseTime
+
duration
.
years
(
1
))
await
increaseTimeTo
(
this
.
releaseTime
+
duration
.
years
(
1
));
await
this
.
timelock
.
release
().
should
.
be
.
fulfilled
await
this
.
timelock
.
release
().
should
.
be
.
fulfilled
;
await
this
.
timelock
.
release
().
should
.
be
.
rejected
await
this
.
timelock
.
release
().
should
.
be
.
rejected
;
const
balance
=
await
this
.
token
.
balanceOf
(
beneficiary
)
const
balance
=
await
this
.
token
.
balanceOf
(
beneficiary
);
balance
.
should
.
be
.
bignumber
.
equal
(
amount
)
balance
.
should
.
be
.
bignumber
.
equal
(
amount
);
})
});
});
})
test/TokenVesting.js
View file @
86628468
const
BigNumber
=
web3
.
BigNumber
const
BigNumber
=
web3
.
BigNumber
;
require
(
'chai'
)
require
(
'chai'
)
.
use
(
require
(
'chai-as-promised'
))
.
use
(
require
(
'chai-as-promised'
))
.
use
(
require
(
'chai-bignumber'
)(
BigNumber
))
.
use
(
require
(
'chai-bignumber'
)(
BigNumber
))
.
should
();
.
should
();
import
EVMRevert
from
'./helpers/EVMRevert'
import
EVMRevert
from
'./helpers/EVMRevert'
;
import
latestTime
from
'./helpers/latestTime'
;
import
latestTime
from
'./helpers/latestTime'
;
import
{
increaseTimeTo
,
duration
}
from
'./helpers/increaseTime'
;
import
{
increaseTimeTo
,
duration
}
from
'./helpers/increaseTime'
;
const
MintableToken
=
artifacts
.
require
(
'MintableToken'
);
const
MintableToken
=
artifacts
.
require
(
'MintableToken'
);
const
TokenVesting
=
artifacts
.
require
(
'TokenVesting'
);
const
TokenVesting
=
artifacts
.
require
(
'TokenVesting'
);
contract
(
'TokenVesting'
,
function
([
_
,
owner
,
beneficiary
])
{
contract
(
'TokenVesting'
,
function
([
_
,
owner
,
beneficiary
])
{
const
amount
=
new
BigNumber
(
1000
);
const
amount
=
new
BigNumber
(
1000
);
beforeEach
(
async
function
()
{
beforeEach
(
async
function
()
{
...
@@ -75,7 +74,7 @@ contract('TokenVesting', function ([_, owner, beneficiary]) {
...
@@ -75,7 +74,7 @@ contract('TokenVesting', function ([_, owner, beneficiary]) {
});
});
it
(
'should fail to be revoked by owner if revocable not set'
,
async
function
()
{
it
(
'should fail to be revoked by owner if revocable not set'
,
async
function
()
{
const
vesting
=
await
TokenVesting
.
new
(
beneficiary
,
this
.
start
,
this
.
cliff
,
this
.
duration
,
false
,
{
from
:
owner
}
);
const
vesting
=
await
TokenVesting
.
new
(
beneficiary
,
this
.
start
,
this
.
cliff
,
this
.
duration
,
false
,
{
from
:
owner
});
await
vesting
.
revoke
(
this
.
token
.
address
,
{
from
:
owner
}).
should
.
be
.
rejectedWith
(
EVMRevert
);
await
vesting
.
revoke
(
this
.
token
.
address
,
{
from
:
owner
}).
should
.
be
.
rejectedWith
(
EVMRevert
);
});
});
...
@@ -111,5 +110,4 @@ contract('TokenVesting', function ([_, owner, beneficiary]) {
...
@@ -111,5 +110,4 @@ contract('TokenVesting', function ([_, owner, beneficiary]) {
await
this
.
vesting
.
revoke
(
this
.
token
.
address
,
{
from
:
owner
}).
should
.
be
.
rejectedWith
(
EVMRevert
);
await
this
.
vesting
.
revoke
(
this
.
token
.
address
,
{
from
:
owner
}).
should
.
be
.
rejectedWith
(
EVMRevert
);
});
});
});
});
test/helpers/EVMRevert.js
View file @
86628468
export
default
'revert'
export
default
'revert'
;
test/helpers/EVMThrow.js
View file @
86628468
export
default
'invalid opcode'
export
default
'invalid opcode'
;
test/helpers/advanceToBlock.js
View file @
86628468
export
function
advanceBlock
()
{
export
function
advanceBlock
()
{
return
new
Promise
((
resolve
,
reject
)
=>
{
return
new
Promise
((
resolve
,
reject
)
=>
{
web3
.
currentProvider
.
sendAsync
({
web3
.
currentProvider
.
sendAsync
({
jsonrpc
:
'2.0'
,
jsonrpc
:
'2.0'
,
method
:
'evm_mine'
,
method
:
'evm_mine'
,
id
:
Date
.
now
(),
id
:
Date
.
now
(),
},
(
err
,
res
)
=>
{
},
(
err
,
res
)
=>
{
return
err
?
reject
(
err
)
:
resolve
(
res
)
return
err
?
reject
(
err
)
:
resolve
(
res
)
;
})
})
;
})
})
;
}
}
// Advances the block number so that the last mined block is `number`.
// Advances the block number so that the last mined block is `number`.
export
default
async
function
advanceToBlock
(
number
)
{
export
default
async
function
advanceToBlock
(
number
)
{
if
(
web3
.
eth
.
blockNumber
>
number
)
{
if
(
web3
.
eth
.
blockNumber
>
number
)
{
throw
Error
(
`block number
${
number
}
is in the past (current is
${
web3
.
eth
.
blockNumber
}
)`
)
throw
Error
(
`block number
${
number
}
is in the past (current is
${
web3
.
eth
.
blockNumber
}
)`
)
;
}
}
while
(
web3
.
eth
.
blockNumber
<
number
)
{
while
(
web3
.
eth
.
blockNumber
<
number
)
{
await
advanceBlock
()
await
advanceBlock
()
;
}
}
}
}
test/helpers/assertJump.js
View file @
86628468
module
.
exports
=
function
(
error
)
{
module
.
exports
=
function
(
error
)
{
assert
.
isAbove
(
error
.
message
.
search
(
'invalid opcode'
),
-
1
,
'Invalid opcode error must be returned'
);
assert
.
isAbove
(
error
.
message
.
search
(
'invalid opcode'
),
-
1
,
'Invalid opcode error must be returned'
);
}
}
;
test/helpers/assertRevert.js
View file @
86628468
module
.
exports
=
function
(
error
)
{
module
.
exports
=
function
(
error
)
{
assert
.
isAbove
(
error
.
message
.
search
(
'revert'
),
-
1
,
'Error containing "revert" must be returned'
);
assert
.
isAbove
(
error
.
message
.
search
(
'revert'
),
-
1
,
'Error containing "revert" must be returned'
);
}
}
;
test/helpers/ether.js
View file @
86628468
export
default
function
ether
(
n
)
{
export
default
function
ether
(
n
)
{
return
new
web3
.
BigNumber
(
web3
.
toWei
(
n
,
'ether'
))
return
new
web3
.
BigNumber
(
web3
.
toWei
(
n
,
'ether'
))
;
}
}
test/helpers/expectThrow.js
View file @
86628468
...
@@ -13,7 +13,7 @@ export default async promise => {
...
@@ -13,7 +13,7 @@ export default async promise => {
const
revert
=
error
.
message
.
search
(
'revert'
)
>=
0
;
const
revert
=
error
.
message
.
search
(
'revert'
)
>=
0
;
assert
(
assert
(
invalidOpcode
||
outOfGas
||
revert
,
invalidOpcode
||
outOfGas
||
revert
,
"Expected throw, got '"
+
error
+
"' instead"
,
'Expected throw, got
\'
'
+
error
+
'
\'
instead'
,
);
);
return
;
return
;
}
}
...
...
test/helpers/hashMessage.js
View file @
86628468
import
utils
from
'ethereumjs-util'
;
import
utils
from
'ethereumjs-util'
;
// Hash and add same prefix to the hash that testrpc use.
// Hash and add same prefix to the hash that testrpc use.
module
.
exports
=
function
(
message
)
{
module
.
exports
=
function
(
message
)
{
const
messageHex
=
new
Buffer
(
utils
.
sha3
(
message
).
toString
(
'hex'
),
'hex'
);
const
messageHex
=
new
Buffer
(
utils
.
sha3
(
message
).
toString
(
'hex'
),
'hex'
);
const
prefix
=
utils
.
toBuffer
(
'
\
u0019Ethereum Signed Message:
\
n'
+
messageHex
.
length
.
toString
());
const
prefix
=
utils
.
toBuffer
(
'
\
u0019Ethereum Signed Message:
\
n'
+
messageHex
.
length
.
toString
());
return
utils
.
bufferToHex
(
utils
.
sha3
(
Buffer
.
concat
([
prefix
,
messageHex
]))
);
return
utils
.
bufferToHex
(
utils
.
sha3
(
Buffer
.
concat
([
prefix
,
messageHex
]))
);
};
};
test/helpers/increaseTime.js
View file @
86628468
import
latestTime
from
'./latestTime'
import
latestTime
from
'./latestTime'
;
// Increases testrpc time by the passed duration in seconds
// Increases testrpc time by the passed duration in seconds
export
default
function
increaseTime
(
duration
)
{
export
default
function
increaseTime
(
duration
)
{
const
id
=
Date
.
now
()
const
id
=
Date
.
now
()
;
return
new
Promise
((
resolve
,
reject
)
=>
{
return
new
Promise
((
resolve
,
reject
)
=>
{
web3
.
currentProvider
.
sendAsync
({
web3
.
currentProvider
.
sendAsync
({
...
@@ -11,17 +11,17 @@ export default function increaseTime(duration) {
...
@@ -11,17 +11,17 @@ export default function increaseTime(duration) {
params
:
[
duration
],
params
:
[
duration
],
id
:
id
,
id
:
id
,
},
err1
=>
{
},
err1
=>
{
if
(
err1
)
return
reject
(
err1
)
if
(
err1
)
return
reject
(
err1
)
;
web3
.
currentProvider
.
sendAsync
({
web3
.
currentProvider
.
sendAsync
({
jsonrpc
:
'2.0'
,
jsonrpc
:
'2.0'
,
method
:
'evm_mine'
,
method
:
'evm_mine'
,
id
:
id
+
1
,
id
:
id
+
1
,
},
(
err2
,
res
)
=>
{
},
(
err2
,
res
)
=>
{
return
err2
?
reject
(
err2
)
:
resolve
(
res
)
return
err2
?
reject
(
err2
)
:
resolve
(
res
)
;
})
})
;
})
})
;
})
})
;
}
}
/**
/**
...
@@ -31,7 +31,7 @@ export default function increaseTime(duration) {
...
@@ -31,7 +31,7 @@ export default function increaseTime(duration) {
*
*
* @param target time in seconds
* @param target time in seconds
*/
*/
export
function
increaseTimeTo
(
target
)
{
export
function
increaseTimeTo
(
target
)
{
let
now
=
latestTime
();
let
now
=
latestTime
();
if
(
target
<
now
)
throw
Error
(
`Cannot increase current time(
${
now
}
) to a moment in the past(
${
target
}
)`
);
if
(
target
<
now
)
throw
Error
(
`Cannot increase current time(
${
now
}
) to a moment in the past(
${
target
}
)`
);
let
diff
=
target
-
now
;
let
diff
=
target
-
now
;
...
@@ -39,10 +39,10 @@ export function increaseTimeTo(target) {
...
@@ -39,10 +39,10 @@ export function increaseTimeTo(target) {
}
}
export
const
duration
=
{
export
const
duration
=
{
seconds
:
function
(
val
)
{
return
val
},
seconds
:
function
(
val
)
{
return
val
;
},
minutes
:
function
(
val
)
{
return
val
*
this
.
seconds
(
60
)
},
minutes
:
function
(
val
)
{
return
val
*
this
.
seconds
(
60
);
},
hours
:
function
(
val
)
{
return
val
*
this
.
minutes
(
60
)
},
hours
:
function
(
val
)
{
return
val
*
this
.
minutes
(
60
);
},
days
:
function
(
val
)
{
return
val
*
this
.
hours
(
24
)
},
days
:
function
(
val
)
{
return
val
*
this
.
hours
(
24
);
},
weeks
:
function
(
val
)
{
return
val
*
this
.
days
(
7
)
},
weeks
:
function
(
val
)
{
return
val
*
this
.
days
(
7
);
},
years
:
function
(
val
)
{
return
val
*
this
.
days
(
365
)}
years
:
function
(
val
)
{
return
val
*
this
.
days
(
365
);
},
};
};
test/helpers/latestTime.js
View file @
86628468
// Returns the time of the last mined block in seconds
// Returns the time of the last mined block in seconds
export
default
function
latestTime
()
{
export
default
function
latestTime
()
{
return
web3
.
eth
.
getBlock
(
'latest'
).
timestamp
;
return
web3
.
eth
.
getBlock
(
'latest'
).
timestamp
;
}
}
test/helpers/merkleTree.js
View file @
86628468
import
{
sha3
,
bufferToHex
}
from
"ethereumjs-util"
;
import
{
sha3
,
bufferToHex
}
from
'ethereumjs-util'
;
export
default
class
MerkleTree
{
export
default
class
MerkleTree
{
constructor
(
elements
)
{
constructor
(
elements
)
{
// Filter empty strings and hash elements
// Filter empty strings and hash elements
this
.
elements
=
elements
.
filter
(
el
=>
el
).
map
(
el
=>
sha3
(
el
));
this
.
elements
=
elements
.
filter
(
el
=>
el
).
map
(
el
=>
sha3
(
el
));
...
@@ -14,9 +14,9 @@ export default class MerkleTree {
...
@@ -14,9 +14,9 @@ export default class MerkleTree {
this
.
layers
=
this
.
getLayers
(
this
.
elements
);
this
.
layers
=
this
.
getLayers
(
this
.
elements
);
}
}
getLayers
(
elements
)
{
getLayers
(
elements
)
{
if
(
elements
.
length
==
0
)
{
if
(
elements
.
length
==
0
)
{
return
[[
""
]];
return
[[
''
]];
}
}
const
layers
=
[];
const
layers
=
[];
...
@@ -30,7 +30,7 @@ export default class MerkleTree {
...
@@ -30,7 +30,7 @@ export default class MerkleTree {
return
layers
;
return
layers
;
}
}
getNextLayer
(
elements
)
{
getNextLayer
(
elements
)
{
return
elements
.
reduce
((
layer
,
el
,
idx
,
arr
)
=>
{
return
elements
.
reduce
((
layer
,
el
,
idx
,
arr
)
=>
{
if
(
idx
%
2
===
0
)
{
if
(
idx
%
2
===
0
)
{
// Hash the current element with its pair element
// Hash the current element with its pair element
...
@@ -41,26 +41,26 @@ export default class MerkleTree {
...
@@ -41,26 +41,26 @@ export default class MerkleTree {
},
[]);
},
[]);
}
}
combinedHash
(
first
,
second
)
{
combinedHash
(
first
,
second
)
{
if
(
!
first
)
{
return
second
;
}
if
(
!
first
)
{
return
second
;
}
if
(
!
second
)
{
return
first
;
}
if
(
!
second
)
{
return
first
;
}
return
sha3
(
this
.
sortAndConcat
(
first
,
second
));
return
sha3
(
this
.
sortAndConcat
(
first
,
second
));
}
}
getRoot
()
{
getRoot
()
{
return
this
.
layers
[
this
.
layers
.
length
-
1
][
0
];
return
this
.
layers
[
this
.
layers
.
length
-
1
][
0
];
}
}
getHexRoot
()
{
getHexRoot
()
{
return
bufferToHex
(
this
.
getRoot
());
return
bufferToHex
(
this
.
getRoot
());
}
}
getProof
(
el
)
{
getProof
(
el
)
{
let
idx
=
this
.
bufIndexOf
(
el
,
this
.
elements
);
let
idx
=
this
.
bufIndexOf
(
el
,
this
.
elements
);
if
(
idx
===
-
1
)
{
if
(
idx
===
-
1
)
{
throw
new
Error
(
"Element does not exist in Merkle tree"
);
throw
new
Error
(
'Element does not exist in Merkle tree'
);
}
}
return
this
.
layers
.
reduce
((
proof
,
layer
)
=>
{
return
this
.
layers
.
reduce
((
proof
,
layer
)
=>
{
...
@@ -76,13 +76,13 @@ export default class MerkleTree {
...
@@ -76,13 +76,13 @@ export default class MerkleTree {
},
[]);
},
[]);
}
}
getHexProof
(
el
)
{
getHexProof
(
el
)
{
const
proof
=
this
.
getProof
(
el
);
const
proof
=
this
.
getProof
(
el
);
return
this
.
bufArrToHex
(
proof
);
return
this
.
bufArrToHex
(
proof
);
}
}
getPairElement
(
idx
,
layer
)
{
getPairElement
(
idx
,
layer
)
{
const
pairIdx
=
idx
%
2
===
0
?
idx
+
1
:
idx
-
1
;
const
pairIdx
=
idx
%
2
===
0
?
idx
+
1
:
idx
-
1
;
if
(
pairIdx
<
layer
.
length
)
{
if
(
pairIdx
<
layer
.
length
)
{
...
@@ -92,7 +92,7 @@ export default class MerkleTree {
...
@@ -92,7 +92,7 @@ export default class MerkleTree {
}
}
}
}
bufIndexOf
(
el
,
arr
)
{
bufIndexOf
(
el
,
arr
)
{
let
hash
;
let
hash
;
// Convert element to 32 byte hash if it is not one already
// Convert element to 32 byte hash if it is not one already
...
@@ -111,21 +111,21 @@ export default class MerkleTree {
...
@@ -111,21 +111,21 @@ export default class MerkleTree {
return
-
1
;
return
-
1
;
}
}
bufDedup
(
elements
)
{
bufDedup
(
elements
)
{
return
elements
.
filter
((
el
,
idx
)
=>
{
return
elements
.
filter
((
el
,
idx
)
=>
{
return
this
.
bufIndexOf
(
el
,
elements
)
===
idx
;
return
this
.
bufIndexOf
(
el
,
elements
)
===
idx
;
});
});
}
}
bufArrToHex
(
arr
)
{
bufArrToHex
(
arr
)
{
if
(
arr
.
some
(
el
=>
!
Buffer
.
isBuffer
(
el
)))
{
if
(
arr
.
some
(
el
=>
!
Buffer
.
isBuffer
(
el
)))
{
throw
new
Error
(
"Array is not an array of buffers"
);
throw
new
Error
(
'Array is not an array of buffers'
);
}
}
return
"0x"
+
arr
.
map
(
el
=>
el
.
toString
(
"hex"
)).
join
(
""
);
return
'0x'
+
arr
.
map
(
el
=>
el
.
toString
(
'hex'
)).
join
(
''
);
}
}
sortAndConcat
(...
args
)
{
sortAndConcat
(...
args
)
{
return
Buffer
.
concat
([...
args
].
sort
(
Buffer
.
compare
));
return
Buffer
.
concat
([...
args
].
sort
(
Buffer
.
compare
));
}
}
}
}
test/helpers/transactionMined.js
View file @
86628468
'use strict'
;
//from https://gist.github.com/xavierlepretre/88682e871f4ad07be4534ae560692ee6
//
from https://gist.github.com/xavierlepretre/88682e871f4ad07be4534ae560692ee6
module
.
export
=
web3
.
eth
.
transactionMined
=
function
(
txnHash
,
interval
)
{
module
.
export
=
web3
.
eth
.
transactionMined
=
function
(
txnHash
,
interval
)
{
var
transactionReceiptAsync
;
var
transactionReceiptAsync
;
interval
=
interval
?
interval
:
500
;
interval
=
interval
||
500
;
transactionReceiptAsync
=
function
(
txnHash
,
resolve
,
reject
)
{
transactionReceiptAsync
=
function
(
txnHash
,
resolve
,
reject
)
{
try
{
try
{
var
receipt
=
web3
.
eth
.
getTransactionReceipt
(
txnHash
);
var
receipt
=
web3
.
eth
.
getTransactionReceipt
(
txnHash
);
if
(
receipt
===
null
)
{
if
(
receipt
===
null
)
{
...
@@ -14,7 +13,7 @@ module.export = web3.eth.transactionMined = function (txnHash, interval) {
...
@@ -14,7 +13,7 @@ module.export = web3.eth.transactionMined = function (txnHash, interval) {
}
else
{
}
else
{
resolve
(
receipt
);
resolve
(
receipt
);
}
}
}
catch
(
e
)
{
}
catch
(
e
)
{
reject
(
e
);
reject
(
e
);
}
}
};
};
...
...
truffle-config.js
View file @
86628468
...
@@ -5,44 +5,44 @@ require('babel-polyfill');
...
@@ -5,44 +5,44 @@ require('babel-polyfill');
const
HDWalletProvider
=
require
(
'truffle-hdwallet-provider'
);
const
HDWalletProvider
=
require
(
'truffle-hdwallet-provider'
);
const
providerWithMnemonic
=
(
mnemonic
,
rpcEndpoint
)
=>
const
providerWithMnemonic
=
(
mnemonic
,
rpcEndpoint
)
=>
new
HDWalletProvider
(
mnemonic
,
rpcEndpoint
)
new
HDWalletProvider
(
mnemonic
,
rpcEndpoint
)
;
const
infuraProvider
=
network
=>
providerWithMnemonic
(
const
infuraProvider
=
network
=>
providerWithMnemonic
(
process
.
env
.
MNEMONIC
,
process
.
env
.
MNEMONIC
,
`https://
${
network
}
.infura.io/
${
process
.
env
.
INFURA_API_KEY
}
`
`https://
${
network
}
.infura.io/
${
process
.
env
.
INFURA_API_KEY
}
`
)
)
;
const
ropstenProvider
=
process
.
env
.
SOLIDITY_COVERAGE
const
ropstenProvider
=
process
.
env
.
SOLIDITY_COVERAGE
?
undefined
?
undefined
:
infuraProvider
(
'ropsten'
)
:
infuraProvider
(
'ropsten'
)
;
module
.
exports
=
{
module
.
exports
=
{
networks
:
{
networks
:
{
development
:
{
development
:
{
host
:
'localhost'
,
host
:
'localhost'
,
port
:
8545
,
port
:
8545
,
network_id
:
'*'
network_id
:
'*'
,
},
},
ropsten
:
{
ropsten
:
{
provider
:
ropstenProvider
,
provider
:
ropstenProvider
,
network_id
:
3
// official id of the ropsten network
network_id
:
3
,
// official id of the ropsten network
},
},
coverage
:
{
coverage
:
{
host
:
"localhost"
,
host
:
'localhost'
,
network_id
:
"*"
,
network_id
:
'*'
,
port
:
8555
,
port
:
8555
,
gas
:
0xfffffffffff
,
gas
:
0xfffffffffff
,
gasPrice
:
0x01
gasPrice
:
0x01
,
},
},
testrpc
:
{
testrpc
:
{
host
:
'localhost'
,
host
:
'localhost'
,
port
:
8545
,
port
:
8545
,
network_id
:
'*'
network_id
:
'*'
,
},
},
ganache
:
{
ganache
:
{
host
:
'localhost'
,
host
:
'localhost'
,
port
:
7545
,
port
:
7545
,
network_id
:
'*'
network_id
:
'*'
,
},
},
},
}
};
};
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