From 1b7252ed26fb34a751be81957762cfe9e357ea61 Mon Sep 17 00:00:00 2001 From: snugghash Date: Sun, 11 Jun 2017 15:24:09 +0530 Subject: [PATCH] Add parsing amount, storage of address from thread Amount is parsed from comment having "@NAME" where name is env. variable. Address from commiteth's comment, stored in a global variable. Destroyed when reinstantiating container. (fixes aragon/autobounty#1) Revert Dockerfile change Revert index.js whitespace --- Dockerfile | 3 +++ index.js | 68 +++++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 53 insertions(+), 18 deletions(-) diff --git a/Dockerfile b/Dockerfile index 58ca644..9c69de5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,3 +2,6 @@ FROM node:7-onbuild ENV PORT 8080 EXPOSE 8080 + +ENV NAME autobounty +ENV STANDARD_BOUNTY 0.001 diff --git a/index.js b/index.js index 05ecfd1..485ecfb 100644 --- a/index.js +++ b/index.js @@ -4,13 +4,16 @@ * awards that bounty to the address posted earlier in the thread (by the * commiteth bot). * TODO tests + * REVIEW parsing, non-persisting storage of addresses, hardcoded string length. + * Depends on commiteth version as of 2017-06-10. */ const SignerProvider = require('ethjs-provider-signer'); const sign = require('ethjs-signer').sign; const Eth = require('ethjs-query'); -const address = process.env.ADDRESS +const address = process.env.ADDRESS; +const name = process.env.NAME; const provider = new SignerProvider(process.env.NODE, { signTransaction: (rawTx, cb) => cb(null, sign(rawTx, process.env.KEY)), @@ -24,30 +27,59 @@ var express = require('express'), bodyParser = require('body-parser'), jsonParser = bodyParser.json(); -app.use(jsonParser); app.use(cors()); +// Store issue ids and their bounty addresses +var issueData = {}; + // Receive a POST request at the address specified by an env. var. -app.post('/address/:address', function(req, res, next){ - eth.getTransactionCount(address, (err, nonce) => { - eth.sendTransaction({ - from: address, // Specified in webhook, secret - to: req.params.address, // TODO replace with address from earlier in the thread - gas: 100000, - value: (parseFloat(process.env.AMOUNT) || 1.5) * 1e18, // TODO replace with parsed amount from comments - data: '0xde5f72fd', // sha3('faucet()') - nonce, - }, (err, txID) => { - if (err) { - console.log('Request failed', err) - return res.status(500).json(err) +app.post('/address/:address', jsonParser, function(req, res, next){ + if (!req.body) + return res.sendStatus(400); + var commentBody = req.body.comment.body; + var issueId = req.body.issue.id; + var namePosition = commentBody.search("@" + name); + // Store toAddress from commiteth + if (namePosition == -1) { + issueData[issueId] = {"toAddress": commentBody.substring(commentBody.search("Contract address:") + 18, commentBody.search("Contract address:") + 60)} + console.log(issueData); + return res.status(204); + } + else { + var postNameWords = commentBody.substring(namePosition + 1 + name.length + 1).trim().split(' '); + var amount = 0; + if (postNameWords.length > 0) { + if(postNameWords[0] == "standard") { + amount = process.env.STANDARD_BOUNTY; } else { - console.log('Successful request:', txID) - res.json({ txID }) + amount = parseFloat(postNameWords[0]); } + } + console.log("Trying to give " + amount + " ETH to " + issueData[issueId].toAddress + " for issue " + issueId); + issueData[issueId].amount = amount; + + // Conduct the transaction + eth.getTransactionCount(address, (err, nonce) => { + eth.sendTransaction({ + from: address, // Specified in webhook, secret + to: issueData[issueId].toAddress, // Address from earlier in the thread + gas: 100000, + value: issueData[issueId].amount, + data: '0xde5f72fd', // sha3('faucet()') + nonce, + }, (err, txID) => { + if (err) { + console.log('Request failed', err) + return res.status(500).json(err) + } + else { + console.log('Successful request:', txID) + res.json({ txID }) + } + }); }); - }); + } }); const port = process.env.PORT || 8181