UNPKG

arc_dx

Version:

A platform for building DAOs

333 lines (306 loc) 17.6 kB
const helpers = require('./helpers'); const constants = require('./constants'); const DaoCreator = artifacts.require("./DaoCreator.sol"); const Avatar = artifacts.require("./Avatar.sol"); const SimpleICO = artifacts.require("./SimpleICO.sol"); const StandardTokenMock = artifacts.require('./test/StandardTokenMock.sol'); const ControllerCreator = artifacts.require("./ControllerCreator.sol"); const setupSimpleICOParams = async function(accounts, simpleICO, org, cap=10000, price=1, startBlock=0, endBlock=500) { // Register ICO parameters let beneficiary = org.avatar.address; let admin = accounts[0]; await simpleICO.setParameters(cap, price, startBlock, endBlock, beneficiary, admin); const paramsHash = await simpleICO.getParametersHash(cap, price, startBlock, endBlock, beneficiary, admin); return paramsHash; }; var daoCreator; const setupOrganization = async function (daoCreatorOwner,founderToken,founderReputation) { var controllerCreator = await ControllerCreator.new({gas: constants.ARC_GAS_LIMIT}); daoCreator = await DaoCreator.new(controllerCreator.address,{gas:constants.ARC_GAS_LIMIT}); var org = await helpers.setupOrganization(daoCreator,daoCreatorOwner,founderToken,founderReputation); return org; }; const setup = async function (accounts,cap =10000,price=1) { var testSetup = new helpers.TestSetup(); testSetup.beneficiary = accounts[0]; testSetup.fee =10; testSetup.standardTokenMock = await StandardTokenMock.new(accounts[1],100); testSetup.simpleICO = await SimpleICO.new(); testSetup.org = await setupOrganization(accounts[0],1000,1000); const blockNumber = await web3.eth.getBlockNumber(); testSetup.paramHash= await setupSimpleICOParams(accounts,testSetup.simpleICO,testSetup.org,cap,price,blockNumber,blockNumber+500); await daoCreator.setSchemes(testSetup.org.avatar.address,[testSetup.simpleICO.address],[testSetup.paramHash],["0x00000000"]); return testSetup; }; contract('SimpleICO', accounts => { before(function() { helpers.etherForEveryone(accounts); }); it("simpleICO send ether to contract - should revert", async () => { var simpleICO = await SimpleICO.new(); var account1BalanceBefore = await web3.eth.getBalance(accounts[1])/web3.utils.toWei('1', "ether"); try{ await web3.eth.sendTransaction({from:accounts[1],to:simpleICO.address, value: web3.utils.toWei('1', "ether")}); assert(false,"should fail - contract simpleICO should not receive ethers and should revert in this case"); } catch(ex){ helpers.assertVMException(ex); } var account1BalanceAfter = await web3.eth.getBalance(accounts[1])/web3.utils.toWei('1', "ether"); assert.equal(Math.round(account1BalanceAfter),Math.round(account1BalanceBefore)); }); it("simpleICO setParameters", async function() { var simpleICO = await SimpleICO.new(); await simpleICO.setParameters(1000,2,0,0,accounts[1],accounts[1]); var paramHash = await simpleICO.getParametersHash(1000,2,0,0,accounts[1],accounts[1]); var parameters = await simpleICO.parameters(paramHash); assert.equal(parameters[0].toNumber(),1000); }); it("simpleICO setParameters with cap zero should revert", async function() { var simpleICO = await SimpleICO.new(); try { await simpleICO.setParameters(0,2,0,0,accounts[1],accounts[1]); assert(false,"setParameters with cap zero should revert"); }catch(ex){ helpers.assertVMException(ex); } }); it("simpleICO isActive ", async function() { var testSetup = await setup(accounts); assert.equal(await testSetup.simpleICO.isActive(testSetup.org.avatar.address),false); await testSetup.simpleICO.start(testSetup.org.avatar.address); assert.equal(await testSetup.simpleICO.isActive(testSetup.org.avatar.address),true); }); it("simpleICO isActive test start block ", async function() { var standardTokenMock = await StandardTokenMock.new(accounts[1],100); var simpleICO = await SimpleICO.new(); var org = await setupOrganization(accounts[0],1000,1000); var paramHash= await setupSimpleICOParams(accounts, simpleICO, org, 1000, 1, (await web3.eth.getBlockNumber())+100, (await web3.eth.getBlockNumber())+100+500); //give some tokens to organization avatar so it could register the universal scheme. await standardTokenMock.transfer(org.avatar.address,30,{from:accounts[1]}); await daoCreator.setSchemes(org.avatar.address,[simpleICO.address],[paramHash],["0x8000000F"]); await simpleICO.start(org.avatar.address); assert.equal(await simpleICO.isActive(org.avatar.address),false); }); it("simpleICO isActive test end block ", async function() { var standardTokenMock = await StandardTokenMock.new(accounts[1],100); var simpleICO = await SimpleICO.new(); var org = await setupOrganization(accounts[0],1000,1000); var paramHash= await setupSimpleICOParams(accounts, simpleICO, org, 1000, 1, await web3.eth.getBlockNumber(), await web3.eth.getBlockNumber()); //give some tokens to organization avatar so it could register the universal scheme. await standardTokenMock.transfer(org.avatar.address,30,{from:accounts[1]}); await daoCreator.setSchemes(org.avatar.address,[simpleICO.address],[paramHash],["0x8000000F"]); await simpleICO.start(org.avatar.address); var isActive = await simpleICO.isActive(org.avatar.address); assert.equal(isActive,false); }); it("simpleICO isActive test cap ", async function() { var cap = 2; var price = 1; var standardTokenMock = await StandardTokenMock.new(accounts[1],100); var simpleICO = await SimpleICO.new(); var org = await setupOrganization(accounts[0],1000,1000); var paramHash= await setupSimpleICOParams(accounts, simpleICO, org, cap, price, await web3.eth.getBlockNumber(), await web3.eth.getBlockNumber()+500); //give some tokens to organization avatar so it could register the universal scheme. await standardTokenMock.transfer(org.avatar.address,30,{from:accounts[1]}); await daoCreator.setSchemes(org.avatar.address,[simpleICO.address],[paramHash],["0x8000000F"]); await simpleICO.start(org.avatar.address); var donationEther = cap; await simpleICO.donate(org.avatar.address,accounts[3],{value:donationEther}); var isActive = await simpleICO.isActive(org.avatar.address); assert.equal(isActive,false); }); it("simpleICO haltICO ", async function() { var organization; var standardTokenMock = await StandardTokenMock.new(accounts[1],100); var simpleICO = await SimpleICO.new(); try { await simpleICO.haltICO(accounts[0]); assert(false,"haltICO should fail - accounts[0] is not avatar and not registered yet"); }catch(ex){ helpers.assertVMException(ex); } var org = await setupOrganization(accounts[0],1000,1000); try { await simpleICO.haltICO(org.avatar.address); assert(false,"haltICO should fail - org is not registered yet"); }catch(ex){ helpers.assertVMException(ex); } var paramHash= await setupSimpleICOParams(accounts,simpleICO,org); //give some tokens to organization avatar so it could register the universal scheme. await standardTokenMock.transfer(org.avatar.address,30,{from:accounts[1]}); await daoCreator.setSchemes(org.avatar.address,[simpleICO.address],[paramHash],["0x8000000F"]); organization = await simpleICO.organizationsICOInfo(org.avatar.address); assert.equal(organization[3],false); await simpleICO.start(org.avatar.address); organization = await simpleICO.organizationsICOInfo(org.avatar.address); assert.equal(organization[3],false); await simpleICO.haltICO(org.avatar.address); organization = await simpleICO.organizationsICOInfo(org.avatar.address); assert.equal(organization[3],true); try{ await simpleICO.haltICO(org.avatar.address,{from:accounts[1]}); assert(false,"haltICO should fail - accounts[1] is not admin"); }catch(ex){ helpers.assertVMException(ex); } }); it("simpleICO resumeICO ", async function() { var testSetup = await setup(accounts); await testSetup.simpleICO.start(testSetup.org.avatar.address); await testSetup.simpleICO.haltICO(testSetup.org.avatar.address); var organization = await testSetup.simpleICO.organizationsICOInfo(testSetup.org.avatar.address); assert.equal(organization[3],true); await testSetup.simpleICO.resumeICO(testSetup.org.avatar.address); organization = await testSetup.simpleICO.organizationsICOInfo(testSetup.org.avatar.address); assert.equal(organization[3],false); try{ await testSetup.simpleICO.resumeICO(testSetup.org.avatar.address,{from:accounts[1]}); assert(false,"resumeICO should fail - accounts[1] is not admin"); }catch(ex){ helpers.assertVMException(ex); } }); it("simpleICO donate log", async function() { var price = 2; var testSetup = await setup(accounts,1000,price); await testSetup.simpleICO.start(testSetup.org.avatar.address); //do not send ether ..just call donate. var tx = await testSetup.simpleICO.donate(testSetup.org.avatar.address,accounts[3]); assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "DonationReceived"); var avatar = await helpers.getValueFromLogs(tx, 'organization',1); assert.equal(avatar,testSetup.org.avatar.address); var _beneficiary = await helpers.getValueFromLogs(tx, '_beneficiary',1); assert.equal(_beneficiary,accounts[3]); var _incomingEther = await helpers.getValueFromLogs(tx, '_incomingEther'); assert.equal(_incomingEther,0); var _tokensAmount = await helpers.getValueFromLogs(tx, '_tokensAmount',1); assert.equal(_tokensAmount,0); var donationEther = 3; tx = await testSetup.simpleICO.donate(testSetup.org.avatar.address,accounts[3],{value:donationEther}); assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "DonationReceived"); avatar = await helpers.getValueFromLogs(tx, 'organization',1); assert.equal(avatar,testSetup.org.avatar.address); _beneficiary = await helpers.getValueFromLogs(tx, '_beneficiary',1); assert.equal(_beneficiary,accounts[3]); _incomingEther = await helpers.getValueFromLogs(tx, '_incomingEther'); assert.equal(_incomingEther,donationEther); _tokensAmount = await helpers.getValueFromLogs(tx, '_tokensAmount',1); assert.equal(_tokensAmount.toNumber(),price*donationEther); }); it("simpleICO donate check transfer", async function() { var price = 2; var testSetup = await setup(accounts,1000,price); await testSetup.simpleICO.start(testSetup.org.avatar.address); var donationEther = 3; await testSetup.simpleICO.donate(testSetup.org.avatar.address,accounts[3],{value:donationEther}); var balance = await testSetup.org.token.balanceOf(accounts[3]); assert.equal(balance.toNumber(),price*donationEther); }); it("simpleICO donate check update totalEthRaised", async function() { var price = 2; var testSetup = await setup(accounts,1000,price); await testSetup.simpleICO.start(testSetup.org.avatar.address); var donationEther = 3; await testSetup.simpleICO.donate(testSetup.org.avatar.address,accounts[3],{value:donationEther}); var organization = await testSetup.simpleICO.organizationsICOInfo(testSetup.org.avatar.address); assert.equal(organization[2].toNumber(),donationEther); }); it("simpleICO donate check isActive", async function() { var price = 2; var testSetup = await setup(accounts,1000,price); var donationEther = 3; try{ await testSetup.simpleICO.donate(testSetup.org.avatar.address,accounts[3],{value:donationEther}); assert(false,"donate should fail - ico not started yet"); }catch(ex){ helpers.assertVMException(ex); } }); it("simpleICO donate check isHalted", async function() { var price = 2; var testSetup = await setup(accounts,1000,price); await testSetup.simpleICO.start(testSetup.org.avatar.address); await testSetup.simpleICO.haltICO(testSetup.org.avatar.address); var donationEther = 3; try{ await testSetup.simpleICO.donate(testSetup.org.avatar.address,accounts[3],{value:donationEther}); assert(false,"donate should fail - halted !"); }catch(ex){ helpers.assertVMException(ex); } }); it("simpleICO donate check change back", async function() { var price = 2; var cap = 3; var testSetup = await setup(accounts,cap,price); await testSetup.simpleICO.start(testSetup.org.avatar.address); var donationEther = cap+10; let otherAvatar = await Avatar.new('otheravatar', helpers.NULL_ADDRESS, helpers.NULL_ADDRESS); var beneficiaryBalance = await web3.eth.getBalance(otherAvatar.address); assert.equal(beneficiaryBalance,0); await testSetup.simpleICO.donate(testSetup.org.avatar.address,otherAvatar.address,{value:donationEther}); var balance = await testSetup.org.token.balanceOf(otherAvatar.address); assert.equal(balance.toNumber(),price*cap); beneficiaryBalance = await web3.eth.getBalance(otherAvatar.address); assert.equal(beneficiaryBalance,10); }); it("simpleICO MirrorContractICO", async function() { var price = 2; var cap = 3; var testSetup = await setup(accounts,cap,price); await testSetup.simpleICO.start(testSetup.org.avatar.address); let otherAvatar = await Avatar.new('otheravatar', helpers.NULL_ADDRESS, helpers.NULL_ADDRESS); var beneficiaryBalance = await web3.eth.getBalance(otherAvatar.address); assert.equal(beneficiaryBalance,0); var organization = await testSetup.simpleICO.organizationsICOInfo(testSetup.org.avatar.address); var mirrorContractICO = organization[1]; //need more gas for this ... await web3.eth.sendTransaction({from:accounts[3],to:mirrorContractICO, value:2,gas: 900000 }); //await simpleICO.donate(org.avatar.address,otherAvatar.address,{value:13}); var balance = await testSetup.org.token.balanceOf(accounts[3]); assert.equal(balance.toNumber(),price*2); }); it("simpleICO MirrorContractICO without start should fail", async function() { var price = 2; var cap = 3; var testSetup = await setup(accounts,cap,price); let otherAvatar = await Avatar.new('otheravatar', helpers.NULL_ADDRESS, helpers.NULL_ADDRESS); var beneficiaryBalance =await web3.eth.getBalance(otherAvatar.address); assert.equal(beneficiaryBalance,0); var organization = await testSetup.simpleICO.organizationsICOInfo(testSetup.org.avatar.address); var mirrorContractICO = organization[1]; //need more gas for this ... await web3.eth.sendTransaction({from:accounts[3],to:mirrorContractICO, value:2,gas: 900000 }); //await simpleICO.donate(org.avatar.address,otherAvatar.address,{value:13}); var balance = await testSetup.org.token.balanceOf(accounts[3]); assert.equal(balance.toNumber(),0); }); });