contract('WhitelistCrowdsale', function ([_, wallet, whitelister, whitelisted, otherWhitelisted, other]) { const rate = new BN(1); const value = ether('42'); const tokenSupply = new BN('10').pow(new BN('22')); beforeEach(async function () { this.token = await SimpleToken.new({ from: whitelister }); this.crowdsale = await WhitelistCrowdsale.new(rate, wallet, this.token.address, { from: whitelister }); await this.token.transfer(this.crowdsale.address, tokenSupply, { from: whitelister }); }); async function purchaseShouldSucceed (crowdsale, beneficiary, value) { await crowdsale.buyTokens(beneficiary, { from: beneficiary, value }); await crowdsale.sendTransaction({ from: beneficiary, value }); } async function purchaseShouldFail (crowdsale, beneficiary, value) { await shouldFail.reverting.withMessage(crowdsale.buyTokens(beneficiary, { from: beneficiary, value }), 'WhitelistCrowdsale: beneficiary doesn\'t have the Whitelisted role' ); await shouldFail.reverting.withMessage(crowdsale.sendTransaction({ from: beneficiary, value }), 'WhitelistCrowdsale: beneficiary doesn\'t have the Whitelisted role' ); } context('with no whitelisted addresses', function () { it('rejects all purchases', async function () { await purchaseShouldFail(this.crowdsale, other, value); await purchaseShouldFail(this.crowdsale, whitelisted, value); }); }); context('with whitelisted addresses', function () { beforeEach(async function () { await this.crowdsale.addWhitelisted(whitelisted, { from: whitelister }); await this.crowdsale.addWhitelisted(otherWhitelisted, { from: whitelister }); }); it('accepts purchases with whitelisted beneficiaries', async function () { await purchaseShouldSucceed(this.crowdsale, whitelisted, value); await purchaseShouldSucceed(this.crowdsale, otherWhitelisted, value); }); it('rejects purchases from whitelisted addresses with non-whitelisted beneficiaries', async function () { await shouldFail(this.crowdsale.buyTokens(other, { from: whitelisted, value })); }); it('rejects purchases with non-whitelisted beneficiaries', async function () { await purchaseShouldFail(this.crowdsale, other, value); }); }); });
contract('ERC20Capped', function ([_, minter, ...otherAccounts]) { const cap = ether('1000'); it('requires a non-zero cap', async function () { await shouldFail.reverting.withMessage( ERC20Capped.new(new BN(0), { from: minter }), 'ERC20Capped: cap is 0' ); }); context('once deployed', async function () { beforeEach(async function () { this.token = await ERC20Capped.new(cap, { from: minter }); }); shouldBehaveLikeERC20Capped(minter, otherAccounts, cap); shouldBehaveLikeERC20Mintable(minter, otherAccounts); }); });
context('with bought tokens', function () { const value = ether('42'); beforeEach(async function () { await this.crowdsale.buyTokens(investor, { value: value, from: purchaser }); }); it('does not immediately assign tokens to beneficiaries', async function () { (await this.crowdsale.balanceOf(investor)).should.be.bignumber.equal(value); (await this.token.balanceOf(investor)).should.be.bignumber.equal('0'); }); it('does not allow beneficiaries to withdraw tokens before crowdsale ends', async function () { await shouldFail.reverting.withMessage(this.crowdsale.withdrawTokens(investor), 'PostDeliveryCrowdsale: not closed' ); }); context('after closing time', function () { beforeEach(async function () { await time.increaseTo(this.afterClosingTime); }); it('allows beneficiaries to withdraw tokens', async function () { await this.crowdsale.withdrawTokens(investor); (await this.crowdsale.balanceOf(investor)).should.be.bignumber.equal('0'); (await this.token.balanceOf(investor)).should.be.bignumber.equal(value); }); it('rejects multiple withdrawals', async function () { await this.crowdsale.withdrawTokens(investor); await shouldFail.reverting.withMessage(this.crowdsale.withdrawTokens(investor), 'PostDeliveryCrowdsale: beneficiary is not due any tokens' ); }); }); });