From e5508460b8908ad02db9268d71dfb2939e0919cd Mon Sep 17 00:00:00 2001 From: Alex Bosworth Date: Tue, 6 Oct 2020 22:23:43 -0700 Subject: [PATCH] fix testnet swaps --- CHANGELOG.md | 5 + bos | 28 +- network/execute_probe.js | 4 +- package-lock.json | 682 +++++++++++++--------------- package.json | 11 +- swaps/get_paid_service.js | 82 ++-- swaps/get_swap_cost.js | 61 +-- swaps/index.js | 2 + swaps/swap_api_key.js | 3 + swaps/swap_in.js | 9 +- swaps/swap_out.js | 7 + telegram/start_telegram_bot.js | 2 +- test/swaps/test_get_paid_service.js | 2 + test/swaps/test_get_swap_cost.js | 17 +- 14 files changed, 456 insertions(+), 459 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5489bda..dbee29b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Versions +## Version 6.2.1 + +- `chain-receive`: Fix method on testnet +- `increase-inbound-liquidity`: Fix method on testnet + ## Version 6.2.0 - `fees`: Allow specifying formulas with `--set-fee-rate`, including INBOUND_FEE_RATE diff --git a/bos b/bos index 48cdfb4..6868aef 100755 --- a/bos +++ b/bos @@ -9,6 +9,7 @@ const {statSync} = require('fs'); const {unlink} = require('fs'); const {writeFile} = require('fs'); +const fetch = require('node-fetch'); const {findKey} = require('ln-sync'); const inquirer = require('inquirer'); const prog = require('caporal'); @@ -38,12 +39,12 @@ const {getFeesPaid} = require('./routing'); const {getForwards} = require('./network'); const {getLiquidity} = require('./balances'); const {getLnds} = require('./lnd'); +const {getPaidService} = require('./swaps'); const {getPeers} = require('./network'); const {getPriceChart} = require('./fiat'); const {getReceivedChart} = require('./wallets'); const {getReport} = require('./wallets'); const {getSwapCost} = require('./swaps'); -const {getSwapService} = require('./swaps'); const {getUtxos} = require('./chain'); const {ignoreFromAvoid} = require('./routing'); const {lndCredentials} = require('./lnd'); @@ -220,11 +221,13 @@ prog .option('--node ', 'Node to receive funds on') .option('--recovery ', 'Attempt refund of swap') .option('--refund-address ', 'Refund address for swap') + .option('--service-socket ', 'host:port for service') .option('--test-refund', 'Reduce refund timeout height to test refund') .action((args, options, logger) => { return new Promise(async (resolve, reject) => { try { return swapIn({ + fetch, logger, api_key: options.apiKey || undefined, in_through: options.in || undefined, @@ -234,6 +237,7 @@ prog node: options.node, recovery: options.recovery, refund_address: options.refundAddress, + socket: options.serviceSocket || undefined, tokens: args.amount, }, returnObject({exit, logger, reject, resolve})); @@ -632,6 +636,7 @@ prog return new Promise(async (resolve, reject) => { try { return swapOut({ + fetch, logger, api_key: options.apiKey || undefined, avoid: flatten([options.avoid].filter(n => !!n)), @@ -695,22 +700,32 @@ prog .visible(false) .argument('', 'Liquidity direction', swapTypes) .argument('', 'Amount of liquidity to get quote for', INT) + .argument('', 'Swap API key to use', hexMatch) .option('--above ', 'Return amount above watermark', INT) - .option('--api-key ', 'Pre-paid API key to use', hexMatch) .option('--fast', 'Avoid any server batching wait time') .option('--node ', 'Node to get liquidity cost') + .option('--service-socket', 'Specify a custom swap service address') .action((args, options, logger) => { return new Promise(async (resolve, reject) => { try { - const {service} = await getSwapService({logger, node: options.node}); + const {lnd} = await authenticatedLnd({logger, node: options.node}); + + const {macaroon, preimage, service} = await getPaidService({ + fetch, + lnd, + logger, + socket: options.serviceSocket, + token: args.apiKey, + }); return getSwapCost({ + lnd, logger, + macaroon, + preimage, service, above: options.above, - api_key: options.apiKey || undefined, is_fast: options.fast || undefined, - lnd: (await authenticatedLnd({logger, node: options.node})).lnd, tokens: args.amount, type: args.type, }, @@ -1120,10 +1135,12 @@ prog .option('--macaroon ', 'Hex encoded macaroon of swap API key') .option('--node ', 'Node to use to pay for API key') .option('--preimage ', 'Hex encoded preimage of swap API key') + .option('--service-socket ', 'host:port for service') .action((args, options, logger) => { return new Promise(async (resolve, reject) => { try { return swapApiKey({ + fetch, logger, api_key: options.apiKey, is_purchase: options.purchase, @@ -1131,6 +1148,7 @@ prog macaroon: options.macaroon, node: options.node, preimage: options.preimage, + socket: options.serviceSocket, }, returnObject({logger, reject, resolve})); } catch (err) { diff --git a/network/execute_probe.js b/network/execute_probe.js index 4571ec1..33210f5 100644 --- a/network/execute_probe.js +++ b/network/execute_probe.js @@ -121,6 +121,8 @@ module.exports = (args, cbk) => { const method = !features ? subscribeToProbe : subscribeToProbeForRoute; + const timeoutMinutes = minutesAsMs((args.timeout_minutes || Number())); + const sub = method({ cltv_delta: args.cltv_delta, destination: args.destination, @@ -135,7 +137,7 @@ module.exports = (args, cbk) => { outgoing_channel: args.outgoing_channel, path_timeout_ms: pathTimeoutMs, payment: args.payment, - probe_timeout_ms: minutesAsMs((args.timeout_minutes || Number())), + probe_timeout_ms: timeoutMinutes || undefined, routes: args.routes, tokens: args.tokens, total_mtokens: mtokens, diff --git a/package-lock.json b/package-lock.json index a0b214b..017e46d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "balanceofsatoshis", - "version": "6.2.0", + "version": "6.2.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -249,9 +249,9 @@ "integrity": "sha512-LIbt3dAK7v7VPoDQ/hNO3KSlUdPLkO74m1A/c+guKhoBiY1192F2Nt0moHU0wyWw/sUV9zAnw1GPyGsS7401ZQ==" }, "@datastructures-js/priority-queue": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@datastructures-js/priority-queue/-/priority-queue-4.1.1.tgz", - "integrity": "sha512-2i9+/23VjcJRZrPRoQtuQwL8lMy/FVoRTMurZAV+1x0lZxCJjUUo8m83SC0ndCycFmiNjxdWVns/vsHWtj4bpQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@datastructures-js/priority-queue/-/priority-queue-4.1.2.tgz", + "integrity": "sha512-S4fXJcsPdqEp2bbKZlH7suSiZ0lqmIs8n5BXqQXB+7/lA9LSK/Ng0hIehTjgETfe7n3g4ZVLoyjEUWHEbHJFdQ==", "requires": { "@datastructures-js/heap": "^2.0.0" } @@ -363,11 +363,6 @@ "@types/node": "*" } }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" - }, "@types/long": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", @@ -670,9 +665,9 @@ "integrity": "sha512-Al3nHGQGqDYqqinXhQzmwmcRToe/3WyBv4N8aZc5Pef8xw2neZlR9VPi84Sa23JtgWcucu18HxVZrnI0fn2etw==" }, "bignumber.js": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", - "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" }, "binary-extensions": { "version": "2.1.0", @@ -856,9 +851,9 @@ } }, "bolt09": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/bolt09/-/bolt09-0.1.1.tgz", - "integrity": "sha512-BX1LjpvU7qLyv8LRpYsq7p6fM2SiECWtfwjzx2/cStT0YFJhS74qFw5CfivoRz6ZEg3W7g1Exrv0tmDRkKeBkA==" + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/bolt09/-/bolt09-0.1.2.tgz", + "integrity": "sha512-UcjCWM5w0ncmeLy+L1ghgWBmFUD7F+tvYpYw/pi1PLXMhRJ10gHFbPjzX2CTMsU0ICb8CisIFBsd16DWaUd4FA==" }, "boxen": { "version": "4.2.0", @@ -881,11 +876,10 @@ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -1945,18 +1939,18 @@ "dev": true }, "flow-parser": { - "version": "0.134.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.134.0.tgz", - "integrity": "sha512-VmRba5YXKmVqIH3xNzUJ4pNobxXEOl6h36m+0f5dZ6/av9YlRpls/yBnPESQ4qBUbyyp7iqoc1Feo1lFw3u1YQ==", + "version": "0.135.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.135.0.tgz", + "integrity": "sha512-ev8SvmG+XU9D6WgHVezP4kY3Myr1tJvTUTEi7mbhhj+rn889K7YXdakte6oqXNLIJYJ2f5Fuw18zXTVa1NO8Kw==", "dev": true }, "flow-remove-types": { - "version": "2.134.0", - "resolved": "https://registry.npmjs.org/flow-remove-types/-/flow-remove-types-2.134.0.tgz", - "integrity": "sha512-NVtghveE8GbU+980DRZQ0NZYGE7l7FIZm/UU8Ft7QoFgpsU8Tauv/WRLX+Exj4WT+GbAndmyUWZFOtcBfeT+gg==", + "version": "2.135.0", + "resolved": "https://registry.npmjs.org/flow-remove-types/-/flow-remove-types-2.135.0.tgz", + "integrity": "sha512-l/9INhkrrTD+91k35P0eiF94E1cOpjfd86WVVqRwQRjamjSwTKKgu7MDLel3DGmBB09I2AXv7IjacNiwt0yc1g==", "dev": true, "requires": { - "flow-parser": "^0.134.0", + "flow-parser": "^0.135.0", "pirates": "^3.0.2", "vlq": "^0.2.1" } @@ -2109,9 +2103,9 @@ "dev": true }, "goldengate": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/goldengate/-/goldengate-7.0.2.tgz", - "integrity": "sha512-ION2SoSTsePG9boPyREvPbH0f3bz9ZnYfUUaZsgPlEwj+od7+vGvHTQRdEvg3hl4Yod2U+gxNG7SpMHsY9Yuaw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/goldengate/-/goldengate-7.1.0.tgz", + "integrity": "sha512-LwQDMX/kEKqBUoaBI8ssgbJ9f1HWbRv62pMbMfIjGxqrH4HSB8fd3ZkMBqDLicA4J5LfFIxvUjn5aqo6KgvVvg==", "requires": { "@grpc/proto-loader": "0.5.5", "@mitmaro/http-authorization-header": "1.0.0", @@ -2124,95 +2118,17 @@ "bn.js": "5.1.3", "cbor": "5.1.0", "grpc": "1.24.3", - "ln-service": "49.10.0", + "ln-service": "49.14.0", "macaroon": "3.0.4", + "node-fetch": "2.6.1", "pushdata-bitcoin": "1.0.1", "varuint-bitcoin": "1.1.2" }, "dependencies": { - "bip174": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bip174/-/bip174-1.0.1.tgz", - "integrity": "sha512-Mq2aFs1TdMfxBpYPg7uzjhsiXbAtoVq44TNjEWtvuZBiBgc3m7+n55orYMtTAxdg7jWbL4DtH0MKocJER4xERQ==" - }, "bn.js": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==" - }, - "bolt07": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/bolt07/-/bolt07-1.5.2.tgz", - "integrity": "sha512-P7LNOnBLtRYe0v30JvVR2xVvWWNrUt4IZ19njFRJb1NMhEx2xe+O0G7x4WZTWB7bHPAdkfR76l9F7jEVxizjlQ==", - "requires": { - "bn.js": "5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", - "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==" - } - } - }, - "invoices": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/invoices/-/invoices-1.1.3.tgz", - "integrity": "sha512-+RZmDmgVXvn6hAzGUqdl+1q8lEm9Th5XO/yg2aAIHpxhBc+BrrdCaMjjsk+weoZp9jm6LA92Dt2bzo+4ou1SVw==", - "requires": { - "bech32": "1.1.4", - "bitcoinjs-lib": "5.1.10", - "bn.js": "5.1.3", - "bolt07": "1.5.2", - "bolt09": "0.1.1", - "secp256k1": "4.0.2" - }, - "dependencies": { - "bitcoinjs-lib": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-5.1.10.tgz", - "integrity": "sha512-CesUqtBtnYc+SOMsYN9jWQWhdohW1MpklUkF7Ukn4HiAyN6yxykG+cIJogfRt6x5xcgH87K1Q+Mnoe/B+du1Iw==", - "requires": { - "bech32": "^1.1.2", - "bip174": "^1.0.1", - "bip32": "^2.0.4", - "bip66": "^1.1.0", - "bitcoin-ops": "^1.4.0", - "bs58check": "^2.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.3", - "merkle-lib": "^2.0.10", - "pushdata-bitcoin": "^1.0.1", - "randombytes": "^2.0.1", - "tiny-secp256k1": "^1.1.1", - "typeforce": "^1.11.3", - "varuint-bitcoin": "^1.0.4", - "wif": "^2.0.1" - } - } - } - }, - "ln-service": { - "version": "49.10.0", - "resolved": "https://registry.npmjs.org/ln-service/-/ln-service-49.10.0.tgz", - "integrity": "sha512-XK3gFc+Qowy9SquJ37UUktn61dlyoAR/4eN6eV2WPSY4DaSahZ/Xwe9j3ljXnZjTL5FClNzAfPwAhS/ljrgbhw==", - "requires": { - "@datastructures-js/priority-queue": "4.1.1", - "async": "3.2.0", - "asyncjs-util": "1.2.3", - "bitcoinjs-lib": "5.2.0", - "bn.js": "5.1.3", - "bolt07": "1.5.2", - "bolt09": "0.1.1", - "cors": "2.8.5", - "express": "4.17.1", - "invoices": "1.1.3", - "is-base64": "1.1.0", - "lightning": "2.0.44", - "macaroon": "3.0.4", - "morgan": "1.10.0", - "ws": "7.3.1" - } } } }, @@ -2501,11 +2417,10 @@ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -2634,11 +2549,6 @@ "version": "5.1.3", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==" - }, - "bolt09": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/bolt09/-/bolt09-0.1.2.tgz", - "integrity": "sha512-UcjCWM5w0ncmeLy+L1ghgWBmFUD7F+tvYpYw/pi1PLXMhRJ10gHFbPjzX2CTMsU0ICb8CisIFBsd16DWaUd4FA==" } } }, @@ -3114,9 +3024,9 @@ "dev": true }, "lightning": { - "version": "2.0.44", - "resolved": "https://registry.npmjs.org/lightning/-/lightning-2.0.44.tgz", - "integrity": "sha512-Xi8C0FmxIZ1Pg23JlXRoXc7ELEtskiWI7jfcdr1oYWpVlNxUJKc4ALrUMofqo+EXaoHhtEvc6byyHtxuNl6iLw==", + "version": "2.0.54", + "resolved": "https://registry.npmjs.org/lightning/-/lightning-2.0.54.tgz", + "integrity": "sha512-NbKno+RNlOUIIND9s5DwfBwPvUcEfWhaiRKHzOsOJB9NZZUgzczjSK9aO84yd5Sen/fauMyA0jNHbBdBp7jtqQ==", "requires": { "@grpc/proto-loader": "0.5.5", "async": "3.2.0", @@ -3124,75 +3034,19 @@ "bitcoinjs-lib": "5.2.0", "bn.js": "5.1.3", "body-parser": "1.19.0", - "bolt07": "1.5.2", - "bolt09": "0.1.1", + "bolt07": "1.6.0", + "bolt09": "0.1.2", "cbor": "5.1.0", "express": "4.17.1", "grpc": "1.24.3", - "invoices": "1.1.3" + "invoices": "1.1.4", + "psbt": "1.1.5" }, "dependencies": { - "bip174": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bip174/-/bip174-1.0.1.tgz", - "integrity": "sha512-Mq2aFs1TdMfxBpYPg7uzjhsiXbAtoVq44TNjEWtvuZBiBgc3m7+n55orYMtTAxdg7jWbL4DtH0MKocJER4xERQ==" - }, "bn.js": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==" - }, - "bolt07": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/bolt07/-/bolt07-1.5.2.tgz", - "integrity": "sha512-P7LNOnBLtRYe0v30JvVR2xVvWWNrUt4IZ19njFRJb1NMhEx2xe+O0G7x4WZTWB7bHPAdkfR76l9F7jEVxizjlQ==", - "requires": { - "bn.js": "5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", - "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==" - } - } - }, - "invoices": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/invoices/-/invoices-1.1.3.tgz", - "integrity": "sha512-+RZmDmgVXvn6hAzGUqdl+1q8lEm9Th5XO/yg2aAIHpxhBc+BrrdCaMjjsk+weoZp9jm6LA92Dt2bzo+4ou1SVw==", - "requires": { - "bech32": "1.1.4", - "bitcoinjs-lib": "5.1.10", - "bn.js": "5.1.3", - "bolt07": "1.5.2", - "bolt09": "0.1.1", - "secp256k1": "4.0.2" - }, - "dependencies": { - "bitcoinjs-lib": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-5.1.10.tgz", - "integrity": "sha512-CesUqtBtnYc+SOMsYN9jWQWhdohW1MpklUkF7Ukn4HiAyN6yxykG+cIJogfRt6x5xcgH87K1Q+Mnoe/B+du1Iw==", - "requires": { - "bech32": "^1.1.2", - "bip174": "^1.0.1", - "bip32": "^2.0.4", - "bip66": "^1.1.0", - "bitcoin-ops": "^1.4.0", - "bs58check": "^2.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.3", - "merkle-lib": "^2.0.10", - "pushdata-bitcoin": "^1.0.1", - "randombytes": "^2.0.1", - "tiny-secp256k1": "^1.1.1", - "typeforce": "^1.11.3", - "varuint-bitcoin": "^1.0.4", - "wif": "^2.0.1" - } - } - } } } }, @@ -3208,6 +3062,14 @@ "ln-service": "49.10.0" }, "dependencies": { + "@datastructures-js/priority-queue": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@datastructures-js/priority-queue/-/priority-queue-4.1.1.tgz", + "integrity": "sha512-2i9+/23VjcJRZrPRoQtuQwL8lMy/FVoRTMurZAV+1x0lZxCJjUUo8m83SC0ndCycFmiNjxdWVns/vsHWtj4bpQ==", + "requires": { + "@datastructures-js/heap": "^2.0.0" + } + }, "bip174": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/bip174/-/bip174-1.0.1.tgz", @@ -3233,6 +3095,33 @@ } } }, + "bolt09": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/bolt09/-/bolt09-0.1.1.tgz", + "integrity": "sha512-BX1LjpvU7qLyv8LRpYsq7p6fM2SiECWtfwjzx2/cStT0YFJhS74qFw5CfivoRz6ZEg3W7g1Exrv0tmDRkKeBkA==" + }, + "goldengate": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/goldengate/-/goldengate-7.0.2.tgz", + "integrity": "sha512-ION2SoSTsePG9boPyREvPbH0f3bz9ZnYfUUaZsgPlEwj+od7+vGvHTQRdEvg3hl4Yod2U+gxNG7SpMHsY9Yuaw==", + "requires": { + "@grpc/proto-loader": "0.5.5", + "@mitmaro/http-authorization-header": "1.0.0", + "async": "3.2.0", + "asyncjs-util": "1.2.3", + "bip65": "1.0.3", + "bip68": "1.0.4", + "bitcoin-ops": "1.4.1", + "bitcoinjs-lib": "5.2.0", + "bn.js": "5.1.3", + "cbor": "5.1.0", + "grpc": "1.24.3", + "ln-service": "49.10.0", + "macaroon": "3.0.4", + "pushdata-bitcoin": "1.0.1", + "varuint-bitcoin": "1.1.2" + } + }, "invoices": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/invoices/-/invoices-1.1.3.tgz", @@ -3270,6 +3159,25 @@ } } }, + "lightning": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/lightning/-/lightning-2.0.44.tgz", + "integrity": "sha512-Xi8C0FmxIZ1Pg23JlXRoXc7ELEtskiWI7jfcdr1oYWpVlNxUJKc4ALrUMofqo+EXaoHhtEvc6byyHtxuNl6iLw==", + "requires": { + "@grpc/proto-loader": "0.5.5", + "async": "3.2.0", + "asyncjs-util": "1.2.3", + "bitcoinjs-lib": "5.2.0", + "bn.js": "5.1.3", + "body-parser": "1.19.0", + "bolt07": "1.5.2", + "bolt09": "0.1.1", + "cbor": "5.1.0", + "express": "4.17.1", + "grpc": "1.24.3", + "invoices": "1.1.3" + } + }, "ln-service": { "version": "49.10.0", "resolved": "https://registry.npmjs.org/ln-service/-/ln-service-49.10.0.tgz", @@ -3295,9 +3203,9 @@ } }, "ln-service": { - "version": "49.12.0", - "resolved": "https://registry.npmjs.org/ln-service/-/ln-service-49.12.0.tgz", - "integrity": "sha512-giGNeXH/d2vpzny9HdxTp7DSHN+gnL2Qz8U4RHW5sIOOdc4dXR4E/G1H5cpKovX0Ix4IuQ8FlyvwwXwMHPJHEw==", + "version": "49.14.0", + "resolved": "https://registry.npmjs.org/ln-service/-/ln-service-49.14.0.tgz", + "integrity": "sha512-01CoIfdo1vRQfc3siVGAZEDaKv3IrAwpjLLCtOa8aYxIwjQN+a7YC4GIBysbxiOaF0E+eZZIGz8Y76U7zWHhEQ==", "requires": { "@datastructures-js/priority-queue": "4.1.2", "async": "3.2.0", @@ -3310,48 +3218,16 @@ "express": "4.17.1", "invoices": "1.1.4", "is-base64": "1.1.0", - "lightning": "2.0.50", + "lightning": "2.0.54", "macaroon": "3.0.4", "morgan": "1.10.0", "ws": "7.3.1" }, "dependencies": { - "@datastructures-js/priority-queue": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@datastructures-js/priority-queue/-/priority-queue-4.1.2.tgz", - "integrity": "sha512-S4fXJcsPdqEp2bbKZlH7suSiZ0lqmIs8n5BXqQXB+7/lA9LSK/Ng0hIehTjgETfe7n3g4ZVLoyjEUWHEbHJFdQ==", - "requires": { - "@datastructures-js/heap": "^2.0.0" - } - }, "bn.js": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==" - }, - "bolt09": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/bolt09/-/bolt09-0.1.2.tgz", - "integrity": "sha512-UcjCWM5w0ncmeLy+L1ghgWBmFUD7F+tvYpYw/pi1PLXMhRJ10gHFbPjzX2CTMsU0ICb8CisIFBsd16DWaUd4FA==" - }, - "lightning": { - "version": "2.0.50", - "resolved": "https://registry.npmjs.org/lightning/-/lightning-2.0.50.tgz", - "integrity": "sha512-vLD7N0OH5prJ+Ebt0lYestUuVKRmqMapH00jK+SR8IxIxzT6JM/KpMSJNWujUkP6yRSwBPF7QSUrIf/U1nk/FQ==", - "requires": { - "@grpc/proto-loader": "0.5.5", - "async": "3.2.0", - "asyncjs-util": "1.2.3", - "bitcoinjs-lib": "5.2.0", - "bn.js": "5.1.3", - "body-parser": "1.19.0", - "bolt07": "1.6.0", - "bolt09": "0.1.2", - "cbor": "5.1.0", - "express": "4.17.1", - "grpc": "1.24.3", - "invoices": "1.1.4" - } } } }, @@ -3375,11 +3251,6 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==" }, - "bolt09": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/bolt09/-/bolt09-0.1.2.tgz", - "integrity": "sha512-UcjCWM5w0ncmeLy+L1ghgWBmFUD7F+tvYpYw/pi1PLXMhRJ10gHFbPjzX2CTMsU0ICb8CisIFBsd16DWaUd4FA==" - }, "lightning": { "version": "2.0.49", "resolved": "https://registry.npmjs.org/lightning/-/lightning-2.0.49.tgz", @@ -3417,27 +3288,130 @@ }, "dependencies": { "@datastructures-js/priority-queue": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@datastructures-js/priority-queue/-/priority-queue-4.1.2.tgz", - "integrity": "sha512-S4fXJcsPdqEp2bbKZlH7suSiZ0lqmIs8n5BXqQXB+7/lA9LSK/Ng0hIehTjgETfe7n3g4ZVLoyjEUWHEbHJFdQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@datastructures-js/priority-queue/-/priority-queue-4.1.1.tgz", + "integrity": "sha512-2i9+/23VjcJRZrPRoQtuQwL8lMy/FVoRTMurZAV+1x0lZxCJjUUo8m83SC0ndCycFmiNjxdWVns/vsHWtj4bpQ==", "requires": { "@datastructures-js/heap": "^2.0.0" } }, + "bip174": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bip174/-/bip174-1.0.1.tgz", + "integrity": "sha512-Mq2aFs1TdMfxBpYPg7uzjhsiXbAtoVq44TNjEWtvuZBiBgc3m7+n55orYMtTAxdg7jWbL4DtH0MKocJER4xERQ==" + }, "bn.js": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==" }, + "bolt07": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/bolt07/-/bolt07-1.5.2.tgz", + "integrity": "sha512-P7LNOnBLtRYe0v30JvVR2xVvWWNrUt4IZ19njFRJb1NMhEx2xe+O0G7x4WZTWB7bHPAdkfR76l9F7jEVxizjlQ==", + "requires": { + "bn.js": "5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", + "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==" + } + } + }, "bolt09": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/bolt09/-/bolt09-0.1.2.tgz", - "integrity": "sha512-UcjCWM5w0ncmeLy+L1ghgWBmFUD7F+tvYpYw/pi1PLXMhRJ10gHFbPjzX2CTMsU0ICb8CisIFBsd16DWaUd4FA==" + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/bolt09/-/bolt09-0.1.1.tgz", + "integrity": "sha512-BX1LjpvU7qLyv8LRpYsq7p6fM2SiECWtfwjzx2/cStT0YFJhS74qFw5CfivoRz6ZEg3W7g1Exrv0tmDRkKeBkA==" + }, + "goldengate": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/goldengate/-/goldengate-7.0.2.tgz", + "integrity": "sha512-ION2SoSTsePG9boPyREvPbH0f3bz9ZnYfUUaZsgPlEwj+od7+vGvHTQRdEvg3hl4Yod2U+gxNG7SpMHsY9Yuaw==", + "requires": { + "@grpc/proto-loader": "0.5.5", + "@mitmaro/http-authorization-header": "1.0.0", + "async": "3.2.0", + "asyncjs-util": "1.2.3", + "bip65": "1.0.3", + "bip68": "1.0.4", + "bitcoin-ops": "1.4.1", + "bitcoinjs-lib": "5.2.0", + "bn.js": "5.1.3", + "cbor": "5.1.0", + "grpc": "1.24.3", + "ln-service": "49.10.0", + "macaroon": "3.0.4", + "pushdata-bitcoin": "1.0.1", + "varuint-bitcoin": "1.1.2" + }, + "dependencies": { + "invoices": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/invoices/-/invoices-1.1.3.tgz", + "integrity": "sha512-+RZmDmgVXvn6hAzGUqdl+1q8lEm9Th5XO/yg2aAIHpxhBc+BrrdCaMjjsk+weoZp9jm6LA92Dt2bzo+4ou1SVw==", + "requires": { + "bech32": "1.1.4", + "bitcoinjs-lib": "5.1.10", + "bn.js": "5.1.3", + "bolt07": "1.5.2", + "bolt09": "0.1.1", + "secp256k1": "4.0.2" + }, + "dependencies": { + "bitcoinjs-lib": { + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-5.1.10.tgz", + "integrity": "sha512-CesUqtBtnYc+SOMsYN9jWQWhdohW1MpklUkF7Ukn4HiAyN6yxykG+cIJogfRt6x5xcgH87K1Q+Mnoe/B+du1Iw==", + "requires": { + "bech32": "^1.1.2", + "bip174": "^1.0.1", + "bip32": "^2.0.4", + "bip66": "^1.1.0", + "bitcoin-ops": "^1.4.0", + "bs58check": "^2.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.3", + "merkle-lib": "^2.0.10", + "pushdata-bitcoin": "^1.0.1", + "randombytes": "^2.0.1", + "tiny-secp256k1": "^1.1.1", + "typeforce": "^1.11.3", + "varuint-bitcoin": "^1.0.4", + "wif": "^2.0.1" + } + } + } + }, + "ln-service": { + "version": "49.10.0", + "resolved": "https://registry.npmjs.org/ln-service/-/ln-service-49.10.0.tgz", + "integrity": "sha512-XK3gFc+Qowy9SquJ37UUktn61dlyoAR/4eN6eV2WPSY4DaSahZ/Xwe9j3ljXnZjTL5FClNzAfPwAhS/ljrgbhw==", + "requires": { + "@datastructures-js/priority-queue": "4.1.1", + "async": "3.2.0", + "asyncjs-util": "1.2.3", + "bitcoinjs-lib": "5.2.0", + "bn.js": "5.1.3", + "bolt07": "1.5.2", + "bolt09": "0.1.1", + "cors": "2.8.5", + "express": "4.17.1", + "invoices": "1.1.3", + "is-base64": "1.1.0", + "lightning": "2.0.44", + "macaroon": "3.0.4", + "morgan": "1.10.0", + "ws": "7.3.1" + } + } + } }, "lightning": { - "version": "2.0.50", - "resolved": "https://registry.npmjs.org/lightning/-/lightning-2.0.50.tgz", - "integrity": "sha512-vLD7N0OH5prJ+Ebt0lYestUuVKRmqMapH00jK+SR8IxIxzT6JM/KpMSJNWujUkP6yRSwBPF7QSUrIf/U1nk/FQ==", + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/lightning/-/lightning-2.0.44.tgz", + "integrity": "sha512-Xi8C0FmxIZ1Pg23JlXRoXc7ELEtskiWI7jfcdr1oYWpVlNxUJKc4ALrUMofqo+EXaoHhtEvc6byyHtxuNl6iLw==", "requires": { "@grpc/proto-loader": "0.5.5", "async": "3.2.0", @@ -3445,12 +3419,51 @@ "bitcoinjs-lib": "5.2.0", "bn.js": "5.1.3", "body-parser": "1.19.0", - "bolt07": "1.6.0", - "bolt09": "0.1.2", + "bolt07": "1.5.2", + "bolt09": "0.1.1", "cbor": "5.1.0", "express": "4.17.1", "grpc": "1.24.3", - "invoices": "1.1.4" + "invoices": "1.1.3" + }, + "dependencies": { + "invoices": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/invoices/-/invoices-1.1.3.tgz", + "integrity": "sha512-+RZmDmgVXvn6hAzGUqdl+1q8lEm9Th5XO/yg2aAIHpxhBc+BrrdCaMjjsk+weoZp9jm6LA92Dt2bzo+4ou1SVw==", + "requires": { + "bech32": "1.1.4", + "bitcoinjs-lib": "5.1.10", + "bn.js": "5.1.3", + "bolt07": "1.5.2", + "bolt09": "0.1.1", + "secp256k1": "4.0.2" + }, + "dependencies": { + "bitcoinjs-lib": { + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-5.1.10.tgz", + "integrity": "sha512-CesUqtBtnYc+SOMsYN9jWQWhdohW1MpklUkF7Ukn4HiAyN6yxykG+cIJogfRt6x5xcgH87K1Q+Mnoe/B+du1Iw==", + "requires": { + "bech32": "^1.1.2", + "bip174": "^1.0.1", + "bip32": "^2.0.4", + "bip66": "^1.1.0", + "bitcoin-ops": "^1.4.0", + "bs58check": "^2.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.3", + "merkle-lib": "^2.0.10", + "pushdata-bitcoin": "^1.0.1", + "randombytes": "^2.0.1", + "tiny-secp256k1": "^1.1.1", + "typeforce": "^1.11.3", + "varuint-bitcoin": "^1.0.4", + "wif": "^2.0.1" + } + } + } + } } }, "ln-service": { @@ -3473,6 +3486,48 @@ "macaroon": "3.0.4", "morgan": "1.10.0", "ws": "7.3.1" + }, + "dependencies": { + "@datastructures-js/priority-queue": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@datastructures-js/priority-queue/-/priority-queue-4.1.2.tgz", + "integrity": "sha512-S4fXJcsPdqEp2bbKZlH7suSiZ0lqmIs8n5BXqQXB+7/lA9LSK/Ng0hIehTjgETfe7n3g4ZVLoyjEUWHEbHJFdQ==", + "requires": { + "@datastructures-js/heap": "^2.0.0" + } + }, + "bolt07": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/bolt07/-/bolt07-1.6.0.tgz", + "integrity": "sha512-c+o1FdDxsmrCmrcqW6YRpk/dHDXk3frqHd1552b0JMXM2Kp6K74dbj74vioeYYUTzwyXB3zZFh9g2OZBg3JcYQ==", + "requires": { + "bn.js": "5.1.3" + } + }, + "bolt09": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/bolt09/-/bolt09-0.1.2.tgz", + "integrity": "sha512-UcjCWM5w0ncmeLy+L1ghgWBmFUD7F+tvYpYw/pi1PLXMhRJ10gHFbPjzX2CTMsU0ICb8CisIFBsd16DWaUd4FA==" + }, + "lightning": { + "version": "2.0.50", + "resolved": "https://registry.npmjs.org/lightning/-/lightning-2.0.50.tgz", + "integrity": "sha512-vLD7N0OH5prJ+Ebt0lYestUuVKRmqMapH00jK+SR8IxIxzT6JM/KpMSJNWujUkP6yRSwBPF7QSUrIf/U1nk/FQ==", + "requires": { + "@grpc/proto-loader": "0.5.5", + "async": "3.2.0", + "asyncjs-util": "1.2.3", + "bitcoinjs-lib": "5.2.0", + "bn.js": "5.1.3", + "body-parser": "1.19.0", + "bolt07": "1.6.0", + "bolt09": "0.1.2", + "cbor": "5.1.0", + "express": "4.17.1", + "grpc": "1.24.3", + "invoices": "1.1.4" + } + } } } } @@ -3773,9 +3828,9 @@ "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==" }, "moment": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.0.tgz", - "integrity": "sha512-z6IJ5HXYiuxvFTI6eiQ9dm77uE0gyy1yXNApVHqTcnIKfY9tIwEjlzsZ6u1LQXvVgKeTnv9Xm7NDvJ7lso3MtA==" + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" }, "morgan": { "version": "1.10.0", @@ -4557,130 +4612,15 @@ } }, "probing": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/probing/-/probing-1.2.0.tgz", - "integrity": "sha512-i8VEApQgD8jI5V2taxOpIFSGSqtrC4lfNLFwf0j7YHBjStCCXpBqgO+a4iQVBOcb5TWk2yN99nqxvnPPIIasew==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/probing/-/probing-1.2.1.tgz", + "integrity": "sha512-G1xDei0tamsy0fRsXzAB6dxb4PVhUNkV3ogwjNOQaFanFTNuax1m/wDQrRwMPLTA9pqGniQnWpwDjFAQmb+gpg==", "requires": { "async": "3.2.0", "asyncjs-util": "1.2.3", - "bolt07": "1.5.2", - "invoices": "1.1.1", - "ln-service": "49.4.2" - }, - "dependencies": { - "bip174": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bip174/-/bip174-1.0.1.tgz", - "integrity": "sha512-Mq2aFs1TdMfxBpYPg7uzjhsiXbAtoVq44TNjEWtvuZBiBgc3m7+n55orYMtTAxdg7jWbL4DtH0MKocJER4xERQ==" - }, - "bitcoinjs-lib": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-5.1.10.tgz", - "integrity": "sha512-CesUqtBtnYc+SOMsYN9jWQWhdohW1MpklUkF7Ukn4HiAyN6yxykG+cIJogfRt6x5xcgH87K1Q+Mnoe/B+du1Iw==", - "requires": { - "bech32": "^1.1.2", - "bip174": "^1.0.1", - "bip32": "^2.0.4", - "bip66": "^1.1.0", - "bitcoin-ops": "^1.4.0", - "bs58check": "^2.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.3", - "merkle-lib": "^2.0.10", - "pushdata-bitcoin": "^1.0.1", - "randombytes": "^2.0.1", - "tiny-secp256k1": "^1.1.1", - "typeforce": "^1.11.3", - "varuint-bitcoin": "^1.0.4", - "wif": "^2.0.1" - } - }, - "bn.js": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", - "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==" - }, - "bolt07": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/bolt07/-/bolt07-1.5.2.tgz", - "integrity": "sha512-P7LNOnBLtRYe0v30JvVR2xVvWWNrUt4IZ19njFRJb1NMhEx2xe+O0G7x4WZTWB7bHPAdkfR76l9F7jEVxizjlQ==", - "requires": { - "bn.js": "5.1.2" - } - }, - "cbor": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.0.2.tgz", - "integrity": "sha512-6JiKVURxxO92FntzTJq54QdN/8fBaBwD7+nNyGIAi1HL9mBgU3YK6ULV8k7WTuT/EwfRsjy3MuqDKlkQMCmfXg==", - "requires": { - "bignumber.js": "^9.0.0", - "nofilter": "^1.0.3" - } - }, - "invoices": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/invoices/-/invoices-1.1.1.tgz", - "integrity": "sha512-vcqo6soFOi+BXbirhuw1KRsL9GKmIbG150dk8Pb5SH/GfECxxEJwnY6DX4qcHylTy3GJSfAsiBT2jFgpls33Aw==", - "requires": { - "bech32": "1.1.4", - "bitcoinjs-lib": "5.1.10", - "bn.js": "5.1.2", - "bolt07": "1.5.2", - "bolt09": "0.1.1", - "secp256k1": "4.0.1" - } - }, - "lightning": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/lightning/-/lightning-2.0.30.tgz", - "integrity": "sha512-XZFefXdOE4kPa/C533MwnTpgfidwM6M9s0Mtg7U0jmDA5dRB9VmMU8zssBAeo+cZ46fXEx7fz4lXLGQ6V7opUw==", - "requires": { - "@grpc/proto-loader": "0.5.5", - "async": "3.2.0", - "asyncjs-util": "1.2.3", - "bitcoinjs-lib": "5.1.10", - "bn.js": "5.1.2", - "body-parser": "1.19.0", - "bolt07": "1.5.2", - "bolt09": "0.1.1", - "cbor": "5.0.2", - "express": "4.17.1", - "grpc": "1.24.3", - "invoices": "1.1.1" - } - }, - "ln-service": { - "version": "49.4.2", - "resolved": "https://registry.npmjs.org/ln-service/-/ln-service-49.4.2.tgz", - "integrity": "sha512-ePUaLFWUEfz+QYAeaAvSAiHL33IpQILAEbMPFPc0KQ9/gFlWgnLDwBQmlIona2G10xePfOhTbaKz8Mjy0bQ+OA==", - "requires": { - "@datastructures-js/priority-queue": "4.1.1", - "async": "3.2.0", - "asyncjs-util": "1.2.3", - "bitcoinjs-lib": "5.1.10", - "bn.js": "5.1.2", - "bolt07": "1.5.2", - "bolt09": "0.1.1", - "cors": "2.8.5", - "express": "4.17.1", - "invoices": "1.1.1", - "is-base64": "1.1.0", - "lightning": "2.0.30", - "macaroon": "3.0.4", - "morgan": "1.10.0", - "ws": "7.3.1" - } - }, - "secp256k1": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.1.tgz", - "integrity": "sha512-iGRjbGAKfXMqhtdkkuNxsgJQfJO8Oo78Rm7DAvsG3XKngq+nJIOGqrCSXcQqIVsmCj0wFanE5uTKFxV3T9j2wg==", - "requires": { - "elliptic": "^6.5.2", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - } - } + "bolt07": "1.6.0", + "invoices": "1.1.4", + "ln-service": "49.14.0" } }, "process-nextick-args": { @@ -4720,9 +4660,9 @@ }, "dependencies": { "@types/node": { - "version": "13.13.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.21.tgz", - "integrity": "sha512-tlFWakSzBITITJSxHV4hg4KvrhR/7h3xbJdSFbYJBVzKubrASbnnIFuSgolUh7qKGo/ZeJPKUfbZ0WS6Jp14DQ==" + "version": "13.13.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.23.tgz", + "integrity": "sha512-L31WmMJYKb15PDqFWutn8HNwrNK6CE6bkWgSB0dO1XpNoHrszVKV1Clcnfgd6c/oG54TVF8XQEvY2gQrW8K6Mw==" } } }, @@ -5263,11 +5203,10 @@ }, "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -6985,9 +6924,9 @@ } }, "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.0.tgz", + "integrity": "sha512-+Zw5lu0D9tvBMjGP8LpvMb0u2WW2QV3y+D8mO6J+cNzCYIN4sVy43Bf9vl92nqFahutN0I8zHa7cc4vihIshnw==" }, "tunnel-agent": { "version": "0.6.0", @@ -7107,11 +7046,10 @@ }, "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, diff --git a/package.json b/package.json index 2210235..a661013 100644 --- a/package.json +++ b/package.json @@ -25,17 +25,18 @@ "colorette": "1.2.1", "crypto-js": "4.0.0", "csv-parse": "4.12.0", - "goldengate": "7.0.2", + "goldengate": "7.1.0", "hot-formula-parser": "3.0.2", "ini": "1.3.5", "inquirer": "7.3.3", "invoices": "1.1.4", "ln-accounting": "4.1.10", - "ln-service": "49.12.0", + "ln-service": "49.14.0", "ln-sync": "0.3.0", "ln-telegram": "1.1.0", - "moment": "2.29.0", - "probing": "1.2.0", + "moment": "2.29.1", + "node-fetch": "2.6.1", + "probing": "1.2.1", "psbt": "1.1.5", "qrcode-terminal": "0.12.0", "sanitize-filename": "1.6.3", @@ -72,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": "6.2.0" + "version": "6.2.1" } diff --git a/swaps/get_paid_service.js b/swaps/get_paid_service.js index 9bd665d..2b9e21c 100644 --- a/swaps/get_paid_service.js +++ b/swaps/get_paid_service.js @@ -1,5 +1,6 @@ const asyncAuto = require('async/auto'); const {encode} = require('cbor'); +const {genericSwapService} = require('goldengate'); const {getNetwork} = require('ln-sync'); const {getSwapMacaroon} = require('goldengate'); const {lightningLabsSwapService} = require('goldengate'); @@ -10,12 +11,18 @@ const {swapUserId} = require('goldengate'); const decodeSwapApiKey = require('./decode_swap_api_key'); const {probeDestination} = require('./../network'); +const bitcoinTestnetNetwork = 'btctestnet'; +const bufferFromBase64 = base64 => Buffer.from(base64, 'base64'); +const bufferFromHex = hex => Buffer.from(hex, 'hex'); const encodeCbor = json => encode(json).toString('hex'); +const httpMatch = /^https?:\/\//; const maxRoutingFee = 100; +const testnetSocket = 'https://balanceofsatoshis.com:11010'; /** Get a paid swap service object { + fetch: lnd: logger: [socket]: @@ -32,11 +39,15 @@ const maxRoutingFee = 100; token: } */ -module.exports = ({lnd, logger, socket, token}, cbk) => { +module.exports = ({fetch, lnd, logger, socket, token}, cbk) => { return new Promise((resolve, reject) => { return asyncAuto({ // Check arguments validate: cbk => { + if (!fetch) { + return cbk([400, 'ExpectedFetchFunctionToGetPaidService']); + } + if (!lnd) { return cbk([400, 'ExpectedLndToGetPaidService']); } @@ -61,11 +72,36 @@ module.exports = ({lnd, logger, socket, token}, cbk) => { // Get network getNetwork: ['validate', ({}, cbk) => getNetwork({lnd}, cbk)], + // Make a service object for the remote swap service + remote: ['getNetwork', ({getNetwork}, cbk) => { + // Exit early when using a generic service + if (!!socket && httpMatch.test(socket)) { + try { + return cbk(null, genericSwapService({fetch, socket})); + } 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})); + } catch (err) { + return cbk([500, 'UnexpectedErrorInitiatingSwapService', {err}]); + } + }], + // Get an unpaid swap macaroon getUnpaidMacaroon: [ 'decodeToken', - 'getNetwork', - ({decodeToken, getNetwork}, cbk) => + 'remote', + ({decodeToken, remote}, cbk) => { // Exit early when there is already a service token macaroon if (!!decodeToken) { @@ -75,17 +111,7 @@ module.exports = ({lnd, logger, socket, token}, cbk) => { }); } - const {network} = getNetwork; - - try { - lightningLabsSwapService({network, socket}); - } catch (err) { - return cbk([400, 'UnexpectedErrorInitiatingSwapService', {err}]); - } - - const {service} = lightningLabsSwapService({network, socket}); - - return getSwapMacaroon({service}, cbk); + return getSwapMacaroon({service: remote.service}, cbk); }], // Pay for the macaroon @@ -110,44 +136,32 @@ module.exports = ({lnd, logger, socket, token}, cbk) => { cbk); }], - // Get the paid service object - service: [ + // Final service method details + paidService: [ 'decodeToken', - 'getNetwork', 'getUnpaidMacaroon', 'payForMacaroon', - ({decodeToken, getNetwork, getUnpaidMacaroon, payForMacaroon}, cbk) => + 'remote', + ({decodeToken, getUnpaidMacaroon, payForMacaroon, remote}, cbk) => { const {id} = getUnpaidMacaroon; const {macaroon} = getUnpaidMacaroon; - const {network} = getNetwork; const {paid} = payForMacaroon; const {preimage} = payForMacaroon; + const {service} = remote; if (!decodeToken && !paid) { return cbk([400, 'FailedToPurchasePaidServiceTokens']); } - try { - lightningLabsSwapService({macaroon, network, socket}); - } catch (err) { - return cbk([400, 'FailedToFindSupportedSwapService', {err}]); - } - - const {service} = lightningLabsSwapService({ - macaroon, - network, - socket, - }); - const token = encodeCbor({ - macaroon: Buffer.from(macaroon, 'base64'), - preimage: Buffer.from(preimage, 'hex'), + macaroon: bufferFromBase64(macaroon), + preimage: bufferFromHex(preimage), }); return cbk(null, {id, macaroon, paid, preimage, service, token}); }], }, - returnResult({reject, resolve, of: 'service'}, cbk)); + returnResult({reject, resolve, of: 'paidService'}, cbk)); }); }; diff --git a/swaps/get_swap_cost.js b/swaps/get_swap_cost.js index 9d2c6d5..015bdce 100644 --- a/swaps/get_swap_cost.js +++ b/swaps/get_swap_cost.js @@ -10,18 +10,17 @@ const {returnResult} = require('asyncjs-util'); const {balanceFromTokens} = require('./../balances'); const {cltvDeltaBuffer} = require('./constants'); const {fastDelayMinutes} = require('./constants'); -const getPaidService = require('./get_paid_service'); const {slowDelayMinutes} = require('./constants'); /** Get the cost of liquidity via swap { [above]: - [api_key]: [is_fast]: lnd: logger: - service: + macaroon: + preimage: tokens: type: } @@ -44,6 +43,14 @@ module.exports = (args, cbk) => { return cbk([400, 'ExpectedLoggerToGetSwapCost']); } + if (!args.macaroon) { + return cbk([400, 'ExpectedServiceMacaroonToGetSwapCost']); + } + + if (!args.preimage) { + return cbk([400, 'ExpectedPaymentPreimageToGetSwapCost']); + } + if (!args.service) { return cbk([400, 'ExpectedSwapServiceToGetSwapCost']); } @@ -59,37 +66,22 @@ module.exports = (args, cbk) => { return cbk(); }, - // Get paid service - getService: ['validate', ({}, cbk) => { - // Exit early when there is no API key with the vanilla service - if (!args.api_key) { - return cbk(null, {service: args.service}); - } - - return getPaidService({ - lnd: args.lnd, - logger: args.logger, - token: args.api_key, - }, - cbk); - }], - // Get swap terms - getTerms: ['getService', ({getService}, cbk) => { + getTerms: ['validate', ({}, cbk) => { switch (args.type) { case 'inbound': return getSwapOutTerms({ - macaroon: getService.macaroon, - preimage: getService.preimage, - service: getService.service, + macaroon: args.macaroon, + preimage: args.preimage, + service: args.service, }, cbk); case 'outbound': return getSwapInTerms({ - macaroon: getService.macaroon, - preimage: getService.preimage, - service: getService.service, + macaroon: args.macaroon, + preimage: args.preimage, + service: args.service, }, cbk); @@ -104,12 +96,7 @@ module.exports = (args, cbk) => { }], // Get a swap quote - getQuote: [ - 'getHeight', - 'getService', - 'getTerms', - ({getHeight, getService, getTerms}, cbk) => - { + getQuote: ['getHeight', 'getTerms', ({getHeight, getTerms}, cbk) => { const cltv = getTerms.max_cltv_delta + getHeight.current_block_height; const swapDelay = !args.is_fast ? slowDelayMinutes : fastDelayMinutes; @@ -117,9 +104,9 @@ module.exports = (args, cbk) => { case 'inbound': return getSwapOutQuote({ delay: moment().add(swapDelay, 'minutes').toISOString(), - macaroon: getService.macaroon, - preimage: getService.preimage, - service: getService.service, + macaroon: args.macaroon, + preimage: args.preimage, + service: args.service, timeout: cltv - cltvDeltaBuffer, tokens: args.tokens, }, @@ -127,9 +114,9 @@ module.exports = (args, cbk) => { case 'outbound': return getSwapInQuote({ - macaroon: getService.macaroon, - preimage: getService.preimage, - service: getService.service, + macaroon: args.macaroon, + preimage: args.preimage, + service: args.service, tokens: args.tokens, }, cbk); diff --git a/swaps/index.js b/swaps/index.js index 58e856d..a5a2e59 100644 --- a/swaps/index.js +++ b/swaps/index.js @@ -1,3 +1,4 @@ +const getPaidService = require('./get_paid_service'); const getSwapCost = require('./get_swap_cost'); const getSwapService = require('./get_swap_service'); const rebalance = require('./rebalance'); @@ -7,6 +8,7 @@ const swapOut = require('./swap_out'); const {swapTypes} = require('./constants'); module.exports = { + getPaidService, getSwapCost, getSwapService, rebalance, diff --git a/swaps/swap_api_key.js b/swaps/swap_api_key.js index 53ad891..8ddf496 100644 --- a/swaps/swap_api_key.js +++ b/swaps/swap_api_key.js @@ -10,6 +10,7 @@ const getPaidService = require('./get_paid_service'); { [api_key]: + [fetch]: [is_purchase]: [macaroon]: [lnd]: @@ -87,8 +88,10 @@ module.exports = (args, cbk) => { } return getPaidService({ + fetch: args.fetch, lnd: args.lnd, logger: args.logger, + socket: args.socket, token: args.api_key, }, cbk); diff --git a/swaps/swap_in.js b/swaps/swap_in.js index 1ef876e..2389ea6 100644 --- a/swaps/swap_in.js +++ b/swaps/swap_in.js @@ -14,7 +14,6 @@ const {getNetwork} = require('ln-sync'); const {getSwapInQuote} = require('goldengate'); const {getSwapInTerms} = require('goldengate'); const {getWalletInfo} = require('ln-service'); -const {lightningLabsSwapService} = require('goldengate'); const moment = require('moment'); const qrcode = require('qrcode-terminal'); const {refundTransaction} = require('goldengate'); @@ -39,6 +38,7 @@ const waitForDepositMs = 1000 * 60 * 60 * 24; { [api_key]: + fetch: [in_through]: [is_refund_test]: lnd: @@ -46,6 +46,7 @@ const waitForDepositMs = 1000 * 60 * 60 * 24; [max_fee]: [recovery]: [refund_address]: + [socket]: [tokens]: } @@ -60,6 +61,10 @@ module.exports = (args, cbk) => { return asyncAuto({ // Check arguments validate: cbk => { + if (!args.fetch) { + return cbk([400, 'ExpectedFetchFunctionToReceiveOnChain']); + } + if (!args.logger) { return cbk([400, 'ExpectedLoggerToReceiveOnChain']); } @@ -104,8 +109,10 @@ module.exports = (args, cbk) => { } return getPaidService({ + fetch: args.fetch, lnd: args.lnd, logger: args.logger, + socket: args.socket, token: args.api_key, }, cbk); diff --git a/swaps/swap_out.js b/swaps/swap_out.js index b0c9444..db05e58 100644 --- a/swaps/swap_out.js +++ b/swaps/swap_out.js @@ -84,6 +84,7 @@ const tokensAsBigUnit = tokens => ((tokens || 0) / 1e8).toFixed(8); [api_key]: [avoid]: [] confs: + fetch: [is_fast]: [is_dry_run]: [is_raw_recovery_shown]: @@ -116,6 +117,10 @@ module.exports = (args, cbk) => { return cbk([400, 'ExpectedConfirmationsCountToConsiderReorgSafe']); } + if (!args.fetch) { + return cbk([400, 'ExpectedFetchFunctionToInitiateSwapOut']); + } + if (!args.lnd) { return cbk([400, 'ExpectedLndToInitiateSwapOut']); } @@ -295,6 +300,7 @@ module.exports = (args, cbk) => { return getPaidService({ network, + fetch: args.fetch, lnd: args.lnd, logger: args.logger, socket: args.socket, @@ -795,6 +801,7 @@ module.exports = (args, cbk) => { 'decodeFundingRequest', 'findRouteForExecution', 'findRoutesForFunding', + 'getMinSweepFee', ({decodeFundingRequest, findRoutesForFunding}, cbk) => { if (!!args.recovery) { diff --git a/telegram/start_telegram_bot.js b/telegram/start_telegram_bot.js index e95703e..ff9e287 100644 --- a/telegram/start_telegram_bot.js +++ b/telegram/start_telegram_bot.js @@ -10,6 +10,7 @@ const {getWalletInfo} = require('ln-service'); const {handleBackupCommand} = require('ln-telegram'); const {handleBlocknotifyCommand} = require('ln-telegram'); const {handleConnectCommand} = require('ln-telegram'); +const {handleEarningsCommand} = require('ln-telegram'); const {handleInvoiceCommand} = require('ln-telegram'); const {handleLiquidityCommand} = require('ln-telegram'); const {handleMempoolCommand} = require('ln-telegram'); @@ -239,7 +240,6 @@ module.exports = ({fs, id, lnds, logger, payments, request}, cbk) => { }); bot.command('earnings', ({message, replyWithMarkdown}) => { - const {handleEarningsCommand} = require('ln-telegram'); handleEarningsCommand({ from: message.from.id, id: connectedId, diff --git a/test/swaps/test_get_paid_service.js b/test/swaps/test_get_paid_service.js index 1cb96f1..9f87feb 100644 --- a/test/swaps/test_get_paid_service.js +++ b/test/swaps/test_get_paid_service.js @@ -1,4 +1,5 @@ const {encode} = require('cbor'); +const fetch = require('node-fetch'); const {test} = require('tap'); const {getInfoResponse} = require('./../fixtures'); @@ -9,6 +10,7 @@ const makeToken = (m, p) => encode({macaroon: m, preimage: p}).toString('hex'); const makeArgs = override => { const args = { + fetch, lnd: { default: { getInfo: ({}, cbk) => cbk(null, getInfoResponse), diff --git a/test/swaps/test_get_swap_cost.js b/test/swaps/test_get_swap_cost.js index f69253c..b39f268 100644 --- a/test/swaps/test_get_swap_cost.js +++ b/test/swaps/test_get_swap_cost.js @@ -3,6 +3,9 @@ const {test} = require('tap'); const {getInfoResponse} = require('./../fixtures'); const {getSwapCost} = require('./../../swaps'); +const macaroon = 'macaroon'; +const preimage = 'preimage'; + const makeLnd = ({}) => { return { default: { @@ -34,22 +37,24 @@ const makeTerms = ({max, min}) => ({ const tests = [ { - args: {lnd: {}, logger: {}}, + args: {macaroon, preimage, lnd: {}, logger: {}}, description: 'Swap service is required', error: [400, 'ExpectedSwapServiceToGetSwapCost'], }, { - args: {lnd: {}, logger: {}, service: {}}, + args: {macaroon, preimage, lnd: {}, logger: {}, service: {}}, description: 'Tokens are required', error: [400, 'ExpectedTokensCountToGetSwapCost'], }, { - args: {lnd: {}, logger: {}, service: {}, tokens: 1}, + args: {macaroon, preimage, lnd: {}, logger: {}, service: {}, tokens: 1}, description: 'Swap type is required', error: [400, 'ExpectedLiquidityTypeToGetSwapCost'], }, { args: { + macaroon, + preimage, lnd: {}, logger: {}, service: makeService({}), @@ -61,6 +66,8 @@ const tests = [ }, { args: { + macaroon, + preimage, lnd: makeLnd({}), logger: {}, service: { @@ -75,6 +82,8 @@ const tests = [ }, { args: { + macaroon, + preimage, lnd: makeLnd({}), logger: {}, service: { @@ -91,6 +100,8 @@ const tests = [ }, { args: { + macaroon, + preimage, lnd: makeLnd({}), logger: {}, service: makeService({}),