246 lines
10 KiB
JavaScript
246 lines
10 KiB
JavaScript
|
const PresaleOracles = artifacts.require("PresaleOraclesMock.sol");
|
||
|
const BigNumber = web3.BigNumber;
|
||
|
require('chai')
|
||
|
.use(require('chai-as-promised'))
|
||
|
.use(require('chai-bignumber')(web3.BigNumber))
|
||
|
.should();
|
||
|
|
||
|
const moment = require('moment');
|
||
|
|
||
|
const ETHER = new web3.BigNumber(10).toPower(18);
|
||
|
|
||
|
function getTime() {
|
||
|
return Math.floor(Date.now() / 1000);
|
||
|
}
|
||
|
|
||
|
function latestTime() {
|
||
|
return web3.eth.getBlock('latest').timestamp;
|
||
|
}
|
||
|
|
||
|
let PRESALE_START_DATE, PRESALE_END_DATE;
|
||
|
contract('Presale', function(accounts) {
|
||
|
let presaleContract;
|
||
|
|
||
|
beforeEach(async () => {
|
||
|
presaleContract = await PresaleOracles.new();
|
||
|
});
|
||
|
|
||
|
it('constructor should set owner', async () => {
|
||
|
accounts[0].should.be.equal(
|
||
|
await presaleContract.owner()
|
||
|
);
|
||
|
});
|
||
|
it('can not buy if not initialized', async () => {
|
||
|
await presaleContract.sendTransaction({amount: ETHER})
|
||
|
.should.be.rejectedWith('invalid opcode');
|
||
|
})
|
||
|
|
||
|
describe('#initilize', async () => {
|
||
|
|
||
|
beforeEach(() => {
|
||
|
PRESALE_START_DATE = moment('2017-12-11T16:00:00Z').unix();
|
||
|
PRESALE_END_DATE = moment('2017-12-18T16:00:00Z').unix();
|
||
|
})
|
||
|
it('rejects if not sent by owner', async () => {
|
||
|
await presaleContract.initialize(PRESALE_START_DATE, PRESALE_END_DATE, ETHER, accounts[1], {from: accounts[1]})
|
||
|
.should.be.rejectedWith('invalid opcode');
|
||
|
})
|
||
|
it('sets values', async () => {
|
||
|
await presaleContract.initialize(PRESALE_START_DATE, PRESALE_END_DATE, ETHER, accounts[1], {from: accounts[0]})
|
||
|
true.should.be.equal(
|
||
|
await presaleContract.isInitialized()
|
||
|
)
|
||
|
PRESALE_START_DATE.should.be.bignumber.equal(
|
||
|
await presaleContract.startTime()
|
||
|
)
|
||
|
PRESALE_END_DATE.should.be.bignumber.equal(
|
||
|
await presaleContract.endTime()
|
||
|
)
|
||
|
ETHER.should.be.bignumber.equal(
|
||
|
await presaleContract.cap()
|
||
|
)
|
||
|
accounts[1].should.be.equal(
|
||
|
await presaleContract.vault()
|
||
|
)
|
||
|
})
|
||
|
it('cannot initialize twice', async () => {
|
||
|
// require(!isInitialized);
|
||
|
await presaleContract.initialize(PRESALE_START_DATE, PRESALE_END_DATE, ETHER, accounts[1], {from: accounts[0]})
|
||
|
await presaleContract.initialize(PRESALE_START_DATE, PRESALE_END_DATE, ETHER, accounts[1], {from: accounts[0]})
|
||
|
.should.be.rejectedWith('invalid opcode');
|
||
|
})
|
||
|
it('startTime cannot be 0', async () => {
|
||
|
// require(_startTime != 0);
|
||
|
await presaleContract.initialize(0, PRESALE_END_DATE, ETHER, accounts[1], {from: accounts[1]})
|
||
|
.should.be.rejectedWith('invalid opcode');
|
||
|
})
|
||
|
it('endTime cannot be 0', async () => {
|
||
|
// require(_endTime != 0);
|
||
|
await presaleContract.initialize(PRESALE_START_DATE, 0, ETHER, accounts[1], {from: accounts[1]})
|
||
|
.should.be.rejectedWith('invalid opcode');
|
||
|
})
|
||
|
it('endTime cannot be less than startTime', async () => {
|
||
|
// require(_endTime > _startTime);
|
||
|
await presaleContract.initialize(PRESALE_END_DATE, PRESALE_START_DATE, ETHER, accounts[1], {from: accounts[1]})
|
||
|
.should.be.rejectedWith('invalid opcode');
|
||
|
})
|
||
|
it('cap cannot be 0', async () => {
|
||
|
// require(_cap != 0);
|
||
|
await presaleContract.initialize(PRESALE_START_DATE, PRESALE_END_DATE, 0, accounts[1], {from: accounts[1]})
|
||
|
.should.be.rejectedWith('invalid opcode');
|
||
|
})
|
||
|
it('vault cannot be 0x0', async () => {
|
||
|
// require(_vault != 0x0);
|
||
|
await presaleContract.initialize(PRESALE_START_DATE, PRESALE_END_DATE, ETHER, '0x0', {from: accounts[1]})
|
||
|
.should.be.rejectedWith('invalid opcode');
|
||
|
})
|
||
|
})
|
||
|
|
||
|
describe('#buy', async () => {
|
||
|
|
||
|
beforeEach(async () => {
|
||
|
PRESALE_START_DATE = moment('2017-12-11T16:00:00Z').unix();
|
||
|
PRESALE_END_DATE = moment('2017-12-18T16:00:00Z').unix();
|
||
|
await presaleContract.initialize(PRESALE_START_DATE, PRESALE_END_DATE, ETHER.mul(2), accounts[1], {from: accounts[0]})
|
||
|
})
|
||
|
it('cannot buy if not whitelisted', async () => {
|
||
|
// require(whitelist[msg.sender]);
|
||
|
await presaleContract.sendTransaction({amount: ETHER})
|
||
|
.should.be.rejectedWith('invalid opcode');
|
||
|
})
|
||
|
it('cannot buy if not value is 0', async () => {
|
||
|
// require(msg.value > 0);
|
||
|
await presaleContract.setTime(PRESALE_START_DATE);
|
||
|
await presaleContract.whitelistInvestor(accounts[0]);
|
||
|
await presaleContract.sendTransaction({value: 0})
|
||
|
.should.be.rejectedWith('invalid opcode');
|
||
|
})
|
||
|
|
||
|
it('can not buy if not initialized', async () => {
|
||
|
// require(isInitialized);
|
||
|
await presaleContract.sendTransaction({amount: ETHER})
|
||
|
.should.be.rejectedWith('invalid opcode');
|
||
|
})
|
||
|
|
||
|
it('can not buy if time is not within startTime&endTime', async ()=> {
|
||
|
// require(now >= startTime && now <= endTime);
|
||
|
await presaleContract.setTime(PRESALE_START_DATE - 1);
|
||
|
await presaleContract.whitelistInvestor(accounts[0]);
|
||
|
await presaleContract.sendTransaction({value: ETHER})
|
||
|
.should.be.rejectedWith('invalid opcode');
|
||
|
await presaleContract.setTime(PRESALE_END_DATE + 1);
|
||
|
await presaleContract.sendTransaction({value: ETHER})
|
||
|
.should.be.rejectedWith('invalid opcode');
|
||
|
})
|
||
|
|
||
|
it('can not buy more than cap', async () => {
|
||
|
// require(totalInvestedInWei + msg.value <= cap);
|
||
|
await presaleContract.setTime(PRESALE_START_DATE);
|
||
|
await presaleContract.whitelistInvestor(accounts[0]);
|
||
|
await presaleContract.sendTransaction({value: ETHER.mul(2) + 1})
|
||
|
.should.be.rejectedWith('invalid opcode');
|
||
|
})
|
||
|
|
||
|
it('happy path', async () => {
|
||
|
// investorBalances[investor] += msg.value;
|
||
|
// totalInvestedInWei += msg.value;
|
||
|
// forwardFunds(msg.value);
|
||
|
const vault = accounts[1];
|
||
|
const preVaultBalance = await web3.eth.getBalance(vault);
|
||
|
await presaleContract.setTime(PRESALE_START_DATE);
|
||
|
await presaleContract.whitelistInvestor(accounts[0]);
|
||
|
await presaleContract.sendTransaction({value: ETHER});
|
||
|
ETHER.should.be.bignumber.equal(
|
||
|
await presaleContract.investorBalances(accounts[0])
|
||
|
)
|
||
|
ETHER.should.be.bignumber.equal(
|
||
|
await presaleContract.totalInvestedInWei()
|
||
|
)
|
||
|
preVaultBalance.add(ETHER).should.be.bignumber.equal(
|
||
|
await web3.eth.getBalance(vault)
|
||
|
)
|
||
|
await presaleContract.sendTransaction({value: ETHER});
|
||
|
|
||
|
ETHER.mul(2).should.be.bignumber.equal(
|
||
|
await presaleContract.investorBalances(accounts[0])
|
||
|
)
|
||
|
ETHER.mul(2).should.be.bignumber.equal(
|
||
|
await presaleContract.totalInvestedInWei()
|
||
|
)
|
||
|
preVaultBalance.add(ETHER.mul(2)).should.be.bignumber.equal(
|
||
|
await web3.eth.getBalance(vault)
|
||
|
)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
describe('#whitelistInvestor', async ()=>{
|
||
|
it('cannot by called by non-owner', async ()=> {
|
||
|
await presaleContract.whitelistInvestor(accounts[0], {from: accounts[1]})
|
||
|
.should.be.rejectedWith('invalid opcode');
|
||
|
})
|
||
|
it('whitelists an investor', async ()=> {
|
||
|
'0'.should.be.bignumber.equal(
|
||
|
await presaleContract.investorsLength()
|
||
|
)
|
||
|
false.should.be.equal(
|
||
|
await presaleContract.whitelist(accounts[0])
|
||
|
)
|
||
|
await presaleContract.whitelistInvestor(accounts[0]);
|
||
|
true.should.be.equal(
|
||
|
await presaleContract.whitelist(accounts[0])
|
||
|
)
|
||
|
'1'.should.be.bignumber.equal(
|
||
|
await presaleContract.investorsLength()
|
||
|
)
|
||
|
})
|
||
|
})
|
||
|
describe('#whitelistInvestors', async ()=>{
|
||
|
it('cannot by called by non-owner', async ()=> {
|
||
|
await presaleContract.whitelistInvestors([accounts[0]], {from: accounts[1]})
|
||
|
.should.be.rejectedWith('invalid opcode');
|
||
|
})
|
||
|
it('whitelists investors', async ()=> {
|
||
|
'0'.should.be.bignumber.equal(
|
||
|
await presaleContract.investorsLength()
|
||
|
)
|
||
|
false.should.be.equal(
|
||
|
await presaleContract.whitelist(accounts[0])
|
||
|
)
|
||
|
await presaleContract.whitelistInvestors([accounts[0], accounts[1], accounts[2]]);
|
||
|
true.should.be.equal(
|
||
|
await presaleContract.whitelist(accounts[2])
|
||
|
)
|
||
|
'3'.should.be.bignumber.equal(
|
||
|
await presaleContract.investorsLength()
|
||
|
)
|
||
|
})
|
||
|
})
|
||
|
describe('#blacklistInvestor', async ()=>{
|
||
|
it('cannot by called by non-owner', async ()=> {
|
||
|
await presaleContract.blacklistInvestor(accounts[0], {from: accounts[1]})
|
||
|
.should.be.rejectedWith('invalid opcode');
|
||
|
})
|
||
|
it('blacklist an investors', async ()=> {
|
||
|
'0'.should.be.bignumber.equal(
|
||
|
await presaleContract.investorsLength()
|
||
|
)
|
||
|
false.should.be.equal(
|
||
|
await presaleContract.whitelist(accounts[0])
|
||
|
)
|
||
|
await presaleContract.whitelistInvestors([accounts[0], accounts[1], accounts[2]]);
|
||
|
true.should.be.equal(
|
||
|
await presaleContract.whitelist(accounts[0])
|
||
|
)
|
||
|
'3'.should.be.bignumber.equal(
|
||
|
await presaleContract.investorsLength()
|
||
|
)
|
||
|
await presaleContract.blacklistInvestor(accounts[0]);
|
||
|
false.should.be.equal(
|
||
|
await presaleContract.whitelist(accounts[0])
|
||
|
)
|
||
|
'2'.should.be.bignumber.equal(
|
||
|
await presaleContract.investorsLength()
|
||
|
)
|
||
|
})
|
||
|
})
|
||
|
});
|