mirror of
https://github.com/alexbosworth/balanceofsatoshis.git
synced 2026-08-13 12:33:37 +02:00
update dependencies
This commit is contained in:
parent
231715d9fe
commit
deca37ca45
12 changed files with 805 additions and 1369 deletions
|
|
@ -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
5
bos
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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
1914
package-lock.json
generated
File diff suppressed because it is too large
Load diff
16
package.json
16
package.json
|
|
@ -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"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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)),
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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({}),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue