const Logger= require('../entity/Logger.js'); const logger=Logger.logger; const meta=require('../pages/MetaMask.js'); const MetaMask=meta.MetaMask; const wizardWelcome=require('../pages/WizardWelcome.js'); const WizardWelcome=wizardWelcome.WizardWelcome; const wizStep1=require('../pages/WizardStep1.js'); const WizardStep1=wizStep1.WizardStep1; const wizStep2=require('../pages/WizardStep2.js'); const WizardStep2=wizStep2.WizardStep2; const wizStep3=require('../pages/WizardStep3.js'); const WizardStep3=wizStep3.WizardStep3; const wizStep4=require('../pages/WizardStep4.js'); const WizardStep4=wizStep4.WizardStep4; const tierpage=require('../pages/TierPage.js'); const TierPage=tierpage.TierPage; const reservedTokensPage=require('../pages/ReservedTokensPage.js'); const ReservedTokensPage=reservedTokensPage.ReservedTokensPage; const crowdPage=require('../pages/CrowdsalePage.js'); const CrowdsalePage=crowdPage.CrowdsalePage; const investPage=require('../pages/InvestPage.js'); const InvestPage=investPage.InvestPage; const managePage=require('../pages/ManagePage.js'); const ManagePage=managePage.ManagePage; const utils=require('../utils/Utils.js'); const Utils=utils.Utils; const fs = require('fs'); const crowdsale=require('../entity/Crowdsale.js'); const Crowdsale=crowdsale.Crowdsale; const page=require('../pages/Page.js'); const Page=page.Page; const testRA=require('../test/testRA.js'); const timeLimitTransactions=25; class User { constructor(driver,file){ try{ this.driver = driver; var obj = JSON.parse(fs.readFileSync(file, "utf8")); this.account = obj.account; this.privateKey = obj.privateKey; this.networkID = obj.networkID; this.accountOrderInMetamask = "undefined";//for MetaMaskPage only this.name = file; } catch (err) { logger.info("can not create User instance"); logger.info(err); } } async getTokenBalance(crowdsale) { logger.info("GetTokenBalance: account="+this.account); logger.info("Token address="+crowdsale.tokenAddress); try { let web3 = Utils.setNetwork(this.networkID); let tokenContract=crowdsale.tokenContractAbi; let MyContract = new web3.eth.Contract(tokenContract, crowdsale.tokenAddress); return await MyContract.methods.balanceOf(this.account).call(); } catch(err) { logger.info("Can not get balance. "+err); return 0; } } async setMetaMaskAccount() { logger.info("Set Metamask account") let metaMask = new MetaMask(this.driver); if (this.accountOrderInMetamask =="undefined") { await metaMask.importAccount(this); } else { await metaMask.selectAccount(this); } } print(){ logger.info("account:"+this.account); logger.info("privateKey:"+this.privateKey); logger.info("networkID:"+this.networkID); } async openInvestPage(crowdsale) { await new Page(this.driver).open(crowdsale.url); } async openManagePage(crowdsale) { logger.info("Open manage page") const startURL=Utils.getStartURL(); /* var welcomePage=new WizardWelcome(this.driver); welcomePage.URL=startURL; await welcomePage.activate(); await welcomePage.clickButtonChooseContract();*/ let mngPage=new ManagePage(this.driver); mngPage.URL=startURL+"manage/"+crowdsale.contractAddress; await mngPage.open(); await mngPage.waitUntilLoaderGone(); if (await mngPage.isPresentButtonOK()) return false; return mngPage; } async getSupplyTier(tier) { logger.info("get Supply for tier #"+tier); let mngPage=new ManagePage(this.driver); await mngPage.refresh(); let s=await mngPage.getSupplyTier(tier); logger.info("Received value="+s); return s; } async getRateTier(tier) { logger.info("get Rate for tier #"+tier); let mngPage=new ManagePage(this.driver); await mngPage.refresh(); let s=await mngPage.getRateTier(tier); logger.info("Received value="+s); return s; } async getStartTime(tier){ logger.info("get Start time of tier #"+tier); let mngPage=new ManagePage(this.driver); await mngPage.refresh(); let s=await mngPage.getStartTimeTier(tier); logger.info("Received value="+s); return s; } async getEndTime(tier) { logger.info("get End time of tier #"+tier); let mngPage=new ManagePage(this.driver); await mngPage.refresh(); let s=await mngPage.getEndTimeTier(tier); logger.info("Received value="+s); return s; } async changeRate(tier,value) { logger.info("change Rate for tier#" + tier); let mngPage=new ManagePage(this.driver); await mngPage.waitUntilLoaderGone(); try { await mngPage.fillRateTier(tier, value); await mngPage.clickButtonSave(); let metaMask = new MetaMask(this.driver); await metaMask.doTransaction(5); await mngPage.waitUntilLoaderGone(); let result = await this.confirmPopup(); await mngPage.waitUntilLoaderGone(); return result; } catch(err){ logger.info("can not change Rate for tier #"+ tier+" ,err:"+err ); return false; } } async fillWhitelistTier(tier,address,min,max) { logger.info("fill whitelist for tier "+ tier); logger.info("Wh address="+address+" , min="+min+ ", max="+max); let mngPage=new ManagePage(this.driver); await mngPage.fillWhitelist(tier,address,min,max); let metaMask = new MetaMask(this.driver); let result=await metaMask.doTransaction(5); if (!result) return false; await mngPage.waitUntilLoaderGone(); result = await this.confirmPopup(); await mngPage.waitUntilLoaderGone(); return result; } async changeSupply(tier,value){ logger.info("change Supply for tier#" + tier); let mngPage=new ManagePage(this.driver); await mngPage.waitUntilLoaderGone(); try { await mngPage.fillSupplyTier(tier, value); await mngPage.clickButtonSave(); let metaMask = new MetaMask(this.driver); await metaMask.doTransaction(5); await mngPage.waitUntilLoaderGone(); let result = await this.confirmPopup(); await mngPage.waitUntilLoaderGone(); return result; } catch(err){ logger.info("can not change Supply for tier #"+ tier+" ,err:"+err ); return false; } } async changeEndTime(tier, newDate, newTime) { logger.info("change EndTime for tier#"+tier+", new date="+newDate+", new time="+newTime); let formatTimeBrowser=await Utils.getDateFormat(this.driver); if (formatTimeBrowser=="mdy") { newDate=Utils.convertDateToMdy(newDate); newTime=Utils.convertTimeToMdy(newTime); } let mngPage=new ManagePage(this.driver); await mngPage.waitUntilLoaderGone(); try { let b=await mngPage.fillEndTimeTier(tier, newDate, newTime); if (!b) return false; if ( await mngPage.isPresentWarningEndTimeTier1()|| await mngPage.isPresentWarningEndTimeTier2() ) { return false; } await mngPage.clickButtonSave(); let metaMask = new MetaMask(this.driver); await metaMask.doTransaction(5); await mngPage.waitUntilLoaderGone(); b = await this.confirmPopup(); await mngPage.waitUntilLoaderGone(); return b; } catch(err){ logger.info("can not change Supply for tier #"+ tier+" ,err:"+err ); return false; } } async changeStartTime(tier,newDate,newTime) { logger.info("change StartTime for tier#"+tier+", new date="+newDate+", new time="+newTime); let formatTimeBrowser=await Utils.getDateFormat(this.driver); if (formatTimeBrowser=="mdy") { newDate=Utils.convertDateToMdy(newDate); newTime=Utils.convertTimeToMdy(newTime); } let mngPage=new ManagePage(this.driver); await mngPage.waitUntilLoaderGone(); try { let result=await mngPage.fillStartTimeTier(tier, newDate, newTime); if (!result) return false; if ( await mngPage.isPresentWarningStartTimeTier1()|| await mngPage.isPresentWarningStartTimeTier2() ) return false; await mngPage.clickButtonSave(); let metaMask = new MetaMask(this.driver); await metaMask.doTransaction(); await mngPage.waitUntilLoaderGone(); result = await this.confirmPopup(); await mngPage.waitUntilLoaderGone(); return result; } catch(err){ logger.info("can not change start time for tier #"+ tier+" ,err:"+err ); return false; } } async distribute(crowdsale) { logger.info(this.account + ": distribution:"); let mngPage=await this.openManagePage(crowdsale); await mngPage.refresh(); logger.info("Snapshot:"); logger.info("Time now: "+Utils.getDate()); logger.info("Start time: "+await mngPage.getStartTimeTier(1)); logger.info("End time: "+await mngPage.getEndTimeTier(1)); logger.info("isDistributionEnabled: "+await mngPage.isEnabledDistribute()); logger.info("isFinalizeEnabled: "+await mngPage.isEnabledFinalize()); logger.info("walletAddress: "+await mngPage.getWalletAddressTier(1)); await mngPage.waitUntilLoaderGone(); await this.driver.sleep(3000); if (await mngPage.isEnabledFinalize()) await mngPage.clickButtonFinalize(); //await Utils.zoom(this.driver,0.5); //await Utils.takeScreenshoot(this.driver,"manage1"); //await Utils.zoom(this.driver,1); await mngPage.waitUntilLoaderGone(); await mngPage.refresh(); await this.driver.sleep(3000); let result=false; for (let i=0;i<2;i++) { result=(await mngPage.isEnabledDistribute())||result; } //await Utils.zoom(this.driver,0.5); //await Utils.takeScreenshoot(this.driver,"manage2"); //await Utils.zoom(this.driver,1); if (result) { await mngPage.clickButtonDistribute(); } else { await mngPage.clickButtonDistribute(); return false; } let metaMask = new meta.MetaMask(this.driver); await metaMask.doTransaction(10); await mngPage.waitUntilLoaderGone(); result = await mngPage.confirmPopup(); return true; } async finalize(crowdsale) { logger.info(this.account + ": finalize:"); await this.openManagePage(crowdsale); let mngPage=new ManagePage(this.driver); await mngPage.waitUntilLoaderGone(); await this.driver.sleep(3000); await mngPage.refresh(); await this.driver.sleep(3000); await mngPage.clickButtonDistribute(); await mngPage.refresh(); await this.driver.sleep(3000); if ( await mngPage.isEnabledFinalize()) { await mngPage.clickButtonFinalize(); } else { return false; } let counter=0; do { if (counter++>20) return false; await this.driver.sleep(1000); } while(!(await mngPage.isPresentPopupYesFinalize())); await mngPage.clickButtonYesFinalize(); let metaMask = new meta.MetaMask(this.driver); await metaMask.doTransaction(5); await mngPage.waitUntilLoaderGone(); await mngPage.confirmPopup(); return true; } async createCrowdsale(crowdsale,Tfactor,option) { logger.info("create crowdsale:") let refreshCount=5; if ((this.networkID!=8545)&&(this.networkID!=77)) refreshCount=15; const startURL=Utils.getStartURL(); const welcomePage = new WizardWelcome(this.driver,startURL); const metaMask = new MetaMask(this.driver); const wizardStep1 = new WizardStep1(this.driver); const wizardStep2 = new WizardStep2(this.driver); const wizardStep3 = new WizardStep3(this.driver); WizardStep3.setCountTiers(0); WizardStep3.setFlagCustom(false); WizardStep3.setFlagWHitelising(false); const wizardStep4 = new WizardStep4(this.driver); const crowdsalePage = new CrowdsalePage(this.driver); const investPage = new InvestPage(this.driver); const reservedTokens=new ReservedTokensPage(this.driver); let tiers=[]; for (let i=0;i0) do { await wizardStep2.fillName(crowdsale.name); } while(await wizardStep2.isPresentWarningName()); do { await wizardStep2.fillTicker(crowdsale.ticker); } while(await wizardStep2.isPresentWarningTicker()); do { await wizardStep2.fillDecimals(crowdsale.decimals); } while(await wizardStep2.isPresentWarningDecimals()); if (option=='reserved') { await testRA.fillReservedTokens(this.driver); //for testing bundle of reserved addresses } else for (var i=0;i0); let counterTransactions=0; let skippedTransactions=0; let isContinue=true; let result=false; let timeLimit=timeLimitTransactions*crowdsale.tiers.length; do { result=await metaMask.doTransaction(refreshCount); counterTransactions++; if (!result) { logger.info("Transaction #"+counterTransactions+" didn't appear."); } else { logger.info("Transaction# "+counterTransactions+" is successfull"); } await this.driver.sleep(Tfactor*500);//anyway won't be faster than start time if (await wizardStep4.isPresentButtonSkipTransaction()) { await wizardStep4.clickButtonSkipTransaction(); await this.driver.sleep(1000); await wizardStep4.clickButtonYes(); logger.info("Transaction #"+ (counterTransactions+1)+" is skipped."); counterTransactions++; skippedTransactions++; } else { if (!(await wizardStep4.isPresentModal())) { await wizardStep4.waitUntilLoaderGone(); await wizardStep4.clickButtonOk(); isContinue = false; } } if (skippedTransactions>5) { logger.info("Deployment failed because too many skipped transaction."+ "\n"+"Transaction were done:"+ (counterTransactions-skippedTransactions)+ "\n"+ "Transaction were skipped: "+skippedTransactions); isContinue=false; } if((timeLimit--)==0) { logger.info("Deployment failed because time expired."+"\n"+ " Transaction were done:"+ (counterTransactions-skippedTransactions)+ "\n"+ "Transaction were skipped: "+skippedTransactions); isContinue=false; } } while (isContinue); logger.info("Crowdsale created."+"\n"+" Transaction were done:"+ (counterTransactions-skippedTransactions)+ "\n"+ "Transaction were skipped: "+skippedTransactions); await this.driver.sleep(5000); const abi=await wizardStep4.getABI(); await wizardStep4.clickButtonContinue(); await wizardStep4.waitUntilLoaderGone(); await this.driver.sleep(1000); do { await crowdsalePage.clickButtonInvest();} while (! await investPage.isPresentCountdownTimer()) const urlInvestPage=await investPage.getURL(); await investPage.waitUntilLoaderGone(); const tokenAddress=await investPage.getTokenAddress(); const contractAddress=await investPage.getContractAddress(); logger.info(JSON.stringify(abi)); logger.info("Final invest page link: "+urlInvestPage); logger.info("token address: "+tokenAddress); logger.info("contract address: "+contractAddress); crowdsale.tokenAddress=tokenAddress; crowdsale.contractAddress=contractAddress; crowdsale.url=urlInvestPage; crowdsale.tokenContractAbi=abi; return crowdsale; } async confirmPopup(){ logger.info("confirm popup"); let investPage = new InvestPage(this.driver); await this.driver.sleep(1000); let counter=10; while(counter-->0) { await this.driver.sleep(1000); if (await investPage.isPresentWarning()) { await this.driver.sleep(1000); await investPage.clickButtonOK(); return true; } return false; } } async contribute(amount){ logger.info(" contribution = "+amount); const investPage = new InvestPage(this.driver); await investPage.waitUntilLoaderGone(); await investPage.fillInvest(amount); await investPage.clickButtonContribute(); let counter=0; let isContinue=true; let timeLimit=2; do { await this.driver.sleep(500); if (await investPage.isPresentWarning()) { await logger.info(this.name+": warning:"+await investPage.getWarningText()); return false; } if (await investPage.isPresentError()) { await logger.info(this.name+": error:"+await investPage.getErrorText()); return false; } counter++; if (counter>=timeLimit) { isContinue=false; } } while(isContinue); let result=await new MetaMask(this.driver).doTransaction(5); if (!result) { return false; } await investPage.waitUntilLoaderGone(); counter=0; timeLimit=5; while(counter++