update dependencies

This commit is contained in:
Alex Bosworth 2020-11-01 14:52:58 -08:00
parent 231715d9fe
commit deca37ca45
No known key found for this signature in database
GPG key ID: E80D2F3F311FD87E
12 changed files with 805 additions and 1369 deletions

View file

@ -1,6 +1,6 @@
# Versions
## Version 7.2.2
## Version 7.2.3
- `reconnect`: Attempt to fix channels that are inactive but peers are still connected

5
bos
View file

@ -780,7 +780,7 @@ prog
try {
const {lnd} = await authenticatedLnd({logger, node: options.node});
const {macaroon, preimage, service} = await getPaidService({
const {metadata, service} = await getPaidService({
fetch,
lnd,
logger,
@ -791,8 +791,7 @@ prog
return getSwapCost({
lnd,
logger,
macaroon,
preimage,
metadata,
service,
above: options.above,
is_fast: options.fast || undefined,

View file

@ -82,16 +82,31 @@ module.exports = ({fs, node, os}, cbk) => {
}
}],
// Derive the socket from the configuration settings
deriveSocket: ['parseConf', ({parseConf}, cbk) => {
// Derive the RPC host
deriveHost: ['parseConf', ({parseConf}, cbk) => {
// Exit early when there is no conf settings
if (!parseConf) {
return cbk();
}
const {tlsextradomain} = parseConf[applicationOptions] || {};
const {tlsextraip} = parseConf[applicationOptions] || {};
if (!tlsextraip) {
if (!tlsextradomain && !tlsextraip) {
return cbk();
}
return cbk(null, tlsextradomain || tlsextraip);
}],
// Derive the RPC socket from the configuration settings
deriveSocket: [
'deriveHost',
'parseConf',
({deriveHost, parseConf}, cbk) =>
{
// Exit early when there is no conf settings or TLS host
if (!deriveHost || !parseConf) {
return cbk();
}
@ -104,7 +119,7 @@ module.exports = ({fs, node, os}, cbk) => {
throw new Error('FailedToDerivePortFromApplicationOptions');
}
return cbk(null, `${tlsextraip}:${port}`);
return cbk(null, `${deriveHost}:${port}`);
} catch (err) {
// Ignore errors
return cbk();

View file

@ -158,22 +158,23 @@ module.exports = (args, cbk) => {
'forNode',
'getCert',
'getMacaroon',
'getSocket',
'nodeCredentials',
({forNode, getCert, getMacaroon, nodeCredentials}, cbk) =>
({forNode, getCert, getMacaroon, getSocket, nodeCredentials}, cbk) =>
{
// Exit early with the default credentials when no node is specified
if (!forNode) {
return cbk(null, {
socket,
cert: getCert.cert,
macaroon: getMacaroon.macaroon,
socket: getSocket.socket || socket,
});
}
return cbk(null, {
cert: nodeCredentials.cert,
macaroon: nodeCredentials.macaroon,
socket: nodeCredentials.socket,
socket: getSocket.socket || nodeCredentials.socket,
});
}],

1914
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -25,25 +25,25 @@
"colorette": "1.2.1",
"crypto-js": "4.0.0",
"csv-parse": "4.12.0",
"goldengate": "8.0.0",
"goldengate": "9.0.0",
"hot-formula-parser": "3.0.2",
"ini": "1.3.5",
"inquirer": "7.3.3",
"invoices": "1.1.4",
"ln-accounting": "4.1.11",
"ln-service": "50.2.0",
"ln-sync": "0.3.0",
"ln-telegram": "3.0.2",
"ln-accounting": "4.1.13",
"ln-service": "50.3.0",
"ln-sync": "0.3.1",
"ln-telegram": "3.0.4",
"moment": "2.29.1",
"node-fetch": "2.6.1",
"probing": "1.3.0",
"probing": "1.3.1",
"psbt": "1.1.6",
"qrcode-terminal": "0.12.0",
"sanitize-filename": "1.6.3",
"stats-lite": "2.2.0",
"table": "6.0.3",
"telegraf": "3.38.0",
"update-notifier": "5.0.0",
"update-notifier": "5.0.1",
"window-size": "1.1.1"
},
"description": "Lightning balance CLI",
@ -73,5 +73,5 @@
"postpublish": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t alexbosworth/balanceofsatoshis --push .",
"test": "tap test/arrays/*.js test/balances/*.js test/chain/*.js test/display/*.js test/encryption/*.js test/fiat/*.js test/lnd/*.js test/network/*.js test/nodes/*.js test/responses/*.js test/routing/*.js test/swaps/*.js test/wallets/*.js"
},
"version": "7.2.2"
"version": "7.2.3"
}

View file

@ -1,21 +1,30 @@
const asyncAuto = require('async/auto');
const {encode} = require('cbor');
const {genericSwapAuth} = require('goldengate');
const {genericSwapService} = require('goldengate');
const {getNetwork} = require('ln-sync');
const {getSwapMacaroon} = require('goldengate');
const {getSwapOutTerms} = require('goldengate');
const {lightningLabsSwapAuth} = require('goldengate');
const {lightningLabsSwapService} = require('goldengate');
const {paidMacaroon} = require('goldengate');
const {parsePaymentRequest} = require('invoices');
const {payViaPaymentRequest} = require('ln-service');
const {returnResult} = require('asyncjs-util');
const {swapUserId} = require('goldengate');
const decodeSwapApiKey = require('./decode_swap_api_key');
const bitcoinNetwork = 'btc';
const bitcoinTestnetNetwork = 'btctestnet';
const bufferFromBase64 = base64 => Buffer.from(base64, 'base64');
const bufferFromHex = hex => Buffer.from(hex, 'hex');
const connectError = 'FailedToConnectToService';
const encodeCbor = json => encode(json).toString('hex');
const httpMatch = /^https?:\/\//;
const {isArray} = Array;
const mainnetSocket = 'https://balanceofsatoshis.com:11011';
const maxServiceFee = 1337;
const maxRoutingFee = 100;
const testnetSocket = 'https://balanceofsatoshis.com:11010';
@ -31,9 +40,8 @@ const testnetSocket = 'https://balanceofsatoshis.com:11010';
@returns via cbk or Promise
{
id: <Authenticated User Id string>
macaroon: <Authenticated Service Macaroon Base64 String>
metadata: <Authenticated Service Metadata Object>
paid: <Paid Tokens Number>
preimage: <Authenticated Preimage Hex String>
service: <Authenticated Paid Swap Service Object>
token: <Authentication Token Hex String>
}
@ -67,26 +75,63 @@ module.exports = ({fetch, lnd, socket, token}, cbk) => {
// Get network
getNetwork: ['validate', ({}, cbk) => getNetwork({lnd}, cbk)],
// Determine which endpoint to use for the service
endpoint: ['getNetwork', ({getNetwork}, cbk) => {
// Exit early when the endpoint is directly specified
if (!!socket) {
return cbk(null, socket);
}
const {metadata} = lightningLabsSwapAuth({});
const {network} = getNetwork;
const {service} = lightningLabsSwapService({network});
return getSwapOutTerms({metadata, service}, err => {
// Exit early when the standard endpoint is working
if (!isArray(err)) {
return cbk();
}
const [, message] = err;
// Exit early when the error is not a connection issue
if (message !== connectError) {
return cbk();
}
// Try to switch to a backup socket when the main socket fails
switch (getNetwork.network) {
case bitcoinNetwork:
return cbk(null, mainnetSocket);
case bitcoinTestnetNetwork:
return cbk(null, testnetSocket);
default:
return cbk();
}
});
return cbk();
}],
// Make a service object for the remote swap service
remote: ['getNetwork', ({getNetwork}, cbk) => {
remote: ['endpoint', 'getNetwork', ({endpoint, getNetwork}, cbk) => {
// Exit early when using a generic service
if (!!socket && httpMatch.test(socket)) {
if (!!endpoint && httpMatch.test(endpoint)) {
try {
return cbk(null, genericSwapService({fetch, socket}));
return cbk(null, genericSwapService({fetch, socket: endpoint}));
} catch (err) {
return cbk([500, 'UnexpectedErrorInitiatingSwapService', {err}]);
}
}
const {network} = getNetwork;
// Exit early and use a generic service on testnet
if (!socket && network === bitcoinTestnetNetwork) {
return cbk(null, genericSwapService({fetch, socket: testnetSocket}));
}
try {
return cbk(null, lightningLabsSwapService({network, socket}));
return cbk(null, lightningLabsSwapService({
network: getNetwork.network,
socket: endpoint,
}));
} catch (err) {
return cbk([500, 'UnexpectedErrorInitiatingSwapService', {err}]);
}
@ -120,39 +165,69 @@ module.exports = ({fetch, lnd, socket, token}, cbk) => {
return cbk(null, {secret: decodeToken.preimage});
}
// Purchase the macaroon
const {request} = getUnpaidMacaroon;
// Validate the service token payment request
try {
const {tokens} = parsePaymentRequest({request});
if (tokens > maxServiceFee) {
return cbk([503, 'UnexpectedlyHighServiceFee', {fee: tokens}]);
}
} catch (err) {
return cbk([503, 'FailedToParseServicePaymentRequest', {err}]);
}
// Pay the service token payment request to purchase the macaroon
return payViaPaymentRequest({
lnd,
request,
max_fee: maxRoutingFee,
request: getUnpaidMacaroon.request,
},
cbk);
}],
// Final service method details
paidService: [
// Create authentication metadata object
metadata: [
'decodeToken',
'endpoint',
'getUnpaidMacaroon',
'payForMacaroon',
'remote',
({decodeToken, getUnpaidMacaroon, payForMacaroon, remote}, cbk) =>
({decodeToken, endpoint, getUnpaidMacaroon, payForMacaroon}, cbk) =>
{
const {id} = getUnpaidMacaroon;
const {macaroon} = getUnpaidMacaroon;
const paid = payForMacaroon.tokens;
const preimage = payForMacaroon.secret;
const {service} = remote;
if (!decodeToken && !preimage) {
return cbk([400, 'FailedToPurchasePaidServiceTokens']);
if (!decodeToken && !payForMacaroon.secret) {
return cbk([400, 'FailedToPurchasePaidServiceToken']);
}
const {macaroon} = getUnpaidMacaroon;
const preimage = payForMacaroon.secret;
// Exit early when using a generic service
if (!!endpoint && httpMatch.test(endpoint)) {
return cbk(null, genericSwapAuth({macaroon, preimage}).metadata);
}
return cbk(null, lightningLabsSwapAuth({macaroon, preimage}).metadata);
}],
// Final service method details
paidService: [
'getUnpaidMacaroon',
'metadata',
'payForMacaroon',
'remote',
({getUnpaidMacaroon, metadata, payForMacaroon, remote}, cbk) =>
{
const {id} = getUnpaidMacaroon;
const paid = payForMacaroon.tokens;
const {service} = remote;
const token = encodeCbor({
macaroon: bufferFromBase64(macaroon),
preimage: bufferFromHex(preimage),
macaroon: bufferFromBase64(getUnpaidMacaroon.macaroon),
preimage: bufferFromHex(payForMacaroon.secret),
});
return cbk(null, {id, macaroon, paid, preimage, service, token});
return cbk(null, {id, metadata, paid, service, token});
}],
},
returnResult({reject, resolve, of: 'paidService'}, cbk));

View file

@ -19,8 +19,7 @@ const {slowDelayMinutes} = require('./constants');
[is_fast]: <Swap Out Is Immediate Bool>
lnd: <Authenticated LND API Object>
logger: <Winston Logger Object>
macaroon: <Authenticated Service Macaroon Base64 String>
preimage: <Authenticated Preimage Hex String>
metadata: <Authentication Metadata Object>
tokens: <Liquidity Tokens Number>
type: <Liquidity Type String>
}
@ -43,12 +42,8 @@ module.exports = (args, cbk) => {
return cbk([400, 'ExpectedLoggerToGetSwapCost']);
}
if (!args.macaroon) {
return cbk([400, 'ExpectedServiceMacaroonToGetSwapCost']);
}
if (!args.preimage) {
return cbk([400, 'ExpectedPaymentPreimageToGetSwapCost']);
if (!args.metadata) {
return cbk([400, 'ExpectedServiceMetadataToGetSwapCost']);
}
if (!args.service) {
@ -71,16 +66,14 @@ module.exports = (args, cbk) => {
switch (args.type) {
case 'inbound':
return getSwapOutTerms({
macaroon: args.macaroon,
preimage: args.preimage,
metadata: args.metadata,
service: args.service,
},
cbk);
case 'outbound':
return getSwapInTerms({
macaroon: args.macaroon,
preimage: args.preimage,
metadata: args.metadata,
service: args.service,
},
cbk);
@ -102,8 +95,7 @@ module.exports = (args, cbk) => {
case 'inbound':
return getSwapOutQuote({
delay: moment().add(swapDelay, 'minutes').toISOString(),
macaroon: args.macaroon,
preimage: args.preimage,
metadata: args.metadata,
service: args.service,
timeout: cltv - cltvDeltaBuffer,
tokens: args.tokens,
@ -112,8 +104,7 @@ module.exports = (args, cbk) => {
case 'outbound':
return getSwapInQuote({
macaroon: args.macaroon,
preimage: args.preimage,
metadata: args.metadata,
service: args.service,
tokens: args.tokens,
},

View file

@ -135,6 +135,7 @@ module.exports = (args, cbk) => {
}
return getSwapInQuote({
metadata: getService.metadata,
service: getService.service,
tokens: args.tokens,
},
@ -187,7 +188,11 @@ module.exports = (args, cbk) => {
return cbk();
}
return getSwapInTerms({service: getService.service}, cbk);
return getSwapInTerms({
metadata: getService.metadata,
service: getService.service,
},
cbk);
}],
// Initiate the swap
@ -212,8 +217,7 @@ module.exports = (args, cbk) => {
return createSwapIn({
fee: getQuote.fee,
in_through: args.in_through,
macaroon: getService.macaroon,
preimage: getService.preimage,
metadata: getService.metadata,
request: createInvoice.request,
service: getService.service,
},

View file

@ -348,8 +348,7 @@ module.exports = (args, cbk) => {
}
return getSwapOutTerms({
macaroon: getService.macaroon,
preimage: getService.preimage,
metadata: getService.metadata,
service: getService.service,
},
cbk);
@ -379,8 +378,7 @@ module.exports = (args, cbk) => {
return getSwapOutQuote({
delay: !args.is_fast ? fundAt.toISOString() : undefined,
macaroon: getService.macaroon,
preimage: getService.preimage,
metadata: getService.metadata,
service: getService.service,
timeout: getLimits.max_cltv_delta + startHeight,
tokens: args.tokens,
@ -482,8 +480,7 @@ module.exports = (args, cbk) => {
return createSwapOut({
network,
fund_at: fundAt.toISOString(),
macaroon: getService.macaroon,
preimage: getService.preimage,
metadata: getService.metadata,
service: getService.service,
timeout: getTimeout,
tokens: args.tokens,
@ -584,8 +581,7 @@ module.exports = (args, cbk) => {
const sub = subscribeToSwapOutStatus({
id: decodeFundingRequest.id,
macaroon: getService.macaroon,
preimage: getService.preimage,
metadata: getService.metadata,
service: getService.service,
});
@ -1415,8 +1411,7 @@ module.exports = (args, cbk) => {
}
return releaseSwapOutSecret({
auth_macaroon: getService.macaroon,
auth_preimage: getService.preimage,
metadata: getService.metadata,
secret: claim.secret,
service: getService.service,
},

View file

@ -34,8 +34,7 @@ const tests = [
args: makeArgs({}),
description: 'A paid service object is returned',
expected: {
macaroon,
preimage: Buffer.alloc(1, 1).toString('hex'),
metadata: {get: () => [Buffer.alloc(1, 1).toString('hex')]},
service: {},
token: makeToken(Buffer.from(macaroon, 'base64'), Buffer.alloc(1, 1)),
},

View file

@ -5,8 +5,7 @@ const {test} = require('tap');
const {getInfoResponse} = require('./../fixtures');
const {getSwapCost} = require('./../../swaps');
const macaroon = 'macaroon';
const preimage = 'preimage';
const metadata = {get: () => ['00']};
const makeLnd = ({}) => {
return {
@ -50,24 +49,23 @@ const makeTerms = ({max, min}) => ({
const tests = [
{
args: {macaroon, preimage, lnd: {}, logger: {}},
args: {metadata, lnd: {}, logger: {}},
description: 'Swap service is required',
error: [400, 'ExpectedSwapServiceToGetSwapCost'],
},
{
args: {macaroon, preimage, lnd: {}, logger: {}, service: {}},
args: {metadata, lnd: {}, logger: {}, service: {}},
description: 'Tokens are required',
error: [400, 'ExpectedTokensCountToGetSwapCost'],
},
{
args: {macaroon, preimage, lnd: {}, logger: {}, service: {}, tokens: 1},
args: {metadata, lnd: {}, logger: {}, service: {}, tokens: 1},
description: 'Swap type is required',
error: [400, 'ExpectedLiquidityTypeToGetSwapCost'],
},
{
args: {
macaroon,
preimage,
metadata,
lnd: {},
logger: {},
service: makeService({}),
@ -79,8 +77,7 @@ const tests = [
},
{
args: {
macaroon,
preimage,
metadata,
lnd: makeLnd({}),
logger: {},
service: {
@ -95,8 +92,7 @@ const tests = [
},
{
args: {
macaroon,
preimage,
metadata,
lnd: makeLnd({}),
logger: {},
service: {
@ -113,8 +109,7 @@ const tests = [
},
{
args: {
macaroon,
preimage,
metadata,
lnd: makeLnd({}),
logger: {},
service: makeService({}),