commit
b6bf866ef3
4 changed files with 109 additions and 34 deletions
|
|
@ -19,6 +19,7 @@
|
||||||
"@grpc/proto-loader": "^0.5.1",
|
"@grpc/proto-loader": "^0.5.1",
|
||||||
"axios": "^0.19.0",
|
"axios": "^0.19.0",
|
||||||
"basic-auth": "^2.0.0",
|
"basic-auth": "^2.0.0",
|
||||||
|
"big.js": "^5.2.2",
|
||||||
"bitcore-lib": "^0.15.0",
|
"bitcore-lib": "^0.15.0",
|
||||||
"body-parser": "^1.16.0",
|
"body-parser": "^1.16.0",
|
||||||
"colors": "^1.3.0",
|
"colors": "^1.3.0",
|
||||||
|
|
|
||||||
|
|
@ -134,7 +134,7 @@ const onAcceptedRequests = (user, SEA) => {
|
||||||
res(feed)
|
res(feed)
|
||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
// @ts-expect-error
|
// @ts-ignore
|
||||||
v => size(v) === 0
|
v => size(v) === 0
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
129
src/routes.js
129
src/routes.js
|
|
@ -13,6 +13,7 @@ const responseTime = require("response-time");
|
||||||
const uuid = require("uuid/v4");
|
const uuid = require("uuid/v4");
|
||||||
const Common = require('shock-common')
|
const Common = require('shock-common')
|
||||||
const isARealUsableNumber = require('lodash/isFinite')
|
const isARealUsableNumber = require('lodash/isFinite')
|
||||||
|
const Big = require('big.js')
|
||||||
const size = require('lodash/size')
|
const size = require('lodash/size')
|
||||||
|
|
||||||
const getListPage = require("../utils/paginate");
|
const getListPage = require("../utils/paginate");
|
||||||
|
|
@ -1188,29 +1189,42 @@ module.exports = async (
|
||||||
const openChannelRequest = {
|
const openChannelRequest = {
|
||||||
node_pubkey: Buffer.from(pubkey, 'hex'),
|
node_pubkey: Buffer.from(pubkey, 'hex'),
|
||||||
local_funding_amount: channelCapacity,
|
local_funding_amount: channelCapacity,
|
||||||
push_sat: channelPushAmount,
|
push_sat: channelPushAmount === '' ? '0' : channelPushAmount,
|
||||||
sat_per_byte:satPerByte,
|
sat_per_byte:satPerByte,
|
||||||
};
|
};
|
||||||
logger.info("OpenChannelRequest", openChannelRequest);
|
logger.info("OpenChannelRequest", openChannelRequest);
|
||||||
|
let finalEvent = null //Object to send to the socket, depends on final event from the stream
|
||||||
const openedChannel = lightning.openChannel(openChannelRequest);
|
const openedChannel = lightning.openChannel(openChannelRequest);
|
||||||
// only emits one event
|
|
||||||
openedChannel.on("data", response => {
|
openedChannel.on("data", response => {
|
||||||
logger.debug("OpenChannelRequest:", response);
|
logger.debug("OpenChannelRequest:", response);
|
||||||
if (!res.headersSent) {
|
if(res.headersSent){//if res was already sent
|
||||||
|
if(response.update === 'chan_open'){
|
||||||
|
finalEvent = {status:'chan_open'}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
res.json(response);
|
res.json(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
openedChannel.on("error", async err => {
|
openedChannel.on("error", async err => {
|
||||||
logger.info("OpenChannelRequest Error:", err);
|
logger.info("OpenChannelRequest Error:", err);
|
||||||
const health = await checkHealth();
|
if(res.headersSent){
|
||||||
if (health.LNDStatus.success && !res.headersSent) {
|
finalEvent = {error:err.details}//send error on socket if http has already finished
|
||||||
res.status(500).json({ field: "openChannelRequest", errorMessage: sanitizeLNDError(err.message) });
|
} else {
|
||||||
} else if (!res.headersSent) {
|
const health = await checkHealth();
|
||||||
res.status(500);
|
if (health.LNDStatus.success) {
|
||||||
res.json({ errorMessage: "LND is down" });
|
res.status(500).json({ field: "openChannelRequest", errorMessage: sanitizeLNDError(err.details) });
|
||||||
|
} else if (!res.headersSent) {
|
||||||
|
res.status(500);
|
||||||
|
res.json({ errorMessage: "LND is down" });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
openedChannel.write(openChannelRequest)
|
openedChannel.on('end',()=> {
|
||||||
|
if(finalEvent !== null){//send the last event got from the stream
|
||||||
|
//TO DO send finalEvent on socket
|
||||||
|
}
|
||||||
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
// closechannel
|
// closechannel
|
||||||
|
|
@ -1260,7 +1274,11 @@ module.exports = async (
|
||||||
// this is the recommended value from lightning labs
|
// this is the recommended value from lightning labs
|
||||||
const { maxParts = 3, payreq } = req.body;
|
const { maxParts = 3, payreq } = req.body;
|
||||||
|
|
||||||
const paymentRequest = { payment_request: payreq, max_parts: maxParts };
|
const paymentRequest = {
|
||||||
|
payment_request: payreq,
|
||||||
|
max_parts: maxParts,
|
||||||
|
timeout_seconds:5
|
||||||
|
};
|
||||||
|
|
||||||
if (req.body.amt) {
|
if (req.body.amt) {
|
||||||
paymentRequest.amt = req.body.amt;
|
paymentRequest.amt = req.body.amt;
|
||||||
|
|
@ -1268,18 +1286,24 @@ module.exports = async (
|
||||||
|
|
||||||
logger.info("Sending payment", paymentRequest);
|
logger.info("Sending payment", paymentRequest);
|
||||||
const sentPayment = router.sendPaymentV2(paymentRequest);
|
const sentPayment = router.sendPaymentV2(paymentRequest);
|
||||||
|
let finalEvent = null //Object to send to the socket, depends on final event from the stream
|
||||||
// only emits one event
|
|
||||||
sentPayment.on("data", response => {
|
sentPayment.on("data", response => {
|
||||||
if (response.payment_error) {
|
if(res.headersSent){//if res was already sent
|
||||||
logger.error("SendPayment Info:", response)
|
if(response.failure_reason !== 'FAILURE_REASON_NONE'){//if the operation failed
|
||||||
return res.status(500).json({
|
finalEvent = {error:response.failure_reason}
|
||||||
errorMessage: response.payment_error
|
} else {
|
||||||
});
|
finalEvent = {status:response.status}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (response.failure_reason !== 'FAILURE_REASON_NONE') {
|
||||||
|
logger.error("SendPayment Info:", response)
|
||||||
|
return res.status(500).json({
|
||||||
|
errorMessage: response.failure_reason
|
||||||
|
});
|
||||||
|
}
|
||||||
|
logger.info("SendPayment Data:", response);
|
||||||
|
return res.json(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.info("SendPayment Data:", response);
|
|
||||||
return res.json(response);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
sentPayment.on("status", status => {
|
sentPayment.on("status", status => {
|
||||||
|
|
@ -1288,18 +1312,25 @@ module.exports = async (
|
||||||
|
|
||||||
sentPayment.on("error", async err => {
|
sentPayment.on("error", async err => {
|
||||||
logger.error("SendPayment Error:", err);
|
logger.error("SendPayment Error:", err);
|
||||||
const health = await checkHealth();
|
if(res.headersSent){
|
||||||
if (health.LNDStatus.success) {
|
finalEvent = {error:err.details}//send error on socket if http has already finished
|
||||||
res.status(500).json({
|
|
||||||
errorMessage: sanitizeLNDError(err.message)
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
res.status(500);
|
const health = await checkHealth();
|
||||||
res.json({ errorMessage: "LND is down" });
|
if (health.LNDStatus.success) {
|
||||||
|
res.status(500).json({
|
||||||
|
errorMessage: sanitizeLNDError(err.details)
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
res.status(500);
|
||||||
|
res.json({ errorMessage: "LND is down" });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
sentPayment.on('end',()=>{
|
||||||
sentPayment.write(paymentRequest);
|
if(finalEvent !== null){//send the last event got from the stream
|
||||||
|
//TO DO send finalEvent on socket
|
||||||
|
}
|
||||||
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
app.post("/api/lnd/trackpayment", (req, res) => {
|
app.post("/api/lnd/trackpayment", (req, res) => {
|
||||||
|
|
@ -1381,7 +1412,7 @@ module.exports = async (
|
||||||
if (req.body.expiry) {
|
if (req.body.expiry) {
|
||||||
invoiceRequest.expiry = req.body.expiry;
|
invoiceRequest.expiry = req.body.expiry;
|
||||||
}
|
}
|
||||||
lightning.addInvoice(invoiceRequest, async (err, response) => {
|
lightning.addInvoice(invoiceRequest, async (err, newInvoice) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
logger.debug("AddInvoice Error:", err);
|
logger.debug("AddInvoice Error:", err);
|
||||||
const health = await checkHealth();
|
const health = await checkHealth();
|
||||||
|
|
@ -1396,8 +1427,40 @@ module.exports = async (
|
||||||
}
|
}
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
logger.debug("AddInvoice:", response);
|
logger.debug("AddInvoice:", newInvoice);
|
||||||
res.json(response);
|
if (req.body.value) {
|
||||||
|
logger.debug("AddInvoice liquidity check:");
|
||||||
|
lightning.listChannels({active_only:true}, async (err, response) => {
|
||||||
|
if (err) {
|
||||||
|
logger.debug("ListChannels Error:", err);
|
||||||
|
const health = await checkHealth();
|
||||||
|
if (health.LNDStatus.success) {
|
||||||
|
res.status(400).json({
|
||||||
|
field: "listChannels",
|
||||||
|
errorMessage: sanitizeLNDError(err.message)
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
res.status(500);
|
||||||
|
res.json({ errorMessage: "LND is down" });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
logger.debug("ListChannels:", response);
|
||||||
|
const channelsList = response.channels
|
||||||
|
let remoteBalance = Big(0)
|
||||||
|
channelsList.forEach(element=>{
|
||||||
|
const remB = Big(element.remote_balance)
|
||||||
|
if(remB.gt(remoteBalance)){
|
||||||
|
remoteBalance = remB
|
||||||
|
}
|
||||||
|
})
|
||||||
|
newInvoice.liquidityCheck = remoteBalance > req.body.value
|
||||||
|
//newInvoice.remoteBalance = remoteBalance
|
||||||
|
res.json(newInvoice);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
res.json(newInvoice);
|
||||||
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
11
yarn.lock
11
yarn.lock
|
|
@ -1227,6 +1227,11 @@ better-assert@~1.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
callsite "1.0.0"
|
callsite "1.0.0"
|
||||||
|
|
||||||
|
big.js@^5.2.2:
|
||||||
|
version "5.2.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
|
||||||
|
integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
|
||||||
|
|
||||||
binary-extensions@^1.0.0:
|
binary-extensions@^1.0.0:
|
||||||
version "1.13.1"
|
version "1.13.1"
|
||||||
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
|
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
|
||||||
|
|
@ -2966,9 +2971,15 @@ grpc@^1.21.1:
|
||||||
node-pre-gyp "^0.13.0"
|
node-pre-gyp "^0.13.0"
|
||||||
protobufjs "^5.0.3"
|
protobufjs "^5.0.3"
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
|
"gun@git://github.com/amark/gun#3e678b8568a4a8a825b84b26759d4dd4f3b0988e":
|
||||||
|
version "0.2020.520"
|
||||||
|
resolved "git://github.com/amark/gun#3e678b8568a4a8a825b84b26759d4dd4f3b0988e"
|
||||||
|
=======
|
||||||
"gun@git://github.com/amark/gun#97aa976c97e6219a9f93095d32c220dcd371ca62":
|
"gun@git://github.com/amark/gun#97aa976c97e6219a9f93095d32c220dcd371ca62":
|
||||||
version "0.2020.520"
|
version "0.2020.520"
|
||||||
resolved "git://github.com/amark/gun#97aa976c97e6219a9f93095d32c220dcd371ca62"
|
resolved "git://github.com/amark/gun#97aa976c97e6219a9f93095d32c220dcd371ca62"
|
||||||
|
>>>>>>> master
|
||||||
dependencies:
|
dependencies:
|
||||||
ws "^7.2.1"
|
ws "^7.2.1"
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue