diff --git a/class/User.js b/class/User.js index cc92305..23ba5bc 100644 --- a/class/User.js +++ b/class/User.js @@ -243,7 +243,11 @@ export class User { invoice.description = ''; for (let tag of decoded.tags) { if (tag.tagName === 'description') { - invoice.description += decodeURIComponent(tag.data); + try { + invoice.description += decodeURIComponent(tag.data); + } catch (_) { + invoice.description += tag.data; + } } if (tag.tagName === 'payment_hash') { invoice.payment_hash = tag.data; @@ -267,7 +271,7 @@ export class User { } invoice.amt = decoded.satoshis; - invoice.expire_time = 3600; + invoice.expire_time = 3600 * 24; // ^^^default; will keep for now. if we want to un-hardcode it - it should be among tags (`expire_time`) invoice.timestamp = decoded.timestamp; invoice.type = 'user_invoice'; @@ -313,6 +317,10 @@ export class User { if (invoice.payment_route) { invoice.fee = +invoice.payment_route.total_fees; invoice.value = +invoice.payment_route.total_fees + +invoice.payment_route.total_amt; + if (invoice.payment_route.total_amt_msat && invoice.payment_route.total_amt_msat / 1000 !== +invoice.payment_route.total_amt) { + // okay, we have to account for MSAT + invoice.value = +invoice.payment_route.total_fees + Math.max(parseInt(invoice.payment_route.total_amt_msat / 1000), +invoice.payment_route.total_amt) + 1; // extra sat to cover for msats, as external layer (clients) dont have that resolution + } } else { invoice.fee = 0; } diff --git a/controllers/api.js b/controllers/api.js index 8a6808c..0d8466e 100644 --- a/controllers/api.js +++ b/controllers/api.js @@ -128,10 +128,17 @@ router.post('/payinvoice', async function(req, res) { // obtaining a lock let lock = new Lock(redis, 'invoice_paying_for_' + u.getUserId()); if (!(await lock.obtainLock())) { - return errorTryAgainLater(res); + return errorGeneralServerError(res); } - let userBalance = await u.getCalculatedBalance(); + let userBalance; + try { + userBalance = await u.getCalculatedBalance(); + } catch (Error) { + logger.log('', [req.id, 'error running getCalculatedBalance():', Error.message]); + lock.releaseLock(); + return errorTryAgainLater(res); + } lightning.decodePayReq({ pay_req: req.body.invoice }, async function(err, info) { if (err) { @@ -206,7 +213,7 @@ router.post('/payinvoice', async function(req, res) { return errorPaymentFailed(res); } }); - if (!info.num_satoshis && !info.num_satoshis) { + if (!info.num_satoshis) { // tip invoice, but someone forgot to specify amount await lock.releaseLock(); return errorBadArguments(res); @@ -255,11 +262,16 @@ router.get('/balance', postLimiter, async function(req, res) { return errorBadAuth(res); } - if (!(await u.getAddress())) await u.generateAddress(); // onchain address needed further - await u.accountForPosibleTxids(); - let balance = await u.getBalance(); - if (balance < 0) balance = 0; - res.send({ BTC: { AvailableBalance: balance } }); + try { + if (!(await u.getAddress())) await u.generateAddress(); // onchain address needed further + await u.accountForPosibleTxids(); + let balance = await u.getBalance(); + if (balance < 0) balance = 0; + res.send({ BTC: { AvailableBalance: balance } }); + } catch (Error) { + logger.log('', [req.id, 'error getting balance:', Error.message, 'userid:', u.getUserId()]); + return errorGeneralServerError(res); + } }); router.get('/getinfo', postLimiter, async function(req, res) { @@ -298,7 +310,7 @@ router.get('/gettxs', async function(req, res) { } res.send(txs); } catch (Err) { - logger.log('', [req.id, 'error:', Err]); + logger.log('', [req.id, 'error gettxs:', Err.message, 'userid:', u.getUserId()]); res.send([]); } }); @@ -318,7 +330,7 @@ router.get('/getuserinvoices', async function(req, res) { res.send(invoices); } } catch (Err) { - logger.log('', [req.id, 'error:', Err]); + logger.log('', [req.id, 'error getting user invoices:', Err.message, 'userid:', u.getUserId()]); res.send([]); } }); @@ -408,7 +420,7 @@ function errorGeneralServerError(res) { return res.send({ error: true, code: 6, - message: 'Server fault', + message: 'Something went wrong. Please try again later', }); } diff --git a/package-lock.json b/package-lock.json index d540b0f..72d6946 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2050,9 +2050,9 @@ } }, "eslint-plugin-prettier": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.1.tgz", - "integrity": "sha512-A+TZuHZ0KU0cnn56/9mfR7/KjUJ9QNVXUhwvRFSR7PGPe0zQR6PTkmyqg1AtUUEOzTqeRsUwyKFh0oVZKVCrtA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz", + "integrity": "sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA==", "requires": { "prettier-linter-helpers": "^1.0.0" } @@ -3641,9 +3641,9 @@ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, "ioredis": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.14.1.tgz", - "integrity": "sha512-94W+X//GHM+1GJvDk6JPc+8qlM7Dul+9K+lg3/aHixPN7ZGkW6qlvX0DG6At9hWtH2v3B32myfZqWoANUJYGJA==", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.15.1.tgz", + "integrity": "sha512-vbSsIlmI2P31c+nxZvYjChAcgMK5Ssn9FLdhOXi0O+KVOp6JLXrkVFlq8Zrmc3ee5e5eoqB9nHFYIQzWKc/12Q==", "requires": { "cluster-key-slot": "^1.1.0", "debug": "^4.1.1", @@ -4211,9 +4211,9 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "mustache": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-3.1.0.tgz", - "integrity": "sha512-3Bxq1R5LBZp7fbFPZzFe5WN4s0q3+gxZaZuZVY+QctYJiCiVgXHOTIC0/HgZuOPFt/6BQcx5u0H2CUOxT/RoGQ==" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-3.2.1.tgz", + "integrity": "sha512-RERvMFdLpaFfSRIEe632yDm5nsd0SDKn8hGmcUwswnyiE5mtdZLDybtHAz6hjJhawokF0hXvGLtx9mrQfm6FkA==" }, "mute-stream": { "version": "0.0.8", diff --git a/package.json b/package.json index d81220f..1ae5fad 100644 --- a/package.json +++ b/package.json @@ -19,18 +19,18 @@ "babel-preset-env": "^1.7.0", "babel-preset-es2015": "^6.24.1", "babel-register": "^6.26.0", - "bignumber.js": "^9.0.0", + "bignumber.js": "^8.0.1", "bolt11": "^1.2.6", - "eslint": "^6.7.1", - "eslint-config-prettier": "^6.7.0", - "eslint-plugin-prettier": "^3.0.0", + "eslint": "^5.9.0", + "eslint-config-prettier": "^3.3.0", + "eslint-plugin-prettier": "^3.1.2", "express": "^4.16.4", "express-rate-limit": "^5.0.0", "grpc": "^1.17.0-pre1", "ioredis": "^4.2.0", "jayson": "^3.1.2", "morgan": "^1.9.1", - "mustache": "^3.0.1", + "mustache": "^3.2.1", "node-uuid": "^1.4.8", "prettier": "^1.19.1", "request": "^2.88.0", diff --git a/utils/logger.js b/utils/logger.js index eb7364d..cb58110 100644 --- a/utils/logger.js +++ b/utils/logger.js @@ -37,10 +37,6 @@ if (!fs.existsSync('logs')) { fs.mkdirSync('logs'); } -/** - * @param {string} label group label - * @param {string} message log message - */ function log(label, message) { logger.log({ level: 'info',