Working kredits-contract integration

This commit is contained in:
bumi 2018-04-18 22:54:41 +02:00
parent e99addf37e
commit 9dc1ece94f

View File

@ -16,7 +16,7 @@ const fs = require('fs');
const util = require('util'); const util = require('util');
const fetch = require('node-fetch'); const fetch = require('node-fetch');
const ethers = require('ethers'); const ethers = require('ethers');
const kredits = require('kredits-contracts'); const Kredits = require('kredits-contracts');
const walletPath = process.env.KREDITS_WALLET_PATH || './wallet.json'; const walletPath = process.env.KREDITS_WALLET_PATH || './wallet.json';
const walletJson = fs.readFileSync(walletPath); const walletJson = fs.readFileSync(walletPath);
@ -30,13 +30,25 @@ const ipfsConfig = {
}; };
module.exports = async function(robot) { module.exports = async function(robot) {
let wallet;
try {
wallet = await ethers.Wallet.fromEncryptedWallet(walletJson, process.env.KREDITS_WALLET_PASSWORD);
} catch(error) {
console.log('could not load wallet', error);
process.exit(1);
}
const wallet = await ethers.Wallet.fromEncryptedWallet(walletJson, process.env.KREDITS_WALLET_PASSWORD);
const ethProvider = new ethers.providers.JsonRpcProvider(providerUrl, {chainId: networkId}); const ethProvider = new ethers.providers.JsonRpcProvider(providerUrl, {chainId: networkId});
ethProvider.signer = wallet; ethProvider.signer = wallet;
wallet.provider = ethProvider; wallet.provider = ethProvider;
const kredits = await Kredits.setup(ethProvider, wallet, ipfsConfig); let kredits;
try {
kredits = await Kredits.setup(ethProvider, wallet, ipfsConfig);
} catch(error) {
console.log('could not setup kredits', error);
process.exit(1);
}
const Contributor = kredits.Contributor; const Contributor = kredits.Contributor;
const Operator = kredits.Operator; const Operator = kredits.Operator;
@ -47,25 +59,25 @@ module.exports = async function(robot) {
robot.logger.info('[hubot-kredits] Wallet address: ' + wallet.address); robot.logger.info('[hubot-kredits] Wallet address: ' + wallet.address);
ethProvider.getBalance(wallet.address).then(balance => { ethProvider.getBalance(wallet.address).then(balance => {
robot.logger.info('[hubot-kredits] Wallet balance: ' + balance.toString()); robot.logger.info('[hubot-kredits] Wallet balance: ' + ethers.utils.formatEther(balance) + 'ETH');
if (balance.toNumber() <= 0) { if (balance.lt(ethers.utils.parseEther('0.0001'))) {
messageRoom(`Yo gang, I\'m broke! Please drop me some ETH to ${hubotWalletAddress}. kthxbai.`); messageRoom(`Yo gang, I\'m broke! Please drop me some ETH to ${wallet.address}. kthxbai.`);
} }
}); });
robot.respond(/got ETH\?/i, res => { robot.respond(/got ETH\??/i, res => {
ethProvider.getBalance(wallet.address).then((balance) => { ethProvider.getBalance(wallet.address).then((balance) => {
res.send(`my wallet contains ${ethers.utils.formatEther(balance)} ETH`); res.send(`my wallet contains ${ethers.utils.formatEther(balance)} ETH`);
}); });
}); });
robot.respond(/propose (\d*)\s?\S*\s?to (\S+)(?:\sfor (.*))?$"/i, res => { robot.respond(/propose (\d*)\s?\S*\s?to (\S+)(?:\sfor (.*))?$/i, res => {
let amount = res.match[1]; let amount = res.match[1];
let githubUser = res.match[2]; let githubUser = res.match[2];
let description = res.match[3]; let description = res.match[3];
let url = null; let url = null;
createProposal(githubUser, amount, description, url).then((result) => { createProposal(githubUser, amount, description, url).then((result) => {
messageRoom('Proposal created'); messageRoom('Sounds good! will be listed on http://kredits.kosmos.org in a bit');
}); });
}); });
@ -78,6 +90,7 @@ module.exports = async function(robot) {
}); });
} }
}); });
messageRoom('http://kredits.kosmos.org');
}); });
}); });
@ -87,7 +100,7 @@ module.exports = async function(robot) {
return c.github_username === username; return c.github_username === username;
}); });
if (!contrib) { if (!contrib) {
throw new Errro(`No contributor found for ${username}`);A throw new Error(`No contributor found for ${username}`);A
} else { } else {
return contrib; return contrib;
} }
@ -98,16 +111,19 @@ module.exports = async function(robot) {
return getContributorByGithubUser(githubUser).then((contributor) => { return getContributorByGithubUser(githubUser).then((contributor) => {
robot.logger.debug(`[kredits] Creating proposal to issue ${amount}₭S to ${githubUser} for ${url}...`); robot.logger.debug(`[kredits] Creating proposal to issue ${amount}₭S to ${githubUser} for ${url}...`);
let contributionAttr = { let contributionAttr = {
contributorId: contributor.id,
amount: amount,
contributorIpfsHash: contributor.ipfsHash, contributorIpfsHash: contributor.ipfsHash,
url, url,
description, description,
details, details,
kind: 'dev' kind: 'dev'
}; };
return Operator.add(contributionAttr).then((result) => { return Operator.addProposal(contributionAttr).then((result) => {
robot.logger.debug('[kredits] proposal created:', util.inspect(result)); robot.logger.debug('[kredits] proposal created:', util.inspect(result));
}); });
}).catch(() => { }).catch((error) => {
console.log(error);
messageRoom(`I wanted to propose giving kredits to ${githubUser} for ${url}, but I can't find their contact data. Please add them as a contributor: https://kredits.kosmos.org`); messageRoom(`I wanted to propose giving kredits to ${githubUser} for ${url}, but I can't find their contact data. Please add them as a contributor: https://kredits.kosmos.org`);
}); });
} }
@ -166,7 +182,6 @@ module.exports = async function(robot) {
function handleGitHubPullRequestClosed(data) { function handleGitHubPullRequestClosed(data) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
// fs.writeFileSync('tmp/github-pr.json', JSON.stringify(data, null, 4));
let recipients; let recipients;
let pull_request = data.pull_request; let pull_request = data.pull_request;
let assignees = pull_request.assignees.map(a => a.login); let assignees = pull_request.assignees.map(a => a.login);
@ -240,7 +255,7 @@ module.exports = async function(robot) {
function handleProposalCreated(proposalId, creatorAccount, contributorId, amount) { function handleProposalCreated(proposalId, creatorAccount, contributorId, amount) {
Contributor.getById(contributorId).then((contributor) => { Contributor.getById(contributorId).then((contributor) => {
Operator.getBy(proposalId).then((proposal) => { Operator.getById(proposalId).then((proposal) => {
messageRoom(`Let's give ${contributor.name} some kredits for ${proposal.url} (${proposal.description}): https://kredits.kosmos.org`); messageRoom(`Let's give ${contributor.name} some kredits for ${proposal.url} (${proposal.description}): https://kredits.kosmos.org`);
}); });
}); });