const { expectThrow } = require('../helpers/expectThrow'); const { ethSendTransaction, ethGetBalance } = require('../helpers/web3'); const HasNoEtherTest = artifacts.require('HasNoEtherTest'); const ForceEther = artifacts.require('ForceEther'); contract('HasNoEther', function (accounts) { const amount = web3.toWei('1', 'ether'); it('should be constructible', async function () { await HasNoEtherTest.new(); }); it('should not accept ether in constructor', async function () { await expectThrow(HasNoEtherTest.new({ value: amount })); }); it('should not accept ether', async function () { const hasNoEther = await HasNoEtherTest.new(); await expectThrow( ethSendTransaction({ from: accounts[1], to: hasNoEther.address, value: amount, }), ); }); it('should allow owner to reclaim ether', async function () { // Create contract const hasNoEther = await HasNoEtherTest.new(); const startBalance = await ethGetBalance(hasNoEther.address); assert.equal(startBalance, 0); // Force ether into it const forceEther = await ForceEther.new({ value: amount }); await forceEther.destroyAndSend(hasNoEther.address); const forcedBalance = await ethGetBalance(hasNoEther.address); assert.equal(forcedBalance, amount); // Reclaim const ownerStartBalance = await ethGetBalance(accounts[0]); await hasNoEther.reclaimEther(); const ownerFinalBalance = await ethGetBalance(accounts[0]); const finalBalance = await ethGetBalance(hasNoEther.address); assert.equal(finalBalance, 0); assert.isTrue(ownerFinalBalance.greaterThan(ownerStartBalance)); }); it('should allow only owner to reclaim ether', async function () { // Create contract const hasNoEther = await HasNoEtherTest.new({ from: accounts[0] }); // Force ether into it const forceEther = await ForceEther.new({ value: amount }); await forceEther.destroyAndSend(hasNoEther.address); const forcedBalance = await ethGetBalance(hasNoEther.address); assert.equal(forcedBalance, amount); // Reclaim await expectThrow(hasNoEther.reclaimEther({ from: accounts[1] })); }); });