Skip to content

Commit 33ecbd4

Browse files
committed
transfer events catch WIP
1 parent ad99c03 commit 33ecbd4

File tree

10 files changed

+130
-48
lines changed

10 files changed

+130
-48
lines changed

server.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const methodOverride = require('method-override'); // simulate DELETE and PUT (e
1111
const buildRouter = require('./src/routes');
1212
const https = require('https');
1313
const fs = require('fs');
14-
const EscrowContractService = require('./src/services/EscrowContractService');
14+
const EventsParserService = require('./src/services/EventsParserService');
1515

1616

1717
app.use(morgan('dev')); // log every request to the console
@@ -82,8 +82,8 @@ app.use(function(err, req, res, next){
8282

8383
const portNum = config.get('port');
8484
app.listen(portNum, function(){
85-
console.log("server is up at /", portNum)
86-
EscrowContractService.subscribeForPendingEvents();
85+
console.log("server is up at /", portNum);
86+
EventsParserService.start();
8787
});
8888

8989

src/controllers/ReceiverController.js

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ function* verifySms(req, res) {
8080
transfer.verified = true;
8181
const result = yield transfer.save();
8282

83-
res.json({success: true, transfer: transfer});
83+
res.json({success: true, transitKeystore: transfer.transitKeystore});
8484
}
8585

8686

@@ -137,9 +137,25 @@ function* confirm(req, res) {
137137
}
138138

139139

140+
function* getTransfer(req, res) {
141+
const { transferId } = req.params;
142+
if (!transferId) {
143+
throw new BadRequestError('Please provide transfer id');
144+
};
145+
146+
const transfer = yield TransferService.getByTransferId(transferId);
147+
if (!transfer) {
148+
throw new BadRequestError('No transfer found on server.');
149+
}
150+
151+
res.json({success: true, transfer });
152+
}
153+
154+
140155
module.exports = {
141156
claim,
142157
verifySms,
143-
confirm
158+
confirm,
159+
getTransfer
144160
}
145161

src/controllers/SenderController.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,11 @@ function* registerTransfer(req, res) {
4040
};
4141

4242
const transferParams = {
43-
phoneHash,
44-
transferId,
45-
transitAddress,
46-
transitKeystore,
47-
senderAddress,
43+
phoneHash: phoneHash.toLowerCase(),
44+
transferId: transferId.toLowerCase(),
45+
transitAddress: transitAddress.toLowerCase(),
46+
senderAddress: senderAddress.toLowerCase(),
47+
transitKeystore,
4848
amount
4949
};
5050

src/models/TransferEvent.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@ var TransferEventSchema = new Schema({
1313
txStatus: {
1414
type: String,
1515
enum: ["pending", "success", "error"]
16-
}
16+
},
17+
gasPrice: {
18+
type: Number
19+
}
1720
}, {timeStamps: true});
1821

1922

src/models/transfer.js

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ const TransferSchema = new Schema({
2929
},
3030
amount: {
3131
type: Number,
32-
required: true
32+
//required: true
3333
},
3434
senderAddress: {
3535
type: String,
36-
required: true
36+
//required: true
3737
},
3838
events: [TransferEventSchema],
3939
status: {
@@ -54,6 +54,17 @@ const TransferSchema = new Schema({
5454
// for faster lookups on blockchain events update
5555
TransferSchema.index({senderAddress: 1, transitAddress: 1}, {unique: true, name: "SenderTransitAddressIndex"});
5656

57+
// delete sensitive info by default
58+
TransferSchema.methods.toJSON = function() {
59+
var obj = this.toObject();
60+
delete obj.transitKeystore;
61+
delete obj.verified;
62+
delete obj._id;
63+
delete obj.senderAddress;
64+
delete obj.transitAddress;
65+
delete obj.phoneHash;
66+
return obj;
67+
}
5768

5869
var Transfer = mongoose.model('Transfer', TransferSchema);
5970
module.exports = Transfer;

src/routes/routes.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,11 @@ module.exports = {
2323
controller: "ReceiverController",
2424
method: 'confirm'
2525
}
26+
},
27+
'/transfers/:transferId': {
28+
'get': {
29+
controller: "ReceiverController",
30+
method: 'getTransfer'
31+
}
2632
}
2733
}

src/services/EscrowContractService.js

Lines changed: 4 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,17 @@
1-
const net = require('net');
2-
const Web3 = require("web3");
31
const Promise = require("bluebird");
42
const BadRequestError = require('../libs/error').BadRequestError;
53
const config = require("../config/app-config");
64
const log = require('./../libs/log')(module);
7-
// const TransferService = require('./TransferService');
85

9-
10-
function getWeb3() {
11-
const web3 = new Web3(new Web3.providers.IpcProvider(process.env['HOME'] + config.get("GETH_LOCATION"), net));
12-
Promise.promisifyAll(web3.eth, { suffix: "Promise" });
13-
Promise.promisifyAll(web3.personal, { suffix: "Promise" });
14-
return web3;
15-
}
16-
17-
const web3 = getWeb3();
186
const CONTRACT_ABI = require("../contracts/e2pEscrow").abi;
7+
const web3 = require('../utils/web3');
8+
9+
// init contract
1910
const CONTRACT_ADDRESS = config.get("ESCROW_CONTRACT_ADDRESS");
2011
const contractInstance = web3.eth.contract(CONTRACT_ABI).at(CONTRACT_ADDRESS);
21-
2212
Promise.promisifyAll(contractInstance, { suffix: "Promise" });
2313

2414

25-
function subscribeForPendingEvents() {
26-
// log.debug("Subscribing for pending events.");
27-
//var options = {address: CONTRACT_ADDRESS, fromBlock: 'earliest', toBlock: 'earliest'};
28-
//var filter = web3.eth.filter(options);
29-
var myEvent = contractInstance.LogDeposit({}, {fromBlock: 'pending', toBlock: 'pending'});
30-
31-
32-
myEvent.watch((error, tx) => {
33-
// try {
34-
// const tx = await web3.eth.getTransactionPromise(txHash);
35-
// if (tx.to === CONTRACT_ADDRESS) {
36-
log.debug("GOT PENDING EVENT: ");
37-
log.debug(tx);
38-
// }
39-
// } catch(err) {
40-
// log.debug(err);
41-
// }
42-
});
43-
}
44-
4515
function* getByTransitAddress(transitAddress) {
4616
function _parseTransfer(data) {
4717
return {
@@ -78,7 +48,7 @@ function* checkSignature(transitAddress, to, v, r, s) {
7848
function* checkTransferStatusBeforeWithdraw(transitAddress) {
7949
// transfer instance from blockchain
8050
const transferBc = yield getByTransitAddress(transitAddress);
81-
// log.debug({transferBc, transitAddress});
51+
8252
// if no transfer in blockchain or no amount for transfer set
8353
if (!(transferBc && transferBc.amount > 0)) {
8454
throw new BadRequestError('No pending transfer found on blockchain!');
@@ -110,5 +80,4 @@ module.exports = {
11080
checkSignature,
11181
withdraw,
11282
checkTransferStatusBeforeWithdraw,
113-
subscribeForPendingEvents
11483
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
const web3 = require('../utils/web3');
2+
const log = require('./../libs/log')(module);
3+
const TransferService = require('./TransferService');
4+
const config = require("../config/app-config");
5+
const CONTRACT_ADDRESS = config.get("ESCROW_CONTRACT_ADDRESS");
6+
7+
8+
const DEPOSIT_SHA3 = '0xf340fa01';
9+
const CANCEL_SHA3 = '0xa7c1e629';
10+
11+
12+
const subscribeForPendingEvents = () => {
13+
log.debug("Subscribing for pending events.");
14+
var filter = web3.eth.filter('pending');
15+
16+
filter.watch( async (error, txHash) => {
17+
try {
18+
const tx = await web3.eth.getTransactionPromise(txHash);
19+
if (tx.to === CONTRACT_ADDRESS) {
20+
log.debug("GOT PENDING EVENT: ");
21+
log.debug(tx);
22+
console.log(tx);
23+
let eventName;
24+
if (tx.input.includes(DEPOSIT_SHA3)) {
25+
// deposit event
26+
eventName = 'deposit';
27+
} else if (tx.input.includes(CANCEL_SHA3)) {
28+
// cancel event
29+
eventName = 'cancel';
30+
} else {
31+
log.debug("Unknown event!");
32+
return null;
33+
}
34+
35+
// get transit address from input data
36+
const transitAddress = '0x' + tx.input.substring(tx.input.length - 40);
37+
const gasPrice = tx.gasPrice.toNumber();
38+
console.log({transitAddress, gasPrice});
39+
const params = {senderAddress: tx.from, transitAddress };
40+
console.log({params})
41+
const transfer = await TransferService.findOne(params);
42+
log.debug({transfer});
43+
// TransferService.addEvent()
44+
}
45+
} catch(err) {
46+
log.debug(err);
47+
}
48+
});
49+
}
50+
51+
const start = () => {
52+
subscribeForPendingEvents();
53+
}
54+
55+
56+
module.exports = {
57+
start
58+
}

src/services/TransferService.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,14 @@ function* getByTransferId(transferId) {
1313
return yield Transfer.findOne({transferId});
1414
}
1515

16+
function findOne(params={}) {
17+
return Transfer.findOne(params);
18+
}
19+
1620

1721

1822
module.exports = {
1923
create,
2024
getByTransferId,
25+
findOne
2126
}

src/utils/web3.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
const config = require("../config/app-config");
2+
const net = require('net');
3+
const Web3 = require("web3");
4+
const Promise = require("bluebird");
5+
6+
7+
function getWeb3() {
8+
const web3 = new Web3(new Web3.providers.IpcProvider(process.env['HOME'] + config.get("GETH_LOCATION"), net));
9+
Promise.promisifyAll(web3.eth, { suffix: "Promise" });
10+
Promise.promisifyAll(web3.personal, { suffix: "Promise" });
11+
return web3;
12+
}
13+
14+
module.exports = getWeb3();

0 commit comments

Comments
 (0)