poa-test-setup/e2eCeremonyTest.js

183 lines
5.7 KiB
JavaScript

const fs = require('fs');
const utils = require("./utils/utils");
const Constants = require("./utils/constants");
const constants = Constants.constants;
const dir = require('node-dir');
const path = require('path');
const Web3 = require('web3');
const EthereumTx = require('ethereumjs-tx');
const webdriver = require('selenium-webdriver'),
chrome = require('selenium-webdriver/chrome');
require("chromedriver");
const metaMaskWallet = require('./MetaMaskWallet.js');
const MetaMaskWallet = metaMaskWallet.MetaMaskWallet;
const meta = require('./pages/MetaMask.js');
const buttonSubmit = require('./pages/MetaMask.js');
const ceremony = require('./pages/Ceremony.js');
const timeout = ms => new Promise(res => setTimeout(res, ms))
const ceremonyURL = 'http://localhost:3000'
let args = process.argv.slice(2);
let validator_num = args[0];
let files = dir.files(constants.initialKeysFolder, {sync:true});
files = files.filter((file) => {
let isNotGitKeep = path.basename(file) !== path.basename(`${constants.initialKeysFolder}.gitkeep`);
let isNotDsStore = path.basename(file) !== path.basename(`${constants.initialKeysFolder}.DS_Store`);
return isNotGitKeep && isNotDsStore;
})
let initialKeyPath = files[0];
let initialKeyContent = fs.readFileSync(initialKeyPath, "utf8");
let initialKey
let initialKeyPrivateKeyHex
try {
let initialKeyObj = JSON.parse(initialKeyContent);
initialKey = initialKeyObj.address;
initialKeyPrivateKeyHex = initialKeyObj.privateKey;
} catch(e) {
console.log(e.message);
}
main()
async function main() {
let options = new chrome.Options();
options.addExtensions('./MetaMask_v3.14.1.crx');
options.addArguments('start-maximized');
options.addArguments('disable-popup-blocking');
let driver = new webdriver.Builder()
.withCapabilities(options.toCapabilities())
.build();
let wallet = MetaMaskWallet.createMetaMaskWallet(initialKeyPath);
let metaMask = new meta.MetaMask(driver, wallet);
let ceremonyPage = await new ceremony.Ceremony(driver,ceremonyURL);
metaMask.open();
metaMask.activate();
metaMask.switchToAnotherPage();
ceremonyPage.open();
driver.sleep(4000);
ceremonyPage.clickButtonGenerateKeys();
driver.sleep(2000);
metaMask.switchToAnotherPage();
driver.sleep(3000);
metaMask.refresh();
driver.sleep(2000);
let el = await metaMask.isElementPresent(buttonSubmit.buttonSubmit)
if (el) {
confirmTx(el)
} else {
console.log("Something went wrong. Let's try once more...")
driver.sleep(2000);
let el = await metaMask.isElementPresent(buttonSubmit.buttonSubmit)
confirmTx(el)
}
async function confirmTx(el) {
metaMask.submitTransaction();
ceremonyPage.switchToAnotherPage();
driver.sleep(7000);
let votingKey = await getKeys(ceremonyPage);
console.log("Productions keys are saved")
await transferETHToVotingKey(initialKey, votingKey);
console.log("ETH was transfered from initial key to voting key");
driver.sleep(5000);
let handles = await driver.getAllWindowHandles();
for (let i = 0; i < handles.length; i++) {
driver.switchTo().window(handles[i]);
driver.close();
}
}
}
async function getKeys(ceremonyPage) {
console.log("Productions keys saving...")
let miningKey = await ceremonyPage.getMiningKey();
let payoutKey = await ceremonyPage.getPayoutKey();
let votingKey = await ceremonyPage.getVotingKey();
fs.writeFileSync(`${constants.miningKeysFolder}/${miningKey.address}.key`, JSON.stringify(miningKey));
fs.writeFileSync(`${constants.payoutKeysFolder}/${payoutKey.address}.key`, JSON.stringify(payoutKey));
fs.writeFileSync(`${constants.votingKeysFolder}/${votingKey.address}.key`, JSON.stringify(votingKey));
let validator_path = `${constants.nodeFolder}/parity_validator_${validator_num}`;
if (!fs.existsSync(validator_path)) {
fs.mkdirSync(validator_path);
}
if (!fs.existsSync(`${validator_path}/keys`)) {
fs.mkdirSync(`${validator_path}/keys`);
}
if (!fs.existsSync(`${validator_path}/keys/Sokol`)) {
fs.mkdirSync(`${validator_path}/keys/Sokol`);
}
fs.writeFileSync(`${validator_path}/keys/Sokol/${miningKey.address}`, JSON.stringify(miningKey.keyObject));
fs.writeFileSync(`${validator_path}/node.pwd`, miningKey.password);
fs.unlinkSync(initialKeyPath);
await fs.readdir(constants.scriptsMocOutputFolder, (err, files) => {
if (err) throw err;
for (const file of files) {
if (file != '.gitkeep' && file != '.DS_Store') {
fs.unlinkSync(path.join(constants.scriptsMocOutputFolder, file));
}
}
});
return votingKey.address;
}
async function transferETHToVotingKey(initialKey, votingKey) {
console.log("initialKey:", initialKey);
console.log("votingKey:", votingKey);
let web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));
var nonce = await web3.eth.getTransactionCount(initialKey);
var nonceHex = web3.utils.toHex(nonce);
var BN = web3.utils.BN;
var ethToSend = web3.utils.toWei(new BN(90), "milliether");
const rawTx = {
nonce: nonceHex,
gasPrice: 21000,
gasLimit: 100000,
to: votingKey,
value: ethToSend,
data: '0x0',
chainId: web3.utils.toHex(web3.version.network)
};
const initialKeyPrivateKeyBuf = Buffer.from(initialKeyPrivateKeyHex, 'hex')
var tx = new EthereumTx(rawTx);
tx.sign(initialKeyPrivateKeyBuf);
var serializedTx = tx.serialize();
let receipt;
try { receipt = await web3.eth.sendSignedTransaction("0x" + serializedTx.toString('hex')) }
catch (err) { return console.log(err.message); }
}