diff --git a/README.mdown b/README.mdown index 95143bc..6da0c61 100644 --- a/README.mdown +++ b/README.mdown @@ -81,30 +81,29 @@ At some point these should be moved into a real nice CLI. To run these scripts use `truffle exec`. For example: `truffle exec scripts/add-proposal.js` ### cli.js - Call any function on any contract: - $ truffle exec scripts/cli.js [ ] - - For example: - $ truffle exec scripts/cli.js Operator proposalsCount + $ truffle exec scripts/cli.js -Please note that the contract name and the function are case sensitive. +### repl.js +Similar to cli.js but only provides a REPL with an initialized `kredits` instance. + + $ truffle exec scripts/repl.js ### add-contributor.js Adds a new core contributor, creates a proposal for the new contributor and votes for that one. - $ truffle exec scripts/add-contributor.js [] + $ truffle exec scripts/add-contributor.js ### add-proposal.js Adds a new proposal for an existing contributor - $ truffle exec scripts/add-proposal.js [] + $ truffle exec scripts/add-proposal.js ### send-funds.js Sends funds to an address. Helpful in development mode to for example fund a metamask account. - $ truffle exec scripts/send-funds.js + $ truffle exec scripts/send-funds.js ### seeds.js Run seeds defined in `config/seeds.js`. diff --git a/config/seeds.js b/config/seeds.js index d8b84e5..355d52c 100644 --- a/config/seeds.js +++ b/config/seeds.js @@ -6,4 +6,8 @@ let contractCalls = [ ['Operator', 'addProposal', [{contributorId: 3, amount: 100, kind: 'code', description: 'hacks on kredits', url: '' }, {gasLimit: 350000}]], ['Operator', 'vote', ['1', {gasLimit: 250000}]] ]; -module.exports = { contractCalls }; +let funds = [ + '0x7e8f313c56f809188313aa274fa67ee58c31515d', + '0xa502eb4021f3b9ab62f75b57a94e1cfbf81fd827' +]; +module.exports = { contractCalls, funds }; diff --git a/scripts/add-contributor.js b/scripts/add-contributor.js index 34bb282..2eeb18d 100644 --- a/scripts/add-contributor.js +++ b/scripts/add-contributor.js @@ -1,6 +1,5 @@ const Registry = artifacts.require('./Registry.sol'); const promptly = require('promptly'); -const bs58 = require('bs58'); const ethers = require('ethers'); const Kredits = require('../lib/kredits'); @@ -37,7 +36,7 @@ module.exports = function(callback) { console.log("\nAdding contributor:"); console.log(contributorAttributes); - kredits.Contributor.add(contributorAttributes, {gasLimit: 250000}).then((result) => { + kredits.Contributor.add(contributorAttributes, { gasLimit: 250000 }).then((result) => { console.log("\n\nResult:"); console.log(result); callback(); diff --git a/scripts/add-proposal.js b/scripts/add-proposal.js index 6dbe117..162161d 100644 --- a/scripts/add-proposal.js +++ b/scripts/add-proposal.js @@ -1,38 +1,46 @@ const Registry = artifacts.require('./Registry.sol'); -const Operator = artifacts.require('./Operator.sol'); -const Contributors = artifacts.require('./Contributors.sol'); const promptly = require('promptly'); -const bs58 = require('bs58'); - -function getBytes32FromMultiash(multihash) { - const decoded = bs58.decode(multihash); - - return { - digest: `0x${decoded.slice(2).toString('hex')}`, - hashFunction: decoded[0], - size: decoded[1], - }; -} +const ethers = require('ethers'); +const Kredits = require('../lib/kredits'); module.exports = function(callback) { Registry.deployed().then(async (registry) => { - var operatorAddress = await registry.getProxyFor('Operator'); - var contributorsAddress = await registry.getProxyFor('Contributors'); + const networkId = parseInt(web3.version.network); + const provider = new ethers.providers.Web3Provider( + web3.currentProvider, { chainId: networkId } + ); + const kredits = await Kredits.setup(provider, provider.getSigner()); - var operator = await Operator.at(operatorAddress); - var contributors = await Contributors.at(contributorsAddress); + console.log(`Using operator at: ${kredits.Operator.contract.address}`); - let recipientAddress = await promptly.prompt('Contributor address: '); - let ipfsHash = await promptly.prompt('IPFS hash (blank for default): ', { default: 'QmQNA1hhVyL1Vm6HiRxXe9xmc6LUMBDyiNMVgsjThtyevs' }); + let contributor = await promptly.prompt('Contributor (address or id): '); + let contributorId; + if (contributor.length < 5) { + contributorId = contributor; + } else { + contributorId = await kredits.Contributor.functions.getContributorIdByAddress(contributor); + } + console.log(`Creating a proposal for contributor ID #${contributorId}`); - let multihash = getBytes32FromMultiash(ipfsHash); + let contributionAttributes = { + contributorId, + amount: await promptly.prompt('Amount: '), + description: await promptly.prompt('Description: '), + kind: await promptly.prompt('Kind: ', { default: 'dev' }), + url: await promptly.prompt('URL: ', { default: '' }) + } - let contributorId = await contributors.getContributorIdByAddress(recipientAddress); + console.log("\nAdding proposal:"); + console.log(contributionAttributes); - let result = await operator.addProposal(contributorId.toNumber(), 23, multihash.digest, multihash.hashFunction, multihash.size); - console.log('Proposal added, tx: ', result.tx); - - callback(); + kredits.Operator.addProposal(contributionAttributes, { gasLimit: 300000 }).then((result) => { + console.log("\n\nResult:"); + console.log(result); + callback(); + }).catch((error) => { + console.log('Failed to create proposal'); + console.log(error); + }); }); } diff --git a/scripts/cli.js b/scripts/cli.js index f1c733f..4b10ee3 100644 --- a/scripts/cli.js +++ b/scripts/cli.js @@ -7,30 +7,43 @@ const Kredits = require('../lib/kredits'); module.exports = function(callback) { const Registry = artifacts.require('./Registry.sol'); Registry.deployed().then(async (registry) => { - let contractName = await promptly.prompt('Contract Name: '); - let method = await promptly.prompt('Function: '); - let argumentInput = await promptly.prompt('Arguments (comma separated): ', { default: '' }); - let args = []; - if (argumentInput !== '') { - args = argumentInput.split(',').map(a => a.trim()); - } - const networkId = parseInt(web3.version.network); const provider = new ethers.providers.Web3Provider( web3.currentProvider, { chainId: networkId } ); const kredits = await Kredits.setup(provider, provider.getSigner()); - const contract = kredits[contractName].contract; - console.log(`Using ${contractName} at ${contract.address}`); - console.log(`Calling ${method} with ${JSON.stringify(args)}`); + let contractName = await promptly.prompt('Contract Name: '); + const contractWrapper = kredits[contractName]; - if (!contract[method]) { + let method; + method = await promptly.prompt('Function (? for available functions): '); + while (method === '?') { + console.log(`Contract functions: ${JSON.stringify(Object.keys(contractWrapper.functions))}`); + console.log(`\nWrapper functions: ${JSON.stringify(Object.getOwnPropertyNames(Object.getPrototypeOf(contractWrapper)))}`); + console.log("\n"); + + method = await promptly.prompt('Function: '); + } + if (!contractWrapper[method] && !contractWrapper.functions[method]) { callback(new Error(`Method ${method} is not defined on ${contractName}`)); return; } + let argumentInput = await promptly.prompt('Arguments (comma separated): ', { default: '' }); + let args = []; + if (argumentInput !== '') { + args = argumentInput.split(',').map(a => a.trim()); + } + console.log(`Using ${contractName} at ${contractWrapper.contract.address}`); + console.log(`Calling ${method} with ${JSON.stringify(args)}`); - contract[method](...args).then((result) => { + let func; + if (contractWrapper[method]) { + func = contractWrapper[method]; + } else { + func = contractWrapper.functions[method]; + } + func.apply(contractWrapper, args).then((result) => { console.log("\nResult:"); console.log(result); @@ -38,7 +51,7 @@ module.exports = function(callback) { console.log(`defined variables: result, ${contractName}, kredis`); let r = REPL.start(); r.context.result = result; - r.context[contractName] = contract; + r.context[contractName] = contractWrapper; r.context.kredits = kredits; r.on('exit', () => { diff --git a/scripts/repl.js b/scripts/repl.js new file mode 100644 index 0000000..9019e18 --- /dev/null +++ b/scripts/repl.js @@ -0,0 +1,25 @@ +const REPL = require('repl'); +const promptly = require('promptly'); + +const ethers = require('ethers'); +const Kredits = require('../lib/kredits'); + +module.exports = function(callback) { + const Registry = artifacts.require('./Registry.sol'); + Registry.deployed().then(async (registry) => { + const networkId = parseInt(web3.version.network); + const provider = new ethers.providers.Web3Provider( + web3.currentProvider, { chainId: networkId } + ); + const kredits = await Kredits.setup(provider, provider.getSigner()); + console.log(`defined variables: kredits, web3`); + let r = REPL.start(); + r.context.kredits = kredits; + r.context.web3 = web3; + + r.on('exit', () => { + console.log('Bye'); + callback(); + }); + }); +} diff --git a/scripts/seeds.js b/scripts/seeds.js index 7e9fd9a..f6b544b 100644 --- a/scripts/seeds.js +++ b/scripts/seeds.js @@ -17,6 +17,18 @@ module.exports = function(callback) { ); const kredits = await Kredits.setup(provider, provider.getSigner()); + let fundingAmount = 2; + each(seeds.funds, (address, next) => { + console.log(`funding ${address} with 2 ETH`); + web3.eth.sendTransaction({ + to: address, + value: web3.toWei(fundingAmount), + from: web3.eth.accounts[0] + }, + (result) => { next(); } + ) + }); + each(seeds.contractCalls, (call, next) => { let [contractName, method, args] = call; let contractWrapper = kredits[contractName];