Request Params Cleanup

pull/1366/head
ShahanaFarooqui 2 months ago
parent 8d7f6e0ed2
commit 86cef687a0

@ -80,6 +80,7 @@ export const closeChannel = (req, res, next) => {
}); });
}; };
export const listForwards = (req, res, next) => { export const listForwards = (req, res, next) => {
const { status } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Getting Channel List Forwards..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Getting Channel List Forwards..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { if (options.error) {
@ -88,8 +89,8 @@ export const listForwards = (req, res, next) => {
options.url = req.session.selectedNode.ln_server_url + '/v1/listforwards'; options.url = req.session.selectedNode.ln_server_url + '/v1/listforwards';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Forwarding History Received For Status ' + req.body.status, data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Forwarding History Received For Status ' + status, data: body });
body.forwards = !body.forwards ? [] : (req.body.status === 'failed' || req.body.status === 'local_failed') ? body.forwards.slice(Math.max(0, body.forwards.length - 1000), Math.max(1000, body.forwards.length)).reverse() : body.forwards.reverse(); body.forwards = !body.forwards ? [] : (status === 'failed' || status === 'local_failed') ? body.forwards.slice(Math.max(0, body.forwards.length - 1000), Math.max(1000, body.forwards.length)).reverse() : body.forwards.reverse();
res.status(200).json(body.forwards); res.status(200).json(body.forwards);
}).catch((errRes) => { }).catch((errRes) => {
const err = common.handleError(errRes, 'Channels', 'Forwarding History Error', req.session.selectedNode); const err = common.handleError(errRes, 'Channels', 'Forwarding History Error', req.session.selectedNode);

@ -40,6 +40,7 @@ export const listChannels = (req, res, next) => {
}); });
}; };
export const feeRates = (req, res, next) => { export const feeRates = (req, res, next) => {
const { style } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Getting Network Fee Rates..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Getting Network Fee Rates..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { if (options.error) {
@ -48,7 +49,7 @@ export const feeRates = (req, res, next) => {
options.url = req.session.selectedNode.ln_server_url + '/v1/feerates'; options.url = req.session.selectedNode.ln_server_url + '/v1/feerates';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Network Fee Rates Received for ' + req.body.style, data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Network Fee Rates Received for ' + style, data: body });
res.status(200).json(body); res.status(200).json(body);
}).catch((errRes) => { }).catch((errRes) => {
const err = common.handleError(errRes, 'Network', 'Fee Rates Error', req.session.selectedNode); const err = common.handleError(errRes, 'Network', 'Fee Rates Error', req.session.selectedNode);
@ -56,14 +57,14 @@ export const feeRates = (req, res, next) => {
}); });
}; };
export const listNodes = (req, res, next) => { export const listNodes = (req, res, next) => {
const filter_liquidity_ads = !!req.body.liquidity_ads;
delete req.body.liquidity_ads;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'List Nodes..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'List Nodes..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.ln_server_url + '/v1/listnodes'; options.url = req.session.selectedNode.ln_server_url + '/v1/listnodes';
const filter_liquidity_ads = !!req.body.liquidity_ads;
delete req.body.liquidity_ads;
options.body = req.body; options.body = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Network', msg: 'List Nodes URL' + options.url }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Network', msg: 'List Nodes URL' + options.url });
request.post(options).then((body) => { request.post(options).then((body) => {

@ -18,10 +18,11 @@ export const listOfferBookmarks = (req, res, next) => {
}); });
}; };
export const deleteOfferBookmark = (req, res, next) => { export const deleteOfferBookmark = (req, res, next) => {
const { offer_str } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Deleting Offer Bookmark..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Deleting Offer Bookmark..' });
databaseService.remove(req.session.selectedNode, CollectionsEnum.OFFERS, CollectionFieldsEnum.BOLT12, req.body.offer_str).then((deleteRes) => { databaseService.remove(req.session.selectedNode, CollectionsEnum.OFFERS, CollectionFieldsEnum.BOLT12, offer_str).then((deleteRes) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offer Bookmark Deleted', data: deleteRes }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offer Bookmark Deleted', data: deleteRes });
res.status(204).json(req.body.offer_str); res.status(204).json(offer_str);
}).catch((errRes) => { }).catch((errRes) => {
const err = common.handleError(errRes, 'Offers', 'Offer Bookmark Delete Error', req.session.selectedNode); const err = common.handleError(errRes, 'Offers', 'Offer Bookmark Delete Error', req.session.selectedNode);
return res.status(err.statusCode).json({ message: err.message, error: err.error }); return res.status(err.statusCode).json({ message: err.message, error: err.error });

@ -95,12 +95,13 @@ export const listPayments = (req, res, next) => {
}); });
}; };
export const postPayment = (req, res, next) => { export const postPayment = (req, res, next) => {
const { paymentType, saveToDB, bolt12, zeroAmtOffer, amount_msat, title, issuer, description } = req.body;
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
const options_body = JSON.parse(JSON.stringify(req.body)); const options_body = JSON.parse(JSON.stringify(req.body));
if (req.body.paymentType === 'KEYSEND') { if (paymentType === 'KEYSEND') {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Keysend Payment..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Keysend Payment..' });
options.url = req.session.selectedNode.ln_server_url + '/v1/keysend'; options.url = req.session.selectedNode.ln_server_url + '/v1/keysend';
delete options_body.uiMessage; delete options_body.uiMessage;
@ -121,13 +122,13 @@ export const postPayment = (req, res, next) => {
options.body = options_body; options.body = options_body;
} }
else { else {
if (req.body.paymentType === 'OFFER') { if (paymentType === 'OFFER') {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Sending Offer Payment..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Sending Offer Payment..' });
} }
else { else {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Sending Invoice Payment..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Sending Invoice Payment..' });
} }
if (req.body.paymentType === 'OFFER') { if (paymentType === 'OFFER') {
// delete amount for zero amt offer also as fetchinvoice already has amount information // delete amount for zero amt offer also as fetchinvoice already has amount information
delete options_body.amount_msat; delete options_body.amount_msat;
} }
@ -147,18 +148,18 @@ export const postPayment = (req, res, next) => {
} }
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Sent', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Sent', data: body });
if (req.body.paymentType === 'OFFER') { if (paymentType === 'OFFER') {
if (req.body.saveToDB && req.body.bolt12) { if (saveToDB && bolt12) {
const offerToUpdate = { bolt12: req.body.bolt12, amountMSat: (req.body.zeroAmtOffer ? 0 : req.body.amount_msat), title: req.body.title, lastUpdatedAt: new Date(Date.now()).getTime() }; const offerToUpdate = { bolt12: bolt12, amountMSat: (zeroAmtOffer ? 0 : amount_msat), title: title, lastUpdatedAt: new Date(Date.now()).getTime() };
if (req.body.issuer) { if (issuer) {
offerToUpdate['issuer'] = req.body.issuer; offerToUpdate['issuer'] = issuer;
} }
if (req.body.description) { if (description) {
offerToUpdate['description'] = req.body.description; offerToUpdate['description'] = description;
} }
// eslint-disable-next-line arrow-body-style // eslint-disable-next-line arrow-body-style
return databaseService.validateDocument(CollectionsEnum.OFFERS, offerToUpdate).then((validated) => { return databaseService.validateDocument(CollectionsEnum.OFFERS, offerToUpdate).then((validated) => {
return databaseService.update(req.session.selectedNode, CollectionsEnum.OFFERS, offerToUpdate, CollectionFieldsEnum.BOLT12, req.body.bolt12).then((updatedOffer) => { return databaseService.update(req.session.selectedNode, CollectionsEnum.OFFERS, offerToUpdate, CollectionFieldsEnum.BOLT12, bolt12).then((updatedOffer) => {
logger.log({ level: 'DEBUG', fileName: 'Payments', msg: 'Offer Updated', data: updatedOffer }); logger.log({ level: 'DEBUG', fileName: 'Payments', msg: 'Offer Updated', data: updatedOffer });
return res.status(201).json({ paymentResponse: body, saveToDBResponse: updatedOffer }); return res.status(201).json({ paymentResponse: body, saveToDBResponse: updatedOffer });
}).catch((errDB) => { }).catch((errDB) => {
@ -174,10 +175,10 @@ export const postPayment = (req, res, next) => {
return res.status(201).json({ paymentResponse: body, saveToDBResponse: 'NA' }); return res.status(201).json({ paymentResponse: body, saveToDBResponse: 'NA' });
} }
} }
if (req.body.paymentType === 'INVOICE') { if (paymentType === 'INVOICE') {
return res.status(201).json({ paymentResponse: body, saveToDBResponse: 'NA' }); return res.status(201).json({ paymentResponse: body, saveToDBResponse: 'NA' });
} }
if (req.body.paymentType === 'KEYSEND') { if (paymentType === 'KEYSEND') {
return res.status(201).json(body); return res.status(201).json(body);
} }
}).catch((errRes) => { }).catch((errRes) => {

@ -158,7 +158,8 @@ export const closeChannel = (req, res, next) => {
}); });
}; };
export const circularRebalance = (req, res, next) => { export const circularRebalance = (req, res, next) => {
const crInvDescription = 'Circular rebalancing invoice for ' + (req.body.amountMsat / 1000) + ' Sats'; const { amountMsat, sourceNodeId, targetNodeId, ignoreNodeIds, format, sourceShortChannelId, targetShortChannelId } = req.body;
const crInvDescription = 'Circular rebalancing invoice for ' + (amountMsat / 1000) + ' Sats';
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
@ -168,22 +169,22 @@ export const circularRebalance = (req, res, next) => {
const tillToday = (Math.round(new Date(Date.now()).getTime() / 1000)).toString(); const tillToday = (Math.round(new Date(Date.now()).getTime() / 1000)).toString();
// Check if unpaid Invoice exists already // Check if unpaid Invoice exists already
listPendingInvoicesRequestCall(req.session.selectedNode).then((callRes) => { listPendingInvoicesRequestCall(req.session.selectedNode).then((callRes) => {
const foundExistingInvoice = callRes.find((inv) => inv.description.includes(crInvDescription) && inv.amount === req.body.amountMsat && inv.expiry && inv.timestamp && ((inv.expiry + inv.timestamp) >= tillToday)); const foundExistingInvoice = callRes.find((inv) => inv.description.includes(crInvDescription) && inv.amount === amountMsat && inv.expiry && inv.timestamp && ((inv.expiry + inv.timestamp) >= tillToday));
// Create new invoice if doesn't exist already // Create new invoice if doesn't exist already
const requestCalls = foundExistingInvoice && foundExistingInvoice.serialized ? const requestCalls = foundExistingInvoice && foundExistingInvoice.serialized ?
[findRouteBetweenNodesRequestCall(req.session.selectedNode, req.body.amountMsat, req.body.sourceNodeId, req.body.targetNodeId, req.body.ignoreNodeIds, req.body.format)] : [findRouteBetweenNodesRequestCall(req.session.selectedNode, amountMsat, sourceNodeId, targetNodeId, ignoreNodeIds, format)] :
[findRouteBetweenNodesRequestCall(req.session.selectedNode, req.body.amountMsat, req.body.sourceNodeId, req.body.targetNodeId, req.body.ignoreNodeIds, req.body.format), createInvoiceRequestCall(req.session.selectedNode, crInvDescription, req.body.amountMsat)]; [findRouteBetweenNodesRequestCall(req.session.selectedNode, amountMsat, sourceNodeId, targetNodeId, ignoreNodeIds, format), createInvoiceRequestCall(req.session.selectedNode, crInvDescription, amountMsat)];
Promise.all(requestCalls).then((values) => { Promise.all(requestCalls).then((values) => {
// eslint-disable-next-line arrow-body-style // eslint-disable-next-line arrow-body-style
const routes = values[0]?.routes?.filter((route) => { const routes = values[0]?.routes?.filter((route) => {
return !((route.shortChannelIds[0] === req.body.sourceShortChannelId && route.shortChannelIds[1] === req.body.targetShortChannelId) || return !((route.shortChannelIds[0] === sourceShortChannelId && route.shortChannelIds[1] === targetShortChannelId) ||
(route.shortChannelIds[1] === req.body.sourceShortChannelId && route.shortChannelIds[0] === req.body.targetShortChannelId)); (route.shortChannelIds[1] === sourceShortChannelId && route.shortChannelIds[0] === targetShortChannelId));
}); });
const firstRoute = routes[0].shortChannelIds.join() || ''; const firstRoute = routes[0].shortChannelIds.join() || '';
const shortChannelIds = req.body.sourceShortChannelId + ',' + firstRoute + ',' + req.body.targetShortChannelId; const shortChannelIds = sourceShortChannelId + ',' + firstRoute + ',' + targetShortChannelId;
const invoice = (foundExistingInvoice && foundExistingInvoice.serialized ? foundExistingInvoice.serialized : (values[1] ? values[1].serialized : '')) || ''; const invoice = (foundExistingInvoice && foundExistingInvoice.serialized ? foundExistingInvoice.serialized : (values[1] ? values[1].serialized : '')) || '';
const paymentHash = (foundExistingInvoice && foundExistingInvoice.paymentHash ? foundExistingInvoice.paymentHash : (values[1] ? values[1].paymentHash : '') || ''); const paymentHash = (foundExistingInvoice && foundExistingInvoice.paymentHash ? foundExistingInvoice.paymentHash : (values[1] ? values[1].paymentHash : '') || '');
return sendPaymentToRouteRequestCall(req.session.selectedNode, shortChannelIds, invoice, req.body.amountMsat).then((payToRouteCallRes) => { return sendPaymentToRouteRequestCall(req.session.selectedNode, shortChannelIds, invoice, amountMsat).then((payToRouteCallRes) => {
// eslint-disable-next-line arrow-body-style // eslint-disable-next-line arrow-body-style
setTimeout(() => { setTimeout(() => {
return getSentInfoFromPaymentRequest(req.session.selectedNode, paymentHash).then((sentInfoCallRes) => { return getSentInfoFromPaymentRequest(req.session.selectedNode, paymentHash).then((sentInfoCallRes) => {

@ -135,12 +135,13 @@ export const createInvoiceRequestCall = (selectedNode, description, amount) => {
}); });
}; };
export const createInvoice = (req, res, next) => { export const createInvoice = (req, res, next) => {
const { description, amountMsat } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'Creating Invoice..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'Creating Invoice..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
createInvoiceRequestCall(req.session.selectedNode, req.body.description, req.body.amountMsat).then((invRes) => { createInvoiceRequestCall(req.session.selectedNode, description, amountMsat).then((invRes) => {
res.status(201).json(invRes); res.status(201).json(invRes);
}).catch((err) => res.status(err.statusCode).json({ message: err.message, error: err.error })); }).catch((err) => res.status(err.statusCode).json({ message: err.message, error: err.error }));
}; };

@ -35,11 +35,12 @@ export const findRouteBetweenNodesRequestCall = (selectedNode, amountMsat, sourc
}); });
}; };
export const findRouteBetweenNodes = (req, res, next) => { export const findRouteBetweenNodes = (req, res, next) => {
const { amountMsat, sourceNodeId, targetNodeId, ignoreNodeIds, format } = req.body;
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
findRouteBetweenNodesRequestCall(req.session.selectedNode, req.body.amountMsat, req.body.sourceNodeId, req.body.targetNodeId, req.body.ignoreNodeIds, req.body.format).then((callRes) => { findRouteBetweenNodesRequestCall(req.session.selectedNode, amountMsat, sourceNodeId, targetNodeId, ignoreNodeIds, format).then((callRes) => {
res.status(200).json(callRes); res.status(200).json(callRes);
}).catch((err) => res.status(err.statusCode).json({ message: err.message, error: err.error })); }).catch((err) => res.status(err.statusCode).json({ message: err.message, error: err.error }));
}; };

@ -74,17 +74,14 @@ export const getTransactions = (req, res, next) => {
}); });
}; };
export const sendFunds = (req, res, next) => { export const sendFunds = (req, res, next) => {
const { address, amount, blocks } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Sending On Chain Funds..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Sending On Chain Funds..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.ln_server_url + '/sendonchain'; options.url = req.session.selectedNode.ln_server_url + '/sendonchain';
options.form = { options.form = { address: address, amountSatoshis: amount, confirmationTarget: blocks };
address: req.body.address,
amountSatoshis: req.body.amount,
confirmationTarget: req.body.blocks
};
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Onchain', msg: 'Send Funds Options', data: options.form }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Onchain', msg: 'Send Funds Options', data: options.form });
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Onchain', msg: 'On Chain Funds Sent', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Onchain', msg: 'On Chain Funds Sent', data: body });

@ -104,13 +104,14 @@ export const queryPaymentRoute = (req, res, next) => {
}); });
}; };
export const getSentPaymentsInformation = (req, res, next) => { export const getSentPaymentsInformation = (req, res, next) => {
const { payments } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Getting Sent Payment Information..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Getting Sent Payment Information..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
if (req.body.payments) { if (payments) {
const paymentsArr = req.body.payments.split(','); const paymentsArr = payments.split(',');
return Promise.all(paymentsArr?.map((payment) => getSentInfoFromPaymentRequest(req.session.selectedNode, payment))). return Promise.all(paymentsArr?.map((payment) => getSentInfoFromPaymentRequest(req.session.selectedNode, payment))).
then((values) => { then((values) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Sent Information Received', data: values }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Sent Information Received', data: values });
@ -142,12 +143,13 @@ export const sendPaymentToRouteRequestCall = (selectedNode, shortChannelIds, inv
}); });
}; };
export const sendPaymentToRoute = (req, res, next) => { export const sendPaymentToRoute = (req, res, next) => {
const { shortChannelIds, invoice, amountMsat } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Send Payment To Route..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Send Payment To Route..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
sendPaymentToRouteRequestCall(req.session.selectedNode, req.body.shortChannelIds, req.body.invoice, req.body.amountMsat).then((callRes) => { sendPaymentToRouteRequestCall(req.session.selectedNode, shortChannelIds, invoice, amountMsat).then((callRes) => {
res.status(200).json(callRes); res.status(200).json(callRes);
}).catch((err) => res.status(err.statusCode).json({ message: err.message, error: err.error })); }).catch((err) => res.status(err.statusCode).json({ message: err.message, error: err.error }));
}; };

@ -123,6 +123,7 @@ export const getClosedChannels = (req, res, next) => {
}); });
}; };
export const postChannel = (req, res, next) => { export const postChannel = (req, res, next) => {
const { node_pubkey, private: privateChannel, spend_unconfirmed, local_funding_amount, trans_type, trans_type_value, commitment_type } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Opening Channel..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Opening Channel..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { if (options.error) {
@ -130,19 +131,19 @@ export const postChannel = (req, res, next) => {
} }
options.url = req.session.selectedNode.ln_server_url + '/v1/channels'; options.url = req.session.selectedNode.ln_server_url + '/v1/channels';
options.form = { options.form = {
node_pubkey_string: req.body.node_pubkey, node_pubkey_string: node_pubkey,
local_funding_amount: req.body.local_funding_amount, local_funding_amount: local_funding_amount,
private: req.body.private, private: privateChannel,
spend_unconfirmed: req.body.spend_unconfirmed spend_unconfirmed: spend_unconfirmed
}; };
if (req.body.trans_type === '1') { if (trans_type === '1') {
options.form.target_conf = req.body.trans_type_value; options.form.target_conf = trans_type_value;
} }
else if (req.body.trans_type === '2') { else if (trans_type === '2') {
options.form.sat_per_byte = req.body.trans_type_value; options.form.sat_per_byte = trans_type_value;
} }
if (req.body.commitment_type) { if (commitment_type) {
options.form.commitment_type = req.body.commitment_type; options.form.commitment_type = commitment_type;
} }
options.form = JSON.stringify(options.form); options.form = JSON.stringify(options.form);
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Channel Open Options', data: options.form }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Channel Open Options', data: options.form });
@ -155,27 +156,28 @@ export const postChannel = (req, res, next) => {
}); });
}; };
export const postTransactions = (req, res, next) => { export const postTransactions = (req, res, next) => {
const { paymentReq, paymentAmount, feeLimit, outgoingChannel, allowSelfPayment, lastHopPubkey } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Sending Payment..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Sending Payment..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.ln_server_url + '/v1/channels/transaction-stream'; options.url = req.session.selectedNode.ln_server_url + '/v1/channels/transaction-stream';
options.form = { payment_request: req.body.paymentReq }; options.form = { payment_request: paymentReq };
if (req.body.paymentAmount) { if (paymentAmount) {
options.form.amt = req.body.paymentAmount; options.form.amt = paymentAmount;
} }
if (req.body.feeLimit) { if (feeLimit) {
options.form.fee_limit = req.body.feeLimit; options.form.fee_limit = feeLimit;
} }
if (req.body.outgoingChannel) { if (outgoingChannel) {
options.form.outgoing_chan_id = req.body.outgoingChannel; options.form.outgoing_chan_id = outgoingChannel;
} }
if (req.body.allowSelfPayment) { if (allowSelfPayment) {
options.form.allow_self_payment = req.body.allowSelfPayment; options.form.allow_self_payment = allowSelfPayment;
} }
if (req.body.lastHopPubkey) { if (lastHopPubkey) {
options.form.last_hop_pubkey = Buffer.from(req.body.lastHopPubkey, 'hex').toString('base64'); options.form.last_hop_pubkey = Buffer.from(lastHopPubkey, 'hex').toString('base64');
} }
options.form = JSON.stringify(options.form); options.form = JSON.stringify(options.form);
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Send Payment Options', data: options.form }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Send Payment Options', data: options.form });
@ -224,35 +226,36 @@ export const closeChannel = (req, res, next) => {
} }
}; };
export const postChanPolicy = (req, res, next) => { export const postChanPolicy = (req, res, next) => {
const { chanPoint, baseFeeMsat, feeRate, timeLockDelta, max_htlc_msat, min_htlc_msat } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Updating Channel Policy..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Updating Channel Policy..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.ln_server_url + '/v1/chanpolicy'; options.url = req.session.selectedNode.ln_server_url + '/v1/chanpolicy';
if (req.body.chanPoint === 'all') { if (chanPoint === 'all') {
options.form = JSON.stringify({ options.form = JSON.stringify({
global: true, global: true,
base_fee_msat: req.body.baseFeeMsat, base_fee_msat: baseFeeMsat,
fee_rate: parseFloat((req.body.feeRate / 1000000).toString()), fee_rate: parseFloat((feeRate / 1000000).toString()),
time_lock_delta: parseInt(req.body.timeLockDelta) time_lock_delta: parseInt(timeLockDelta)
}); });
} }
else { else {
const breakPoint = req.body.chanPoint.indexOf(':'); const breakPoint = chanPoint.indexOf(':');
const txid_str = req.body.chanPoint.substring(0, breakPoint); const txid_str = chanPoint.substring(0, breakPoint);
const output_idx = req.body.chanPoint.substring(breakPoint + 1, req.body.chanPoint.length); const output_idx = chanPoint.substring(breakPoint + 1, chanPoint.length);
const optionsBody = { const optionsBody = {
base_fee_msat: req.body.baseFeeMsat, base_fee_msat: baseFeeMsat,
fee_rate: parseFloat((req.body.feeRate / 1000000).toString()), fee_rate: parseFloat((feeRate / 1000000).toString()),
time_lock_delta: parseInt(req.body.timeLockDelta), time_lock_delta: parseInt(timeLockDelta),
chan_point: { funding_txid_str: txid_str, output_index: parseInt(output_idx) } chan_point: { funding_txid_str: txid_str, output_index: parseInt(output_idx) }
}; };
if (req.body.max_htlc_msat) { if (max_htlc_msat) {
optionsBody['max_htlc_msat'] = req.body.max_htlc_msat; optionsBody['max_htlc_msat'] = max_htlc_msat;
} }
if (req.body.min_htlc_msat) { if (min_htlc_msat) {
optionsBody['min_htlc_msat'] = req.body.min_htlc_msat; optionsBody['min_htlc_msat'] = min_htlc_msat;
optionsBody['min_htlc_msat_specified'] = true; optionsBody['min_htlc_msat_specified'] = true;
} }
options.form = JSON.stringify(optionsBody); options.form = JSON.stringify(optionsBody);

@ -5,6 +5,7 @@ let options = null;
const logger = Logger; const logger = Logger;
const common = Common; const common = Common;
export const signMessage = (req, res, next) => { export const signMessage = (req, res, next) => {
const { message } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Signing Message..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Signing Message..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { if (options.error) {
@ -12,7 +13,7 @@ export const signMessage = (req, res, next) => {
} }
options.url = req.session.selectedNode.ln_server_url + '/v1/signmessage'; options.url = req.session.selectedNode.ln_server_url + '/v1/signmessage';
options.form = JSON.stringify({ options.form = JSON.stringify({
msg: Buffer.from(req.body.message).toString('base64') msg: Buffer.from(message).toString('base64')
}); });
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Message Signed', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Message Signed', data: body });
@ -23,6 +24,7 @@ export const signMessage = (req, res, next) => {
}); });
}; };
export const verifyMessage = (req, res, next) => { export const verifyMessage = (req, res, next) => {
const { message, signature } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Verifying Message..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Verifying Message..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { if (options.error) {
@ -30,8 +32,8 @@ export const verifyMessage = (req, res, next) => {
} }
options.url = req.session.selectedNode.ln_server_url + '/v1/verifymessage'; options.url = req.session.selectedNode.ln_server_url + '/v1/verifymessage';
options.form = JSON.stringify({ options.form = JSON.stringify({
msg: Buffer.from(req.body.message).toString('base64'), msg: Buffer.from(message).toString('base64'),
signature: req.body.signature signature: signature
}); });
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Message Verified', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Message Verified', data: body });

@ -27,13 +27,14 @@ export const decodePayment = (req, res, next) => {
}); });
}; };
export const decodePayments = (req, res, next) => { export const decodePayments = (req, res, next) => {
const { payments } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'PayRequest', msg: 'Decoding Payments List..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'PayRequest', msg: 'Decoding Payments List..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
if (req.body.payments) { if (payments) {
const paymentsArr = req.body.payments.split(','); const paymentsArr = payments.split(',');
return Promise.all(paymentsArr?.map((payment) => decodePaymentFromPaymentRequest(req.session.selectedNode, payment))). return Promise.all(paymentsArr?.map((payment) => decodePaymentFromPaymentRequest(req.session.selectedNode, payment))).
then((values) => { then((values) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'PayRequest', msg: 'Payment List Decoded', data: values }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'PayRequest', msg: 'Payment List Decoded', data: values });

@ -35,6 +35,7 @@ export const getPeers = (req, res, next) => {
}); });
}; };
export const postPeer = (req, res, next) => { export const postPeer = (req, res, next) => {
const { host, pubkey, perm } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Connecting Peer..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Connecting Peer..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { if (options.error) {
@ -42,8 +43,8 @@ export const postPeer = (req, res, next) => {
} }
options.url = req.session.selectedNode.ln_server_url + '/v1/peers'; options.url = req.session.selectedNode.ln_server_url + '/v1/peers';
options.form = JSON.stringify({ options.form = JSON.stringify({
addr: { host: req.body.host, pubkey: req.body.pubkey }, addr: { host: host, pubkey: pubkey },
perm: req.body.perm perm: perm
}); });
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peer Connected', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peer Connected', data: body });
@ -52,7 +53,7 @@ export const postPeer = (req, res, next) => {
const peers = (!body.peers) ? [] : body.peers; const peers = (!body.peers) ? [] : body.peers;
return Promise.all(peers?.map((peer) => getAliasForPeers(req.session.selectedNode, peer))).then((values) => { return Promise.all(peers?.map((peer) => getAliasForPeers(req.session.selectedNode, peer))).then((values) => {
if (body.peers) { if (body.peers) {
body.peers = common.newestOnTop(body.peers, 'pub_key', req.body.pubkey); body.peers = common.newestOnTop(body.peers, 'pub_key', pubkey);
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peers List after Connect Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peers List after Connect Received', data: body });
} }
res.status(201).json(body.peers); res.status(201).json(body.peers);

@ -7,7 +7,8 @@ const common = Common;
const responseData = { switch: { forwarding_events: [], last_offset_index: 0 }, fees: { forwarding_events: [], last_offset_index: 0 } }; const responseData = { switch: { forwarding_events: [], last_offset_index: 0 }, fees: { forwarding_events: [], last_offset_index: 0 } };
const num_max_events = 100; const num_max_events = 100;
export const forwardingHistory = (req, res, next) => { export const forwardingHistory = (req, res, next) => {
getAllForwardingEvents(req, req.body.start_time, req.body.end_time, 0, 'switch', (eventsResponse) => { const { start_time, end_time } = req.body;
getAllForwardingEvents(req, start_time, end_time, 0, 'switch', (eventsResponse) => {
if (eventsResponse.error) { if (eventsResponse.error) {
res.status(eventsResponse.error.statusCode).json(eventsResponse); res.status(eventsResponse.error.statusCode).json(eventsResponse);
} }

@ -20,6 +20,7 @@ export const getTransactions = (req, res, next) => {
}); });
}; };
export const postTransactions = (req, res, next) => { export const postTransactions = (req, res, next) => {
const { amount, address, fees, blocks, sendAll } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Transactions', msg: 'Sending Transaction..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Transactions', msg: 'Sending Transaction..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { if (options.error) {
@ -27,13 +28,13 @@ export const postTransactions = (req, res, next) => {
} }
options.url = req.session.selectedNode.ln_server_url + '/v1/transactions'; options.url = req.session.selectedNode.ln_server_url + '/v1/transactions';
options.form = { options.form = {
amount: req.body.amount, amount: amount,
addr: req.body.address, addr: address,
sat_per_byte: req.body.fees, sat_per_byte: fees,
target_conf: req.body.blocks target_conf: blocks
}; };
if (req.body.sendAll) { if (sendAll) {
options.form.send_all = req.body.sendAll; options.form.send_all = sendAll;
} }
options.form = JSON.stringify(options.form); options.form = JSON.stringify(options.form);
request.post(options).then((body) => { request.post(options).then((body) => {

@ -26,6 +26,7 @@ export const genSeed = (req, res, next) => {
}); });
}; };
export const operateWallet = (req, res, next) => { export const operateWallet = (req, res, next) => {
const { wallet_password, aezeed_passphrase, cipher_seed_mnemonic } = req.body;
let err_message = ''; let err_message = '';
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { if (options.error) {
@ -36,24 +37,24 @@ export const operateWallet = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Unlocking Wallet..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Unlocking Wallet..' });
options.url = req.session.selectedNode.ln_server_url + '/v1/unlockwallet'; options.url = req.session.selectedNode.ln_server_url + '/v1/unlockwallet';
options.form = JSON.stringify({ options.form = JSON.stringify({
wallet_password: Buffer.from(atob(req.body.wallet_password)).toString('base64') wallet_password: Buffer.from(atob(wallet_password)).toString('base64')
}); });
err_message = 'Unlocking wallet failed! Verify that lnd is running and the wallet is locked!'; err_message = 'Unlocking wallet failed! Verify that lnd is running and the wallet is locked!';
} }
else { else {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Initializing Wallet..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Initializing Wallet..' });
options.url = req.session.selectedNode.ln_server_url + '/v1/initwallet'; options.url = req.session.selectedNode.ln_server_url + '/v1/initwallet';
if (req.body.aezeed_passphrase && req.body.aezeed_passphrase !== '') { if (aezeed_passphrase && aezeed_passphrase !== '') {
options.form = JSON.stringify({ options.form = JSON.stringify({
wallet_password: Buffer.from(atob(req.body.wallet_password)).toString('base64'), wallet_password: Buffer.from(atob(wallet_password)).toString('base64'),
cipher_seed_mnemonic: req.body.cipher_seed_mnemonic, cipher_seed_mnemonic: cipher_seed_mnemonic,
aezeed_passphrase: Buffer.from(atob(req.body.aezeed_passphrase)).toString('base64') aezeed_passphrase: Buffer.from(atob(aezeed_passphrase)).toString('base64')
}); });
} }
else { else {
options.form = JSON.stringify({ options.form = JSON.stringify({
wallet_password: Buffer.from(atob(req.body.wallet_password)).toString('base64'), wallet_password: Buffer.from(atob(wallet_password)).toString('base64'),
cipher_seed_mnemonic: req.body.cipher_seed_mnemonic cipher_seed_mnemonic: cipher_seed_mnemonic
}); });
} }
err_message = 'Initializing wallet failed!'; err_message = 'Initializing wallet failed!';
@ -119,6 +120,7 @@ export const getUTXOs = (req, res, next) => {
}); });
}; };
export const bumpFee = (req, res, next) => { export const bumpFee = (req, res, next) => {
const { txid, outputIndex, targetConf, satPerByte } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Bumping Fee..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Bumping Fee..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { if (options.error) {
@ -127,14 +129,14 @@ export const bumpFee = (req, res, next) => {
options.url = req.session.selectedNode.ln_server_url + '/v2/wallet/bumpfee'; options.url = req.session.selectedNode.ln_server_url + '/v2/wallet/bumpfee';
options.form = {}; options.form = {};
options.form.outpoint = { options.form.outpoint = {
txid_str: req.body.txid, txid_str: txid,
output_index: req.body.outputIndex output_index: outputIndex
}; };
if (req.body.targetConf) { if (targetConf) {
options.form.target_conf = req.body.targetConf; options.form.target_conf = targetConf;
} }
else if (req.body.satPerByte) { else if (satPerByte) {
options.form.sat_per_byte = req.body.satPerByte; options.form.sat_per_byte = satPerByte;
} }
options.form = JSON.stringify(options.form); options.form = JSON.stringify(options.form);
request.post(options).then((body) => { request.post(options).then((body) => {
@ -152,11 +154,7 @@ export const labelTransaction = (req, res, next) => {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.ln_server_url + '/v2/wallet/tx/label'; options.url = req.session.selectedNode.ln_server_url + '/v2/wallet/tx/label';
options.form = {}; options.form = JSON.parse(JSON.stringify(options.form));
options.form.txid = req.body.txid;
options.form.label = req.body.label;
options.form.overwrite = req.body.overwrite;
options.form = JSON.stringify(options.form);
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Wallet', msg: 'Label Transaction Options', data: options.form }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Wallet', msg: 'Label Transaction Options', data: options.form });
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Transaction Labelled', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Transaction Labelled', data: body });
@ -167,6 +165,7 @@ export const labelTransaction = (req, res, next) => {
}); });
}; };
export const leaseUTXO = (req, res, next) => { export const leaseUTXO = (req, res, next) => {
const { txid, outputIndex } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Leasing UTXO..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Leasing UTXO..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { if (options.error) {
@ -174,10 +173,10 @@ export const leaseUTXO = (req, res, next) => {
} }
options.url = req.session.selectedNode.ln_server_url + '/v2/wallet/utxos/lease'; options.url = req.session.selectedNode.ln_server_url + '/v2/wallet/utxos/lease';
options.form = {}; options.form = {};
options.form.id = req.body.txid; options.form.id = txid;
options.form.outpoint = { options.form.outpoint = {
txid_bytes: req.body.txid, txid_bytes: txid,
output_index: req.body.outputIndex output_index: outputIndex
}; };
options.form = JSON.stringify(options.form); options.form = JSON.stringify(options.form);
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Wallet', msg: 'UTXO Lease Options', data: options.form }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Wallet', msg: 'UTXO Lease Options', data: options.form });
@ -190,6 +189,7 @@ export const leaseUTXO = (req, res, next) => {
}); });
}; };
export const releaseUTXO = (req, res, next) => { export const releaseUTXO = (req, res, next) => {
const { txid, outputIndex } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Releasing UTXO..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Releasing UTXO..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { if (options.error) {
@ -197,10 +197,10 @@ export const releaseUTXO = (req, res, next) => {
} }
options.url = req.session.selectedNode.ln_server_url + '/v2/wallet/utxos/release'; options.url = req.session.selectedNode.ln_server_url + '/v2/wallet/utxos/release';
options.form = {}; options.form = {};
options.form.id = req.body.txid; options.form.id = txid;
options.form.outpoint = { options.form.outpoint = {
txid_bytes: req.body.txid, txid_bytes: txid,
output_index: req.body.outputIndex output_index: outputIndex
}; };
options.form = JSON.stringify(options.form); options.form = JSON.stringify(options.form);
request.post(options).then((body) => { request.post(options).then((body) => {

@ -132,30 +132,31 @@ export const getRTLConfig = (req, res, next) => {
}); });
}; };
export const updateUISettings = (req, res, next) => { export const updateUISettings = (req, res, next) => {
const { updatedSettings } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating UI Settings..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating UI Settings..' });
const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json'; const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json';
const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8'));
const node = config.nodes.find((node) => (node.index === req.session.selectedNode.index)); const node = config.nodes.find((node) => (node.index === req.session.selectedNode.index));
if (node && node.Settings) { if (node && node.Settings) {
node.Settings.userPersona = req.body.updatedSettings.userPersona; node.Settings.userPersona = updatedSettings.userPersona;
node.Settings.themeMode = req.body.updatedSettings.themeMode; node.Settings.themeMode = updatedSettings.themeMode;
node.Settings.themeColor = req.body.updatedSettings.themeColor; node.Settings.themeColor = updatedSettings.themeColor;
node.Settings.unannouncedChannels = req.body.updatedSettings.unannouncedChannels; node.Settings.unannouncedChannels = updatedSettings.unannouncedChannels;
node.Settings.fiatConversion = req.body.updatedSettings.fiatConversion; node.Settings.fiatConversion = updatedSettings.fiatConversion;
if (req.body.updatedSettings.fiatConversion) { if (updatedSettings.fiatConversion) {
node.Settings.currencyUnit = req.body.updatedSettings.currencyUnit ? req.body.updatedSettings.currencyUnit : 'USD'; node.Settings.currencyUnit = updatedSettings.currencyUnit ? updatedSettings.currencyUnit : 'USD';
} }
else { else {
delete node.Settings.currencyUnit; delete node.Settings.currencyUnit;
} }
const selectedNode = common.findNode(req.session.selectedNode.index); const selectedNode = common.findNode(req.session.selectedNode.index);
selectedNode.user_persona = req.body.updatedSettings.userPersona; selectedNode.user_persona = updatedSettings.userPersona;
selectedNode.theme_mode = req.body.updatedSettings.themeMode; selectedNode.theme_mode = updatedSettings.themeMode;
selectedNode.theme_color = req.body.updatedSettings.themeColor; selectedNode.theme_color = updatedSettings.themeColor;
selectedNode.unannounced_channels = req.body.updatedSettings.unannouncedChannels; selectedNode.unannounced_channels = updatedSettings.unannouncedChannels;
selectedNode.fiat_conversion = req.body.updatedSettings.fiatConversion; selectedNode.fiat_conversion = updatedSettings.fiatConversion;
if (req.body.updatedSettings.fiatConversion) { if (updatedSettings.fiatConversion) {
selectedNode.currency_unit = req.body.updatedSettings.currencyUnit ? req.body.updatedSettings.currencyUnit : 'USD'; selectedNode.currency_unit = updatedSettings.currencyUnit ? updatedSettings.currencyUnit : 'USD';
} }
else { else {
delete selectedNode.currency_unit; delete selectedNode.currency_unit;
@ -174,16 +175,17 @@ export const updateUISettings = (req, res, next) => {
} }
}; };
export const update2FASettings = (req, res, next) => { export const update2FASettings = (req, res, next) => {
const { secret2fa } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating 2FA Settings..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating 2FA Settings..' });
const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json'; const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json';
const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8'));
if (req.body.secret2fa && req.body.secret2fa.trim() !== '') { if (secret2fa && secret2fa.trim() !== '') {
config.secret2fa = req.body.secret2fa; config.secret2fa = secret2fa;
} }
else { else {
delete config.secret2fa; delete config.secret2fa;
} }
const message = req.body.secret2fa.trim() === '' ? 'Two factor authentication disabled successfully.' : 'Two factor authentication enabled successfully.'; const message = secret2fa.trim() === '' ? 'Two factor authentication disabled successfully.' : 'Two factor authentication enabled successfully.';
try { try {
fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8'); fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8');
common.rtl_secret2fa = config.secret2fa; common.rtl_secret2fa = config.secret2fa;
@ -197,10 +199,11 @@ export const update2FASettings = (req, res, next) => {
} }
}; };
export const updateDefaultNode = (req, res, next) => { export const updateDefaultNode = (req, res, next) => {
const { defaultNodeIndex } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating Default Node..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating Default Node..' });
const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json'; const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json';
const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8'));
config.defaultNodeIndex = req.body.defaultNodeIndex; config.defaultNodeIndex = defaultNodeIndex;
try { try {
fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8'); fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8');
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Default Node Updated', data: maskPasswords(config) }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Default Node Updated', data: maskPasswords(config) });
@ -296,11 +299,12 @@ export const getCurrencyRates = (req, res, next) => {
}); });
}; };
export const updateSSO = (req, res, next) => { export const updateSSO = (req, res, next) => {
const { SSO } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating SSO Settings..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating SSO Settings..' });
const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json'; const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json';
const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8'));
delete config.SSO; delete config.SSO;
config.SSO = req.body.SSO; config.SSO = SSO;
try { try {
fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8'); fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8');
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'SSO Setting Updated', data: maskPasswords(config) }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'SSO Setting Updated', data: maskPasswords(config) });
@ -313,19 +317,20 @@ export const updateSSO = (req, res, next) => {
} }
}; };
export const updateServiceSettings = (req, res, next) => { export const updateServiceSettings = (req, res, next) => {
const { service, settings } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating Service Settings..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating Service Settings..' });
const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json'; const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json';
const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8'));
const selectedNode = common.findNode(req.session.selectedNode.index); const selectedNode = common.findNode(req.session.selectedNode.index);
config.nodes.forEach((node) => { config.nodes.forEach((node) => {
if (node.index === req.session.selectedNode.index) { if (node.index === req.session.selectedNode.index) {
switch (req.body.service) { switch (service) {
case 'LOOP': case 'LOOP':
if (req.body.settings.enable) { if (settings.enable) {
node.Settings.swapServerUrl = req.body.settings.serverUrl; node.Settings.swapServerUrl = settings.serverUrl;
node.Authentication.swapMacaroonPath = req.body.settings.macaroonPath; node.Authentication.swapMacaroonPath = settings.macaroonPath;
selectedNode.swap_server_url = req.body.settings.serverUrl; selectedNode.swap_server_url = settings.serverUrl;
selectedNode.swap_macaroon_path = req.body.settings.macaroonPath; selectedNode.swap_macaroon_path = settings.macaroonPath;
} }
else { else {
delete node.Settings.swapServerUrl; delete node.Settings.swapServerUrl;
@ -335,11 +340,11 @@ export const updateServiceSettings = (req, res, next) => {
} }
break; break;
case 'BOLTZ': case 'BOLTZ':
if (req.body.settings.enable) { if (settings.enable) {
node.Settings.boltzServerUrl = req.body.settings.serverUrl; node.Settings.boltzServerUrl = settings.serverUrl;
node.Authentication.boltzMacaroonPath = req.body.settings.macaroonPath; node.Authentication.boltzMacaroonPath = settings.macaroonPath;
selectedNode.boltz_server_url = req.body.settings.serverUrl; selectedNode.boltz_server_url = settings.serverUrl;
selectedNode.boltz_macaroon_path = req.body.settings.macaroonPath; selectedNode.boltz_macaroon_path = settings.macaroonPath;
} }
else { else {
delete node.Settings.boltzServerUrl; delete node.Settings.boltzServerUrl;
@ -349,12 +354,12 @@ export const updateServiceSettings = (req, res, next) => {
} }
break; break;
case 'OFFERS': case 'OFFERS':
node.Settings.enableOffers = req.body.settings.enableOffers; node.Settings.enableOffers = settings.enableOffers;
selectedNode.enable_offers = req.body.settings.enableOffers; selectedNode.enable_offers = settings.enableOffers;
break; break;
case 'PEERSWAP': case 'PEERSWAP':
node.Settings.enablePeerswap = req.body.settings.enablePeerswap; node.Settings.enablePeerswap = settings.enablePeerswap;
selectedNode.enable_peerswap = req.body.settings.enablePeerswap; selectedNode.enable_peerswap = settings.enablePeerswap;
break; break;
default: default:
break; break;

@ -46,14 +46,15 @@ const handleMultipleFailedAttemptsError = (failed, currentTime, errMsg) => {
}; };
export const verifyToken = (twoFAToken) => !!(common.rtl_secret2fa && common.rtl_secret2fa !== '' && otplib.authenticator.check(twoFAToken, common.rtl_secret2fa)); export const verifyToken = (twoFAToken) => !!(common.rtl_secret2fa && common.rtl_secret2fa !== '' && otplib.authenticator.check(twoFAToken, common.rtl_secret2fa));
export const authenticateUser = (req, res, next) => { export const authenticateUser = (req, res, next) => {
const { authenticateWith, authenticationValue, twoFAToken } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Authenticate', msg: 'Authenticating User..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Authenticate', msg: 'Authenticating User..' });
if (+common.rtl_sso) { if (+common.rtl_sso) {
if (req.body.authenticateWith === 'JWT' && jwt.verify(req.body.authenticationValue, common.secret_key)) { if (authenticateWith === 'JWT' && jwt.verify(authenticationValue, common.secret_key)) {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Authenticate', msg: 'User Authenticated' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Authenticate', msg: 'User Authenticated' });
res.status(406).json({ message: 'SSO Authentication Error', error: 'Login with Password is not allowed with SSO.' }); res.status(406).json({ message: 'SSO Authentication Error', error: 'Login with Password is not allowed with SSO.' });
} }
else if (req.body.authenticateWith === 'PASSWORD') { else if (authenticateWith === 'PASSWORD') {
if (common.cookie_value.trim().length >= 32 && crypto.timingSafeEqual(Buffer.from(crypto.createHash('sha256').update(common.cookie_value).digest('hex'), 'utf-8'), Buffer.from(req.body.authenticationValue, 'utf-8'))) { if (common.cookie_value.trim().length >= 32 && crypto.timingSafeEqual(Buffer.from(crypto.createHash('sha256').update(common.cookie_value).digest('hex'), 'utf-8'), Buffer.from(authenticationValue, 'utf-8'))) {
common.refreshCookie(); common.refreshCookie();
if (!req.session.selectedNode) { if (!req.session.selectedNode) {
req.session.selectedNode = common.initSelectedNode; req.session.selectedNode = common.initSelectedNode;
@ -73,10 +74,10 @@ export const authenticateUser = (req, res, next) => {
const currentTime = new Date().getTime(); const currentTime = new Date().getTime();
const reqIP = common.getRequestIP(req); const reqIP = common.getRequestIP(req);
const failed = getFailedInfo(reqIP, currentTime); const failed = getFailedInfo(reqIP, currentTime);
const password = req.body.authenticationValue; const password = authenticationValue;
if (common.rtl_pass === password && failed.count < ALLOWED_LOGIN_ATTEMPTS) { if (common.rtl_pass === password && failed.count < ALLOWED_LOGIN_ATTEMPTS) {
if (req.body.twoFAToken && req.body.twoFAToken !== '') { if (twoFAToken && twoFAToken !== '') {
if (!verifyToken(req.body.twoFAToken)) { if (!verifyToken(twoFAToken)) {
logger.log({ selectedNode: req.session.selectedNode, level: 'ERROR', fileName: 'Authenticate', msg: 'Invalid Token! Failed IP ' + reqIP, error: { error: 'Invalid token.' } }); logger.log({ selectedNode: req.session.selectedNode, level: 'ERROR', fileName: 'Authenticate', msg: 'Invalid Token! Failed IP ' + reqIP, error: { error: 'Invalid token.' } });
failed.count = failed.count + 1; failed.count = failed.count + 1;
failed.lastTried = currentTime; failed.lastTried = currentTime;
@ -100,6 +101,7 @@ export const authenticateUser = (req, res, next) => {
} }
}; };
export const resetPassword = (req, res, next) => { export const resetPassword = (req, res, next) => {
const { currPassword, newPassword } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Authenticate', msg: 'Resetting Password..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Authenticate', msg: 'Resetting Password..' });
if (+common.rtl_sso) { if (+common.rtl_sso) {
const errMsg = 'Password cannot be reset for SSO authentication'; const errMsg = 'Password cannot be reset for SSO authentication';
@ -107,9 +109,8 @@ export const resetPassword = (req, res, next) => {
return res.status(err.statusCode).json({ message: err.message, error: err.error }); return res.status(err.statusCode).json({ message: err.message, error: err.error });
} }
else { else {
const currPassword = req.body.currPassword;
if (common.rtl_pass === currPassword) { if (common.rtl_pass === currPassword) {
common.rtl_pass = common.replacePasswordWithHash(req.body.newPassword); common.rtl_pass = common.replacePasswordWithHash(newPassword);
const token = jwt.sign({ user: 'NODE_USER' }, common.secret_key); const token = jwt.sign({ user: 'NODE_USER' }, common.secret_key);
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Authenticate', msg: 'Password Reset Successful' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Authenticate', msg: 'Password Reset Successful' });
res.status(200).json({ token: token }); res.status(200).json({ token: token });

@ -79,6 +79,7 @@ export const getSwapInfo = (req, res, next) => {
}); });
}; };
export const createSwap = (req, res, next) => { export const createSwap = (req, res, next) => {
const { amount, address } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Creating Swap..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Creating Swap..' });
options = common.getBoltzServerOptions(req); options = common.getBoltzServerOptions(req);
if (options.url === '') { if (options.url === '') {
@ -87,9 +88,9 @@ export const createSwap = (req, res, next) => {
return res.status(err.statusCode).json({ message: err.message, error: err.error }); return res.status(err.statusCode).json({ message: err.message, error: err.error });
} }
options.url = options.url + '/v1/createswap'; options.url = options.url + '/v1/createswap';
options.body = { amount: req.body.amount }; options.body = { amount: amount };
if (req.body.address !== '') { if (address && address !== '') {
options.body.address = req.body.address; options.body.address = address;
} }
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Boltz', msg: 'Create Swap Options Body', data: options.body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Boltz', msg: 'Create Swap Options Body', data: options.body });
request.post(options).then((createSwapRes) => { request.post(options).then((createSwapRes) => {
@ -101,6 +102,7 @@ export const createSwap = (req, res, next) => {
}); });
}; };
export const createReverseSwap = (req, res, next) => { export const createReverseSwap = (req, res, next) => {
const { amount, acceptZeroConf, address } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Creating Reverse Swap..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Creating Reverse Swap..' });
options = common.getBoltzServerOptions(req); options = common.getBoltzServerOptions(req);
if (options.url === '') { if (options.url === '') {
@ -109,9 +111,9 @@ export const createReverseSwap = (req, res, next) => {
return res.status(err.statusCode).json({ message: err.message, error: err.error }); return res.status(err.statusCode).json({ message: err.message, error: err.error });
} }
options.url = options.url + '/v1/createreverseswap'; options.url = options.url + '/v1/createreverseswap';
options.body = { amount: req.body.amount, accept_zero_conf: req.body.acceptZeroConf || false }; options.body = { amount: amount, accept_zero_conf: acceptZeroConf || false };
if (req.body.address !== '') { if (address && address !== '') {
options.body.address = req.body.address; options.body.address = address;
} }
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Boltz', msg: 'Create Reverse Swap Body', data: options.body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Boltz', msg: 'Create Reverse Swap Body', data: options.body });
request.post(options).then((createReverseSwapRes) => { request.post(options).then((createReverseSwapRes) => {
@ -123,6 +125,7 @@ export const createReverseSwap = (req, res, next) => {
}); });
}; };
export const createChannel = (req, res, next) => { export const createChannel = (req, res, next) => {
const { amount, address } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Creating Boltz Channel..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Creating Boltz Channel..' });
options = common.getBoltzServerOptions(req); options = common.getBoltzServerOptions(req);
if (options.url === '') { if (options.url === '') {
@ -131,9 +134,9 @@ export const createChannel = (req, res, next) => {
return res.status(err.statusCode).json({ message: err.message, error: err.error }); return res.status(err.statusCode).json({ message: err.message, error: err.error });
} }
options.url = options.url + '/v1/createchannel'; options.url = options.url + '/v1/createchannel';
options.body = { amount: req.body.amount }; options.body = { amount: amount };
if (req.body.address !== '') { if (address && address !== '') {
options.body.address = req.body.address; options.body.address = address;
} }
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Boltz', msg: 'Create Channel Options Body', data: options.body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Boltz', msg: 'Create Channel Options Body', data: options.body });
request.post(options).then((createChannelRes) => { request.post(options).then((createChannelRes) => {

@ -5,24 +5,25 @@ let options = null;
const logger = Logger; const logger = Logger;
const common = Common; const common = Common;
export const loopOut = (req, res, next) => { export const loopOut = (req, res, next) => {
const { amount, targetConf, swapRoutingFee, minerFee, prepayRoutingFee, prepayAmt, swapFee, swapPublicationDeadline, chanId, destAddress } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Loop', msg: 'Looping Out..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Loop', msg: 'Looping Out..' });
options.uri = '/v1/loop/out'; options.uri = '/v1/loop/out';
options.body = { options.body = {
amt: req.body.amount, amt: amount,
sweep_conf_target: req.body.targetConf, sweep_conf_target: targetConf,
max_swap_routing_fee: req.body.swapRoutingFee, max_swap_routing_fee: swapRoutingFee,
max_miner_fee: req.body.minerFee, max_miner_fee: minerFee,
max_prepay_routing_fee: req.body.prepayRoutingFee, max_prepay_routing_fee: prepayRoutingFee,
max_prepay_amt: req.body.prepayAmt, max_prepay_amt: prepayAmt,
max_swap_fee: req.body.swapFee, max_swap_fee: swapFee,
swap_publication_deadline: req.body.swapPublicationDeadline, swap_publication_deadline: swapPublicationDeadline,
initiator: 'RTL' initiator: 'RTL'
}; };
if (req.body.chanId !== '') { if (chanId !== '') {
options.body['loop_out_channel'] = req.body.chanId; options.body['loop_out_channel'] = chanId;
} }
if (req.body.destAddress !== '') { if (destAddress !== '') {
options.body['dest'] = req.body.destAddress; options.body['dest'] = destAddress;
} }
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Loop', msg: 'Loop Out Body', data: options.body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Loop', msg: 'Loop Out Body', data: options.body });
request.post(options).then((loopOutRes) => { request.post(options).then((loopOutRes) => {
@ -87,12 +88,13 @@ export const loopOutTermsAndQuotes = (req, res, next) => {
}); });
}; };
export const loopIn = (req, res, next) => { export const loopIn = (req, res, next) => {
const { amount, swapFee, minerFee } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Loop', msg: 'Looping In..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Loop', msg: 'Looping In..' });
options.uri = '/v1/loop/in'; options.uri = '/v1/loop/in';
options.body = { options.body = {
amt: req.body.amount, amt: amount,
max_swap_fee: req.body.swapFee, max_swap_fee: swapFee,
max_miner_fee: req.body.minerFee, max_miner_fee: minerFee,
initiator: 'RTL' initiator: 'RTL'
}; };
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Loop', msg: 'Loop In Body', data: options.body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Loop', msg: 'Loop In Body', data: options.body });

@ -78,14 +78,15 @@ export const closeChannel = (req, res, next) => {
}; };
export const listForwards = (req, res, next) => { export const listForwards = (req, res, next) => {
const { status } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Getting Channel List Forwards..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Getting Channel List Forwards..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.ln_server_url + '/v1/listforwards'; options.url = req.session.selectedNode.ln_server_url + '/v1/listforwards';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Forwarding History Received For Status ' + req.body.status, data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Forwarding History Received For Status ' + status, data: body });
body.forwards = !body.forwards ? [] : (req.body.status === 'failed' || req.body.status === 'local_failed') ? body.forwards.slice(Math.max(0, body.forwards.length - 1000), Math.max(1000, body.forwards.length)).reverse() : body.forwards.reverse(); body.forwards = !body.forwards ? [] : (status === 'failed' || status === 'local_failed') ? body.forwards.slice(Math.max(0, body.forwards.length - 1000), Math.max(1000, body.forwards.length)).reverse() : body.forwards.reverse();
res.status(200).json(body.forwards); res.status(200).json(body.forwards);
}).catch((errRes) => { }).catch((errRes) => {
const err = common.handleError(errRes, 'Channels', 'Forwarding History Error', req.session.selectedNode); const err = common.handleError(errRes, 'Channels', 'Forwarding History Error', req.session.selectedNode);

@ -41,13 +41,14 @@ export const listChannels = (req, res, next) => {
}; };
export const feeRates = (req, res, next) => { export const feeRates = (req, res, next) => {
const { style } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Getting Network Fee Rates..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Getting Network Fee Rates..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.ln_server_url + '/v1/feerates'; options.url = req.session.selectedNode.ln_server_url + '/v1/feerates';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Network Fee Rates Received for ' + req.body.style, data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Network Fee Rates Received for ' + style, data: body });
res.status(200).json(body); res.status(200).json(body);
}).catch((errRes) => { }).catch((errRes) => {
const err = common.handleError(errRes, 'Network', 'Fee Rates Error', req.session.selectedNode); const err = common.handleError(errRes, 'Network', 'Fee Rates Error', req.session.selectedNode);
@ -56,12 +57,12 @@ export const feeRates = (req, res, next) => {
}; };
export const listNodes = (req, res, next) => { export const listNodes = (req, res, next) => {
const filter_liquidity_ads = !!req.body.liquidity_ads;
delete req.body.liquidity_ads;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'List Nodes..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'List Nodes..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.ln_server_url + '/v1/listnodes'; options.url = req.session.selectedNode.ln_server_url + '/v1/listnodes';
const filter_liquidity_ads = !!req.body.liquidity_ads;
delete req.body.liquidity_ads;
options.body = req.body; options.body = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Network', msg: 'List Nodes URL' + options.url }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Network', msg: 'List Nodes URL' + options.url });
request.post(options).then((body) => { request.post(options).then((body) => {

@ -21,10 +21,11 @@ export const listOfferBookmarks = (req, res, next) => {
}; };
export const deleteOfferBookmark = (req, res, next) => { export const deleteOfferBookmark = (req, res, next) => {
const { offer_str } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Deleting Offer Bookmark..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Deleting Offer Bookmark..' });
databaseService.remove(req.session.selectedNode, CollectionsEnum.OFFERS, CollectionFieldsEnum.BOLT12, req.body.offer_str).then((deleteRes) => { databaseService.remove(req.session.selectedNode, CollectionsEnum.OFFERS, CollectionFieldsEnum.BOLT12, offer_str).then((deleteRes) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offer Bookmark Deleted', data: deleteRes }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offer Bookmark Deleted', data: deleteRes });
res.status(204).json(req.body.offer_str); res.status(204).json(offer_str);
}).catch((errRes) => { }).catch((errRes) => {
const err = common.handleError(errRes, 'Offers', 'Offer Bookmark Delete Error', req.session.selectedNode); const err = common.handleError(errRes, 'Offers', 'Offer Bookmark Delete Error', req.session.selectedNode);
return res.status(err.statusCode).json({ message: err.message, error: err.error }); return res.status(err.statusCode).json({ message: err.message, error: err.error });

@ -89,10 +89,11 @@ export const listPayments = (req, res, next) => {
}; };
export const postPayment = (req, res, next) => { export const postPayment = (req, res, next) => {
const { paymentType, saveToDB, bolt12, zeroAmtOffer, amount_msat, title, issuer, description } = req.body;
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
const options_body = JSON.parse(JSON.stringify(req.body)); const options_body = JSON.parse(JSON.stringify(req.body));
if (req.body.paymentType === 'KEYSEND') { if (paymentType === 'KEYSEND') {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Keysend Payment..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Keysend Payment..' });
options.url = req.session.selectedNode.ln_server_url + '/v1/keysend'; options.url = req.session.selectedNode.ln_server_url + '/v1/keysend';
delete options_body.uiMessage; delete options_body.uiMessage;
@ -112,12 +113,12 @@ export const postPayment = (req, res, next) => {
delete options_body.saveToDB; delete options_body.saveToDB;
options.body = options_body; options.body = options_body;
} else { } else {
if (req.body.paymentType === 'OFFER') { if (paymentType === 'OFFER') {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Sending Offer Payment..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Sending Offer Payment..' });
} else { } else {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Sending Invoice Payment..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Sending Invoice Payment..' });
} }
if (req.body.paymentType === 'OFFER') { if (paymentType === 'OFFER') {
// delete amount for zero amt offer also as fetchinvoice already has amount information // delete amount for zero amt offer also as fetchinvoice already has amount information
delete options_body.amount_msat; delete options_body.amount_msat;
} }
@ -137,14 +138,14 @@ export const postPayment = (req, res, next) => {
} }
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Sent', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Sent', data: body });
if (req.body.paymentType === 'OFFER') { if (paymentType === 'OFFER') {
if (req.body.saveToDB && req.body.bolt12) { if (saveToDB && bolt12) {
const offerToUpdate: Offer = { bolt12: req.body.bolt12, amountMSat: (req.body.zeroAmtOffer ? 0 : req.body.amount_msat), title: req.body.title, lastUpdatedAt: new Date(Date.now()).getTime() }; const offerToUpdate: Offer = { bolt12: bolt12, amountMSat: (zeroAmtOffer ? 0 : amount_msat), title: title, lastUpdatedAt: new Date(Date.now()).getTime() };
if (req.body.issuer) { offerToUpdate['issuer'] = req.body.issuer; } if (issuer) { offerToUpdate['issuer'] = issuer; }
if (req.body.description) { offerToUpdate['description'] = req.body.description; } if (description) { offerToUpdate['description'] = description; }
// eslint-disable-next-line arrow-body-style // eslint-disable-next-line arrow-body-style
return databaseService.validateDocument(CollectionsEnum.OFFERS, offerToUpdate).then((validated) => { return databaseService.validateDocument(CollectionsEnum.OFFERS, offerToUpdate).then((validated) => {
return databaseService.update(req.session.selectedNode, CollectionsEnum.OFFERS, offerToUpdate, CollectionFieldsEnum.BOLT12, req.body.bolt12).then((updatedOffer) => { return databaseService.update(req.session.selectedNode, CollectionsEnum.OFFERS, offerToUpdate, CollectionFieldsEnum.BOLT12, bolt12).then((updatedOffer) => {
logger.log({ level: 'DEBUG', fileName: 'Payments', msg: 'Offer Updated', data: updatedOffer }); logger.log({ level: 'DEBUG', fileName: 'Payments', msg: 'Offer Updated', data: updatedOffer });
return res.status(201).json({ paymentResponse: body, saveToDBResponse: updatedOffer }); return res.status(201).json({ paymentResponse: body, saveToDBResponse: updatedOffer });
}).catch((errDB) => { }).catch((errDB) => {
@ -159,10 +160,10 @@ export const postPayment = (req, res, next) => {
return res.status(201).json({ paymentResponse: body, saveToDBResponse: 'NA' }); return res.status(201).json({ paymentResponse: body, saveToDBResponse: 'NA' });
} }
} }
if (req.body.paymentType === 'INVOICE') { if (paymentType === 'INVOICE') {
return res.status(201).json({ paymentResponse: body, saveToDBResponse: 'NA' }); return res.status(201).json({ paymentResponse: body, saveToDBResponse: 'NA' });
} }
if (req.body.paymentType === 'KEYSEND') { if (paymentType === 'KEYSEND') {
return res.status(201).json(body); return res.status(201).json(body);
} }
}).catch((errRes) => { }).catch((errRes) => {

@ -154,7 +154,8 @@ export const closeChannel = (req, res, next) => {
}; };
export const circularRebalance = (req, res, next) => { export const circularRebalance = (req, res, next) => {
const crInvDescription = 'Circular rebalancing invoice for ' + (req.body.amountMsat / 1000) + ' Sats'; const { amountMsat, sourceNodeId, targetNodeId, ignoreNodeIds, format, sourceShortChannelId, targetShortChannelId } = req.body;
const crInvDescription = 'Circular rebalancing invoice for ' + (amountMsat / 1000) + ' Sats';
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.form = req.body; options.form = req.body;
@ -162,22 +163,22 @@ export const circularRebalance = (req, res, next) => {
const tillToday = (Math.round(new Date(Date.now()).getTime() / 1000)).toString(); const tillToday = (Math.round(new Date(Date.now()).getTime() / 1000)).toString();
// Check if unpaid Invoice exists already // Check if unpaid Invoice exists already
listPendingInvoicesRequestCall(req.session.selectedNode).then((callRes: any[]) => { listPendingInvoicesRequestCall(req.session.selectedNode).then((callRes: any[]) => {
const foundExistingInvoice = callRes.find((inv) => inv.description.includes(crInvDescription) && inv.amount === req.body.amountMsat && inv.expiry && inv.timestamp && ((inv.expiry + inv.timestamp) >= tillToday)); const foundExistingInvoice = callRes.find((inv) => inv.description.includes(crInvDescription) && inv.amount === amountMsat && inv.expiry && inv.timestamp && ((inv.expiry + inv.timestamp) >= tillToday));
// Create new invoice if doesn't exist already // Create new invoice if doesn't exist already
const requestCalls = foundExistingInvoice && foundExistingInvoice.serialized ? const requestCalls = foundExistingInvoice && foundExistingInvoice.serialized ?
[findRouteBetweenNodesRequestCall(req.session.selectedNode, req.body.amountMsat, req.body.sourceNodeId, req.body.targetNodeId, req.body.ignoreNodeIds, req.body.format)] : [findRouteBetweenNodesRequestCall(req.session.selectedNode, amountMsat, sourceNodeId, targetNodeId, ignoreNodeIds, format)] :
[findRouteBetweenNodesRequestCall(req.session.selectedNode, req.body.amountMsat, req.body.sourceNodeId, req.body.targetNodeId, req.body.ignoreNodeIds, req.body.format), createInvoiceRequestCall(req.session.selectedNode, crInvDescription, req.body.amountMsat)]; [findRouteBetweenNodesRequestCall(req.session.selectedNode, amountMsat, sourceNodeId, targetNodeId, ignoreNodeIds, format), createInvoiceRequestCall(req.session.selectedNode, crInvDescription, amountMsat)];
Promise.all(requestCalls).then((values: any[]) => { Promise.all(requestCalls).then((values: any[]) => {
// eslint-disable-next-line arrow-body-style // eslint-disable-next-line arrow-body-style
const routes = values[0]?.routes?.filter((route) => { const routes = values[0]?.routes?.filter((route) => {
return !((route.shortChannelIds[0] === req.body.sourceShortChannelId && route.shortChannelIds[1] === req.body.targetShortChannelId) || return !((route.shortChannelIds[0] === sourceShortChannelId && route.shortChannelIds[1] === targetShortChannelId) ||
(route.shortChannelIds[1] === req.body.sourceShortChannelId && route.shortChannelIds[0] === req.body.targetShortChannelId)); (route.shortChannelIds[1] === sourceShortChannelId && route.shortChannelIds[0] === targetShortChannelId));
}); });
const firstRoute = routes[0].shortChannelIds.join() || ''; const firstRoute = routes[0].shortChannelIds.join() || '';
const shortChannelIds = req.body.sourceShortChannelId + ',' + firstRoute + ',' + req.body.targetShortChannelId; const shortChannelIds = sourceShortChannelId + ',' + firstRoute + ',' + targetShortChannelId;
const invoice = (foundExistingInvoice && foundExistingInvoice.serialized ? foundExistingInvoice.serialized : (values[1] ? values[1].serialized : '')) || ''; const invoice = (foundExistingInvoice && foundExistingInvoice.serialized ? foundExistingInvoice.serialized : (values[1] ? values[1].serialized : '')) || '';
const paymentHash = (foundExistingInvoice && foundExistingInvoice.paymentHash ? foundExistingInvoice.paymentHash : (values[1] ? values[1].paymentHash : '') || ''); const paymentHash = (foundExistingInvoice && foundExistingInvoice.paymentHash ? foundExistingInvoice.paymentHash : (values[1] ? values[1].paymentHash : '') || '');
return sendPaymentToRouteRequestCall(req.session.selectedNode, shortChannelIds, invoice, req.body.amountMsat).then((payToRouteCallRes) => { return sendPaymentToRouteRequestCall(req.session.selectedNode, shortChannelIds, invoice, amountMsat).then((payToRouteCallRes) => {
// eslint-disable-next-line arrow-body-style // eslint-disable-next-line arrow-body-style
setTimeout(() => { setTimeout(() => {
return getSentInfoFromPaymentRequest(req.session.selectedNode, paymentHash).then((sentInfoCallRes) => { return getSentInfoFromPaymentRequest(req.session.selectedNode, paymentHash).then((sentInfoCallRes) => {

@ -131,10 +131,11 @@ export const createInvoiceRequestCall = (selectedNode: CommonSelectedNode, descr
}; };
export const createInvoice = (req, res, next) => { export const createInvoice = (req, res, next) => {
const { description, amountMsat } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'Creating Invoice..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'Creating Invoice..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
createInvoiceRequestCall(req.session.selectedNode, req.body.description, req.body.amountMsat).then((invRes) => { createInvoiceRequestCall(req.session.selectedNode, description, amountMsat).then((invRes) => {
res.status(201).json(invRes); res.status(201).json(invRes);
}).catch((err) => res.status(err.statusCode).json({ message: err.message, error: err.error })); }).catch((err) => res.status(err.statusCode).json({ message: err.message, error: err.error }));
}; };

@ -37,9 +37,10 @@ export const findRouteBetweenNodesRequestCall = (selectedNode: CommonSelectedNod
}; };
export const findRouteBetweenNodes = (req, res, next) => { export const findRouteBetweenNodes = (req, res, next) => {
const { amountMsat, sourceNodeId, targetNodeId, ignoreNodeIds, format } = req.body;
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
findRouteBetweenNodesRequestCall(req.session.selectedNode, req.body.amountMsat, req.body.sourceNodeId, req.body.targetNodeId, req.body.ignoreNodeIds, req.body.format).then((callRes) => { findRouteBetweenNodesRequestCall(req.session.selectedNode, amountMsat, sourceNodeId, targetNodeId, ignoreNodeIds, format).then((callRes) => {
res.status(200).json(callRes); res.status(200).json(callRes);
}).catch((err) => res.status(err.statusCode).json({ message: err.message, error: err.error })); }).catch((err) => res.status(err.statusCode).json({ message: err.message, error: err.error }));
}; };

@ -68,15 +68,12 @@ export const getTransactions = (req, res, next) => {
}; };
export const sendFunds = (req, res, next) => { export const sendFunds = (req, res, next) => {
const { address, amount, blocks } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Sending On Chain Funds..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Sending On Chain Funds..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.ln_server_url + '/sendonchain'; options.url = req.session.selectedNode.ln_server_url + '/sendonchain';
options.form = { options.form = { address: address, amountSatoshis: amount, confirmationTarget: blocks };
address: req.body.address,
amountSatoshis: req.body.amount,
confirmationTarget: req.body.blocks
};
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Onchain', msg: 'Send Funds Options', data: options.form }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Onchain', msg: 'Send Funds Options', data: options.form });
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Onchain', msg: 'On Chain Funds Sent', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Onchain', msg: 'On Chain Funds Sent', data: body });

@ -98,11 +98,12 @@ export const queryPaymentRoute = (req, res, next) => {
}; };
export const getSentPaymentsInformation = (req, res, next) => { export const getSentPaymentsInformation = (req, res, next) => {
const { payments } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Getting Sent Payment Information..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Getting Sent Payment Information..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
if (req.body.payments) { if (payments) {
const paymentsArr = req.body.payments.split(','); const paymentsArr = payments.split(',');
return Promise.all(paymentsArr?.map((payment) => getSentInfoFromPaymentRequest(req.session.selectedNode, payment))). return Promise.all(paymentsArr?.map((payment) => getSentInfoFromPaymentRequest(req.session.selectedNode, payment))).
then((values) => { then((values) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Sent Information Received', data: values }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Sent Information Received', data: values });
@ -135,10 +136,11 @@ export const sendPaymentToRouteRequestCall = (selectedNode: CommonSelectedNode,
}; };
export const sendPaymentToRoute = (req, res, next) => { export const sendPaymentToRoute = (req, res, next) => {
const { shortChannelIds, invoice, amountMsat } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Send Payment To Route..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Send Payment To Route..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
sendPaymentToRouteRequestCall(req.session.selectedNode, req.body.shortChannelIds, req.body.invoice, req.body.amountMsat).then((callRes) => { sendPaymentToRouteRequestCall(req.session.selectedNode, shortChannelIds, invoice, amountMsat).then((callRes) => {
res.status(200).json(callRes); res.status(200).json(callRes);
}).catch((err) => res.status(err.statusCode).json({ message: err.message, error: err.error })); }).catch((err) => res.status(err.statusCode).json({ message: err.message, error: err.error }));
}; };

@ -125,23 +125,24 @@ export const getClosedChannels = (req, res, next) => {
}; };
export const postChannel = (req, res, next) => { export const postChannel = (req, res, next) => {
const { node_pubkey, private: privateChannel, spend_unconfirmed, local_funding_amount, trans_type, trans_type_value, commitment_type } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Opening Channel..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Opening Channel..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.ln_server_url + '/v1/channels'; options.url = req.session.selectedNode.ln_server_url + '/v1/channels';
options.form = { options.form = {
node_pubkey_string: req.body.node_pubkey, node_pubkey_string: node_pubkey,
local_funding_amount: req.body.local_funding_amount, local_funding_amount: local_funding_amount,
private: req.body.private, private: privateChannel,
spend_unconfirmed: req.body.spend_unconfirmed spend_unconfirmed: spend_unconfirmed
}; };
if (req.body.trans_type === '1') { if (trans_type === '1') {
options.form.target_conf = req.body.trans_type_value; options.form.target_conf = trans_type_value;
} else if (req.body.trans_type === '2') { } else if (trans_type === '2') {
options.form.sat_per_byte = req.body.trans_type_value; options.form.sat_per_byte = trans_type_value;
} }
if (req.body.commitment_type) { if (commitment_type) {
options.form.commitment_type = req.body.commitment_type; options.form.commitment_type = commitment_type;
} }
options.form = JSON.stringify(options.form); options.form = JSON.stringify(options.form);
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Channel Open Options', data: options.form }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Channel Open Options', data: options.form });
@ -155,18 +156,19 @@ export const postChannel = (req, res, next) => {
}; };
export const postTransactions = (req, res, next) => { export const postTransactions = (req, res, next) => {
const { paymentReq, paymentAmount, feeLimit, outgoingChannel, allowSelfPayment, lastHopPubkey } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Sending Payment..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Sending Payment..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.ln_server_url + '/v1/channels/transaction-stream'; options.url = req.session.selectedNode.ln_server_url + '/v1/channels/transaction-stream';
options.form = { payment_request: req.body.paymentReq }; options.form = { payment_request: paymentReq };
if (req.body.paymentAmount) { if (paymentAmount) {
options.form.amt = req.body.paymentAmount; options.form.amt = paymentAmount;
} }
if (req.body.feeLimit) { options.form.fee_limit = req.body.feeLimit; } if (feeLimit) { options.form.fee_limit = feeLimit; }
if (req.body.outgoingChannel) { options.form.outgoing_chan_id = req.body.outgoingChannel; } if (outgoingChannel) { options.form.outgoing_chan_id = outgoingChannel; }
if (req.body.allowSelfPayment) { options.form.allow_self_payment = req.body.allowSelfPayment; } if (allowSelfPayment) { options.form.allow_self_payment = allowSelfPayment; }
if (req.body.lastHopPubkey) { options.form.last_hop_pubkey = Buffer.from(req.body.lastHopPubkey, 'hex').toString('base64'); } if (lastHopPubkey) { options.form.last_hop_pubkey = Buffer.from(lastHopPubkey, 'hex').toString('base64'); }
options.form = JSON.stringify(options.form); options.form = JSON.stringify(options.form);
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Send Payment Options', data: options.form }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Send Payment Options', data: options.form });
request.post(options).then((body) => { request.post(options).then((body) => {
@ -208,32 +210,33 @@ export const closeChannel = (req, res, next) => {
}; };
export const postChanPolicy = (req, res, next) => { export const postChanPolicy = (req, res, next) => {
const { chanPoint, baseFeeMsat, feeRate, timeLockDelta, max_htlc_msat, min_htlc_msat } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Updating Channel Policy..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Updating Channel Policy..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.ln_server_url + '/v1/chanpolicy'; options.url = req.session.selectedNode.ln_server_url + '/v1/chanpolicy';
if (req.body.chanPoint === 'all') { if (chanPoint === 'all') {
options.form = JSON.stringify({ options.form = JSON.stringify({
global: true, global: true,
base_fee_msat: req.body.baseFeeMsat, base_fee_msat: baseFeeMsat,
fee_rate: parseFloat((req.body.feeRate / 1000000).toString()), fee_rate: parseFloat((feeRate / 1000000).toString()),
time_lock_delta: parseInt(req.body.timeLockDelta) time_lock_delta: parseInt(timeLockDelta)
}); });
} else { } else {
const breakPoint = req.body.chanPoint.indexOf(':'); const breakPoint = chanPoint.indexOf(':');
const txid_str = req.body.chanPoint.substring(0, breakPoint); const txid_str = chanPoint.substring(0, breakPoint);
const output_idx = req.body.chanPoint.substring(breakPoint + 1, req.body.chanPoint.length); const output_idx = chanPoint.substring(breakPoint + 1, chanPoint.length);
const optionsBody = { const optionsBody = {
base_fee_msat: req.body.baseFeeMsat, base_fee_msat: baseFeeMsat,
fee_rate: parseFloat((req.body.feeRate / 1000000).toString()), fee_rate: parseFloat((feeRate / 1000000).toString()),
time_lock_delta: parseInt(req.body.timeLockDelta), time_lock_delta: parseInt(timeLockDelta),
chan_point: { funding_txid_str: txid_str, output_index: parseInt(output_idx) } chan_point: { funding_txid_str: txid_str, output_index: parseInt(output_idx) }
}; };
if (req.body.max_htlc_msat) { if (max_htlc_msat) {
optionsBody['max_htlc_msat'] = req.body.max_htlc_msat; optionsBody['max_htlc_msat'] = max_htlc_msat;
} }
if (req.body.min_htlc_msat) { if (min_htlc_msat) {
optionsBody['min_htlc_msat'] = req.body.min_htlc_msat; optionsBody['min_htlc_msat'] = min_htlc_msat;
optionsBody['min_htlc_msat_specified'] = true; optionsBody['min_htlc_msat_specified'] = true;
} }
options.form = JSON.stringify(optionsBody); options.form = JSON.stringify(optionsBody);

@ -6,12 +6,13 @@ const logger: LoggerService = Logger;
const common: CommonService = Common; const common: CommonService = Common;
export const signMessage = (req, res, next) => { export const signMessage = (req, res, next) => {
const { message } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Signing Message..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Signing Message..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.ln_server_url + '/v1/signmessage'; options.url = req.session.selectedNode.ln_server_url + '/v1/signmessage';
options.form = JSON.stringify({ options.form = JSON.stringify({
msg: Buffer.from(req.body.message).toString('base64') msg: Buffer.from(message).toString('base64')
}); });
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Message Signed', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Message Signed', data: body });
@ -23,13 +24,14 @@ export const signMessage = (req, res, next) => {
}; };
export const verifyMessage = (req, res, next) => { export const verifyMessage = (req, res, next) => {
const { message, signature } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Verifying Message..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Verifying Message..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.ln_server_url + '/v1/verifymessage'; options.url = req.session.selectedNode.ln_server_url + '/v1/verifymessage';
options.form = JSON.stringify({ options.form = JSON.stringify({
msg: Buffer.from(req.body.message).toString('base64'), msg: Buffer.from(message).toString('base64'),
signature: req.body.signature signature: signature
}); });
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Message Verified', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Message Verified', data: body });

@ -30,11 +30,12 @@ export const decodePayment = (req, res, next) => {
}; };
export const decodePayments = (req, res, next) => { export const decodePayments = (req, res, next) => {
const { payments } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'PayRequest', msg: 'Decoding Payments List..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'PayRequest', msg: 'Decoding Payments List..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
if (req.body.payments) { if (payments) {
const paymentsArr = req.body.payments.split(','); const paymentsArr = payments.split(',');
return Promise.all(paymentsArr?.map((payment) => decodePaymentFromPaymentRequest(req.session.selectedNode, payment))). return Promise.all(paymentsArr?.map((payment) => decodePaymentFromPaymentRequest(req.session.selectedNode, payment))).
then((values) => { then((values) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'PayRequest', msg: 'Payment List Decoded', data: values }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'PayRequest', msg: 'Payment List Decoded', data: values });

@ -37,13 +37,14 @@ export const getPeers = (req, res, next) => {
}; };
export const postPeer = (req, res, next) => { export const postPeer = (req, res, next) => {
const { host, pubkey, perm } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Connecting Peer..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Connecting Peer..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.ln_server_url + '/v1/peers'; options.url = req.session.selectedNode.ln_server_url + '/v1/peers';
options.form = JSON.stringify({ options.form = JSON.stringify({
addr: { host: req.body.host, pubkey: req.body.pubkey }, addr: { host: host, pubkey: pubkey },
perm: req.body.perm perm: perm
}); });
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peer Connected', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peer Connected', data: body });
@ -52,7 +53,7 @@ export const postPeer = (req, res, next) => {
const peers = (!body.peers) ? [] : body.peers; const peers = (!body.peers) ? [] : body.peers;
return Promise.all(peers?.map((peer) => getAliasForPeers(req.session.selectedNode, peer))).then((values) => { return Promise.all(peers?.map((peer) => getAliasForPeers(req.session.selectedNode, peer))).then((values) => {
if (body.peers) { if (body.peers) {
body.peers = common.newestOnTop(body.peers, 'pub_key', req.body.pubkey); body.peers = common.newestOnTop(body.peers, 'pub_key', pubkey);
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peers List after Connect Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peers List after Connect Received', data: body });
} }
res.status(201).json(body.peers); res.status(201).json(body.peers);

@ -8,7 +8,8 @@ const responseData = { switch: { forwarding_events: [], last_offset_index: 0 },
const num_max_events = 100; const num_max_events = 100;
export const forwardingHistory = (req, res, next) => { export const forwardingHistory = (req, res, next) => {
getAllForwardingEvents(req, req.body.start_time, req.body.end_time, 0, 'switch', (eventsResponse) => { const { start_time, end_time } = req.body;
getAllForwardingEvents(req, start_time, end_time, 0, 'switch', (eventsResponse) => {
if (eventsResponse.error) { if (eventsResponse.error) {
res.status(eventsResponse.error.statusCode).json(eventsResponse); res.status(eventsResponse.error.statusCode).json(eventsResponse);
} else { } else {

@ -20,19 +20,18 @@ export const getTransactions = (req, res, next) => {
}; };
export const postTransactions = (req, res, next) => { export const postTransactions = (req, res, next) => {
const { amount, address, fees, blocks, sendAll } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Transactions', msg: 'Sending Transaction..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Transactions', msg: 'Sending Transaction..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.ln_server_url + '/v1/transactions'; options.url = req.session.selectedNode.ln_server_url + '/v1/transactions';
options.form = { options.form = {
amount: req.body.amount, amount: amount,
addr: req.body.address, addr: address,
sat_per_byte: req.body.fees, sat_per_byte: fees,
target_conf: req.body.blocks target_conf: blocks
}; };
if (req.body.sendAll) { if (sendAll) { options.form.send_all = sendAll; }
options.form.send_all = req.body.sendAll;
}
options.form = JSON.stringify(options.form); options.form = JSON.stringify(options.form);
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Transactions', msg: 'Transaction Sent', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Transactions', msg: 'Transaction Sent', data: body });

@ -25,6 +25,7 @@ export const genSeed = (req, res, next) => {
}; };
export const operateWallet = (req, res, next) => { export const operateWallet = (req, res, next) => {
const { wallet_password, aezeed_passphrase, cipher_seed_mnemonic } = req.body;
let err_message = ''; let err_message = '';
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
@ -33,22 +34,22 @@ export const operateWallet = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Unlocking Wallet..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Unlocking Wallet..' });
options.url = req.session.selectedNode.ln_server_url + '/v1/unlockwallet'; options.url = req.session.selectedNode.ln_server_url + '/v1/unlockwallet';
options.form = JSON.stringify({ options.form = JSON.stringify({
wallet_password: Buffer.from(atob(req.body.wallet_password)).toString('base64') wallet_password: Buffer.from(atob(wallet_password)).toString('base64')
}); });
err_message = 'Unlocking wallet failed! Verify that lnd is running and the wallet is locked!'; err_message = 'Unlocking wallet failed! Verify that lnd is running and the wallet is locked!';
} else { } else {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Initializing Wallet..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Initializing Wallet..' });
options.url = req.session.selectedNode.ln_server_url + '/v1/initwallet'; options.url = req.session.selectedNode.ln_server_url + '/v1/initwallet';
if (req.body.aezeed_passphrase && req.body.aezeed_passphrase !== '') { if (aezeed_passphrase && aezeed_passphrase !== '') {
options.form = JSON.stringify({ options.form = JSON.stringify({
wallet_password: Buffer.from(atob(req.body.wallet_password)).toString('base64'), wallet_password: Buffer.from(atob(wallet_password)).toString('base64'),
cipher_seed_mnemonic: req.body.cipher_seed_mnemonic, cipher_seed_mnemonic: cipher_seed_mnemonic,
aezeed_passphrase: Buffer.from(atob(req.body.aezeed_passphrase)).toString('base64') aezeed_passphrase: Buffer.from(atob(aezeed_passphrase)).toString('base64')
}); });
} else { } else {
options.form = JSON.stringify({ options.form = JSON.stringify({
wallet_password: Buffer.from(atob(req.body.wallet_password)).toString('base64'), wallet_password: Buffer.from(atob(wallet_password)).toString('base64'),
cipher_seed_mnemonic: req.body.cipher_seed_mnemonic cipher_seed_mnemonic: cipher_seed_mnemonic
}); });
} }
err_message = 'Initializing wallet failed!'; err_message = 'Initializing wallet failed!';
@ -109,19 +110,20 @@ export const getUTXOs = (req, res, next) => {
}; };
export const bumpFee = (req, res, next) => { export const bumpFee = (req, res, next) => {
const { txid, outputIndex, targetConf, satPerByte } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Bumping Fee..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Bumping Fee..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.ln_server_url + '/v2/wallet/bumpfee'; options.url = req.session.selectedNode.ln_server_url + '/v2/wallet/bumpfee';
options.form = {}; options.form = {};
options.form.outpoint = { options.form.outpoint = {
txid_str: req.body.txid, txid_str: txid,
output_index: req.body.outputIndex output_index: outputIndex
}; };
if (req.body.targetConf) { if (targetConf) {
options.form.target_conf = req.body.targetConf; options.form.target_conf = targetConf;
} else if (req.body.satPerByte) { } else if (satPerByte) {
options.form.sat_per_byte = req.body.satPerByte; options.form.sat_per_byte = satPerByte;
} }
options.form = JSON.stringify(options.form); options.form = JSON.stringify(options.form);
request.post(options).then((body) => { request.post(options).then((body) => {
@ -138,11 +140,7 @@ export const labelTransaction = (req, res, next) => {
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.ln_server_url + '/v2/wallet/tx/label'; options.url = req.session.selectedNode.ln_server_url + '/v2/wallet/tx/label';
options.form = {}; options.form = JSON.parse(JSON.stringify(options.form));
options.form.txid = req.body.txid;
options.form.label = req.body.label;
options.form.overwrite = req.body.overwrite;
options.form = JSON.stringify(options.form);
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Wallet', msg: 'Label Transaction Options', data: options.form }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Wallet', msg: 'Label Transaction Options', data: options.form });
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Transaction Labelled', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Transaction Labelled', data: body });
@ -154,15 +152,16 @@ export const labelTransaction = (req, res, next) => {
}; };
export const leaseUTXO = (req, res, next) => { export const leaseUTXO = (req, res, next) => {
const { txid, outputIndex } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Leasing UTXO..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Leasing UTXO..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.ln_server_url + '/v2/wallet/utxos/lease'; options.url = req.session.selectedNode.ln_server_url + '/v2/wallet/utxos/lease';
options.form = {}; options.form = {};
options.form.id = req.body.txid; options.form.id = txid;
options.form.outpoint = { options.form.outpoint = {
txid_bytes: req.body.txid, txid_bytes: txid,
output_index: req.body.outputIndex output_index: outputIndex
}; };
options.form = JSON.stringify(options.form); options.form = JSON.stringify(options.form);
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Wallet', msg: 'UTXO Lease Options', data: options.form }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Wallet', msg: 'UTXO Lease Options', data: options.form });
@ -176,15 +175,16 @@ export const leaseUTXO = (req, res, next) => {
}; };
export const releaseUTXO = (req, res, next) => { export const releaseUTXO = (req, res, next) => {
const { txid, outputIndex } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Releasing UTXO..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Releasing UTXO..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.ln_server_url + '/v2/wallet/utxos/release'; options.url = req.session.selectedNode.ln_server_url + '/v2/wallet/utxos/release';
options.form = {}; options.form = {};
options.form.id = req.body.txid; options.form.id = txid;
options.form.outpoint = { options.form.outpoint = {
txid_bytes: req.body.txid, txid_bytes: txid,
output_index: req.body.outputIndex output_index: outputIndex
}; };
options.form = JSON.stringify(options.form); options.form = JSON.stringify(options.form);
request.post(options).then((body) => { request.post(options).then((body) => {

@ -134,29 +134,30 @@ export const getRTLConfig = (req, res, next) => {
}; };
export const updateUISettings = (req, res, next) => { export const updateUISettings = (req, res, next) => {
const { updatedSettings } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating UI Settings..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating UI Settings..' });
const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json'; const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json';
const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8'));
const node = config.nodes.find((node) => (node.index === req.session.selectedNode.index)); const node = config.nodes.find((node) => (node.index === req.session.selectedNode.index));
if (node && node.Settings) { if (node && node.Settings) {
node.Settings.userPersona = req.body.updatedSettings.userPersona; node.Settings.userPersona = updatedSettings.userPersona;
node.Settings.themeMode = req.body.updatedSettings.themeMode; node.Settings.themeMode = updatedSettings.themeMode;
node.Settings.themeColor = req.body.updatedSettings.themeColor; node.Settings.themeColor = updatedSettings.themeColor;
node.Settings.unannouncedChannels = req.body.updatedSettings.unannouncedChannels; node.Settings.unannouncedChannels = updatedSettings.unannouncedChannels;
node.Settings.fiatConversion = req.body.updatedSettings.fiatConversion; node.Settings.fiatConversion = updatedSettings.fiatConversion;
if (req.body.updatedSettings.fiatConversion) { if (updatedSettings.fiatConversion) {
node.Settings.currencyUnit = req.body.updatedSettings.currencyUnit ? req.body.updatedSettings.currencyUnit : 'USD'; node.Settings.currencyUnit = updatedSettings.currencyUnit ? updatedSettings.currencyUnit : 'USD';
} else { } else {
delete node.Settings.currencyUnit; delete node.Settings.currencyUnit;
} }
const selectedNode = common.findNode(req.session.selectedNode.index); const selectedNode = common.findNode(req.session.selectedNode.index);
selectedNode.user_persona = req.body.updatedSettings.userPersona; selectedNode.user_persona = updatedSettings.userPersona;
selectedNode.theme_mode = req.body.updatedSettings.themeMode; selectedNode.theme_mode = updatedSettings.themeMode;
selectedNode.theme_color = req.body.updatedSettings.themeColor; selectedNode.theme_color = updatedSettings.themeColor;
selectedNode.unannounced_channels = req.body.updatedSettings.unannouncedChannels; selectedNode.unannounced_channels = updatedSettings.unannouncedChannels;
selectedNode.fiat_conversion = req.body.updatedSettings.fiatConversion; selectedNode.fiat_conversion = updatedSettings.fiatConversion;
if (req.body.updatedSettings.fiatConversion) { if (updatedSettings.fiatConversion) {
selectedNode.currency_unit = req.body.updatedSettings.currencyUnit ? req.body.updatedSettings.currencyUnit : 'USD'; selectedNode.currency_unit = updatedSettings.currencyUnit ? updatedSettings.currencyUnit : 'USD';
} else { } else {
delete selectedNode.currency_unit; delete selectedNode.currency_unit;
} }
@ -174,15 +175,16 @@ export const updateUISettings = (req, res, next) => {
}; };
export const update2FASettings = (req, res, next) => { export const update2FASettings = (req, res, next) => {
const { secret2fa } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating 2FA Settings..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating 2FA Settings..' });
const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json'; const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json';
const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8'));
if (req.body.secret2fa && req.body.secret2fa.trim() !== '') { if (secret2fa && secret2fa.trim() !== '') {
config.secret2fa = req.body.secret2fa; config.secret2fa = secret2fa;
} else { } else {
delete config.secret2fa; delete config.secret2fa;
} }
const message = req.body.secret2fa.trim() === '' ? 'Two factor authentication disabled successfully.' : 'Two factor authentication enabled successfully.'; const message = secret2fa.trim() === '' ? 'Two factor authentication disabled successfully.' : 'Two factor authentication enabled successfully.';
try { try {
fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8'); fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8');
common.rtl_secret2fa = config.secret2fa; common.rtl_secret2fa = config.secret2fa;
@ -196,10 +198,11 @@ export const update2FASettings = (req, res, next) => {
}; };
export const updateDefaultNode = (req, res, next) => { export const updateDefaultNode = (req, res, next) => {
const { defaultNodeIndex } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating Default Node..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating Default Node..' });
const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json'; const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json';
const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8'));
config.defaultNodeIndex = req.body.defaultNodeIndex; config.defaultNodeIndex = defaultNodeIndex;
try { try {
fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8'); fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8');
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Default Node Updated', data: maskPasswords(config) }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Default Node Updated', data: maskPasswords(config) });
@ -293,11 +296,12 @@ export const getCurrencyRates = (req, res, next) => {
}; };
export const updateSSO = (req, res, next) => { export const updateSSO = (req, res, next) => {
const { SSO } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating SSO Settings..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating SSO Settings..' });
const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json'; const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json';
const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8'));
delete config.SSO; delete config.SSO;
config.SSO = req.body.SSO; config.SSO = SSO;
try { try {
fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8'); fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8');
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'SSO Setting Updated', data: maskPasswords(config) }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'SSO Setting Updated', data: maskPasswords(config) });
@ -310,19 +314,20 @@ export const updateSSO = (req, res, next) => {
}; };
export const updateServiceSettings = (req, res, next) => { export const updateServiceSettings = (req, res, next) => {
const { service, settings } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating Service Settings..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Updating Service Settings..' });
const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json'; const RTLConfFile = common.rtl_conf_file_path + sep + 'RTL-Config.json';
const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8'));
const selectedNode = common.findNode(req.session.selectedNode.index); const selectedNode = common.findNode(req.session.selectedNode.index);
config.nodes.forEach((node) => { config.nodes.forEach((node) => {
if (node.index === req.session.selectedNode.index) { if (node.index === req.session.selectedNode.index) {
switch (req.body.service) { switch (service) {
case 'LOOP': case 'LOOP':
if (req.body.settings.enable) { if (settings.enable) {
node.Settings.swapServerUrl = req.body.settings.serverUrl; node.Settings.swapServerUrl = settings.serverUrl;
node.Authentication.swapMacaroonPath = req.body.settings.macaroonPath; node.Authentication.swapMacaroonPath = settings.macaroonPath;
selectedNode.swap_server_url = req.body.settings.serverUrl; selectedNode.swap_server_url = settings.serverUrl;
selectedNode.swap_macaroon_path = req.body.settings.macaroonPath; selectedNode.swap_macaroon_path = settings.macaroonPath;
} else { } else {
delete node.Settings.swapServerUrl; delete node.Settings.swapServerUrl;
delete node.Authentication.swapMacaroonPath; delete node.Authentication.swapMacaroonPath;
@ -332,11 +337,11 @@ export const updateServiceSettings = (req, res, next) => {
break; break;
case 'BOLTZ': case 'BOLTZ':
if (req.body.settings.enable) { if (settings.enable) {
node.Settings.boltzServerUrl = req.body.settings.serverUrl; node.Settings.boltzServerUrl = settings.serverUrl;
node.Authentication.boltzMacaroonPath = req.body.settings.macaroonPath; node.Authentication.boltzMacaroonPath = settings.macaroonPath;
selectedNode.boltz_server_url = req.body.settings.serverUrl; selectedNode.boltz_server_url = settings.serverUrl;
selectedNode.boltz_macaroon_path = req.body.settings.macaroonPath; selectedNode.boltz_macaroon_path = settings.macaroonPath;
} else { } else {
delete node.Settings.boltzServerUrl; delete node.Settings.boltzServerUrl;
delete node.Authentication.boltzMacaroonPath; delete node.Authentication.boltzMacaroonPath;
@ -346,13 +351,13 @@ export const updateServiceSettings = (req, res, next) => {
break; break;
case 'OFFERS': case 'OFFERS':
node.Settings.enableOffers = req.body.settings.enableOffers; node.Settings.enableOffers = settings.enableOffers;
selectedNode.enable_offers = req.body.settings.enableOffers; selectedNode.enable_offers = settings.enableOffers;
break; break;
case 'PEERSWAP': case 'PEERSWAP':
node.Settings.enablePeerswap = req.body.settings.enablePeerswap; node.Settings.enablePeerswap = settings.enablePeerswap;
selectedNode.enable_peerswap = req.body.settings.enablePeerswap; selectedNode.enable_peerswap = settings.enablePeerswap;
break; break;
default: default:

@ -50,13 +50,14 @@ const handleMultipleFailedAttemptsError = (failed, currentTime, errMsg) => {
export const verifyToken = (twoFAToken) => !!(common.rtl_secret2fa && common.rtl_secret2fa !== '' && otplib.authenticator.check(twoFAToken, common.rtl_secret2fa)); export const verifyToken = (twoFAToken) => !!(common.rtl_secret2fa && common.rtl_secret2fa !== '' && otplib.authenticator.check(twoFAToken, common.rtl_secret2fa));
export const authenticateUser = (req, res, next) => { export const authenticateUser = (req, res, next) => {
const { authenticateWith, authenticationValue, twoFAToken } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Authenticate', msg: 'Authenticating User..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Authenticate', msg: 'Authenticating User..' });
if (+common.rtl_sso) { if (+common.rtl_sso) {
if (req.body.authenticateWith === 'JWT' && jwt.verify(req.body.authenticationValue, common.secret_key)) { if (authenticateWith === 'JWT' && jwt.verify(authenticationValue, common.secret_key)) {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Authenticate', msg: 'User Authenticated' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Authenticate', msg: 'User Authenticated' });
res.status(406).json({ message: 'SSO Authentication Error', error: 'Login with Password is not allowed with SSO.' }); res.status(406).json({ message: 'SSO Authentication Error', error: 'Login with Password is not allowed with SSO.' });
} else if (req.body.authenticateWith === 'PASSWORD') { } else if (authenticateWith === 'PASSWORD') {
if (common.cookie_value.trim().length >= 32 && crypto.timingSafeEqual(Buffer.from(crypto.createHash('sha256').update(common.cookie_value).digest('hex'), 'utf-8'), Buffer.from(req.body.authenticationValue, 'utf-8'))) { if (common.cookie_value.trim().length >= 32 && crypto.timingSafeEqual(Buffer.from(crypto.createHash('sha256').update(common.cookie_value).digest('hex'), 'utf-8'), Buffer.from(authenticationValue, 'utf-8'))) {
common.refreshCookie(); common.refreshCookie();
if (!req.session.selectedNode) { req.session.selectedNode = common.initSelectedNode; } if (!req.session.selectedNode) { req.session.selectedNode = common.initSelectedNode; }
const token = jwt.sign({ user: 'SSO_USER' }, common.secret_key); const token = jwt.sign({ user: 'SSO_USER' }, common.secret_key);
@ -72,10 +73,10 @@ export const authenticateUser = (req, res, next) => {
const currentTime = new Date().getTime(); const currentTime = new Date().getTime();
const reqIP = common.getRequestIP(req); const reqIP = common.getRequestIP(req);
const failed = getFailedInfo(reqIP, currentTime); const failed = getFailedInfo(reqIP, currentTime);
const password = req.body.authenticationValue; const password = authenticationValue;
if (common.rtl_pass === password && failed.count < ALLOWED_LOGIN_ATTEMPTS) { if (common.rtl_pass === password && failed.count < ALLOWED_LOGIN_ATTEMPTS) {
if (req.body.twoFAToken && req.body.twoFAToken !== '') { if (twoFAToken && twoFAToken !== '') {
if (!verifyToken(req.body.twoFAToken)) { if (!verifyToken(twoFAToken)) {
logger.log({ selectedNode: req.session.selectedNode, level: 'ERROR', fileName: 'Authenticate', msg: 'Invalid Token! Failed IP ' + reqIP, error: { error: 'Invalid token.' } }); logger.log({ selectedNode: req.session.selectedNode, level: 'ERROR', fileName: 'Authenticate', msg: 'Invalid Token! Failed IP ' + reqIP, error: { error: 'Invalid token.' } });
failed.count = failed.count + 1; failed.count = failed.count + 1;
failed.lastTried = currentTime; failed.lastTried = currentTime;
@ -97,15 +98,15 @@ export const authenticateUser = (req, res, next) => {
}; };
export const resetPassword = (req, res, next) => { export const resetPassword = (req, res, next) => {
const { currPassword, newPassword } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Authenticate', msg: 'Resetting Password..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Authenticate', msg: 'Resetting Password..' });
if (+common.rtl_sso) { if (+common.rtl_sso) {
const errMsg = 'Password cannot be reset for SSO authentication'; const errMsg = 'Password cannot be reset for SSO authentication';
const err = common.handleError({ statusCode: 401, message: 'Password Reset Error', error: errMsg }, 'Authenticate', errMsg, req.session.selectedNode); const err = common.handleError({ statusCode: 401, message: 'Password Reset Error', error: errMsg }, 'Authenticate', errMsg, req.session.selectedNode);
return res.status(err.statusCode).json({ message: err.message, error: err.error }); return res.status(err.statusCode).json({ message: err.message, error: err.error });
} else { } else {
const currPassword = req.body.currPassword;
if (common.rtl_pass === currPassword) { if (common.rtl_pass === currPassword) {
common.rtl_pass = common.replacePasswordWithHash(req.body.newPassword); common.rtl_pass = common.replacePasswordWithHash(newPassword);
const token = jwt.sign({ user: 'NODE_USER' }, common.secret_key); const token = jwt.sign({ user: 'NODE_USER' }, common.secret_key);
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Authenticate', msg: 'Password Reset Successful' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Authenticate', msg: 'Password Reset Successful' });
res.status(200).json({ token: token }); res.status(200).json({ token: token });

@ -80,6 +80,7 @@ export const getSwapInfo = (req, res, next) => {
}; };
export const createSwap = (req, res, next) => { export const createSwap = (req, res, next) => {
const { amount, address } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Creating Swap..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Creating Swap..' });
options = common.getBoltzServerOptions(req); options = common.getBoltzServerOptions(req);
if (options.url === '') { if (options.url === '') {
@ -88,8 +89,8 @@ export const createSwap = (req, res, next) => {
return res.status(err.statusCode).json({ message: err.message, error: err.error }); return res.status(err.statusCode).json({ message: err.message, error: err.error });
} }
options.url = options.url + '/v1/createswap'; options.url = options.url + '/v1/createswap';
options.body = { amount: req.body.amount }; options.body = { amount: amount };
if (req.body.address !== '') { options.body.address = req.body.address; } if (address && address !== '') { options.body.address = address; }
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Boltz', msg: 'Create Swap Options Body', data: options.body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Boltz', msg: 'Create Swap Options Body', data: options.body });
request.post(options).then((createSwapRes) => { request.post(options).then((createSwapRes) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Swap Created', data: createSwapRes }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Swap Created', data: createSwapRes });
@ -101,6 +102,7 @@ export const createSwap = (req, res, next) => {
}; };
export const createReverseSwap = (req, res, next) => { export const createReverseSwap = (req, res, next) => {
const { amount, acceptZeroConf, address } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Creating Reverse Swap..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Creating Reverse Swap..' });
options = common.getBoltzServerOptions(req); options = common.getBoltzServerOptions(req);
if (options.url === '') { if (options.url === '') {
@ -109,8 +111,8 @@ export const createReverseSwap = (req, res, next) => {
return res.status(err.statusCode).json({ message: err.message, error: err.error }); return res.status(err.statusCode).json({ message: err.message, error: err.error });
} }
options.url = options.url + '/v1/createreverseswap'; options.url = options.url + '/v1/createreverseswap';
options.body = { amount: req.body.amount, accept_zero_conf: req.body.acceptZeroConf || false }; options.body = { amount: amount, accept_zero_conf: acceptZeroConf || false };
if (req.body.address !== '') { options.body.address = req.body.address; } if (address && address !== '') { options.body.address = address; }
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Boltz', msg: 'Create Reverse Swap Body', data: options.body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Boltz', msg: 'Create Reverse Swap Body', data: options.body });
request.post(options).then((createReverseSwapRes) => { request.post(options).then((createReverseSwapRes) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Reverse Swap Created', data: createReverseSwapRes }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Reverse Swap Created', data: createReverseSwapRes });
@ -122,6 +124,7 @@ export const createReverseSwap = (req, res, next) => {
}; };
export const createChannel = (req, res, next) => { export const createChannel = (req, res, next) => {
const { amount, address } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Creating Boltz Channel..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Creating Boltz Channel..' });
options = common.getBoltzServerOptions(req); options = common.getBoltzServerOptions(req);
if (options.url === '') { if (options.url === '') {
@ -130,8 +133,8 @@ export const createChannel = (req, res, next) => {
return res.status(err.statusCode).json({ message: err.message, error: err.error }); return res.status(err.statusCode).json({ message: err.message, error: err.error });
} }
options.url = options.url + '/v1/createchannel'; options.url = options.url + '/v1/createchannel';
options.body = { amount: req.body.amount }; options.body = { amount: amount };
if (req.body.address !== '') { options.body.address = req.body.address; } if (address && address !== '') { options.body.address = address; }
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Boltz', msg: 'Create Channel Options Body', data: options.body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Boltz', msg: 'Create Channel Options Body', data: options.body });
request.post(options).then((createChannelRes) => { request.post(options).then((createChannelRes) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Boltz Channel Created', data: createChannelRes }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Boltz', msg: 'Boltz Channel Created', data: createChannelRes });

@ -6,21 +6,22 @@ const logger: LoggerService = Logger;
const common: CommonService = Common; const common: CommonService = Common;
export const loopOut = (req, res, next) => { export const loopOut = (req, res, next) => {
const { amount, targetConf, swapRoutingFee, minerFee, prepayRoutingFee, prepayAmt, swapFee, swapPublicationDeadline, chanId, destAddress } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Loop', msg: 'Looping Out..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Loop', msg: 'Looping Out..' });
options.uri = '/v1/loop/out'; options.uri = '/v1/loop/out';
options.body = { options.body = {
amt: req.body.amount, amt: amount,
sweep_conf_target: req.body.targetConf, sweep_conf_target: targetConf,
max_swap_routing_fee: req.body.swapRoutingFee, max_swap_routing_fee: swapRoutingFee,
max_miner_fee: req.body.minerFee, max_miner_fee: minerFee,
max_prepay_routing_fee: req.body.prepayRoutingFee, max_prepay_routing_fee: prepayRoutingFee,
max_prepay_amt: req.body.prepayAmt, max_prepay_amt: prepayAmt,
max_swap_fee: req.body.swapFee, max_swap_fee: swapFee,
swap_publication_deadline: req.body.swapPublicationDeadline, swap_publication_deadline: swapPublicationDeadline,
initiator: 'RTL' initiator: 'RTL'
}; };
if (req.body.chanId !== '') { options.body['loop_out_channel'] = req.body.chanId; } if (chanId !== '') { options.body['loop_out_channel'] = chanId; }
if (req.body.destAddress !== '') { options.body['dest'] = req.body.destAddress; } if (destAddress !== '') { options.body['dest'] = destAddress; }
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Loop', msg: 'Loop Out Body', data: options.body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Loop', msg: 'Loop Out Body', data: options.body });
request.post(options).then((loopOutRes) => { request.post(options).then((loopOutRes) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Loop', msg: 'Looped Out', data: loopOutRes }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Loop', msg: 'Looped Out', data: loopOutRes });
@ -87,12 +88,13 @@ export const loopOutTermsAndQuotes = (req, res, next) => {
}; };
export const loopIn = (req, res, next) => { export const loopIn = (req, res, next) => {
const { amount, swapFee, minerFee } = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Loop', msg: 'Looping In..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Loop', msg: 'Looping In..' });
options.uri = '/v1/loop/in'; options.uri = '/v1/loop/in';
options.body = { options.body = {
amt: req.body.amount, amt: amount,
max_swap_fee: req.body.swapFee, max_swap_fee: swapFee,
max_miner_fee: req.body.minerFee, max_miner_fee: minerFee,
initiator: 'RTL' initiator: 'RTL'
}; };
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Loop', msg: 'Loop In Body', data: options.body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Loop', msg: 'Loop In Body', data: options.body });

Loading…
Cancel
Save