Merge pull request #41 from 67P/feature/improve-scripts
Improve helper scripts
This commit is contained in:
commit
7260544838
17
README.mdown
17
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`
|
To run these scripts use `truffle exec`. For example: `truffle exec scripts/add-proposal.js`
|
||||||
|
|
||||||
### cli.js
|
### cli.js
|
||||||
|
|
||||||
Call any function on any contract:
|
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
|
|
||||||
|
|
||||||
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
|
### add-contributor.js
|
||||||
Adds a new core contributor, creates a proposal for the new contributor and votes for that one.
|
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
|
### add-proposal.js
|
||||||
Adds a new proposal for an existing contributor
|
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
|
### send-funds.js
|
||||||
Sends funds to an address. Helpful in development mode to for example fund a metamask account.
|
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
|
### seeds.js
|
||||||
Run seeds defined in `config/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', 'addProposal', [{contributorId: 3, amount: 100, kind: 'code', description: 'hacks on kredits', url: '' }, {gasLimit: 350000}]],
|
||||||
['Operator', 'vote', ['1', {gasLimit: 250000}]]
|
['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 Registry = artifacts.require('./Registry.sol');
|
||||||
const promptly = require('promptly');
|
const promptly = require('promptly');
|
||||||
const bs58 = require('bs58');
|
|
||||||
|
|
||||||
const ethers = require('ethers');
|
const ethers = require('ethers');
|
||||||
const Kredits = require('../lib/kredits');
|
const Kredits = require('../lib/kredits');
|
||||||
@ -37,7 +36,7 @@ module.exports = function(callback) {
|
|||||||
console.log("\nAdding contributor:");
|
console.log("\nAdding contributor:");
|
||||||
console.log(contributorAttributes);
|
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("\n\nResult:");
|
||||||
console.log(result);
|
console.log(result);
|
||||||
callback();
|
callback();
|
||||||
|
@ -1,38 +1,46 @@
|
|||||||
const Registry = artifacts.require('./Registry.sol');
|
const Registry = artifacts.require('./Registry.sol');
|
||||||
const Operator = artifacts.require('./Operator.sol');
|
|
||||||
const Contributors = artifacts.require('./Contributors.sol');
|
|
||||||
const promptly = require('promptly');
|
const promptly = require('promptly');
|
||||||
|
|
||||||
const bs58 = require('bs58');
|
const ethers = require('ethers');
|
||||||
|
const Kredits = require('../lib/kredits');
|
||||||
function getBytes32FromMultiash(multihash) {
|
|
||||||
const decoded = bs58.decode(multihash);
|
|
||||||
|
|
||||||
return {
|
|
||||||
digest: `0x${decoded.slice(2).toString('hex')}`,
|
|
||||||
hashFunction: decoded[0],
|
|
||||||
size: decoded[1],
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = function(callback) {
|
module.exports = function(callback) {
|
||||||
Registry.deployed().then(async (registry) => {
|
Registry.deployed().then(async (registry) => {
|
||||||
var operatorAddress = await registry.getProxyFor('Operator');
|
const networkId = parseInt(web3.version.network);
|
||||||
var contributorsAddress = await registry.getProxyFor('Contributors');
|
const provider = new ethers.providers.Web3Provider(
|
||||||
|
web3.currentProvider, { chainId: networkId }
|
||||||
|
);
|
||||||
|
const kredits = await Kredits.setup(provider, provider.getSigner());
|
||||||
|
|
||||||
var operator = await Operator.at(operatorAddress);
|
console.log(`Using operator at: ${kredits.Operator.contract.address}`);
|
||||||
var contributors = await Contributors.at(contributorsAddress);
|
|
||||||
|
|
||||||
let recipientAddress = await promptly.prompt('Contributor address: ');
|
let contributor = await promptly.prompt('Contributor (address or id): ');
|
||||||
let ipfsHash = await promptly.prompt('IPFS hash (blank for default): ', { default: 'QmQNA1hhVyL1Vm6HiRxXe9xmc6LUMBDyiNMVgsjThtyevs' });
|
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);
|
kredits.Operator.addProposal(contributionAttributes, { gasLimit: 300000 }).then((result) => {
|
||||||
console.log('Proposal added, tx: ', result.tx);
|
console.log("\n\nResult:");
|
||||||
|
console.log(result);
|
||||||
callback();
|
callback();
|
||||||
|
}).catch((error) => {
|
||||||
|
console.log('Failed to create proposal');
|
||||||
|
console.log(error);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -7,30 +7,43 @@ const Kredits = require('../lib/kredits');
|
|||||||
module.exports = function(callback) {
|
module.exports = function(callback) {
|
||||||
const Registry = artifacts.require('./Registry.sol');
|
const Registry = artifacts.require('./Registry.sol');
|
||||||
Registry.deployed().then(async (registry) => {
|
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 networkId = parseInt(web3.version.network);
|
||||||
const provider = new ethers.providers.Web3Provider(
|
const provider = new ethers.providers.Web3Provider(
|
||||||
web3.currentProvider, { chainId: networkId }
|
web3.currentProvider, { chainId: networkId }
|
||||||
);
|
);
|
||||||
const kredits = await Kredits.setup(provider, provider.getSigner());
|
const kredits = await Kredits.setup(provider, provider.getSigner());
|
||||||
|
|
||||||
const contract = kredits[contractName].contract;
|
let contractName = await promptly.prompt('Contract Name: ');
|
||||||
console.log(`Using ${contractName} at ${contract.address}`);
|
const contractWrapper = kredits[contractName];
|
||||||
console.log(`Calling ${method} with ${JSON.stringify(args)}`);
|
|
||||||
|
|
||||||
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}`));
|
callback(new Error(`Method ${method} is not defined on ${contractName}`));
|
||||||
return;
|
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("\nResult:");
|
||||||
console.log(result);
|
console.log(result);
|
||||||
|
|
||||||
@ -38,7 +51,7 @@ module.exports = function(callback) {
|
|||||||
console.log(`defined variables: result, ${contractName}, kredis`);
|
console.log(`defined variables: result, ${contractName}, kredis`);
|
||||||
let r = REPL.start();
|
let r = REPL.start();
|
||||||
r.context.result = result;
|
r.context.result = result;
|
||||||
r.context[contractName] = contract;
|
r.context[contractName] = contractWrapper;
|
||||||
r.context.kredits = kredits;
|
r.context.kredits = kredits;
|
||||||
|
|
||||||
r.on('exit', () => {
|
r.on('exit', () => {
|
||||||
|
25
scripts/repl.js
Normal file
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());
|
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) => {
|
each(seeds.contractCalls, (call, next) => {
|
||||||
let [contractName, method, args] = call;
|
let [contractName, method, args] = call;
|
||||||
let contractWrapper = kredits[contractName];
|
let contractWrapper = kredits[contractName];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user