-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbalances.js
131 lines (114 loc) · 4 KB
/
balances.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
var async = require('async');
var bignum = require('bignumber.js');
var ripple = require('ripple-lib');
var remote = require('./../lib/remote.js');
var respond = require('../lib/response-handler.js');
var errors = require('./../lib/errors.js');
module.exports = {
get: getBalances
};
var InvalidRequestError = errors.InvalidRequestError;
/**
* Request the balances for a given account
*
* Notes:
* In order to use paging, you must provide at least ledger as a query parameter.
* Additionally, any limit lower than 10 will be bumped up to 10.
*
* @url
* @param {RippleAddress} request.params.account - account to retrieve balances for
*
* @query
* @param {String ISO 4217 Currency Code} [request.query.currency] - only request balances with given currency
* @param {RippleAddress} [request.query.counterparty] - only request balances with given counterparty
* @param {String} [request.query.marker] - start position in response paging
* @param {Number String} [request.query.limit] - max results per response
* @param {Number String} [request.query.ledger] - identifier
*
* @param {Express.js Response} response
* @param {Express.js Next} next
*/
function getBalances(request, response, next) {
var options = {
account: request.params.account,
currency: request.query.currency,
counterparty: request.query.counterparty
};
var currencyRE = new RegExp(options.currency ? ('^' + options.currency.toUpperCase() + '$') : /./);
var balances = [];
function validateOptions(callback) {
if (!ripple.UInt160.is_valid(options.account)) {
return callback(new InvalidRequestError('Parameter is not a valid Ripple address: account'));
}
if (options.counterparty && !ripple.UInt160.is_valid(options.counterparty)) {
return callback(new InvalidRequestError('Parameter is not a valid Ripple address: counterparty'));
}
if (options.currency && !/^[A-Z0-9]{3}$/.test(options.currency)) {
return callback(new InvalidRequestError('Parameter is not a valid currency: currency'));
}
callback();
};
function getXRPBalance(callback) {
var accountInfoRequest = remote.requestAccountInfo({account: options.account});
accountInfoRequest.once('error', callback);
accountInfoRequest.once('success', function(info) {
balances.push({
value: bignum(info.account_data.Balance).dividedBy('1000000').toString(),
currency: 'XRP',
counterparty: ''
});
callback();
});
accountInfoRequest.request();
};
function getLineBalances(callback) {
var accountLinesRequest;
var marker = request.query.marker;
var limit = /^[0-9]*$/.test(request.query.limit) ? Number(request.query.limit) : void(0);
var ledger = /^[0-9]*$/.test(request.query.ledger) ? Number(request.query.ledger) : void(0);
try {
accountLinesRequest = remote.requestAccountLines({
account: options.account,
marker: marker,
limit: limit,
ledger: ledger
});
} catch (error) {
return callback(error);
}
if (options.counterparty) {
accountLinesRequest.message.peer = options.counterparty;
}
accountLinesRequest.once('error', callback);
accountLinesRequest.once('success', function(result) {
result.lines.forEach(function(line) {
if (currencyRE.test(line.currency)) {
balances.push({
value: line.balance,
currency: line.currency,
counterparty: line.account
});
}
});
callback();
});
accountLinesRequest.request();
};
var steps = [
validateOptions
];
if (options.currency) {
steps.push(options.currency === 'XRP' ? getXRPBalance : getLineBalances);
} else if (options.counterparty) {
steps.push(getLineBalances);
} else {
steps.push(getXRPBalance, getLineBalances);
}
async.series(steps, function(error) {
if (error) {
next(error);
} else {
respond.success(response, { balances: balances });
}
});
};