diff --git a/bin/MasterDistiller.js b/bin/MasterDistiller.js index 048d33896454672fa1c60ca2d634ecddebc73104..319fbca08a567427306be988a225b0123c24dbff 100755 --- a/bin/MasterDistiller.js +++ b/bin/MasterDistiller.js @@ -1,18 +1,11 @@ #!/usr/bin/node -var port = 14349; // cloud -port = 16437; // bc -const networkdir = 'network5445'; -const readline = require('readline'); -const rl = readline.createInterface( { input: process.stdin, output: process.stdout } ); -const Web3 = require('web3'); -const fs = require('fs'); -const Personal = require('web3-eth-personal'); +const Libbfa = require( process.env.BFAHOME + '/bin/libbfa.js'); +const rl = require('readline').createInterface( { input: process.stdin, output: process.stdout } ); var web3; -var GasWell; -var from; -var contractbalance; -var contractaddr; +var Distillery; +var bfa; +var notation = [ 6 ]; function fatal( txt ) { @@ -22,29 +15,27 @@ function fatal( txt ) function init() { - if ( process.env.BFAHOME == undefined ) - fatal( "$BFAHOME not set. Did you source bfa/bin/env ?" ); - web3 = new Web3( "http://127.0.0.1:"+port ); - //accounts = new Accounts( web3 ); - var abi = ""; - contractaddr = fs.realpathSync([ process.env.BFAHOME, networkdir, 'contracts', 'GasWell' ].join('/')); - if ( contractaddr == undefined ) - fatal( "I can't seem to find the contract directory containing the Gas Well's ABI" ); - contractaddr = contractaddr.replace(/^.*\//, ''); - var abipath = [ process.env.BFAHOME, networkdir, 'contracts', contractaddr, 'abi' ].join('/'); - var abifile = fs.createReadStream( abipath ) - .on('readable', () => { - var data; - while (data = abifile.read()) - abi += data; - }) - .on('end', () => { - GasWell = new web3.eth.Contract( JSON.parse(abi), contractaddr ); - web3.eth.getBalance( contractaddr ).then( function(v){contractbalance=v} ); + notation.push( 10**notation[0] ); + switch ( notation[0] ) { + case 6: + notation.push( "Mwei" ); + break; + case 9: + notation.push( "Gwei" ); + break; + default: + notation = [ 6, 10**6, "Mwei" ]; + } + bfa = new Libbfa(); + web3 = bfa.newweb3(); + Distillery = bfa.contract( web3, 'Distillery' ); + web3.eth.getBalance( Distillery.contractaddress ).then( + function receivedOwnBalance(val) { + Distillery.contractbalance = val; getlist(); - }) - ; - getAccount(); + }, + function err(x){ console.log("Can't do that: "+x);process.exit(1); } + ); } function isNumeric(n) { @@ -55,41 +46,7 @@ function isAddr(n) { return n.length == 42 && n.substring(0,2) == "0x"; } - -function getAccount() -{ - var personal = new Personal( web3 ); - personal.getAccounts().then( - function gotPersonalAccounts(obj) { - console.log("Setting default account to "+ obj[0]); - from = obj[0]; - web3.eth.defaultAccount = obj[0]; - }, - function failedGettingPersonalAccounts(err){ - fatal ("Did you remember to allow 'personal' via the RPC port? " + err) - } - ); -} - -function getpos(i) -{ - var arr; - var p = GasWell.methods.atPosition(i).call() - .then( - function gotOneAccount(result) { - console.log( "CC: "+result); - console.log( "C1: "+result[0]); - arr = result; - }, - function gotOneAccountError(err) { - console.log( "DD: "+err); - console.log(err); - } - ); - return arr; -} - -function wellSort(a,b) +function palletSort(a,b) { if ( b == undefined ) { @@ -111,16 +68,17 @@ function wellSort(a,b) function requestBalances( count ) { - var well = new Array; + var pallet = new Array; var proms = new Array; var i; + // Fetch addresses from the list in the contract. for ( i=0; i<count; i++ ) { proms.push( - GasWell.methods.atPosition(i).call( {} ) + Distillery.methods.atPosition(i).call( {} ) .then( function(res){ - well.push(res); + pallet.push(res); }, function(err) { console.log("Fetching position data failed: "+err) } ) @@ -133,11 +91,11 @@ function requestBalances( count ) var p2 = new Array(); for ( i=0; i<count; i++ ) { - var cb = setBal.bind(null,well,i); - p2.push( web3.eth.getBalance( well[i][0] ).then(cb) ); + var cb = setBal.bind(null,pallet,i); + p2.push( web3.eth.getBalance( pallet[i][0] ).then(cb) ); } Promise.all( p2 ).then( - function allbalances(a) { displayBalances( well ) }, + function allbalances(a) { displayBalances( pallet ) }, function(err) { console.log("Getting balances failed: "+err) } ); }, @@ -150,7 +108,7 @@ function setBal( arr, idx, val ) arr[idx][2]=val; } -function editAccount( entry, well ) +function editAccount( entry, pallet ) { if ( entry == undefined ) return; @@ -160,10 +118,10 @@ function editAccount( entry, well ) if ( isAddr(entry) ) { var i = 0; - var n = well.length; + var n = pallet.length; while ( i < n ) { - if ( (""+well[i][0]).toLowerCase() == (""+entry).toLowerCase() ) + if ( (""+pallet[i][0]).toLowerCase() == (""+entry).toLowerCase() ) entry = i; i++; } @@ -175,23 +133,35 @@ function editAccount( entry, well ) value = 0; } else - if ( isNumeric(entry) && entry < well.length ) + if ( isNumeric(entry) && entry < pallet.length ) { - acct = well[entry][0]; - value = well[entry][1]; + acct = pallet[entry][0]; + value = pallet[entry][1]; } else if ( entry == "x" ) { - // trigger Gas Well distribution - GasWell.methods.distribute().send( {"from": from, "gas": 1000000 } ) + // trigger distribution + Distillery.methods.distribute().send( {"from": bfa.account, "gas": 1000000 } ) .then( function distOK(x) { - console.log("Distribute returned succesfully in block# "+x.blockNumber+" using "+x.gasUsed+" gas."); + console.log( + "Distribute returned succesfully in block# " + + x.blockNumber + + " using " + + x.gasUsed + + " gas." + ); getlist(); }, function distFail(x) { - console.log("Distribute returned errors in block# "+x.blockNumber+" using "+x.gasUsed+" gas."); + console.log( + "Distribute returned errors in block# " + + x.blockNumber + + " using " + + x.gasUsed + + " gas." + ); console.log(x); process.exit( 1 ); } @@ -200,12 +170,12 @@ function editAccount( entry, well ) } else fatal("I don't know what to do with \""+entry+"\"." ); - rl.question("Adjust the Mwei fill value of "+acct+" (setting to 0 is the same as deleting)\nAmount?: ", (answer) => { + rl.question("Adjust the "+notation[2]+" fill value of "+acct+" (setting to 0 is the same as deleting)\nAmount?: ", (answer) => { if ( isNumeric(answer) ) { - answer *= 1000000; - console.log("Sending update to the Gas Well..."); - GasWell.methods.setEtherAllowance(acct,answer).send( {"from": from } ) + answer *= notation[1]; + console.log("Sending update to the SC..."); + Distillery.methods.setEtherAllowance(acct,answer).send( {"from": bfa.account } ) .then( function(a){ console.log("Update accepted.") @@ -223,46 +193,51 @@ function editAccount( entry, well ) }); } -function displayBalances( well ) +function displayBalances( pallet ) { - var n = well.length; + var n = pallet.length; var i; - if ( well == undefined ) + if ( pallet == undefined ) fatal( "Bank is not defined." ); - well.sort(wellSort); - console.log("The contract's account ("+contractaddr+") has "+Math.floor(contractbalance/1000000)+" Mwei.\n"); - var longestbefore = 1; - var longestafter = 9; + pallet.sort(palletSort); + console.log( + "The contract's account (" + + Distillery.contractaddress + + ") has " + + Math.floor(Distillery.contractbalance/notation[1]).toFixed(notation[0]) + + " " + + notation[2] + + ".\n" + ); + var longest = 1; for ( i=0; i<n; i++ ) { - var len = Math.floor(well[i][1]/1000000).toString().length; - if ( len > longestbefore ) - longestbefore = len; + var len = (pallet[i][1]/notation[1]).toFixed(notation[0]).length; + if ( len > longest ) + longest = len; } for ( i=0; i<n; i++ ) { - var entry = well[i]; + var entry = pallet[i]; if ( entry == undefined ) console.log( i+": <undef>" ); else { - var numstr = ""+well[i][1]/1000000; - var before = numstr; - var after = ""; - if ( numstr.search(/\./) > -1 ) - { - before = numstr.replace(/\.[0-9]+$/, ''); - after = numstr.replace(/^[0-9]*\./, ''); - } - while ( before.length < longestbefore ) - before = " "+before; - while ( after.length < longestafter ) - after += "0"; - numstr = before+"."+after; - var has = well[i][2].toString(); - if ( has.length > 9 ) - has = has.replace(/[0-9]{9}$/, ".$&"); - console.log( i+": "+well[i][0]+" fills to "+numstr+" Mwei (has "+has+")." ); + var numstr = (pallet[i][1]/notation[1]).toFixed(notation[0]); + while ( numstr.length < longest ) + numstr = " "+numstr; + console.log( + i + + ": " + + pallet[i][0] + + " fills to " + + numstr + + " " + + notation[2] + + " (has " + + Number(pallet[i][2]/notation[1]).toFixed(notation[0]) + + ")." + ); } } console.log("\n[ Q=quit x=distribute ]"); @@ -273,7 +248,7 @@ function displayBalances( well ) if ( (""+answer).toUpperCase() == 'Q' ) process.exit( 0 ); else - editAccount(answer, well); + editAccount(answer, pallet); } rl.close; } @@ -282,7 +257,7 @@ function displayBalances( well ) function getlist() { - GasWell.methods.numberOfBeneficiaries() + Distillery.methods.numberOfBeneficiaries() .call() .then( requestBalances,