Improve helper scripts #41
15
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 <Contract Name> <Function> [<optional> <arguments>]
|
||||
$ truffle exec scripts/cli.js
|
||||
|
||||
For example:
|
||||
$ truffle exec scripts/cli.js Operator proposalsCount
|
||||
### repl.js
|
||||
Similar to cli.js but only provides a REPL with an initialized `kredits` instance.
|
||||
|
||||
Please note that the contract name and the function are case sensitive.
|
||||
$ 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 <ethereum address> [<profile IPFS hash>]
|
||||
$ truffle exec scripts/add-contributor.js
|
||||
|
||||
### add-proposal.js
|
||||
Adds a new proposal for an existing contributor
|
||||
|
||||
$ truffle exec scripts/add-proposal.js <ethereum address> [<proposal IPFS hash>]
|
||||
$ 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 <ethereum address>
|
||||
$ truffle exec scripts/send-funds.js
|
||||
|
||||
### seeds.js
|
||||
Run seeds defined in `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 };
|
||||
|
@ -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');
|
||||
|
@ -1,38 +1,46 @@
|
||||
|
||||
const Registry = artifacts.require('./Registry.sol');
|
||||
const Operator = artifacts.require('./Operator.sol');
|
||||
![]() Where does Where does `contributors` come from?
|
||||
const Contributors = artifacts.require('./Contributors.sol');
|
||||
![]() Where does Where does `contributors` come from?
|
||||
const promptly = require('promptly');
|
||||
|
||||
const bs58 = require('bs58');
|
||||
![]() Where does Where does `contributors` come from?
|
||||
|
||||
![]() Where does Where does `contributors` come from?
|
||||
function getBytes32FromMultiash(multihash) {
|
||||
![]() Where does Where does `contributors` come from?
|
||||
const decoded = bs58.decode(multihash);
|
||||
![]() Where does Where does `contributors` come from?
|
||||
|
||||
![]() Where does Where does `contributors` come from?
|
||||
return {
|
||||
![]() Where does Where does `contributors` come from?
|
||||
digest: `0x${decoded.slice(2).toString('hex')}`,
|
||||
![]() Where does Where does `contributors` come from?
|
||||
hashFunction: decoded[0],
|
||||
![]() Where does Where does `contributors` come from?
|
||||
size: decoded[1],
|
||||
![]() Where does Where does `contributors` come from?
|
||||
};
|
||||
![]() Where does Where does `contributors` come from?
|
||||
}
|
||||
![]() Where does Where does `contributors` come from?
|
||||
const ethers = require('ethers');
|
||||
![]() Where does Where does `contributors` come from?
|
||||
const Kredits = require('../lib/kredits');
|
||||
![]() Where does Where does `contributors` come from?
|
||||
|
||||
module.exports = function(callback) {
|
||||
Registry.deployed().then(async (registry) => {
|
||||
var operatorAddress = await registry.getProxyFor('Operator');
|
||||
![]() Where does Where does `contributors` come from?
|
||||
var contributorsAddress = await registry.getProxyFor('Contributors');
|
||||
![]() Where does Where does `contributors` come from?
|
||||
const networkId = parseInt(web3.version.network);
|
||||
![]() Where does Where does `contributors` come from?
|
||||
const provider = new ethers.providers.Web3Provider(
|
||||
![]() Where does Where does `contributors` come from?
|
||||
web3.currentProvider, { chainId: networkId }
|
||||
![]() Where does Where does `contributors` come from?
|
||||
);
|
||||
![]() Where does Where does `contributors` come from?
|
||||
const kredits = await Kredits.setup(provider, provider.getSigner());
|
||||
![]() Where does Where does `contributors` come from?
|
||||
|
||||
var operator = await Operator.at(operatorAddress);
|
||||
![]() Where does Where does `contributors` come from?
|
||||
var contributors = await Contributors.at(contributorsAddress);
|
||||
![]() Where does Where does `contributors` come from?
|
||||
console.log(`Using operator at: ${kredits.Operator.contract.address}`);
|
||||
![]() Where does Where does `contributors` come from?
|
||||
|
||||
let recipientAddress = await promptly.prompt('Contributor address: ');
|
||||
![]() Where does Where does `contributors` come from?
|
||||
let ipfsHash = await promptly.prompt('IPFS hash (blank for default): ', { default: 'QmQNA1hhVyL1Vm6HiRxXe9xmc6LUMBDyiNMVgsjThtyevs' });
|
||||
![]() Where does Where does `contributors` come from?
|
||||
let contributor = await promptly.prompt('Contributor (address or id): ');
|
||||
![]() Where does Where does `contributors` come from?
|
||||
let contributorId;
|
||||
![]() Where does Where does `contributors` come from?
|
||||
if (contributor.length < 5) {
|
||||
![]() Where does Where does `contributors` come from?
|
||||
contributorId = contributor;
|
||||
![]() Where does Where does `contributors` come from?
|
||||
} else {
|
||||
![]() Where does Where does `contributors` come from?
|
||||
contributorId = await kredits.Contributor.functions.getContributorIdByAddress(contributor);
|
||||
![]() Where does Where does `contributors` come from?
|
||||
}
|
||||
![]() Where does Where does `contributors` come from?
|
||||
console.log(`Creating a proposal for contributor ID #${contributorId}`);
|
||||
![]() Where does Where does `contributors` come from?
|
||||
|
||||
let multihash = getBytes32FromMultiash(ipfsHash);
|
||||
![]() Where does Where does `contributors` come from?
|
||||
let contributionAttributes = {
|
||||
![]() Where does Where does `contributors` come from?
|
||||
contributorId,
|
||||
![]() Where does Where does `contributors` come from?
|
||||
amount: await promptly.prompt('Amount: '),
|
||||
![]() Where does Where does `contributors` come from?
|
||||
description: await promptly.prompt('Description: '),
|
||||
![]() Where does Where does `contributors` come from?
|
||||
kind: await promptly.prompt('Kind: ', { default: 'dev' }),
|
||||
![]() Where does Where does `contributors` come from?
|
||||
url: await promptly.prompt('URL: ', { default: '' })
|
||||
![]() Where does Where does `contributors` come from?
|
||||
}
|
||||
![]() Where does Where does `contributors` come from?
|
||||
|
||||
let contributorId = await contributors.getContributorIdByAddress(recipientAddress);
|
||||
![]() Where does Where does `contributors` come from?
|
||||
|
||||
![]() Where does Where does `contributors` come from?
|
||||
let result = await operator.addProposal(contributorId.toNumber(), 23, multihash.digest, multihash.hashFunction, multihash.size);
|
||||
![]() Where does Where does `contributors` come from?
|
||||
console.log('Proposal added, tx: ', result.tx);
|
||||
![]() Where does Where does `contributors` come from?
|
||||
console.log("\nAdding proposal:");
|
||||
![]() Where does Where does `contributors` come from?
|
||||
console.log(contributionAttributes);
|
||||
![]() Where does Where does `contributors` come from?
|
||||
|
||||
kredits.Operator.addProposal(contributionAttributes, { gasLimit: 300000 }).then((result) => {
|
||||
![]() Where does Where does `contributors` come from?
|
||||
console.log("\n\nResult:");
|
||||
![]() Where does Where does `contributors` come from?
|
||||
console.log(result);
|
||||
![]() Where does Where does `contributors` come from?
|
||||
callback();
|
||||
}).catch((error) => {
|
||||
![]() Where does Where does `contributors` come from?
|
||||
console.log('Failed to create proposal');
|
||||
![]() Where does Where does `contributors` come from?
|
||||
console.log(error);
|
||||
![]() Where does Where does `contributors` come from?
|
||||
});
|
||||
![]() Where does Where does `contributors` come from?
|
||||
});
|
||||
}
|
||||
|
||||
![]() Where does Where does `contributors` come from?
![]() Where does Where does `contributors` come from?
|
@ -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]) {
|
||||
![]() So good that we went with upper case contract names and the properties instead of the functions! So good that we went with upper case contract names and the properties instead of the functions!
But it will breaks on `Contributor`, wouldn’t it? I think we should rename that contract next and align the module code to it. Will make the future much brighter!
![]() yes, agree on renaming it! and maybe adding an alias for Contributor <=> Contributors yes, agree on renaming it! and maybe adding an alias for Contributor <=> Contributors
![]() I opened #44 for the alias I opened #44 for the alias
|
||||
callback(new Error(`Method ${method} is not defined on ${contractName}`));
|
||||
return;
|
||||
}
|
||||
let argumentInput = await promptly.prompt('Arguments (comma separated): ', { default: '' });
|
||||
let args = [];
|
||||
![]() 👀 nice! 👀 nice!
|
||||
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:");
|
||||
![]() Haha master of es6. I think you don’t need the if and the initial Haha master of es6. I think you don’t need the if and the initial `args`
`let args = argumentInput.split(',')` should return an empty array.
![]() oh yeah, true. oh yeah, true.
![]() ah noo. it returns an array with an empty string, that was the reason for the if. or what am I missing? ah noo. it returns an array with an empty string, that was the reason for the if. or what am I missing?
![]() Ah ok. Ah ok.
![]() But if input is already not an empty string, wouldn't it return an array with one argument string? But if input is already not an empty string, wouldn't it return an array with one argument string?
![]() https://jsbin.com/qarikabane/edit?js,console it would return https://jsbin.com/qarikabane/edit?js,console
it would return `[""]` but if no arguments are given I need `[]`.
![]() I was actually asking about the I was actually asking about the `trim` inside, but no idea why. It's for removing whitespace, so that's still needed.
![]() yep, trim() for potential whitespace as for example in yep, trim() for potential whitespace as for example in `"first, second"`
|
||||
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', () => {
|
||||
|
25
scripts/repl.js
Normal file
@ -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();
|
||||
});
|
||||
});
|
||||
}
|
@ -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];
|
||||
|
Where does
contributors
come from?Where does
contributors
come from?