diff --git a/package.json b/package.json index 2c51e92..13f53d7 100644 --- a/package.json +++ b/package.json @@ -44,12 +44,15 @@ "homepage": ".", "dependencies": { "@aragon/os": "3.1.9", + "clear": "^0.1.0", + "cli-spinner": "^0.2.10", "cli-table": "^0.3.1", "colors": "^1.3.3", "commander": "^2.20.0", "embark": "^4.1.0-beta.0", "embarkjs-connector-web3": "^4.0.0", - "inquirer": "^6.3.1" + "inquirer": "^6.3.1", + "readline": "^1.3.0" }, "browserslist": [ ">0.2%", diff --git a/src/actions.js b/src/actions.js index e688e52..da79699 100644 --- a/src/actions.js +++ b/src/actions.js @@ -1,8 +1,7 @@ var inquirer = require('inquirer'); const Web3 = require("web3"); -const Table = require('cli-table'); - - +const PledgeAdminUtils = require('./pledgeadmin-utils'); +const TrxUtils = require('./trx-utils'); const Contracts = require("./contracts.js"); const web3 = new Web3(); @@ -59,33 +58,20 @@ class Actions { 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 () => { - let projectReceipt = await this.contracts.LiquidPledging.methods.addProject(params.name, params.url, params.account, params.parentProject, params.commitTime, params.plugin).send({from: web3.eth.defaultAccount, gas: 2000000}); - console.dir("txHash: " + projectReceipt.transactionHash) - var projectId = projectReceipt.events.ProjectAdded.returnValues.idProject; - - console.log(projectId); + 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); + const projectId = receipt.events.ProjectAdded.returnValues.idProject; + console.log("Project ID: " , projectId); }); } async listProjects() { try { - let numProjects = await this.contracts.LiquidPledging.methods.numberOfPledgeAdmins().call(); - - const table = new Table({ - head: ['Id', 'Name', 'URL', 'ParentProject', 'Status', 'Commit Time', 'Owner', 'Plugin'] - }); - - for(let i = 1; i <= numProjects; i++){ - const pledgeAdmin = await this.contracts.LiquidPledging.methods.getPledgeAdmin(i).call(); - if(pledgeAdmin.adminType !== '2') continue; - - table.push( - [i, pledgeAdmin.name, pledgeAdmin.url, pledgeAdmin.parentProject, pledgeAdmin.canceled ? 'Canceled' : 'Active', pledgeAdmin.commitTime, pledgeAdmin.addr, pledgeAdmin.plugin] - ); - } - - console.log(table.toString()); + 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); } } @@ -95,50 +81,58 @@ class Actions { doAction(text, async () => { try { const pledgeAdmin = await this.contracts.LiquidPledging.methods.getPledgeAdmin(params.id).call(); - const table = new Table({ - head: ['Id', 'Name', 'URL', 'ParentProject', 'Status', 'Commit Time', 'Owner', 'Plugin'] - }); - table.push( - [params.id, pledgeAdmin.name, pledgeAdmin.url, pledgeAdmin.parentProject, pledgeAdmin.canceled ? 'Canceled' : 'Active', pledgeAdmin.commitTime, pledgeAdmin.addr, pledgeAdmin.plugin] - ); - console.log(table.toString()); + PledgeAdminUtils.printTable([pledgeAdmin].filter(x => x.adminType === PledgeAdminUtils.constants.PROJECT)); } catch(error){ console.log("Couldn't obtain the project: ", error.message); } }); } + 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); + } + } + 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 () => { - let funderReceipt = await this.contracts.LiquidPledging.methods.addGiver(params.name, params.url, params.commitTime, params.plugin).send({from: web3.eth.defaultAccount, gas: 2000000}) - console.dir("txHash: " + funderReceipt.transactionHash) - var funderId = funderReceipt.events.GiverAdded.returnValues.idGiver; - console.log(funderId); + 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); + const funderId = receipt.events.GiverAdded.returnValues.idGiver; + console.log("Funder ID: " , funderId); }); } mintToken(params) { let text = `await StandardToken.methods.mint(\"${params.account}\", web3.utils.toWei(\"${params.amount}\", \"ether\")).send({gas: 2000000})` doAction(text, async () => { - let mintReceipt = await this.contracts.StandardToken.methods.mint(params.account, web3.utils.toWei(params.amount, "ether")).send({gas: 2000000}) - console.dir("txHash: " + mintReceipt.transactionHash) + 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) { let text = `await StandardToken.methods.approve(\"${this.contracts.LiquidPledging.options.address}\", web3.utils.toWei(\"${params.amount}\", \"ether\")).send({gas: 2000000})` doAction(text, async () => { - let mintReceipt = await this.contracts.StandardToken.methods.approve(this.contracts.LiquidPledging.options.address, web3.utils.toWei(params.amount, "ether")).send({gas: 2000000}) - console.dir("txHash: " + mintReceipt.transactionHash) + 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) { 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 () => { - let donateReceipt = await this.contracts.LiquidPledging.methods.donate(params.funderId, params.projectId, this.contracts.LiquidPledging.options.address, web3.utils.toWei(params.amount, "ether")).send({gas: 2000000}); - console.dir("txHash: " + donateReceipt.transactionHash) + 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 40d069b..32db5bf 100644 --- a/src/cmd.js +++ b/src/cmd.js @@ -10,7 +10,7 @@ async function app(actions) { subAction = (await menus.projects()).action if (subAction === 'List Projects') { - actions.listProjects(); + actions.listProjects(); } if (subAction === 'Create Project') { let params = (await menus.createProject(actions.web3().eth.defaultAccount)) actions.addProject(params); @@ -25,19 +25,20 @@ async function app(actions) { subAction = (await menus.funders()).action if (subAction === 'List Funders') { + actions.listFunders(); } if (subAction === 'Create Funder') { - let params = (await menus.createProject()) - actions.addProject(params); + 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()) - action.mintToken(params); - } if (subAction === 'Aprove') { + actions.mintToken(params); + } if (subAction === 'Approve') { let params = (await menus.approveToken()) - action.approveToken(params); + actions.approveToken(params); } } else if (action === 'Exit') { process.exit() diff --git a/src/menus.js b/src/menus.js index 9c414de..6b39e75 100644 --- a/src/menus.js +++ b/src/menus.js @@ -70,7 +70,7 @@ const menus = { message: 'Tokens> ', choices: [ 'Mint', - 'Aprove', + 'Approve', // new inquirer.Separator(), // 'Back', // new inquirer.Separator(), diff --git a/src/pledgeadmin-utils.js b/src/pledgeadmin-utils.js new file mode 100644 index 0000000..110da2d --- /dev/null +++ b/src/pledgeadmin-utils.js @@ -0,0 +1,37 @@ +const Table = require('cli-table'); + +const FUNDER = "0"; +const PROJECT = "2"; +const printTable = (pledgeAdmins) => { + const table = new Table({ + head: ['Id', 'Name', 'URL', 'ParentProject', 'Status', 'Commit Time', 'Owner', 'Plugin'] + }); + + for(let i = 0; i < pledgeAdmins.length; i++){ + table.push( + [i, pledgeAdmins[i].name, pledgeAdmins[i].url, pledgeAdmins[i].parentProject, pledgeAdmins[i].canceled ? 'Canceled' : 'Active', pledgeAdmins[i].commitTime, pledgeAdmins[i].addr, pledgeAdmins[i].plugin] + ); + } + + console.log(table.toString()); +}; + + +const getPledgeAdmins = async (LiquidPledging) => { + let numProjects = await LiquidPledging.methods.numberOfPledgeAdmins().call(); + let pledgeAdmins = []; + for(let i = 1; i <= numProjects; i++){ + pledgeAdmins.push(LiquidPledging.methods.getPledgeAdmin(i).call()); + } + return Promise.all(pledgeAdmins); +} + + +module.exports = { + printTable, + getPledgeAdmins, + constants: { + FUNDER, + PROJECT + } +}; diff --git a/src/trx-utils.js b/src/trx-utils.js new file mode 100644 index 0000000..67eb640 --- /dev/null +++ b/src/trx-utils.js @@ -0,0 +1,22 @@ +const Spinner = require('cli-spinner').Spinner; + +const executeAndWait = async (toSend, account) => { + const spinner = new Spinner('%s'); + spinner.setSpinnerString(18); + spinner.start(); + + try { + const estimatedGas = await toSend.estimateGas({from: account}); + const receipt = await toSend.send({from: account, gas: estimatedGas + 10000}); + + spinner.stop(true); + return receipt; + } catch(error) { + console.log("Error minting tokens: ", error.message); + spinner.stop(true); + } +} + +module.exports = { + executeAndWait +}; diff --git a/yarn.lock b/yarn.lock index 168eb59..3199eea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2644,6 +2644,11 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +clear@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/clear/-/clear-0.1.0.tgz#b81b1e03437a716984fd7ac97c87d73bdfe7048a" + integrity sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw== + cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" @@ -2651,6 +2656,11 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" +cli-spinner@^0.2.10: + version "0.2.10" + resolved "https://registry.yarnpkg.com/cli-spinner/-/cli-spinner-0.2.10.tgz#f7d617a36f5c47a7bc6353c697fc9338ff782a47" + integrity sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q== + cli-spinners@^1.1.0: version "1.3.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" @@ -8685,6 +8695,11 @@ readdirp@^2.0.0, readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" +readline@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/readline/-/readline-1.3.0.tgz#c580d77ef2cfc8752b132498060dc9793a7ac01c" + integrity sha1-xYDXfvLPyHUrEySYBg3JeTp6wBw= + recache@0.3.x: version "0.3.1" resolved "https://registry.yarnpkg.com/recache/-/recache-0.3.1.tgz#30037fcb09c594e4e07960342dd5a6ff0a914ddf"