aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2016-11-11 23:20:40 -0800
committerAdam Soltys <[email protected]>2016-12-26 14:22:39 -0800
commite92783c613fa4266b69f5d56257cf919c86182b7 (patch)
treea4454197f19142d2774e7c478c403de16e1a5dbb
parenta3cc882cee6afcfa4b278e653b3927b0cf79df9a (diff)
downloadcoinos-server-e92783c613fa4266b69f5d56257cf919c86182b7.tar.gz
coinos-server-e92783c613fa4266b69f5d56257cf919c86182b7.zip
Use bcoin to watch all m/0/1 addresses and send email/sms notifications (fixes #49 #59)
-rw-r--r--app.js10
-rw-r--r--bcoin.js98
-rw-r--r--package.json5
-rw-r--r--src/app.coffee6
-rw-r--r--src/bcoin.coffee81
-rw-r--r--views/payment.html1
6 files changed, 162 insertions, 39 deletions
diff --git a/app.js b/app.js
index 85654598..7510f08a 100644
--- a/app.js
+++ b/app.js
@@ -1,5 +1,5 @@
(function() {
- var RedisStore, app, authorize, bodyParser, cache, config, cookieParser, express, fetchRates, fs, passport, path, proxy, proxyContext, proxyMiddleware, proxyOptions, request, session, sessionStore, sessions, startBcoin, transactions, users,
+ var RedisStore, app, authorize, bodyParser, cache, config, cookieParser, express, fetchRates, fs, passport, path, proxy, proxyContext, proxyMiddleware, proxyOptions, request, session, sessionStore, sessions, transactions, twilio, users,
indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
request = require('request');
@@ -24,6 +24,8 @@
transactions = require("./routes/transactions");
+ twilio = require('twilio');
+
users = require("./routes/users")(sessions);
session = require('express-session');
@@ -85,7 +87,7 @@
cookie: {
maxAge: 1209600000
},
- key: 'vanbtc.sid'
+ key: 'coinos.sid'
}));
app.use(passport.initialize());
@@ -123,9 +125,7 @@
return setTimeout(fetchRates, 120000);
})();
- (startBcoin = function() {
- return require('./bcoin').init();
- })();
+ require('./bcoin').init(app);
app.get('/', cache, sessions["new"]);
diff --git a/bcoin.js b/bcoin.js
index ece78ec3..a761f116 100644
--- a/bcoin.js
+++ b/bcoin.js
@@ -1,41 +1,107 @@
(function() {
- var bcoin, db;
+ var bcoin, config, db, twilio;
bcoin = require('bcoin');
+ config = require('./config');
+
db = require('./redis');
+ twilio = require('twilio');
+
module.exports = {
- init: function() {
- var addresses, chain, pool;
- addresses = {};
+ init: function(app) {
+ var chain, pool, users;
+ users = {};
chain = new bcoin.chain({
db: 'leveldb',
- location: __dirname + 'mainchain/mainchain.db',
+ name: 'spvchain',
+ location: __dirname + '/db/spvchain',
spv: true
});
pool = new bcoin.pool({
chain: chain,
- spv: true
+ spv: true,
+ size: 1,
+ maxPeers: 1,
+ seeds: ['dctrl.ca']
});
- return pool.open(function(err) {
- db.keys("user:*", function(err, users) {
- return users.map(function(key) {
- return db.hgetall(key, function(err, user) {
- addresses[user.address] = user.username;
- pool.watchAddress(user.address);
- return console.log(user.address);
+ pool.logger.level = 4;
+ return pool.open().then(function() {
+ db.keysAsync("user:*").then(function(keys) {
+ return Promise.all(keys.map(function(key) {
+ return db.hgetallAsync(key).then(function(user) {
+ console.log(key);
+ console.log(user);
+ if (user.address) {
+ pool.watchAddress(user.address);
+ return users[user.address] = {
+ email: user.email,
+ currency: user.currency,
+ symbol: user.symbol,
+ phone: user.phone
+ };
+ }
});
- });
+ }));
});
pool.connect();
pool.startSync();
pool.on('error', function(err) {
- debugger;
return console.log(err);
});
return pool.on('tx', function(tx) {
- return console.log(tx);
+ var address, client, i, len, output, ref, results, value;
+ console.log(tx);
+ ref = tx.outputs;
+ results = [];
+ for (i = 0, len = ref.length; i < len; i++) {
+ output = ref[i];
+ value = (output.value / 100000000).toFixed(8);
+ address = output.getAddress().toBase58();
+ if (Object.keys(users).includes(address)) {
+ app.render('payment', {
+ value: value,
+ address: address
+ }, function(err, html) {
+ debugger;
+ var content, from_email, helper, mail, request, sg, subject, to_email;
+ console.log(users[address]);
+ helper = require('sendgrid').mail;
+ from_email = new helper.Email('[email protected]');
+ to_email = new helper.Email(users[address].email);
+ subject = 'Received Payment';
+ content = new helper.Content('text/html', html);
+ mail = new helper.Mail(from_email, subject, to_email, content);
+ sg = require('sendgrid')(config.sendgrid_token);
+ request = sg.emptyRequest({
+ method: 'POST',
+ path: '/v3/mail/send',
+ body: mail.toJSON()
+ });
+ return sg.API(request, function(error, response) {
+ console.log(response.statusCode);
+ console.log(response.body);
+ return console.log(response.headers);
+ });
+ });
+ if (users[address].phone) {
+ client = new twilio.RestClient(config.twilio_sid, config.twilio_token);
+ results.push(client.messages.create({
+ to: user.phone,
+ from: config.twilio_number,
+ body: "You received a payment of " + value + " BTC"
+ }, function(err, message) {
+ return console.log(message.sid);
+ }));
+ } else {
+ results.push(void 0);
+ }
+ } else {
+ results.push(void 0);
+ }
+ }
+ return results;
});
});
}
diff --git a/package.json b/package.json
index 160a298b..f732d985 100644
--- a/package.json
+++ b/package.json
@@ -8,7 +8,7 @@
},
"dependencies": {
"async": "2.1.1",
- "bcoin": "git+https://github.com/bcoin-org/bcoin.git#0ca843e3cabd4920546a9947f15954e2b7ede195",
+ "bcoin": "git+https://github.com/bcoin-org/bcoin.git#master",
"bcryptjs": "^2.3.0",
"bip39": "^2.2.0",
"bitcoinjs-lib": "^2.3.0",
@@ -31,7 +31,8 @@
"passport-local": "1.0.0",
"redis": "2.6.2",
"request": "~2.75.0",
- "sendgrid": "^4.3.0"
+ "sendgrid": "^4.3.0",
+ "twilio": "^2.11.0"
},
"devDependencies": {
"bower": "^1.8.0",
diff --git a/src/app.coffee b/src/app.coffee
index d51eaa99..75b182ec 100644
--- a/src/app.coffee
+++ b/src/app.coffee
@@ -9,6 +9,7 @@ fs = require('fs')
proxyMiddleware = require('http-proxy-middleware')
sessions = require("./routes/sessions")(passport)
transactions = require("./routes/transactions")
+twilio = require('twilio')
users = require("./routes/users")(sessions)
session = require('express-session')
@@ -45,7 +46,7 @@ app.use(session(
secret: config.secret
store: sessionStore
cookie: maxAge: 1209600000
- key: 'vanbtc.sid'
+ key: 'coinos.sid'
))
app.use(passport.initialize())
app.use(passport.session())
@@ -75,8 +76,7 @@ do fetchRates = ->
)
setTimeout(fetchRates, 120000)
-do startBcoin = ->
- require('./bcoin').init()
+require('./bcoin').init(app)
app.get('/', cache, sessions.new)
diff --git a/src/bcoin.coffee b/src/bcoin.coffee
index 31bd7ca1..5cc303d0 100644
--- a/src/bcoin.coffee
+++ b/src/bcoin.coffee
@@ -1,38 +1,93 @@
bcoin = require('bcoin')
+config = require('./config')
db = require('./redis')
+twilio = require('twilio')
module.exports =
- init: ->
- addresses = {}
+ init: (app) ->
+ users = {}
chain = new bcoin.chain(
db: 'leveldb'
- location: __dirname + 'mainchain/mainchain.db'
+ name: 'spvchain'
+ location: __dirname + '/db/spvchain'
spv: true
)
pool = new bcoin.pool(
chain: chain
spv: true
+ size: 1
+ maxPeers: 1
+ seeds: ['dctrl.ca']
)
- pool.open((err) ->
- db.keys("user:*", (err, users) ->
- users.map((key) ->
- db.hgetall(key, (err, user) ->
- addresses[user.address] = user.username
- pool.watchAddress(user.address)
- console.log(user.address)
+ pool.logger.level = 4
+
+ pool.open().then(->
+ db.keysAsync("user:*").then((keys) ->
+ Promise.all(keys.map((key) ->
+ db.hgetallAsync(key).then((user) ->
+ console.log(key)
+ console.log(user)
+ if user.address
+ pool.watchAddress(user.address)
+ users[user.address] =
+ email: user.email
+ currency: user.currency
+ symbol: user.symbol
+ phone: user.phone
)
- )
+ ))
)
pool.connect()
pool.startSync()
pool.on('error', (err) ->
- debugger
console.log(err)
)
- pool.on('tx', (tx) -> console.log(tx))
+
+ pool.on('tx', (tx) ->
+ console.log(tx)
+
+ for output in tx.outputs
+ value = (output.value / 100000000).toFixed(8)
+ address = output.getAddress().toBase58()
+ if Object.keys(users).includes(address)
+ app.render('payment', { value: value, address: address }, (err, html) ->
+ debugger
+ console.log(users[address])
+ helper = require('sendgrid').mail
+ from_email = new helper.Email('[email protected]')
+ to_email = new helper.Email(users[address].email)
+ subject = 'Received Payment'
+ content = new helper.Content('text/html', html)
+ mail = new helper.Mail(from_email, subject, to_email, content)
+
+ sg = require('sendgrid')(config.sendgrid_token)
+ request = sg.emptyRequest(
+ method: 'POST'
+ path: '/v3/mail/send'
+ body: mail.toJSON()
+ )
+
+ sg.API(request, (error, response) ->
+ console.log(response.statusCode)
+ console.log(response.body)
+ console.log(response.headers)
+ )
+ )
+
+ if users[address].phone
+ client = new twilio.RestClient(config.twilio_sid, config.twilio_token)
+
+ client.messages.create(
+ to: user.phone
+ from: config.twilio_number
+ body: "You received a payment of #{value} BTC"
+ , (err, message) ->
+ console.log(message.sid)
+ )
+ )
)
diff --git a/views/payment.html b/views/payment.html
new file mode 100644
index 00000000..c18f0a13
--- /dev/null
+++ b/views/payment.html
@@ -0,0 +1 @@
+You received a payment of {{value}} BTC