balanceofsatoshis
Version:
Lightning balance CLI
86 lines (72 loc) • 2.15 kB
JavaScript
const {decodeTlvStream} = require('bolt01');
const base64AsHex = base64 => Buffer.from(base64, 'base64').toString('hex');
const processAfter = () => new Date(Date.now() - (1000*60*60)).toISOString();
/** Derive key send request arguments from invoice details
{
[confirmed_at]: <Settled at ISO 8601 Date String>
description: <Invoice Description String>
[description_hash]: <Invoice Description Hash String>
id: <Payment Hash Hex String>
[is_canceled]: <Invoice is Canceled Bool>
is_confirmed: <Invoice is Confirmed Bool>
payments: [{
is_confirmed: <HTLC is Confirmed Bool>
messages: [{
type: <Message Type String>
value: <Hex Encoded Value String>
}]
}]
received: <Tokens Received Rounded Down Number>
secret: <Invoice Preimage Hex String>
tokens: <Invoiced Tokens Rounded Down Number>
}
@returns
{
[arguments]: {
id: <Payment Hash Hex String>
messages: [{
type: <Message Type String>
value: <Hex Encoded Value String>
}]
received: <Tokens Received Rounded Down Number>
}
}
*/
module.exports = (args) => {
const {id} = args;
// Exit early when there is a simulated keysend invoice
if (!args.is_canceled && args.description_hash === args.secret) {
try {
const encoded = base64AsHex(args.description);
return {
arguments: {
id,
messages: decodeTlvStream({encoded}).records,
received: args.tokens,
},
};
} catch (err) {
return {};
}
}
// Exit early when the invoice is not settled
if (!args.is_confirmed) {
return {};
}
// Exit early when this was confirmed too long ago
if (args.confirmed_at < processAfter()) {
return {};
}
const htlcs = args.payments.filter(n => !!n.is_confirmed);
const {received} = args;
// Exit early when the invoice has no confirmed HTLCs
if (!htlcs.length) {
return {};
}
const [{messages}] = htlcs;
// Exit early when the first HTLC has no messages
if (!messages.length) {
return {};
}
return {arguments: {id, messages, received}};
};