diff --git a/src/actions.js b/src/actions.js index da79699..6d1946f 100644 --- a/src/actions.js +++ b/src/actions.js @@ -7,24 +7,27 @@ const Contracts = require("./contracts.js"); const web3 = new Web3(); function doAction(actionText, action) { - console.dir(actionText) - const confirmation = inquirer - .prompt([ - { - type: 'confirm', - name: 'action', - message: 'Execute?', - } - ]).then((answer) => { - if (answer.action === false) return; - console.dir("executing..."); - try { - action() - } catch (e) { - console.dir("== error") - console.dir(e) - } - }) + console.dir(actionText) + return new Promise(async(resolve, reject) => { + inquirer + .prompt([ + { + type: 'confirm', + name: 'action', + message: 'Execute?', + } + ]).then((answer) => { + if (answer.action === false) return resolve(); + console.dir("executing..."); + try { + action() + } catch (e) { + console.dir("== error") + console.dir(e) + } + resolve() + }) + }); } class Actions { @@ -55,9 +58,9 @@ class Actions { return web3; } - addProject(params) { + async addProject(params) { let text = `await LiquidPledging.methods.addProject(\"${params.name}\", \"${params.url}\", \"${params.account}\", ${params.parentProject}, ${params.commitTime}, \"${params.plugin}\").send({from: \"${web3.eth.defaultAccount}\", gas: 2000000})` - doAction(text, async () => { + return doAction(text, async () => { const toSend = this.contracts.LiquidPledging.methods.addProject(params.name, params.url, params.account, params.parentProject, params.commitTime, params.plugin); const receipt = await TrxUtils.executeAndWait(toSend, web3.eth.defaultAccount); console.dir("txHash: " + receipt.transactionHash); @@ -67,18 +70,21 @@ class Actions { } async listProjects() { - try { - const pledgeAdmins = await PledgeAdminUtils.getPledgeAdmins(this.contracts.LiquidPledging); - PledgeAdminUtils.printTable(pledgeAdmins.filter(x => x.adminType === PledgeAdminUtils.constants.PROJECT)); - } catch(error){ - console.log(error); - console.log("Couldn't obtain the list of projects: ", error.message); - } + return new Promise(async (resolve, reject) => { + try { + const pledgeAdmins = await PledgeAdminUtils.getPledgeAdmins(this.contracts.LiquidPledging); + PledgeAdminUtils.printTable(pledgeAdmins.filter(x => x.adminType === PledgeAdminUtils.constants.PROJECT)); + } catch(error){ + console.log(error); + console.log("Couldn't obtain the list of projects: ", error.message); + } + resolve(); + }); } - viewProject(params) { + async viewProject(params) { let text = `await LiquidPledging.methods.getPledgeAdmin(\"${params.id}\").call()` - doAction(text, async () => { + return doAction(text, async () => { try { const pledgeAdmin = await this.contracts.LiquidPledging.methods.getPledgeAdmin(params.id).call(); PledgeAdminUtils.printTable([pledgeAdmin].filter(x => x.adminType === PledgeAdminUtils.constants.PROJECT)); @@ -88,19 +94,22 @@ class Actions { }); } - async listFunders() { - try { - const pledgeAdmins = await PledgeAdminUtils.getPledgeAdmins(this.contracts.LiquidPledging); - PledgeAdminUtils.printTable(pledgeAdmins.filter(x => x.adminType === PledgeAdminUtils.constants.FUNDER)); - } catch(error){ - console.log(error); - console.log("Couldn't obtain the list of funders: ", error.message); - } - } + async listFunders() { + return new Promise(async (resolve, reject) => { + try { + const pledgeAdmins = await PledgeAdminUtils.getPledgeAdmins(this.contracts.LiquidPledging); + PledgeAdminUtils.printTable(pledgeAdmins.filter(x => x.adminType === PledgeAdminUtils.constants.FUNDER)); + } catch(error){ + console.log(error); + console.log("Couldn't obtain the list of funders: ", error.message); + } + resolve(); + }); + } - addGiver(params) { + async addGiver(params) { let text = `await LiquidPledging.methods.addGiver(\"${params.name}\", \"${params.url}\", ${params.commitTime}, \"${params.plugin}\").send({from: \"${web3.eth.defaultAccount}\", gas: 2000000})` - doAction(text, async () => { + return doAction(text, async () => { const toSend = this.contracts.LiquidPledging.methods.addGiver(params.name, params.url, params.commitTime, params.plugin); const receipt = await TrxUtils.executeAndWait(toSend, web3.eth.defaultAccount); console.dir("txHash: " + receipt.transactionHash); @@ -109,27 +118,27 @@ class Actions { }); } - mintToken(params) { + async mintToken(params) { let text = `await StandardToken.methods.mint(\"${params.account}\", web3.utils.toWei(\"${params.amount}\", \"ether\")).send({gas: 2000000})` - doAction(text, async () => { + return doAction(text, async () => { const toSend = this.contracts.StandardToken.methods.mint(params.account, web3.utils.toWei(params.amount.toString(), "ether")); const receipt = await TrxUtils.executeAndWait(toSend, web3.eth.defaultAccount); console.dir("txHash: " + receipt.transactionHash); }); } - approveToken(params) { + async approveToken(params) { let text = `await StandardToken.methods.approve(\"${this.contracts.LiquidPledging.options.address}\", web3.utils.toWei(\"${params.amount}\", \"ether\")).send({gas: 2000000})` - doAction(text, async () => { + return doAction(text, async () => { const toSend = this.contracts.StandardToken.methods.approve(this.contracts.LiquidPledging.options.address, web3.utils.toWei(params.amount.toString(), "ether")); const receipt = await TrxUtils.executeAndWait(toSend, web3.eth.defaultAccount); console.dir("txHash: " + receipt.transactionHash); }); } - donate(params) { + async donate(params) { let text = `await LiquidPledging.methods.donate(${params.funderId}, ${params.projectId}, \"${this.contracts.LiquidPledging.options.address}\", web3.utils.toWei(\"${params.amount}\", \"ether\")).send({gas: 2000000});` - doAction(text, async () => { + return doAction(text, async () => { const toSend = this.contracts.LiquidPledging.methods.donate(params.funderId, params.projectId, this.contracts.LiquidPledging.options.address, web3.utils.toWei(params.amount.toString(), "ether")); const receipt = await TrxUtils.executeAndWait(toSend, web3.eth.defaultAccount); console.dir("txHash: " + receipt.transactionHash); diff --git a/src/cmd.js b/src/cmd.js index 32db5bf..7622894 100644 --- a/src/cmd.js +++ b/src/cmd.js @@ -1,50 +1,59 @@ var inquirer = require('inquirer'); const menus = require('./menus.js'); +function mainMenu(actions) { + return new Promise(async (resolve, reject) => { + let action = (await menus.main()).action + let subAction + + if (action === 'Projects') { + subAction = (await menus.projects()).action + + if (subAction === 'List Projects') { + await actions.listProjects(); + } if (subAction === 'Create Project') { + let params = (await menus.createProject(actions.web3().eth.defaultAccount)) + await actions.addProject(params); + } if (subAction === 'View Project') { + let params = (await menus.viewProject()) + await actions.viewProject(params); + } if (subAction === 'Donate to Project') { + let params = (await menus.donate()) + await actions.donate(params); + } + } else if (action === 'Funders') { + subAction = (await menus.funders()).action + + if (subAction === 'List Funders') { + await actions.listFunders(); + } if (subAction === 'Create Funder') { + let params = (await menus.createFunder()) + await actions.addGiver(params); + } + } else if (action === 'Tokens') { + subAction = (await menus.tokens()).action + + if (subAction === 'Mint') { + let params = (await menus.mintToken()) + await actions.mintToken(params); + } if (subAction === 'Approve') { + let params = (await menus.approveToken()) + await actions.approveToken(params); + } + } else if (action === 'Exit') { + process.exit() + } else { + console.dir("unknown action: " + action) + } + resolve(); + }); +} + async function app(actions) { console.dir("### Liquid Funding Console") - let action = (await menus.main()).action - let subAction - - if (action === 'Projects') { - subAction = (await menus.projects()).action - - if (subAction === 'List Projects') { - actions.listProjects(); - } if (subAction === 'Create Project') { - let params = (await menus.createProject(actions.web3().eth.defaultAccount)) - actions.addProject(params); - } if (subAction === 'View Project') { - let params = (await menus.viewProject()) - actions.viewProject(params); - } if (subAction === 'Donate to Project') { - let params = (await menus.donate()) - actions.donate(params); - } - } else if (action === 'Funders') { - subAction = (await menus.funders()).action - - if (subAction === 'List Funders') { - actions.listFunders(); - } if (subAction === 'Create Funder') { - let params = (await menus.createFunder()) - actions.addGiver(params); - } - } else if (action === 'Tokens') { - subAction = (await menus.tokens()).action - - if (subAction === 'Mint') { - let params = (await menus.mintToken()) - actions.mintToken(params); - } if (subAction === 'Approve') { - let params = (await menus.approveToken()) - actions.approveToken(params); - } - } else if (action === 'Exit') { - process.exit() - } else { - console.dir("unknown action: " + action) - } + while (true) { + await mainMenu(actions); + } } module.exports = app; diff --git a/src/menus.js b/src/menus.js index 6b39e75..d940443 100644 --- a/src/menus.js +++ b/src/menus.js @@ -33,8 +33,8 @@ const menus = { 'Create Project', 'View Project', 'Donate to Project', - // new inquirer.Separator(), - // 'Back', + new inquirer.Separator(), + 'Back', // new inquirer.Separator(), // 'Exit' ] @@ -52,8 +52,8 @@ const menus = { choices: [ 'List Funders', 'Create Funder', - // new inquirer.Separator(), - // 'Back', + new inquirer.Separator(), + 'Back', // new inquirer.Separator(), // 'Exit' ] @@ -71,8 +71,8 @@ const menus = { choices: [ 'Mint', 'Approve', - // new inquirer.Separator(), - // 'Back', + new inquirer.Separator(), + 'Back', // new inquirer.Separator(), // 'Exit' ] @@ -89,8 +89,8 @@ const menus = { message: 'Project> ' + id, choices: [ 'Donate/Pledge', - // new inquirer.Separator(), - // 'Back', + new inquirer.Separator(), + 'Back', // new inquirer.Separator(), // 'Exit' ]