diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 912c1ae1..00000000 --- a/.babelrc +++ /dev/null @@ -1,10 +0,0 @@ -{ - "env": { - "test": { - "plugins": [ - "transform-es2015-modules-commonjs", - "@babel/plugin-proposal-class-properties" - ] - } - } -} diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index eebfc91a..00000000 --- a/.dockerignore +++ /dev/null @@ -1,3 +0,0 @@ -**/.git -**/node_modules -**/radata \ No newline at end of file diff --git a/.env.example b/.env.example deleted file mode 100644 index 486681c4..00000000 --- a/.env.example +++ /dev/null @@ -1,4 +0,0 @@ -# pub and nostr peers -PEERS=["https://wut.shock.network"] -# API Device Token -MS_TO_TOKEN_EXPIRATION=4500000 diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 72d042d3..00000000 --- a/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -*.ts -/public/*.min.js \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 6d35aae7..00000000 --- a/.eslintrc.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "extends": ["eslint:all", "prettier", "plugin:mocha/recommended"], - "plugins": ["prettier", "mocha", "babel"], - "rules": { - "prettier/prettier": "error", - "strict": "off", - - "mocha/no-mocha-arrows": "off", - - "max-statements-per-line": "off", - - "no-empty-function": "off", - - "no-console": "off", - - "max-statements": "off", - - "global-require": "off", - - "new-cap": "off", - - "one-var": "off", - - "max-lines-per-function": "off", - - "no-underscore-dangle": "off", - - "no-implicit-coercion": "off", - - "no-magic-numbers": "off", - - "no-negated-condition": "off", - - "capitalized-comments": "off", - - "max-params": "off", - - "multiline-comment-style": "off", - - "spaced-comment": "off", - - "no-inline-comments": "off", - - "sort-keys": "off", - - "max-lines": "off", - - "prefer-template": "off", - - "callback-return": "off", - - "no-ternary": "off", - - "no-invalid-this": "off", - - "babel/no-invalid-this": "error", - - "complexity": "off", - - "yoda": "off", - - "prefer-promise-reject-errors": "off", - - "camelcase": "off", - - "consistent-return": "off", - - "no-shadow": "off", - // We're usually throwing objects throughout the API to allow for more detailed error messages - "no-throw-literal": "off", - - // lightning has sync methods and this rule bans them - "no-sync": "off", - - "id-length": "off", - - // typescript does this - "no-unused-vars": "off", - - // https://github.com/prettier/eslint-config-prettier/issues/132 - "line-comment-position": "off", - - // if someone does this it's probably intentional - "no-useless-concat": "off", - - "no-plusplus": "off", - - "no-undefined": "off", - - "no-process-env": "off", - - // I am now convinced TODO comments closer to the relevant code are better - // than GH issues. Especially when it only concerns a single function / - // routine. - "no-warning-comments": "off", - - // broken - "sort-imports": "off" - }, - "parser": "babel-eslint", - "env": { - "node": true, - "es6": true - } -} diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index dfe07704..00000000 --- a/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index ee026a26..00000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,30 +0,0 @@ -version: 2 -updates: -- package-ecosystem: npm - directory: "/" - schedule: - interval: daily - open-pull-requests-limit: 10 - ignore: - - dependency-name: bitcore-lib - versions: - - 8.24.2 - - 8.25.0 - - 8.25.2 - - 8.25.3 - - 8.25.4 - - 8.25.7 - - 9.0.0 - - dependency-name: socket.io - versions: - - 3.1.0 - - dependency-name: commander - versions: - - 7.0.0 - - 7.1.0 - - dependency-name: lint-staged - versions: - - 10.5.3 - - dependency-name: eslint-plugin-prettier - versions: - - 3.3.1 diff --git a/.github/workflows/dockerhub.yml b/.github/workflows/dockerhub.yml deleted file mode 100644 index f0f566ad..00000000 --- a/.github/workflows/dockerhub.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Publish Docker image - -on: - release: - types: [published] - -jobs: - push_to_registry: - name: Push Docker image to Docker Hub - runs-on: ubuntu-latest - steps: - - name: Check out the repo - uses: actions/checkout@v2 - - - name: Set up QEMU - uses: docker/setup-qemu-action@v1 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - - name: Log in to Docker Hub - uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - - name: Extract metadata (tags, labels) for Docker - id: meta - uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38 - with: - images: shockwallet/api - - - name: Build and push Docker image - uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc - with: - context: . - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index 1bb412c2..00000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Update Wizard - -on: - push: - branches: [ 'master' ] - pull_request: - branches: [ 'master' ] - workflow_dispatch: - inputs: - name: - description: 'Bump Wizard Version' - required: false - default: 'yes' - -jobs: - dispatch: - strategy: - matrix: - repo: ['shocknet/Wizard'] - runs-on: ubuntu-latest - steps: - - name: 🛎️ Checkout - uses: actions/checkout@v2.3.1 - with: - persist-credentials: false - ref: ${{ github.ref }} - - - name: ⚙️ Install Dependencies - run: yarn install - - - name: 📝 Run Tests - run: yarn test - - - name: 📯 Repository Dispatch - uses: peter-evans/repository-dispatch@v1 - with: - token: ${{ secrets.REPO_ACCESS_TOKEN }} - repository: ${{ matrix.repo }} - event-type: api-update - client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}"}' diff --git a/.github/workflows/version.yml b/.github/workflows/version.yml deleted file mode 100644 index 26e292c4..00000000 --- a/.github/workflows/version.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Bump "package.json" Version - -on: - release: - types: [prereleased, released] - -jobs: - version-bump: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@master - with: - persist-credentials: false - fetch-depth: 0 # otherwise, you will failed to push refs to dest repo - - name: Get the last API TAG and current version in package.json - run: | - export RELEASE_TAG=$(git describe --tags --abbrev=0) && \ - echo "VERSION=${RELEASE_TAG}" >> $GITHUB_ENV - - export API_TAG=$(cat ./package.json | jq -r '.version') - - echo $(if [ "$API_TAG" = "$RELEASE_TAG" ]; then echo "UPGRADEABLE=false"; else echo "UPGRADEABLE=true"; fi) >> $GITHUB_ENV - - - name: Update and Commit files - if: ${{ env.UPGRADEABLE == 'true' }} - run: | - cat ./package.json | jq -r --arg API_TAG "${{ env.VERSION }}" '.version = $API_TAG' | tee a.json && mv a.json package.json - git config --local user.email "actions@shock.network" - git config --local user.name "Version Update Action" - git commit -m "version upgraded to ${{ env.VERSION }}" -a - - name: Push changes - if: ${{ env.UPGRADEABLE == 'true' }} - uses: ad-m/github-push-action@master - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - branch: master diff --git a/.gitignore b/.gitignore index 77d816b5..ab360761 100644 --- a/.gitignore +++ b/.gitignore @@ -1,25 +1,10 @@ -node_modules -.storage -services/auth/secrets.json +.idea/ +.vscode/ +node_modules/ +build/ +tmp/ +temp/ .env -*.log -# New logger date format -*.log.* -.directory -.DS_Store - -test-radata/ -radata/ -radata-*.tmp -*.cert -*.key - -*-audit.json -# Yarn v2 -.pnp.* -.yarn/* -!.yarn/patches -!.yarn/plugins -!.yarn/releases -!.yarn/sdks -!.yarn/versions \ No newline at end of file +build/ +db.sqlite +.key/ \ No newline at end of file diff --git a/.nvmrc b/.nvmrc deleted file mode 100644 index d4fca6f6..00000000 --- a/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v14.18.3 diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index b6283b83..00000000 --- a/.prettierrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "requirePragma": true, - "semi": false, - "singleQuote": true, - "endOfLine": "auto" -} diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 4e5e98fa..00000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "configurations": [ - { - "name": "Attach", - "port": 9229, - "request": "attach", - "skipFiles": ["/**"], - "type": "pwa-node" - }, - { - "name": "Nodemon", - "program": "${workspaceFolder}/main.js", - "args": ["--", "-h", "0.0.0.0", "-c"], - "request": "launch", - "skipFiles": ["/**"], - "type": "node", - "envFile": "${workspaceFolder}/.env", - "outputCapture": "std", - - // https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_restarting-debug-sessions-automatically-when-source-is-edited - // Tip: Pressing the Stop button stops the debug session and disconnects - // from Node.js, but nodemon (and Node.js) will continue to run. To stop - // nodemon, you will have to kill it from the command line (which is - // easily possible if you use the integratedTerminal as shown above). - - // Tip: In case of syntax errors, nodemon will not be able to start - // Node.js successfully until the error has been fixed. In this case, VS - // Code will continue trying to attach to Node.js but eventually give up - // (after 10 seconds). To avoid this, you can increase the timeout by - // adding a timeout attribute with a larger value (in milliseconds). - - "runtimeExecutable": "${workspaceFolder}/node_modules/nodemon/bin/nodemon.js", - "console": "integratedTerminal", - "internalConsoleOptions": "neverOpen", - "restart": true - }, - { - "name": "Nodemon+Polar", - "program": "${workspaceFolder}/main.js", - "args": [ - "--", - "-h", - "0.0.0.0", - "--trace-warnings", - "--max-old-space-size=4096", - "-c", - "-d", - "C:\\Users\\Predator\\AppData\\Local\\Lnd\\tls.cert", - "-m", - "C:\\Users\\Predator\\AppData\\Local\\Lnd\\data\\chain\\bitcoin\\mainnet\\admin.macaroon", - "--tunnel" - ], - "request": "launch", - "skipFiles": ["/**"], - "type": "node", - "envFile": "${workspaceFolder}/.env", - "outputCapture": "std", - - // https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_restarting-debug-sessions-automatically-when-source-is-edited - // Tip: Pressing the Stop button stops the debug session and disconnects - // from Node.js, but nodemon (and Node.js) will continue to run. To stop - // nodemon, you will have to kill it from the command line (which is - // easily possible if you use the integratedTerminal as shown above). - - // Tip: In case of syntax errors, nodemon will not be able to start - // Node.js successfully until the error has been fixed. In this case, VS - // Code will continue trying to attach to Node.js but eventually give up - // (after 10 seconds). To avoid this, you can increase the timeout by - // adding a timeout attribute with a larger value (in milliseconds). - - "runtimeExecutable": "${workspaceFolder}/node_modules/nodemon/bin/nodemon.js", - "console": "integratedTerminal", - "internalConsoleOptions": "neverOpen", - "restart": true - } - ] -} diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index c6028c15..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "eslint.enable": true, - "typescript.tsdk": "node_modules/typescript/lib", - "debug.node.autoAttach": "on", - "editor.formatOnSave": true, - "editor.defaultFormatter": "esbenp.prettier-vscode", - "cSpell.words": [ - "acked", - "addinvoice", - "Authing", - "channelbalance", - "ciphertext", - "closechannel", - "closedchannels", - "Cltv", - "connectpeer", - "disconnectpeer", - "eccrypto", - "endregion", - "ephem", - "epriv", - "Epub", - "estimatefee", - "estimateroutefee", - "exportallchanbackups", - "exportchanbackup", - "falsey", - "forwardinghistory", - "getchaninfo", - "getinfo", - "getnetworkinfo", - "getnodeinfo", - "GUNRPC", - "Healthz", - "initwall", - "ISEA", - "keysend", - "kubernetes", - "listchannels", - "listinvoices", - "listpayments", - "listpeers", - "listunspent", - "lndchanbackups", - "LNDRPC", - "lndstreaming", - "lnrpc", - "lres", - "msgpack", - "newaddress", - "openchannel", - "otheruser", - "payreq", - "pendingchannels", - "preimage", - "PUBKEY", - "qrcode", - "queryroute", - "radata", - "Reqs", - "resave", - "satoshis", - "sendcoins", - "sendmany", - "sendpayment", - "sendtoroute", - "serverhost", - "serverport", - "shockping", - "SHOCKWALLET", - "signmessage", - "thenables", - "trackpayment", - "txid", - "unfollow", - "Unlocker", - "unsubscription", - "utxos", - "uuidv", - "verifymessage", - "walletbalance" - ] -} diff --git a/.vscode/snippets.code-snippets b/.vscode/snippets.code-snippets deleted file mode 100644 index 53bd01c5..00000000 --- a/.vscode/snippets.code-snippets +++ /dev/null @@ -1,33 +0,0 @@ -{ - // Place your api workspace snippets here. Each snippet is defined under a - // snippet name and has a scope, prefix, body and description. Add comma - // separated ids of the languages where the snippet is applicable in the scope - // field. If scope is left empty or omitted, the snippet gets applied to all - // languages. The prefix is what is used to trigger the snippet and the body - // will be expanded and inserted. Possible variables are: $1, $2 for tab - // stops, $0 for the final cursor position, and ${1:label}, ${2:another} for - // placeholders. Placeholders with the same ids are connected. Example: "Print - // to console": {"scope": "javascript,typescript", "prefix": "log", "body": - // ["console.log('$1');", "$2" - // ], - // "description": "Log output to console" - // } - - "Route Body": { - "body": [ - "try {", - " return res.json({", - "", - " })", - "} catch (e) {", - " console.log(e)", - " return res.status(500).json({", - " errorMessage: e.message", - " })", - "}" - ], - "description": "Route Body", - "prefix": "rbody", - "scope": "javascript" - } -} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 7479b4ed..00000000 --- a/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -FROM node:14-buster-slim - -EXPOSE 9835 - -VOLUME [ "/root/.lnd", "/data" ] -RUN apt-get update && apt-get install -y apt-transport-https git - -WORKDIR /app - - -ADD ./package.json /app/package.json -ADD ./yarn.lock /app/yarn.lock - -RUN yarn - -ADD . /app - -ENTRYPOINT [ "node", "main.js" ] diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 505b5d35..00000000 --- a/LICENSE +++ /dev/null @@ -1,688 +0,0 @@ -“Commons Clause” License Condition v1.0 - -The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. - -Without limiting other conditions in the License, the grant of rights under the License will not include, and the License does not grant to you, right to Sell the Software. - -For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software. Any license notice or attribution required by the License must also include this Commons Cause License Condition notice. - -Software: shocknet api -License: GPL3 -Licensor: Shock Network, Inc. - - - - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/README.md b/README.md index ea22448c..953b5984 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -

Lightning.Pub

+# Awesome Project Build with TypeORM ![GitHub last commit](https://img.shields.io/github/last-commit/shocknet/Lightning.Pub?style=flat-square) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) diff --git a/composers/windows-2network-alice/docker-compose.yml b/composers/windows-2network-alice/docker-compose.yml deleted file mode 100644 index d03ab95a..00000000 --- a/composers/windows-2network-alice/docker-compose.yml +++ /dev/null @@ -1,16 +0,0 @@ -version: "3.8" -networks: - default: - external: true - name: 2_default -services: - web: - image: shockwallet/api:latest - command: -c -h 0.0.0.0 -l polar-n2-alice:10009 -m /root/.lnd/data/chain/bitcoin/regtest/admin.macaroon -d /root/.lnd/tls.cert - restart: on-failure - stop_grace_period: 1m - ports: - - 9835:9835 - volumes: - - C:\Users\boufn\.polar\networks\2\volumes\lnd\alice:/root/.lnd - \ No newline at end of file diff --git a/config/defaults.js b/config/defaults.js deleted file mode 100644 index 73890de2..00000000 --- a/config/defaults.js +++ /dev/null @@ -1,55 +0,0 @@ -const os = require("os"); -const path = require("path"); -const platform = os.platform(); -const homeDir = os.homedir(); - -const getLndDirectory = () => { - if (platform === "darwin") { - return homeDir + "/Library/Application Support/Lnd"; - } else if (platform === "win32") { - // eslint-disable-next-line no-process-env - const { APPDATA = "" } = process.env; - return path.resolve(APPDATA, "../Local/Lnd"); - } - - return homeDir + "/.lnd"; -}; - -const parsePath = (filePath = "") => { - if (platform === "win32") { - return filePath.replace("/", "\\"); - } - - return filePath; -}; - -const lndDirectory = getLndDirectory(); - -module.exports = (mainnet = false) => { - const network = mainnet ? "mainnet" : "testnet"; - - return { - serverPort: 9835, - serverHost: "localhost", - lndAddress: "127.0.0.1:9735", - maxNumRoutesToQuery: 20, - lndProto: parsePath(`${__dirname}/rpc.proto`), - routerProto: parsePath(`${__dirname}/router.proto`), - invoicesProto: parsePath(`${__dirname}/invoices.proto`), - walletUnlockerProto: parsePath(`${__dirname}/walletunlocker.proto`), - lndHost: "localhost:10009", - lndCertPath: parsePath(`${lndDirectory}/tls.cert`), - macaroonPath: parsePath( - `${lndDirectory}/data/chain/bitcoin/${network}/admin.macaroon` - ), - dataPath: parsePath(`${lndDirectory}/data`), - loglevel: "info", - logfile: "shockapi.log", - lndLogFile: parsePath(`${lndDirectory}/logs/bitcoin/${network}/lnd.log`), - lndDirPath: lndDirectory, - peers: ['https://gun.shock.network/gun','https://gun-eu.shock.network/gun'], - useTLS: false, - tokenExpirationMS: 259200000, - localtunnelHost:'https://tunnel.rip' - }; -}; diff --git a/config/log.js b/config/log.js deleted file mode 100644 index 06214472..00000000 --- a/config/log.js +++ /dev/null @@ -1,58 +0,0 @@ -/** @prettier */ - -const { createLogger, transports, format } = require('winston') -const util = require('util') -require('winston-daily-rotate-file') - -// @ts-ignore -const transform = info => { - const args = info[Symbol.for('splat')] - if (args) { - return { ...info, message: util.format(info.message, ...args) } - } - return info -} - -const logFormatter = () => ({ transform }) - -const formatter = format.combine( - format.colorize(), - format.errors({ stack: true }), - logFormatter(), - format.prettyPrint(), - format.timestamp(), - format.simple(), - format.align(), - format.printf(info => { - const { timestamp, level, message, stack, exception } = info - - const ts = timestamp.slice(0, 19).replace('T', ' ') - const isObject = typeof message === 'object' - const formattedJson = isObject ? JSON.stringify(message, null, 2) : message - const formattedException = exception ? exception.stack : '' - const errorMessage = stack || formattedException - const formattedMessage = errorMessage ? errorMessage : formattedJson - - return `${ts} [${level}]: ${formattedMessage}` - }) -) - -const Logger = createLogger({ - format: formatter, - transports: [ - new transports.DailyRotateFile({ - filename: 'shockapi.log', - datePattern: 'yyyy-MM-DD', - // https://github.com/winstonjs/winston-daily-rotate-file/issues/188 - json: false, - maxSize: 1000000, - maxFiles: 7, - handleExceptions: true - }), - new transports.Console({ - handleExceptions: true - }) - ] -}) - -module.exports = Logger diff --git a/config/walletunlocker.proto b/config/walletunlocker.proto deleted file mode 100644 index 6e5e4ed9..00000000 --- a/config/walletunlocker.proto +++ /dev/null @@ -1,238 +0,0 @@ -syntax = "proto3"; - -import "rpc.proto"; - -package lnrpc; - -option go_package = "github.com/lightningnetwork/lnd/lnrpc"; - -/* - * Comments in this file will be directly parsed into the API - * Documentation as descriptions of the associated method, message, or field. - * These descriptions should go right above the definition of the object, and - * can be in either block or // comment format. - * - * An RPC method can be matched to an lncli command by placing a line in the - * beginning of the description in exactly the following format: - * lncli: `methodname` - * - * Failure to specify the exact name of the command will cause documentation - * generation to fail. - * - * More information on how exactly the gRPC documentation is generated from - * this proto file can be found here: - * https://github.com/lightninglabs/lightning-api - */ - -// WalletUnlocker is a service that is used to set up a wallet password for -// lnd at first startup, and unlock a previously set up wallet. -service WalletUnlocker { - /* - GenSeed is the first method that should be used to instantiate a new lnd - instance. This method allows a caller to generate a new aezeed cipher seed - given an optional passphrase. If provided, the passphrase will be necessary - to decrypt the cipherseed to expose the internal wallet seed. - - Once the cipherseed is obtained and verified by the user, the InitWallet - method should be used to commit the newly generated seed, and create the - wallet. - */ - rpc GenSeed (GenSeedRequest) returns (GenSeedResponse); - - /* - InitWallet is used when lnd is starting up for the first time to fully - initialize the daemon and its internal wallet. At the very least a wallet - password must be provided. This will be used to encrypt sensitive material - on disk. - - In the case of a recovery scenario, the user can also specify their aezeed - mnemonic and passphrase. If set, then the daemon will use this prior state - to initialize its internal wallet. - - Alternatively, this can be used along with the GenSeed RPC to obtain a - seed, then present it to the user. Once it has been verified by the user, - the seed can be fed into this RPC in order to commit the new wallet. - */ - rpc InitWallet (InitWalletRequest) returns (InitWalletResponse); - - /* lncli: `unlock` - UnlockWallet is used at startup of lnd to provide a password to unlock - the wallet database. - */ - rpc UnlockWallet (UnlockWalletRequest) returns (UnlockWalletResponse); - - /* lncli: `changepassword` - ChangePassword changes the password of the encrypted wallet. This will - automatically unlock the wallet database if successful. - */ - rpc ChangePassword (ChangePasswordRequest) returns (ChangePasswordResponse); -} - -message GenSeedRequest { - /* - aezeed_passphrase is an optional user provided passphrase that will be used - to encrypt the generated aezeed cipher seed. When using REST, this field - must be encoded as base64. - */ - bytes aezeed_passphrase = 1; - - /* - seed_entropy is an optional 16-bytes generated via CSPRNG. If not - specified, then a fresh set of randomness will be used to create the seed. - When using REST, this field must be encoded as base64. - */ - bytes seed_entropy = 2; -} -message GenSeedResponse { - /* - cipher_seed_mnemonic is a 24-word mnemonic that encodes a prior aezeed - cipher seed obtained by the user. This field is optional, as if not - provided, then the daemon will generate a new cipher seed for the user. - Otherwise, then the daemon will attempt to recover the wallet state linked - to this cipher seed. - */ - repeated string cipher_seed_mnemonic = 1; - - /* - enciphered_seed are the raw aezeed cipher seed bytes. This is the raw - cipher text before run through our mnemonic encoding scheme. - */ - bytes enciphered_seed = 2; -} - -message InitWalletRequest { - /* - wallet_password is the passphrase that should be used to encrypt the - wallet. This MUST be at least 8 chars in length. After creation, this - password is required to unlock the daemon. When using REST, this field - must be encoded as base64. - */ - bytes wallet_password = 1; - - /* - cipher_seed_mnemonic is a 24-word mnemonic that encodes a prior aezeed - cipher seed obtained by the user. This may have been generated by the - GenSeed method, or be an existing seed. - */ - repeated string cipher_seed_mnemonic = 2; - - /* - aezeed_passphrase is an optional user provided passphrase that will be used - to encrypt the generated aezeed cipher seed. When using REST, this field - must be encoded as base64. - */ - bytes aezeed_passphrase = 3; - - /* - recovery_window is an optional argument specifying the address lookahead - when restoring a wallet seed. The recovery window applies to each - individual branch of the BIP44 derivation paths. Supplying a recovery - window of zero indicates that no addresses should be recovered, such after - the first initialization of the wallet. - */ - int32 recovery_window = 4; - - /* - channel_backups is an optional argument that allows clients to recover the - settled funds within a set of channels. This should be populated if the - user was unable to close out all channels and sweep funds before partial or - total data loss occurred. If specified, then after on-chain recovery of - funds, lnd begin to carry out the data loss recovery protocol in order to - recover the funds in each channel from a remote force closed transaction. - */ - ChanBackupSnapshot channel_backups = 5; - - /* - stateless_init is an optional argument instructing the daemon NOT to create - any *.macaroon files in its filesystem. If this parameter is set, then the - admin macaroon returned in the response MUST be stored by the caller of the - RPC as otherwise all access to the daemon will be lost! - */ - bool stateless_init = 6; -} -message InitWalletResponse { - /* - The binary serialized admin macaroon that can be used to access the daemon - after creating the wallet. If the stateless_init parameter was set to true, - this is the ONLY copy of the macaroon and MUST be stored safely by the - caller. Otherwise a copy of this macaroon is also persisted on disk by the - daemon, together with other macaroon files. - */ - bytes admin_macaroon = 1; -} - -message UnlockWalletRequest { - /* - wallet_password should be the current valid passphrase for the daemon. This - will be required to decrypt on-disk material that the daemon requires to - function properly. When using REST, this field must be encoded as base64. - */ - bytes wallet_password = 1; - - /* - recovery_window is an optional argument specifying the address lookahead - when restoring a wallet seed. The recovery window applies to each - individual branch of the BIP44 derivation paths. Supplying a recovery - window of zero indicates that no addresses should be recovered, such after - the first initialization of the wallet. - */ - int32 recovery_window = 2; - - /* - channel_backups is an optional argument that allows clients to recover the - settled funds within a set of channels. This should be populated if the - user was unable to close out all channels and sweep funds before partial or - total data loss occurred. If specified, then after on-chain recovery of - funds, lnd begin to carry out the data loss recovery protocol in order to - recover the funds in each channel from a remote force closed transaction. - */ - ChanBackupSnapshot channel_backups = 3; - - /* - stateless_init is an optional argument instructing the daemon NOT to create - any *.macaroon files in its file system. - */ - bool stateless_init = 4; -} -message UnlockWalletResponse { -} - -message ChangePasswordRequest { - /* - current_password should be the current valid passphrase used to unlock the - daemon. When using REST, this field must be encoded as base64. - */ - bytes current_password = 1; - - /* - new_password should be the new passphrase that will be needed to unlock the - daemon. When using REST, this field must be encoded as base64. - */ - bytes new_password = 2; - - /* - stateless_init is an optional argument instructing the daemon NOT to create - any *.macaroon files in its filesystem. If this parameter is set, then the - admin macaroon returned in the response MUST be stored by the caller of the - RPC as otherwise all access to the daemon will be lost! - */ - bool stateless_init = 3; - - /* - new_macaroon_root_key is an optional argument instructing the daemon to - rotate the macaroon root key when set to true. This will invalidate all - previously generated macaroons. - */ - bool new_macaroon_root_key = 4; -} -message ChangePasswordResponse { - /* - The binary serialized admin macaroon that can be used to access the daemon - after rotating the macaroon root key. If both the stateless_init and - new_macaroon_root_key parameter were set to true, this is the ONLY copy of - the macaroon that was created from the new root key and MUST be stored - safely by the caller. Otherwise a copy of this macaroon is also persisted on - disk by the daemon, together with other macaroon files. - */ - bytes admin_macaroon = 1; -} diff --git a/constants/errors.js b/constants/errors.js deleted file mode 100644 index 8f54d2dc..00000000 --- a/constants/errors.js +++ /dev/null @@ -1,35 +0,0 @@ -module.exports = { - /** - * @param {string} path - */ - MACAROON_PATH: path => ` - The specified macaroon path "${path}" was not found. - This issue can be caused by: - - 1. Setting an invalid path for your Macaroon file. - 2. Not initializing your wallet before using the ShockAPI - `, - /** - * @param {string} path - */ - CERT_PATH: path => ` - The specified LND certificate file "${path}" was not found. - This issue can be caused by: - - 1. Setting an invalid path for your Certificates. - 2. Not initializing your wallet before using the ShockAPI - `, - CERT_MISSING: () => - "Required LND certificate path missing from application configuration.", - /** - * @param {string|null} macaroonPath - * @param {string} lndCertPath - */ - CERT_AND_MACAROON_MISSING: (macaroonPath, lndCertPath) => - ` - You neither specified an LND cert path nor a Macaroon path. Please make sure both files exist in the paths you've specified: - - Macaroon Path: ${macaroonPath ? macaroonPath : "N/A"} - LND Certificates path: ${lndCertPath ? lndCertPath : "N/A"} - ` -}; diff --git a/docker-start.sh b/docker-start.sh deleted file mode 100644 index 986525b1..00000000 --- a/docker-start.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/ash -node main -h 0.0.0.0 \ - -m admin.macaroon \ - -d tls.cert \ - -l $LND_ADDR \ No newline at end of file diff --git a/example.env b/example.env new file mode 100644 index 00000000..be980418 --- /dev/null +++ b/example.env @@ -0,0 +1,5 @@ +LND_ADDRESS= +LND_CERT_PATH= +LND_MACAROON_PATH= +DATABASE_FILE=db.sqlite +JWT_SECRET=bigsecrethere \ No newline at end of file diff --git a/guntest.html b/guntest.html deleted file mode 100644 index 09b02bd6..00000000 --- a/guntest.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - Document - - - - - - - - - - - - - - - - diff --git a/main.js b/main.js deleted file mode 100644 index 05685d0d..00000000 --- a/main.js +++ /dev/null @@ -1,27 +0,0 @@ -const program = require("commander"); - -const {version} = (JSON.parse(require('fs').readFileSync("./package.json", "utf-8"))) - -// parse command line parameters -program - .version(version) - .option("-s, --serverport [port]", "web server http listening port (defaults to 9835)") - .option("-h, --serverhost [host]", "web server listening host (defaults to localhost)") - .option("-l, --lndhost [host:port]", "RPC lnd host (defaults to localhost:10009)") - .option("-u, --user [login]", "basic authentication login") - .option("-p, --pwd [password]", "basic authentication password") - .option("-m, --macaroon-path [file path]", "path to admin.macaroon file") - .option("-d, --lnd-cert-path [file path]", "path to LND cert file") - .option("-f, --logfile [file path]", "path to file where to store the application logs") - .option("-e, --loglevel [level]", "level of logs to display (debug, info, warn, error)") - .option("-k, --le-email [email]", "lets encrypt required contact email") - .option("-c, --mainnet", "run server on mainnet mode") - .option("-t, --tunnel","create a localtunnel to listen behind a firewall") - .option('-r, --lndaddress', 'Lnd address, defaults to 127.0.0.1:9735') - .option('-a, --use-TLS', 'use TLS') - .option('-i, --https-cert [path]', 'HTTPS certificate path') - .option('-y, --https-cert-key [path]', 'HTTPS certificate key path') - .parse(process.argv); - -// load server -require("./src/server")(program); // Standard server version diff --git a/nodemon.json b/nodemon.json deleted file mode 100644 index d40e827d..00000000 --- a/nodemon.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "watch": ["src/", "services/", "utils/", "constants/", "config/"], - "ignore": ["node_modules/", ".git", "radata/", ".storage/", "*.log.*"], - "verbose": true, - "ext": "js" -} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..f22f0f0f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6736 @@ +{ + "name": "lightning.pub", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "lightning.pub", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@grpc/grpc-js": "^1.6.7", + "@protobuf-ts/grpc-transport": "^2.5.0", + "@protobuf-ts/plugin": "^2.5.0", + "@protobuf-ts/runtime": "^2.5.0", + "@types/express": "^4.17.13", + "@types/node": "^17.0.31", + "@types/secp256k1": "^4.0.3", + "axios": "^0.27.2", + "copyfiles": "^2.4.1", + "cors": "^2.8.5", + "dotenv": "^16.0.0", + "eccrypto": "^1.1.6", + "express": "^4.18.1", + "grpc-tools": "^1.11.2", + "jsonwebtoken": "^8.5.1", + "lodash": "^4.17.21", + "pg": "^8.4.0", + "reflect-metadata": "^0.1.13", + "rimraf": "^3.0.2", + "rxjs": "^7.5.5", + "secp256k1": "^4.0.3", + "sqlite3": "^5.1.2", + "ts-node": "^10.7.0", + "ts-proto": "^1.112.1", + "typeorm": "0.3.10", + "typescript": "^4.6.4", + "uuid": "^8.3.2" + }, + "devDependencies": { + "@types/cors": "^2.8.12", + "@types/eccrypto": "^1.1.3", + "@types/jsonwebtoken": "^8.5.9", + "@types/lodash": "^4.14.182", + "@types/node": "^16.11.10", + "@types/uuid": "^8.3.4", + "testyts": "^1.5.0", + "ts-node": "10.7.0", + "typescript": "4.5.2" + } + }, + "node_modules/@cspotcode/source-map-consumer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", + "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", + "devOptional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", + "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", + "devOptional": true, + "dependencies": { + "@cspotcode/source-map-consumer": "0.8.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "optional": true + }, + "node_modules/@grpc/grpc-js": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.6.7.tgz", + "integrity": "sha512-eBM03pu9hd3VqDQG+kHahiG1x80RGkkqqRb1Pchcwqej/KkAH95gAvKs6laqaHCycYaPK+TKuNQnOz9UXYA8qw==", + "dependencies": { + "@grpc/proto-loader": "^0.6.4", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.12.tgz", + "integrity": "sha512-filTVbETFnxb9CyRX98zN18ilChTuf/C5scZ2xyaOTp0EHGq0/ufX8rjqXUcSb1Gpv7eZq4M2jDvbh9BogKnrg==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.10.0", + "yargs": "^16.2.0" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", + "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "optional": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "optional": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@protobuf-ts/grpc-transport": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@protobuf-ts/grpc-transport/-/grpc-transport-2.5.0.tgz", + "integrity": "sha512-VyIar6U1wcKH3bD6scyA9efPlr0sjvLOCO7F0rcSIrbDn+lEQcHwS/3GN5tqYgh4O0/hAopuGiQ/UTpiR1n6kQ==", + "dependencies": { + "@protobuf-ts/runtime": "^2.5.0", + "@protobuf-ts/runtime-rpc": "^2.5.0" + }, + "peerDependencies": { + "@grpc/grpc-js": "^1.2.2" + } + }, + "node_modules/@protobuf-ts/plugin": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@protobuf-ts/plugin/-/plugin-2.5.0.tgz", + "integrity": "sha512-+lTtBPZad4gGE9eh9lMn+Fq79u4JB8YY/7uEmJSl8pk+4vMp6W02TxWYBMW4gBh5hzcZHGdEBx90OQxt1MDeJQ==", + "dependencies": { + "@protobuf-ts/plugin-framework": "^2.5.0", + "@protobuf-ts/protoc": "^2.5.0", + "@protobuf-ts/runtime": "^2.5.0", + "@protobuf-ts/runtime-rpc": "^2.5.0", + "typescript": "^3.9" + }, + "bin": { + "protoc-gen-dump": "bin/protoc-gen-dump", + "protoc-gen-ts": "bin/protoc-gen-ts" + } + }, + "node_modules/@protobuf-ts/plugin-framework": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@protobuf-ts/plugin-framework/-/plugin-framework-2.5.0.tgz", + "integrity": "sha512-bOf6oP4P0rjNp7bS8NSF/4O9a2WqHb3SSl4aNYzsNvtEddmC5laMfaUGr+6IePzgCNNl19w4wG4m981NSFZDqw==", + "dependencies": { + "@protobuf-ts/runtime": "^2.5.0", + "typescript": "^3.9" + } + }, + "node_modules/@protobuf-ts/plugin-framework/node_modules/typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/@protobuf-ts/plugin/node_modules/typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/@protobuf-ts/protoc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@protobuf-ts/protoc/-/protoc-2.5.0.tgz", + "integrity": "sha512-zrvKEOMKRFNb51Rrhghq4zWxoVCDEYmJJSUmbeTWoYl67u2DyWQMbFQy3HkwjF4kmhJUsG6HQdQHdcPBk4Yo6A==", + "bin": { + "protoc": "protoc.js" + } + }, + "node_modules/@protobuf-ts/runtime": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@protobuf-ts/runtime/-/runtime-2.5.0.tgz", + "integrity": "sha512-ClfuZQ3iPVABJ0CXLGI044eox1PtmrIbbXZaHYczdFJjaxxn8U7vnwb1dPBM9JZ2I6H1VLZu8A9Z5nRv7zydsg==" + }, + "node_modules/@protobuf-ts/runtime-rpc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@protobuf-ts/runtime-rpc/-/runtime-rpc-2.5.0.tgz", + "integrity": "sha512-zO5W1/66Ok68muvmjG0+ucTWTfzhCUurnqyspqcWGF9DDgGKSmrtR8V1MRV051UoTonOxm7NZZvM6VTbBv9DcA==", + "dependencies": { + "@protobuf-ts/runtime": "^2.5.0" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + }, + "node_modules/@sqltools/formatter": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", + "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==" + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "optional": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "devOptional": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "devOptional": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "devOptional": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "devOptional": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "dev": true + }, + "node_modules/@types/eccrypto": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/eccrypto/-/eccrypto-1.1.3.tgz", + "integrity": "sha512-3O0qER6JMYReqVbcQTGmXeMHdw3O+rVps63tlo5g5zoB3altJS8yzSvboSivwVWeYO9o5jSATu7P0UIqYZPgow==", + "dev": true, + "dependencies": { + "@types/expect": "^1.20.4", + "@types/node": "*" + } + }, + "node_modules/@types/expect": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", + "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "node_modules/@types/jsonwebtoken": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", + "integrity": "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/lodash": { + "version": "4.14.182", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", + "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==", + "dev": true + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "node_modules/@types/node": { + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==" + }, + "node_modules/@types/object-hash": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-1.3.4.tgz", + "integrity": "sha512-xFdpkAkikBgqBdG9vIlsqffDV8GpvnPEzs0IUtr1v3BEB97ijsFQ4RXVbUZwjFThhB4MDSTUfvmxUD5PGx0wXA==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "node_modules/@types/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "devOptional": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "devOptional": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/agentkeepalive": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "optional": true, + "dependencies": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/agentkeepalive/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agentkeepalive/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "optional": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agentkeepalive/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "optional": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/app-root-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", + "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/are-we-there-yet/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "devOptional": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bip66": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", + "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", + "optional": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/body-parser": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "optional": true, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "optional": true + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "optional": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "optional": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dependencies": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/copyfiles": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", + "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", + "dependencies": { + "glob": "^7.0.5", + "minimatch": "^3.0.3", + "mkdirp": "^1.0.4", + "noms": "0.0.0", + "through2": "^2.0.1", + "untildify": "^4.0.0", + "yargs": "^16.1.0" + }, + "bin": { + "copyfiles": "copyfiles", + "copyup": "copyfiles" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "optional": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "optional": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "devOptional": true + }, + "node_modules/dataloader": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", + "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==" + }, + "node_modules/date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "devOptional": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dotenv": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz", + "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==", + "engines": { + "node": ">=12" + } + }, + "node_modules/drbg.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", + "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", + "optional": true, + "dependencies": { + "browserify-aes": "^1.0.6", + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/eccrypto": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/eccrypto/-/eccrypto-1.1.6.tgz", + "integrity": "sha512-d78ivVEzu7Tn0ZphUUaL43+jVPKTMPFGtmgtz1D0LrFn7cY3K8CdrvibuLz2AAkHBLKZtR8DMbB2ukRYFk987A==", + "hasInstallScript": true, + "dependencies": { + "acorn": "7.1.1", + "elliptic": "6.5.4", + "es6-promise": "4.2.8", + "nan": "2.14.0" + }, + "optionalDependencies": { + "secp256k1": "3.7.1" + } + }, + "node_modules/eccrypto/node_modules/acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/eccrypto/node_modules/secp256k1": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.7.1.tgz", + "integrity": "sha512-1cf8sbnRreXrQFdH6qsg2H71Xw91fCCS9Yp021GnUNJzWJS/py96fS4lHbnTnouLp08Xj6jBoBB6V78Tdbdu5g==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "bindings": "^1.5.0", + "bip66": "^1.1.5", + "bn.js": "^4.11.8", + "create-hash": "^1.2.0", + "drbg.js": "^1.0.1", + "elliptic": "^6.4.1", + "nan": "^2.14.0", + "safe-buffer": "^5.1.2" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "optional": true + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "optional": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/express": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.0", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.10.3", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz", + "integrity": "sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "optional": true + }, + "node_modules/grpc-tools": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.11.2.tgz", + "integrity": "sha512-4+EgpnnkJraamY++oyBCw5Hp9huRYfgakjNVKbiE3PgO9Tv5ydVlRo7ZyGJ0C0SEiA7HhbVc1sNNtIyK7FiEtg==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.5" + }, + "bin": { + "grpc_tools_node_protoc": "bin/protoc.js", + "grpc_tools_node_protoc_plugin": "bin/protoc_plugin.js" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "optional": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash-base/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "optional": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "engines": { + "node": "*" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "optional": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "optional": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "optional": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "optional": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "optional": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "optional": true + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "optional": true + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "optional": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=4", + "npm": ">=1.4.28" + } + }, + "node_modules/jsonwebtoken/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "devOptional": true + }, + "node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "optional": true, + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "optional": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "node_modules/minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "optional": true, + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "optional": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", + "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "optional": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "optional": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/node-gyp/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "optional": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/noms": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", + "integrity": "sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "~1.0.31" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "optional": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, + "node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "node_modules/pg": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.8.0.tgz", + "integrity": "sha512-UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw==", + "dependencies": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.5.0", + "pg-pool": "^3.5.2", + "pg-protocol": "^1.5.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.2.tgz", + "integrity": "sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", + "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prettier": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", + "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "optional": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "optional": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/protobufjs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "optional": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "optional": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rxjs": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "hasInstallScript": true, + "dependencies": { + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "optional": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "optional": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "optional": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/socks-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socks-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/split2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", + "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sqlite3": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.2.tgz", + "integrity": "sha512-D0Reg6pRWAFXFUnZKsszCI67tthFD8fGPewRddDCX6w4cYwz3MbvuwRICbL+YQjBAh9zbw+lJ/V9oC8nG5j6eg==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", + "node-addon-api": "^4.2.0", + "tar": "^6.1.11" + }, + "optionalDependencies": { + "node-gyp": "8.x" + }, + "peerDependencies": { + "node-gyp": "8.x" + }, + "peerDependenciesMeta": { + "node-gyp": { + "optional": true + } + } + }, + "node_modules/sqlite3/node_modules/node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "optional": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/testyts": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/testyts/-/testyts-1.5.0.tgz", + "integrity": "sha512-ww6zqyf5kN7NFqaJ0ODX4tRTLKs5RNhHPGJCv4tw5qDU9bdhNXSbuqqjbgMe1YSWjBuSDT6o3XTnNCehrJGwPQ==", + "dev": true, + "dependencies": { + "commander": "^4.1.1", + "glob": "^7.1.6", + "reflect-metadata": "^0.1.12", + "ts-node": "^7.0.1", + "tsconfig-paths": "^3.9.0", + "typescript": "^3.8.3" + }, + "bin": { + "testyts": "build/testy.js" + } + }, + "node_modules/testyts/node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/testyts/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/testyts/node_modules/ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dev": true, + "dependencies": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + }, + "bin": { + "ts-node": "dist/bin.js" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/testyts/node_modules/typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/testyts/node_modules/yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/through2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "node_modules/ts-node": { + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz", + "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==", + "devOptional": true, + "dependencies": { + "@cspotcode/source-map-support": "0.7.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.0", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-poet": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-4.11.0.tgz", + "integrity": "sha512-OaXnCKsRs0yrc0O7LFhnq/US2DB4Wd313cS+qjG2XMksZ74pF/jvMHkJdURXJiAo4kSahL2N4e8JOdwUjOMNdw==", + "dependencies": { + "lodash": "^4.17.15", + "prettier": "^2.5.1" + } + }, + "node_modules/ts-proto": { + "version": "1.112.1", + "resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-1.112.1.tgz", + "integrity": "sha512-pMqPsgehCR5lNHYrSCfaC7Vx5RXLxTk0MQFvC69+9E4x6yvAed3orCLAWZ1VvPug02bBK5J5vV8JJLS3+FnnUA==", + "dependencies": { + "@types/object-hash": "^1.3.0", + "dataloader": "^1.4.0", + "object-hash": "^1.3.1", + "protobufjs": "^6.8.8", + "ts-poet": "^4.11.0", + "ts-proto-descriptors": "1.6.0" + }, + "bin": { + "protoc-gen-ts_proto": "protoc-gen-ts_proto" + } + }, + "node_modules/ts-proto-descriptors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-1.6.0.tgz", + "integrity": "sha512-Vrhue2Ti99us/o76mGy28nF3W/Uanl1/8detyJw2yyRwiBC5yxy+hEZqQ/ZX2PbZ1vyCpJ51A9L4PnCCnkBMTQ==", + "dependencies": { + "long": "^4.0.0", + "protobufjs": "^6.8.8" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typeorm": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.10.tgz", + "integrity": "sha512-VMKiM84EpJQ+Mz9xDIPqnfplWhyUy1d8ccaKdMY9obifxJOTFnv8GYVyPsGwG8Lk7Nb8MlttHyHWENGAhBA3WA==", + "dependencies": { + "@sqltools/formatter": "^1.2.2", + "app-root-path": "^3.0.0", + "buffer": "^6.0.3", + "chalk": "^4.1.0", + "cli-highlight": "^2.1.11", + "date-fns": "^2.28.0", + "debug": "^4.3.3", + "dotenv": "^16.0.0", + "glob": "^7.2.0", + "js-yaml": "^4.1.0", + "mkdirp": "^1.0.4", + "reflect-metadata": "^0.1.13", + "sha.js": "^2.4.11", + "tslib": "^2.3.1", + "uuid": "^8.3.2", + "xml2js": "^0.4.23", + "yargs": "^17.3.1" + }, + "bin": { + "typeorm": "cli.js", + "typeorm-ts-node-commonjs": "cli-ts-node-commonjs.js", + "typeorm-ts-node-esm": "cli-ts-node-esm.js" + }, + "engines": { + "node": ">= 12.9.0" + }, + "funding": { + "url": "https://opencollective.com/typeorm" + }, + "peerDependencies": { + "@google-cloud/spanner": "^5.18.0", + "@sap/hana-client": "^2.12.25", + "better-sqlite3": "^7.1.2", + "hdb-pool": "^0.1.6", + "ioredis": "^5.0.4", + "mongodb": "^3.6.0", + "mssql": "^7.3.0", + "mysql2": "^2.2.5", + "oracledb": "^5.1.0", + "pg": "^8.5.1", + "pg-native": "^3.0.0", + "pg-query-stream": "^4.0.0", + "redis": "^3.1.1 || ^4.0.0", + "sql.js": "^1.4.0", + "sqlite3": "^5.0.3", + "ts-node": "^10.7.0", + "typeorm-aurora-data-api-driver": "^2.0.0" + }, + "peerDependenciesMeta": { + "@google-cloud/spanner": { + "optional": true + }, + "@sap/hana-client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "hdb-pool": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "mongodb": { + "optional": true + }, + "mssql": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-native": { + "optional": true + }, + "pg-query-stream": { + "optional": true + }, + "redis": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "ts-node": { + "optional": true + }, + "typeorm-aurora-data-api-driver": { + "optional": true + } + } + }, + "node_modules/typeorm/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/typeorm/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/typeorm/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/typeorm/node_modules/yargs": { + "version": "17.6.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.1.tgz", + "integrity": "sha512-leBuCGrL4dAd6ispNOGsJlhd0uZ6Qehkbu/B9KCR+Pxa/NVdNwi+i31lo0buCm6XxhJQFshXCD0/evfV4xfoUg==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/typeorm/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/typescript": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", + "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "optional": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "optional": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "devOptional": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "optional": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "devOptional": true, + "engines": { + "node": ">=6" + } + } + }, + "dependencies": { + "@cspotcode/source-map-consumer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", + "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", + "devOptional": true + }, + "@cspotcode/source-map-support": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", + "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", + "devOptional": true, + "requires": { + "@cspotcode/source-map-consumer": "0.8.0" + } + }, + "@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "optional": true + }, + "@grpc/grpc-js": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.6.7.tgz", + "integrity": "sha512-eBM03pu9hd3VqDQG+kHahiG1x80RGkkqqRb1Pchcwqej/KkAH95gAvKs6laqaHCycYaPK+TKuNQnOz9UXYA8qw==", + "requires": { + "@grpc/proto-loader": "^0.6.4", + "@types/node": ">=12.12.47" + } + }, + "@grpc/proto-loader": { + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.12.tgz", + "integrity": "sha512-filTVbETFnxb9CyRX98zN18ilChTuf/C5scZ2xyaOTp0EHGq0/ufX8rjqXUcSb1Gpv7eZq4M2jDvbh9BogKnrg==", + "requires": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.10.0", + "yargs": "^16.2.0" + } + }, + "@mapbox/node-pre-gyp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", + "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", + "requires": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + } + }, + "@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "optional": true, + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "optional": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@protobuf-ts/grpc-transport": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@protobuf-ts/grpc-transport/-/grpc-transport-2.5.0.tgz", + "integrity": "sha512-VyIar6U1wcKH3bD6scyA9efPlr0sjvLOCO7F0rcSIrbDn+lEQcHwS/3GN5tqYgh4O0/hAopuGiQ/UTpiR1n6kQ==", + "requires": { + "@protobuf-ts/runtime": "^2.5.0", + "@protobuf-ts/runtime-rpc": "^2.5.0" + } + }, + "@protobuf-ts/plugin": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@protobuf-ts/plugin/-/plugin-2.5.0.tgz", + "integrity": "sha512-+lTtBPZad4gGE9eh9lMn+Fq79u4JB8YY/7uEmJSl8pk+4vMp6W02TxWYBMW4gBh5hzcZHGdEBx90OQxt1MDeJQ==", + "requires": { + "@protobuf-ts/plugin-framework": "^2.5.0", + "@protobuf-ts/protoc": "^2.5.0", + "@protobuf-ts/runtime": "^2.5.0", + "@protobuf-ts/runtime-rpc": "^2.5.0", + "typescript": "^3.9" + }, + "dependencies": { + "typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==" + } + } + }, + "@protobuf-ts/plugin-framework": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@protobuf-ts/plugin-framework/-/plugin-framework-2.5.0.tgz", + "integrity": "sha512-bOf6oP4P0rjNp7bS8NSF/4O9a2WqHb3SSl4aNYzsNvtEddmC5laMfaUGr+6IePzgCNNl19w4wG4m981NSFZDqw==", + "requires": { + "@protobuf-ts/runtime": "^2.5.0", + "typescript": "^3.9" + }, + "dependencies": { + "typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==" + } + } + }, + "@protobuf-ts/protoc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@protobuf-ts/protoc/-/protoc-2.5.0.tgz", + "integrity": "sha512-zrvKEOMKRFNb51Rrhghq4zWxoVCDEYmJJSUmbeTWoYl67u2DyWQMbFQy3HkwjF4kmhJUsG6HQdQHdcPBk4Yo6A==" + }, + "@protobuf-ts/runtime": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@protobuf-ts/runtime/-/runtime-2.5.0.tgz", + "integrity": "sha512-ClfuZQ3iPVABJ0CXLGI044eox1PtmrIbbXZaHYczdFJjaxxn8U7vnwb1dPBM9JZ2I6H1VLZu8A9Z5nRv7zydsg==" + }, + "@protobuf-ts/runtime-rpc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@protobuf-ts/runtime-rpc/-/runtime-rpc-2.5.0.tgz", + "integrity": "sha512-zO5W1/66Ok68muvmjG0+ucTWTfzhCUurnqyspqcWGF9DDgGKSmrtR8V1MRV051UoTonOxm7NZZvM6VTbBv9DcA==", + "requires": { + "@protobuf-ts/runtime": "^2.5.0" + } + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + }, + "@sqltools/formatter": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", + "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==" + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "optional": true + }, + "@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "devOptional": true + }, + "@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "devOptional": true + }, + "@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "devOptional": true + }, + "@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "devOptional": true + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "dev": true + }, + "@types/eccrypto": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/eccrypto/-/eccrypto-1.1.3.tgz", + "integrity": "sha512-3O0qER6JMYReqVbcQTGmXeMHdw3O+rVps63tlo5g5zoB3altJS8yzSvboSivwVWeYO9o5jSATu7P0UIqYZPgow==", + "dev": true, + "requires": { + "@types/expect": "^1.20.4", + "@types/node": "*" + } + }, + "@types/expect": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", + "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", + "dev": true + }, + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/jsonwebtoken": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", + "integrity": "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/lodash": { + "version": "4.14.182", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", + "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==", + "dev": true + }, + "@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "@types/node": { + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==" + }, + "@types/object-hash": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-1.3.4.tgz", + "integrity": "sha512-xFdpkAkikBgqBdG9vIlsqffDV8GpvnPEzs0IUtr1v3BEB97ijsFQ4RXVbUZwjFThhB4MDSTUfvmxUD5PGx0wXA==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "@types/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", + "requires": { + "@types/node": "*" + } + }, + "@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "devOptional": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "devOptional": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "agentkeepalive": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "optional": true, + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "optional": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + } + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "optional": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "app-root-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", + "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==" + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "devOptional": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "requires": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bip66": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", + "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "body-parser": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "optional": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "optional": true + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "optional": true, + "requires": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "optional": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "optional": true + }, + "cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "requires": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "copyfiles": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", + "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", + "requires": { + "glob": "^7.0.5", + "minimatch": "^3.0.3", + "mkdirp": "^1.0.4", + "noms": "0.0.0", + "through2": "^2.0.1", + "untildify": "^4.0.0", + "yargs": "^16.1.0" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "optional": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "optional": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "devOptional": true + }, + "dataloader": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", + "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==" + }, + "date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "devOptional": true + }, + "dotenv": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz", + "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==" + }, + "drbg.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", + "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", + "optional": true, + "requires": { + "browserify-aes": "^1.0.6", + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4" + } + }, + "eccrypto": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/eccrypto/-/eccrypto-1.1.6.tgz", + "integrity": "sha512-d78ivVEzu7Tn0ZphUUaL43+jVPKTMPFGtmgtz1D0LrFn7cY3K8CdrvibuLz2AAkHBLKZtR8DMbB2ukRYFk987A==", + "requires": { + "acorn": "7.1.1", + "elliptic": "6.5.4", + "es6-promise": "4.2.8", + "nan": "2.14.0", + "secp256k1": "3.7.1" + }, + "dependencies": { + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" + }, + "secp256k1": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.7.1.tgz", + "integrity": "sha512-1cf8sbnRreXrQFdH6qsg2H71Xw91fCCS9Yp021GnUNJzWJS/py96fS4lHbnTnouLp08Xj6jBoBB6V78Tdbdu5g==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "bip66": "^1.1.5", + "bn.js": "^4.11.8", + "create-hash": "^1.2.0", + "drbg.js": "^1.0.1", + "elliptic": "^6.4.1", + "nan": "^2.14.0", + "safe-buffer": "^5.1.2" + } + } + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "optional": true + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "optional": true + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "optional": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "express": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.0", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.10.3", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "follow-redirects": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz", + "integrity": "sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "optional": true + }, + "grpc-tools": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.11.2.tgz", + "integrity": "sha512-4+EgpnnkJraamY++oyBCw5Hp9huRYfgakjNVKbiE3PgO9Tv5ydVlRo7ZyGJ0C0SEiA7HhbVc1sNNtIyK7FiEtg==", + "requires": { + "@mapbox/node-pre-gyp": "^1.0.5" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "optional": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "optional": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "optional": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "optional": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "optional": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + } + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "optional": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "optional": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "optional": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "optional": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "optional": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "optional": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "optional": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "devOptional": true + }, + "make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "optional": true, + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "optional": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "optional": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "optional": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "optional": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "optional": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "optional": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "optional": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "dependencies": { + "are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "optional": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + } + }, + "npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "optional": true, + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "optional": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "optional": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "node-gyp-build": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", + "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==" + }, + "noms": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", + "integrity": "sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "~1.0.31" + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" + }, + "object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "optional": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "requires": { + "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + } + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "pg": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.8.0.tgz", + "integrity": "sha512-UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw==", + "requires": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.5.0", + "pg-pool": "^3.5.2", + "pg-protocol": "^1.5.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + } + }, + "pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + }, + "pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" + }, + "pg-pool": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.2.tgz", + "integrity": "sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w==", + "requires": {} + }, + "pg-protocol": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", + "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" + }, + "pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "requires": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + } + }, + "pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "requires": { + "split2": "^4.1.0" + } + }, + "postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" + }, + "postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==" + }, + "postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==" + }, + "postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "requires": { + "xtend": "^4.0.0" + } + }, + "prettier": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", + "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "optional": true + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "optional": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "protobufjs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "optional": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "optional": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rxjs": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "requires": { + "tslib": "^2.1.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "requires": { + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + } + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "optional": true + }, + "socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "optional": true, + "requires": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "optional": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "split2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", + "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==" + }, + "sqlite3": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.2.tgz", + "integrity": "sha512-D0Reg6pRWAFXFUnZKsszCI67tthFD8fGPewRddDCX6w4cYwz3MbvuwRICbL+YQjBAh9zbw+lJ/V9oC8nG5j6eg==", + "requires": { + "@mapbox/node-pre-gyp": "^1.0.0", + "node-addon-api": "^4.2.0", + "node-gyp": "8.x", + "tar": "^6.1.11" + }, + "dependencies": { + "node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" + } + } + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "optional": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "testyts": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/testyts/-/testyts-1.5.0.tgz", + "integrity": "sha512-ww6zqyf5kN7NFqaJ0ODX4tRTLKs5RNhHPGJCv4tw5qDU9bdhNXSbuqqjbgMe1YSWjBuSDT6o3XTnNCehrJGwPQ==", + "dev": true, + "requires": { + "commander": "^4.1.1", + "glob": "^7.1.6", + "reflect-metadata": "^0.1.12", + "ts-node": "^7.0.1", + "tsconfig-paths": "^3.9.0", + "typescript": "^3.8.3" + }, + "dependencies": { + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dev": true, + "requires": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + } + }, + "typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "dev": true + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true + } + } + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "ts-node": { + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz", + "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==", + "devOptional": true, + "requires": { + "@cspotcode/source-map-support": "0.7.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.0", + "yn": "3.1.1" + } + }, + "ts-poet": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-4.11.0.tgz", + "integrity": "sha512-OaXnCKsRs0yrc0O7LFhnq/US2DB4Wd313cS+qjG2XMksZ74pF/jvMHkJdURXJiAo4kSahL2N4e8JOdwUjOMNdw==", + "requires": { + "lodash": "^4.17.15", + "prettier": "^2.5.1" + } + }, + "ts-proto": { + "version": "1.112.1", + "resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-1.112.1.tgz", + "integrity": "sha512-pMqPsgehCR5lNHYrSCfaC7Vx5RXLxTk0MQFvC69+9E4x6yvAed3orCLAWZ1VvPug02bBK5J5vV8JJLS3+FnnUA==", + "requires": { + "@types/object-hash": "^1.3.0", + "dataloader": "^1.4.0", + "object-hash": "^1.3.1", + "protobufjs": "^6.8.8", + "ts-poet": "^4.11.0", + "ts-proto-descriptors": "1.6.0" + } + }, + "ts-proto-descriptors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-1.6.0.tgz", + "integrity": "sha512-Vrhue2Ti99us/o76mGy28nF3W/Uanl1/8detyJw2yyRwiBC5yxy+hEZqQ/ZX2PbZ1vyCpJ51A9L4PnCCnkBMTQ==", + "requires": { + "long": "^4.0.0", + "protobufjs": "^6.8.8" + } + }, + "tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typeorm": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.10.tgz", + "integrity": "sha512-VMKiM84EpJQ+Mz9xDIPqnfplWhyUy1d8ccaKdMY9obifxJOTFnv8GYVyPsGwG8Lk7Nb8MlttHyHWENGAhBA3WA==", + "requires": { + "@sqltools/formatter": "^1.2.2", + "app-root-path": "^3.0.0", + "buffer": "^6.0.3", + "chalk": "^4.1.0", + "cli-highlight": "^2.1.11", + "date-fns": "^2.28.0", + "debug": "^4.3.3", + "dotenv": "^16.0.0", + "glob": "^7.2.0", + "js-yaml": "^4.1.0", + "mkdirp": "^1.0.4", + "reflect-metadata": "^0.1.13", + "sha.js": "^2.4.11", + "tslib": "^2.3.1", + "uuid": "^8.3.2", + "xml2js": "^0.4.23", + "yargs": "^17.3.1" + }, + "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "yargs": { + "version": "17.6.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.1.tgz", + "integrity": "sha512-leBuCGrL4dAd6ispNOGsJlhd0uZ6Qehkbu/B9KCR+Pxa/NVdNwi+i31lo0buCm6XxhJQFshXCD0/evfV4xfoUg==", + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + } + } + }, + "typescript": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", + "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", + "devOptional": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "optional": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "optional": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "devOptional": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "optional": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "devOptional": true + } + } +} diff --git a/package.json b/package.json index 0972662a..b985d217 100644 --- a/package.json +++ b/package.json @@ -1,113 +1,64 @@ { - "name": "lightningpub", - "version": "2022.12.1", + "name": "lightning.pub", + "version": "1.0.0", "description": "", - "main": "src/server.js", + "main": "index.js", "scripts": { - "start": "node main.js -c", - "dev": "node --trace-warnings --max-old-space-size=4096 main.js -h 0.0.0.0", - "dev:watch": "nodemon main.js -- -h 0.0.0.0", - "dev:attach": "node --inspect --trace-warnings --max-old-space-size=4096 main.js -h 0.0.0.0", - "test": "mocha ./utils -b -t 50000 --recursive", - "typecheck": "tsc", - "lint": "eslint \"services/gunDB/**/*.js\"", - "format": "prettier --write \"./**/*.js\"", + "test": "tsc && testyts", + "start": "ts-node src/index.ts", + "build_autogenerated": "cd proto && rimraf autogenerated && protoc -I ./service --pub_out=. service/*", + "build_lnd_client_1": "cd proto && protoc -I ./others --plugin=.\\node_modules\\.bin\\protoc-gen-ts_proto.cmd --ts_proto_out=./lnd --ts_proto_opt=esModuleInterop=true others/* ", + "build_lnd_client": "cd proto && rimraf lnd/* && npx protoc --ts_out ./lnd --ts_opt long_type_string --proto_path others others/* ", + "typeorm": "typeorm-ts-node-commonjs" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/shocknet/Lightning.Pub.git" }, "author": "", "license": "ISC", + "bugs": { + "url": "https://github.com/shocknet/Lightning.Pub/issues" + }, + "homepage": "https://github.com/shocknet/Lightning.Pub#readme", "dependencies": { - "@grpc/grpc-js": "^1.2.2", - "@grpc/proto-loader": "^0.5.5", - "assert-never": "^1.2.1", - "axios": "^1.1.2", - "basic-auth": "^2.0.0", - "big.js": "^6.2.1", - "bitcore-lib": "^8.25.8", - "bluebird": "^3.7.2", - "body-parser": "^1.16.0", - "colors": "^1.4.0", - "command-exists": "^1.2.6", - "commander": "^9.4.1", - "compression": "^1.7.4", + "@grpc/grpc-js": "^1.6.7", + "@protobuf-ts/grpc-transport": "^2.5.0", + "@protobuf-ts/plugin": "^2.5.0", + "@protobuf-ts/runtime": "^2.5.0", + "@types/express": "^4.17.13", + "@types/node": "^17.0.31", + "@types/secp256k1": "^4.0.3", + "axios": "^0.27.2", + "copyfiles": "^2.4.1", "cors": "^2.8.5", - "debug": "^3.1.0", - "dotenv": "^16.0.3", + "dotenv": "^16.0.0", "eccrypto": "^1.1.6", - "express": "^4.14.1", - "express-session": "^1.17.1", - "google-proto-files": "^1.0.3", - "graphviz": "0.0.9", - "grpc": "1.24.4", - "husky": "^8.0.1", - "jsonfile": "^6.1.0", - "jsonwebtoken": "^8.3.0", + "express": "^4.18.1", + "grpc-tools": "^1.11.2", + "jsonwebtoken": "^8.5.1", "lodash": "^4.17.21", - "method-override": "^3.0.0", - "node-fetch": "^3.2.10", - "node-persist": "^3.1.0", - "promise": "^8.1.0", - "qrcode-terminal": "^0.12.0", - "ramda": "^0.27.1", - "request": "^2.88.2", - "request-promise": "^4.2.6", - "response-time": "^2.3.2", - "shelljs": "^0.8.2", - "shock-common": "^37.0.0", - "socket.io": "4.0.1", - "socket.io-msgpack-parser": "^3.0.1", - "text-encoding": "^0.7.0", - "tingodb": "^0.6.1", - "uuid": "3.x.x", - "winston": "^3.3.3", - "winston-daily-rotate-file": "^4.5.0" + "pg": "^8.4.0", + "reflect-metadata": "^0.1.13", + "rimraf": "^3.0.2", + "rxjs": "^7.5.5", + "secp256k1": "^4.0.3", + "sqlite3": "^5.1.2", + "ts-node": "^10.7.0", + "ts-proto": "^1.112.1", + "typeorm": "0.3.10", + "typescript": "^4.6.4", + "uuid": "^8.3.2" }, "devDependencies": { - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@types/bluebird": "^3.5.32", - "@types/dotenv": "^8.2.0", - "@types/eccrypto": "^1.1.2", - "@types/express": "^4.17.1", - "@types/gun": "^0.9.2", - "@types/jsonwebtoken": "^8.3.7", - "@types/lodash": "^4.14.168", - "@types/mocha": "^9.0.0", - "@types/node-fetch": "^2.5.8", - "@types/node-persist": "^3.1.1", - "@types/ramda": "types/npm-ramda#dist", - "@types/random-words": "^1.1.2", - "@types/react": "16.x.x", - "@types/uuid": "^8.3.0", - "babel-eslint": "^10.1.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", - "eslint": "^8.25.0", - "eslint-config-prettier": "^6.5.0", - "eslint-plugin-babel": "^5.3.1", - "eslint-plugin-jest": "^22.20.1", - "eslint-plugin-prettier": "^3.4.0", - "jest": "^24.9.0", - "lint-staged": "^10.5.4", - "nodemon": "^2.0.7", - "prettier": "^1.18.2", - "random-words": "^1.1.1", - "rimraf": "^3.0.2", - "ts-node": "^9.1.1", - "ts-type": "^3.0.1", - "typescript": "^4.5.4" - }, - "lint-staged": { - "*.js": [ - "prettier --check", - "eslint" - ], - "*.ts": [ - "prettier --check" - ] - }, - "husky": { - "hooks": {} - }, - "engines": { - "npm": "Use yarn!" - }, - "packageManager": "yarn@3.1.1" -} + "@types/cors": "^2.8.12", + "@types/eccrypto": "^1.1.3", + "@types/jsonwebtoken": "^8.5.9", + "@types/lodash": "^4.14.182", + "@types/node": "^16.11.10", + "@types/uuid": "^8.3.4", + "testyts": "^1.5.0", + "ts-node": "10.7.0", + "typescript": "4.5.2" + } +} \ No newline at end of file diff --git a/proto/CODEGEN.md b/proto/CODEGEN.md new file mode 100644 index 00000000..82f63fb1 --- /dev/null +++ b/proto/CODEGEN.md @@ -0,0 +1,2 @@ +create lnd classes: `npx protoc -I ./others --ts_out=./lnd others/*` +create server classes: `npx protoc -I ./service --pub_out=. service/*` \ No newline at end of file diff --git a/proto/autogenerated/debug.txt b/proto/autogenerated/debug.txt new file mode 100644 index 00000000..538bc2c2 --- /dev/null +++ b/proto/autogenerated/debug.txt @@ -0,0 +1,697 @@ +([]*main.Method) (len=11 cap=16) { + (*main.Method)(0xc0002886e0)({ + in: (main.MethodMessage) { + name: (string) (len=5) "Empty", + hasZeroFields: (bool) true + }, + name: (string) (len=6) "Health", + out: (main.MethodMessage) { + name: (string) (len=5) "Empty", + hasZeroFields: (bool) true + }, + opts: (*main.methodOptions)(0xc0003cc420)({ + authType: (*main.supportedAuth)(0xc000379fb0)({ + id: (string) (len=5) "guest", + name: (string) (len=5) "Guest", + encrypted: (bool) false, + context: (map[string]string) { + } + }), + method: (string) (len=3) "get", + route: (main.decodedRoute) { + route: (string) (len=11) "/api/health", + params: ([]string) + }, + query: ([]string) + }) + }), + (*main.Method)(0xc000288730)({ + in: (main.MethodMessage) { + name: (string) (len=25) "EncryptionExchangeRequest", + hasZeroFields: (bool) false + }, + name: (string) (len=18) "EncryptionExchange", + out: (main.MethodMessage) { + name: (string) (len=5) "Empty", + hasZeroFields: (bool) true + }, + opts: (*main.methodOptions)(0xc0003cc5a0)({ + authType: (*main.supportedAuth)(0xc0003d60c0)({ + id: (string) (len=5) "guest", + name: (string) (len=5) "Guest", + encrypted: (bool) false, + context: (map[string]string) { + } + }), + method: (string) (len=4) "post", + route: (main.decodedRoute) { + route: (string) (len=24) "/api/encryption/exchange", + params: ([]string) + }, + query: ([]string) + }) + }), + (*main.Method)(0xc000288780)({ + in: (main.MethodMessage) { + name: (string) (len=17) "LndGetInfoRequest", + hasZeroFields: (bool) false + }, + name: (string) (len=10) "LndGetInfo", + out: (main.MethodMessage) { + name: (string) (len=18) "LndGetInfoResponse", + hasZeroFields: (bool) false + }, + opts: (*main.methodOptions)(0xc0003cc720)({ + authType: (*main.supportedAuth)(0xc0003d6180)({ + id: (string) (len=5) "admin", + name: (string) (len=5) "Admin", + encrypted: (bool) true, + context: (map[string]string) (len=1) { + (string) (len=8) "admin_id": (string) (len=6) "string" + } + }), + method: (string) (len=4) "post", + route: (main.decodedRoute) { + route: (string) (len=16) "/api/lnd/getinfo", + params: ([]string) + }, + query: ([]string) + }) + }), + (*main.Method)(0xc0002887d0)({ + in: (main.MethodMessage) { + name: (string) (len=14) "AddUserRequest", + hasZeroFields: (bool) false + }, + name: (string) (len=7) "AddUser", + out: (main.MethodMessage) { + name: (string) (len=15) "AddUserResponse", + hasZeroFields: (bool) false + }, + opts: (*main.methodOptions)(0xc0003cc8a0)({ + authType: (*main.supportedAuth)(0xc0003d6240)({ + id: (string) (len=5) "guest", + name: (string) (len=5) "Guest", + encrypted: (bool) false, + context: (map[string]string) { + } + }), + method: (string) (len=4) "post", + route: (main.decodedRoute) { + route: (string) (len=13) "/api/user/add", + params: ([]string) + }, + query: ([]string) + }) + }), + (*main.Method)(0xc000288820)({ + in: (main.MethodMessage) { + name: (string) (len=15) "AuthUserRequest", + hasZeroFields: (bool) false + }, + name: (string) (len=8) "AuthUser", + out: (main.MethodMessage) { + name: (string) (len=16) "AuthUserResponse", + hasZeroFields: (bool) false + }, + opts: (*main.methodOptions)(0xc0003cca20)({ + authType: (*main.supportedAuth)(0xc0003d6300)({ + id: (string) (len=5) "guest", + name: (string) (len=5) "Guest", + encrypted: (bool) false, + context: (map[string]string) { + } + }), + method: (string) (len=4) "post", + route: (main.decodedRoute) { + route: (string) (len=14) "/api/user/auth", + params: ([]string) + }, + query: ([]string) + }) + }), + (*main.Method)(0xc0002888c0)({ + in: (main.MethodMessage) { + name: (string) (len=17) "NewAddressRequest", + hasZeroFields: (bool) false + }, + name: (string) (len=10) "NewAddress", + out: (main.MethodMessage) { + name: (string) (len=18) "NewAddressResponse", + hasZeroFields: (bool) false + }, + opts: (*main.methodOptions)(0xc0003ccba0)({ + authType: (*main.supportedAuth)(0xc0003d63c0)({ + id: (string) (len=4) "user", + name: (string) (len=4) "User", + encrypted: (bool) false, + context: (map[string]string) (len=1) { + (string) (len=7) "user_id": (string) (len=6) "string" + } + }), + method: (string) (len=4) "post", + route: (main.decodedRoute) { + route: (string) (len=19) "/api/user/chain/new", + params: ([]string) + }, + query: ([]string) + }) + }), + (*main.Method)(0xc000288960)({ + in: (main.MethodMessage) { + name: (string) (len=17) "PayAddressRequest", + hasZeroFields: (bool) false + }, + name: (string) (len=10) "PayAddress", + out: (main.MethodMessage) { + name: (string) (len=18) "PayAddressResponse", + hasZeroFields: (bool) false + }, + opts: (*main.methodOptions)(0xc0003ccd20)({ + authType: (*main.supportedAuth)(0xc0003d6480)({ + id: (string) (len=4) "user", + name: (string) (len=4) "User", + encrypted: (bool) false, + context: (map[string]string) (len=1) { + (string) (len=7) "user_id": (string) (len=6) "string" + } + }), + method: (string) (len=4) "post", + route: (main.decodedRoute) { + route: (string) (len=19) "/api/user/chain/pay", + params: ([]string) + }, + query: ([]string) + }) + }), + (*main.Method)(0xc000288a00)({ + in: (main.MethodMessage) { + name: (string) (len=17) "NewInvoiceRequest", + hasZeroFields: (bool) false + }, + name: (string) (len=10) "NewInvoice", + out: (main.MethodMessage) { + name: (string) (len=18) "NewInvoiceResponse", + hasZeroFields: (bool) false + }, + opts: (*main.methodOptions)(0xc0003ccea0)({ + authType: (*main.supportedAuth)(0xc0003d6540)({ + id: (string) (len=4) "user", + name: (string) (len=4) "User", + encrypted: (bool) false, + context: (map[string]string) (len=1) { + (string) (len=7) "user_id": (string) (len=6) "string" + } + }), + method: (string) (len=4) "post", + route: (main.decodedRoute) { + route: (string) (len=21) "/api/user/invoice/new", + params: ([]string) + }, + query: ([]string) + }) + }), + (*main.Method)(0xc000288aa0)({ + in: (main.MethodMessage) { + name: (string) (len=17) "PayInvoiceRequest", + hasZeroFields: (bool) false + }, + name: (string) (len=10) "PayInvoice", + out: (main.MethodMessage) { + name: (string) (len=18) "PayInvoiceResponse", + hasZeroFields: (bool) false + }, + opts: (*main.methodOptions)(0xc0003cd020)({ + authType: (*main.supportedAuth)(0xc0003d6600)({ + id: (string) (len=4) "user", + name: (string) (len=4) "User", + encrypted: (bool) false, + context: (map[string]string) (len=1) { + (string) (len=7) "user_id": (string) (len=6) "string" + } + }), + method: (string) (len=4) "post", + route: (main.decodedRoute) { + route: (string) (len=21) "/api/user/invoice/pay", + params: ([]string) + }, + query: ([]string) + }) + }), + (*main.Method)(0xc000288b40)({ + in: (main.MethodMessage) { + name: (string) (len=18) "OpenChannelRequest", + hasZeroFields: (bool) false + }, + name: (string) (len=11) "OpenChannel", + out: (main.MethodMessage) { + name: (string) (len=19) "OpenChannelResponse", + hasZeroFields: (bool) false + }, + opts: (*main.methodOptions)(0xc0003cd1a0)({ + authType: (*main.supportedAuth)(0xc0003d66c0)({ + id: (string) (len=4) "user", + name: (string) (len=4) "User", + encrypted: (bool) false, + context: (map[string]string) (len=1) { + (string) (len=7) "user_id": (string) (len=6) "string" + } + }), + method: (string) (len=4) "post", + route: (main.decodedRoute) { + route: (string) (len=22) "/api/user/open/channel", + params: ([]string) + }, + query: ([]string) + }) + }), + (*main.Method)(0xc000288b90)({ + in: (main.MethodMessage) { + name: (string) (len=5) "Empty", + hasZeroFields: (bool) true + }, + name: (string) (len=19) "GetOpenChannelLNURL", + out: (main.MethodMessage) { + name: (string) (len=27) "GetOpenChannelLNURLResponse", + hasZeroFields: (bool) false + }, + opts: (*main.methodOptions)(0xc0003cd320)({ + authType: (*main.supportedAuth)(0xc0003d6780)({ + id: (string) (len=4) "user", + name: (string) (len=4) "User", + encrypted: (bool) false, + context: (map[string]string) (len=1) { + (string) (len=7) "user_id": (string) (len=6) "string" + } + }), + method: (string) (len=4) "post", + route: (main.decodedRoute) { + route: (string) (len=23) "/api/user/lnurl_channel", + params: ([]string) + }, + query: ([]string) + }) + }) +} + +([]*main.Enum) (len=1 cap=1) { + (*main.Enum)(0xc000379860)({ + name: (string) (len=11) "AddressType", + values: ([]main.EnumValue) (len=3 cap=4) { + (main.EnumValue) { + number: (int64) 0, + name: (string) (len=19) "WITNESS_PUBKEY_HASH" + }, + (main.EnumValue) { + number: (int64) 1, + name: (string) (len=18) "NESTED_PUBKEY_HASH" + }, + (main.EnumValue) { + number: (int64) 2, + name: (string) (len=14) "TAPROOT_PUBKEY" + } + } + }) +} + +(map[string]*main.Message) (len=19) { + (string) (len=17) "LndGetInfoRequest": (*main.Message)(0xc000215140)({ + fullName: (string) (len=17) "LndGetInfoRequest", + name: (string) (len=17) "LndGetInfoRequest", + fields: ([]*main.Field) (len=1 cap=1) { + (*main.Field)(0xc000379320)({ + name: (string) (len=7) "node_id", + kind: (string) (len=5) "int64", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }) + } + }), + (string) (len=18) "LndGetInfoResponse": (*main.Message)(0xc000215180)({ + fullName: (string) (len=18) "LndGetInfoResponse", + name: (string) (len=18) "LndGetInfoResponse", + fields: ([]*main.Field) (len=1 cap=1) { + (*main.Field)(0xc000379350)({ + name: (string) (len=5) "alias", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }) + } + }), + (string) (len=17) "NewAddressRequest": (*main.Message)(0xc0002151c0)({ + fullName: (string) (len=17) "NewAddressRequest", + name: (string) (len=17) "NewAddressRequest", + fields: ([]*main.Field) (len=1 cap=1) { + (*main.Field)(0xc000379380)({ + name: (string) (len=12) "address_type", + kind: (string) (len=11) "AddressType", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) true, + isMessage: (bool) false, + isOptional: (bool) false + }) + } + }), + (string) (len=17) "NewInvoiceRequest": (*main.Message)(0xc0002152c0)({ + fullName: (string) (len=17) "NewInvoiceRequest", + name: (string) (len=17) "NewInvoiceRequest", + fields: ([]*main.Field) (len=1 cap=1) { + (*main.Field)(0xc000379470)({ + name: (string) (len=11) "amount_sats", + kind: (string) (len=5) "int64", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }) + } + }), + (string) (len=18) "PayInvoiceResponse": (*main.Message)(0xc000215380)({ + fullName: (string) (len=18) "PayInvoiceResponse", + name: (string) (len=18) "PayInvoiceResponse", + fields: ([]*main.Field) (len=1 cap=1) { + (*main.Field)(0xc000379530)({ + name: (string) (len=8) "preimage", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }) + } + }), + (string) (len=19) "OpenChannelResponse": (*main.Message)(0xc000215400)({ + fullName: (string) (len=19) "OpenChannelResponse", + name: (string) (len=19) "OpenChannelResponse", + fields: ([]*main.Field) (len=1 cap=1) { + (*main.Field)(0xc000379620)({ + name: (string) (len=10) "channel_id", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }) + } + }), + (string) (len=18) "PayAddressResponse": (*main.Message)(0xc000215280)({ + fullName: (string) (len=18) "PayAddressResponse", + name: (string) (len=18) "PayAddressResponse", + fields: ([]*main.Field) (len=1 cap=1) { + (*main.Field)(0xc000379440)({ + name: (string) (len=5) "tx_id", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }) + } + }), + (string) (len=17) "PayInvoiceRequest": (*main.Message)(0xc000215340)({ + fullName: (string) (len=17) "PayInvoiceRequest", + name: (string) (len=17) "PayInvoiceRequest", + fields: ([]*main.Field) (len=2 cap=2) { + (*main.Field)(0xc0003794d0)({ + name: (string) (len=7) "invoice", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }), + (*main.Field)(0xc000379500)({ + name: (string) (len=6) "amount", + kind: (string) (len=5) "int64", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }) + } + }), + (string) (len=25) "EncryptionExchangeRequest": (*main.Message)(0xc000215100)({ + fullName: (string) (len=25) "EncryptionExchangeRequest", + name: (string) (len=25) "EncryptionExchangeRequest", + fields: ([]*main.Field) (len=2 cap=2) { + (*main.Field)(0xc0003792c0)({ + name: (string) (len=10) "public_key", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }), + (*main.Field)(0xc0003792f0)({ + name: (string) (len=9) "device_id", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }) + } + }), + (string) (len=18) "NewAddressResponse": (*main.Message)(0xc000215200)({ + fullName: (string) (len=18) "NewAddressResponse", + name: (string) (len=18) "NewAddressResponse", + fields: ([]*main.Field) (len=1 cap=1) { + (*main.Field)(0xc0003793b0)({ + name: (string) (len=7) "address", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }) + } + }), + (string) (len=27) "GetOpenChannelLNURLResponse": (*main.Message)(0xc000215440)({ + fullName: (string) (len=27) "GetOpenChannelLNURLResponse", + name: (string) (len=27) "GetOpenChannelLNURLResponse", + fields: ([]*main.Field) (len=1 cap=1) { + (*main.Field)(0xc000379650)({ + name: (string) (len=5) "lnurl", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }) + } + }), + (string) (len=14) "AddUserRequest": (*main.Message)(0xc000215480)({ + fullName: (string) (len=14) "AddUserRequest", + name: (string) (len=14) "AddUserRequest", + fields: ([]*main.Field) (len=3 cap=4) { + (*main.Field)(0xc000379680)({ + name: (string) (len=12) "callback_url", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }), + (*main.Field)(0xc0003796b0)({ + name: (string) (len=4) "name", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }), + (*main.Field)(0xc0003796e0)({ + name: (string) (len=6) "secret", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }) + } + }), + (string) (len=15) "AddUserResponse": (*main.Message)(0xc0002154c0)({ + fullName: (string) (len=15) "AddUserResponse", + name: (string) (len=15) "AddUserResponse", + fields: ([]*main.Field) (len=2 cap=2) { + (*main.Field)(0xc000379710)({ + name: (string) (len=7) "user_id", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }), + (*main.Field)(0xc000379740)({ + name: (string) (len=10) "auth_token", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }) + } + }), + (string) (len=15) "AuthUserRequest": (*main.Message)(0xc000215500)({ + fullName: (string) (len=15) "AuthUserRequest", + name: (string) (len=15) "AuthUserRequest", + fields: ([]*main.Field) (len=2 cap=2) { + (*main.Field)(0xc000379770)({ + name: (string) (len=4) "name", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }), + (*main.Field)(0xc0003797a0)({ + name: (string) (len=6) "secret", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }) + } + }), + (string) (len=16) "AuthUserResponse": (*main.Message)(0xc000215540)({ + fullName: (string) (len=16) "AuthUserResponse", + name: (string) (len=16) "AuthUserResponse", + fields: ([]*main.Field) (len=2 cap=2) { + (*main.Field)(0xc0003797d0)({ + name: (string) (len=7) "user_id", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }), + (*main.Field)(0xc000379800)({ + name: (string) (len=10) "auth_token", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }) + } + }), + (string) (len=5) "Empty": (*main.Message)(0xc0002150c0)({ + fullName: (string) (len=5) "Empty", + name: (string) (len=5) "Empty", + fields: ([]*main.Field) + }), + (string) (len=17) "PayAddressRequest": (*main.Message)(0xc000215240)({ + fullName: (string) (len=17) "PayAddressRequest", + name: (string) (len=17) "PayAddressRequest", + fields: ([]*main.Field) (len=2 cap=2) { + (*main.Field)(0xc0003793e0)({ + name: (string) (len=7) "address", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }), + (*main.Field)(0xc000379410)({ + name: (string) (len=10) "amout_sats", + kind: (string) (len=5) "int64", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }) + } + }), + (string) (len=18) "NewInvoiceResponse": (*main.Message)(0xc000215300)({ + fullName: (string) (len=18) "NewInvoiceResponse", + name: (string) (len=18) "NewInvoiceResponse", + fields: ([]*main.Field) (len=1 cap=1) { + (*main.Field)(0xc0003794a0)({ + name: (string) (len=7) "invoice", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }) + } + }), + (string) (len=18) "OpenChannelRequest": (*main.Message)(0xc0002153c0)({ + fullName: (string) (len=18) "OpenChannelRequest", + name: (string) (len=18) "OpenChannelRequest", + fields: ([]*main.Field) (len=4 cap=4) { + (*main.Field)(0xc000379560)({ + name: (string) (len=11) "destination", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }), + (*main.Field)(0xc000379590)({ + name: (string) (len=14) "funding_amount", + kind: (string) (len=5) "int64", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }), + (*main.Field)(0xc0003795c0)({ + name: (string) (len=11) "push_amount", + kind: (string) (len=5) "int64", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }), + (*main.Field)(0xc0003795f0)({ + name: (string) (len=13) "close_address", + kind: (string) (len=6) "string", + isMap: (bool) false, + isArray: (bool) false, + isEnum: (bool) false, + isMessage: (bool) false, + isOptional: (bool) false + }) + } + }) +} + +parsing file: structs 19 +parsing file: methods 2 +-> [{guest Guest false map[]} {user User false map[user_id:string]} {admin Admin true map[admin_id:string]}] + diff --git a/proto/autogenerated/ts/express_server.ts b/proto/autogenerated/ts/express_server.ts new file mode 100644 index 00000000..1a05a05c --- /dev/null +++ b/proto/autogenerated/ts/express_server.ts @@ -0,0 +1,186 @@ +// This file was autogenerated from a .proto file, DO NOT EDIT! + +import express, { Response, json, urlencoded } from 'express' +import cors from 'cors' +import * as Types from './types' +export type Logger = { log: (v: any) => void, error: (v: any) => void } +export type ServerOptions = { + allowCors?: true + staticFiles?: string + allowNotImplementedMethods?: number + logger?: Logger + throwErrors?: true + GuestAuthGuard: (authorizationHeader?: string) => Promise + UserAuthGuard: (authorizationHeader?: string) => Promise + AdminAuthGuard: (authorizationHeader?: string) => Promise + decryptCallback: (encryptionDeviceId: string, body: any) => Promise + encryptCallback: (encryptionDeviceId: string, plain: any) => Promise +} +const logErrorAndReturnResponse = (error: Error, response: string, res: Response, logger: Logger) => { logger.error(error.message || error); res.json({ status: 'ERROR', reason: response }) } +export default (methods: Types.ServerMethods, opts: ServerOptions) => { + const logger = opts.logger || { log: console.log, error: console.error } + const app = express() + if (opts.allowCors) { + app.use(cors()) + } + app.use(json()) + app.use(urlencoded({ extended: true })) + if (!opts.allowNotImplementedMethods && !methods.Health) throw new Error('method: Health is not implemented') + app.get('/api/health', async (req, res) => { + try { + if (!methods.Health) throw new Error('method: Health is not implemented') + const authContext = await opts.GuestAuthGuard(req.headers['authorization']) + const query = req.query + const params = req.params + await methods.Health({ ...authContext, ...query, ...params }) + res.json({status: 'OK'}) + } catch (ex) { const e = ex as any; logErrorAndReturnResponse(e, e.message || e, res, logger); if (opts.throwErrors) throw e } + }) + if (!opts.allowNotImplementedMethods && !methods.EncryptionExchange) throw new Error('method: EncryptionExchange is not implemented') + app.post('/api/encryption/exchange', async (req, res) => { + try { + if (!methods.EncryptionExchange) throw new Error('method: EncryptionExchange is not implemented') + const authContext = await opts.GuestAuthGuard(req.headers['authorization']) + const request = req.body + const error = Types.EncryptionExchangeRequestValidate(request) + if (error !== null) return logErrorAndReturnResponse(error, 'invalid request body', res, logger) + const query = req.query + const params = req.params + await methods.EncryptionExchange({ ...authContext, ...query, ...params }, request) + res.json({status: 'OK'}) + } catch (ex) { const e = ex as any; logErrorAndReturnResponse(e, e.message || e, res, logger); if (opts.throwErrors) throw e } + }) + if (!opts.allowNotImplementedMethods && !methods.LndGetInfo) throw new Error('method: LndGetInfo is not implemented') + app.post('/api/lnd/getinfo', async (req, res) => { + try { + if (!methods.LndGetInfo) throw new Error('method: LndGetInfo is not implemented') + const authContext = await opts.AdminAuthGuard(req.headers['authorization']) + const encryptionDeviceId = req.headers['x-e2ee-device-id-x'] + if (typeof encryptionDeviceId !== 'string' || encryptionDeviceId === '') throw new Error('invalid encryption header provided') + const request = await opts.decryptCallback(encryptionDeviceId, req.body) + const error = Types.LndGetInfoRequestValidate(request) + if (error !== null) return logErrorAndReturnResponse(error, 'invalid request body', res, logger) + const query = req.query + const params = req.params + const response = await methods.LndGetInfo({ ...authContext, ...query, ...params }, request) + res.json({status: 'OK', result: await opts.encryptCallback(encryptionDeviceId, response)}) + } catch (ex) { const e = ex as any; logErrorAndReturnResponse(e, e.message || e, res, logger); if (opts.throwErrors) throw e } + }) + if (!opts.allowNotImplementedMethods && !methods.AddUser) throw new Error('method: AddUser is not implemented') + app.post('/api/user/add', async (req, res) => { + try { + if (!methods.AddUser) throw new Error('method: AddUser is not implemented') + const authContext = await opts.GuestAuthGuard(req.headers['authorization']) + const request = req.body + const error = Types.AddUserRequestValidate(request) + if (error !== null) return logErrorAndReturnResponse(error, 'invalid request body', res, logger) + const query = req.query + const params = req.params + const response = await methods.AddUser({ ...authContext, ...query, ...params }, request) + res.json({status: 'OK', result: response}) + } catch (ex) { const e = ex as any; logErrorAndReturnResponse(e, e.message || e, res, logger); if (opts.throwErrors) throw e } + }) + if (!opts.allowNotImplementedMethods && !methods.AuthUser) throw new Error('method: AuthUser is not implemented') + app.post('/api/user/auth', async (req, res) => { + try { + if (!methods.AuthUser) throw new Error('method: AuthUser is not implemented') + const authContext = await opts.GuestAuthGuard(req.headers['authorization']) + const request = req.body + const error = Types.AuthUserRequestValidate(request) + if (error !== null) return logErrorAndReturnResponse(error, 'invalid request body', res, logger) + const query = req.query + const params = req.params + const response = await methods.AuthUser({ ...authContext, ...query, ...params }, request) + res.json({status: 'OK', result: response}) + } catch (ex) { const e = ex as any; logErrorAndReturnResponse(e, e.message || e, res, logger); if (opts.throwErrors) throw e } + }) + if (!opts.allowNotImplementedMethods && !methods.NewAddress) throw new Error('method: NewAddress is not implemented') + app.post('/api/user/chain/new', async (req, res) => { + try { + if (!methods.NewAddress) throw new Error('method: NewAddress is not implemented') + const authContext = await opts.UserAuthGuard(req.headers['authorization']) + const request = req.body + const error = Types.NewAddressRequestValidate(request) + if (error !== null) return logErrorAndReturnResponse(error, 'invalid request body', res, logger) + const query = req.query + const params = req.params + const response = await methods.NewAddress({ ...authContext, ...query, ...params }, request) + res.json({status: 'OK', result: response}) + } catch (ex) { const e = ex as any; logErrorAndReturnResponse(e, e.message || e, res, logger); if (opts.throwErrors) throw e } + }) + if (!opts.allowNotImplementedMethods && !methods.PayAddress) throw new Error('method: PayAddress is not implemented') + app.post('/api/user/chain/pay', async (req, res) => { + try { + if (!methods.PayAddress) throw new Error('method: PayAddress is not implemented') + const authContext = await opts.UserAuthGuard(req.headers['authorization']) + const request = req.body + const error = Types.PayAddressRequestValidate(request) + if (error !== null) return logErrorAndReturnResponse(error, 'invalid request body', res, logger) + const query = req.query + const params = req.params + const response = await methods.PayAddress({ ...authContext, ...query, ...params }, request) + res.json({status: 'OK', result: response}) + } catch (ex) { const e = ex as any; logErrorAndReturnResponse(e, e.message || e, res, logger); if (opts.throwErrors) throw e } + }) + if (!opts.allowNotImplementedMethods && !methods.NewInvoice) throw new Error('method: NewInvoice is not implemented') + app.post('/api/user/invoice/new', async (req, res) => { + try { + if (!methods.NewInvoice) throw new Error('method: NewInvoice is not implemented') + const authContext = await opts.UserAuthGuard(req.headers['authorization']) + const request = req.body + const error = Types.NewInvoiceRequestValidate(request) + if (error !== null) return logErrorAndReturnResponse(error, 'invalid request body', res, logger) + const query = req.query + const params = req.params + const response = await methods.NewInvoice({ ...authContext, ...query, ...params }, request) + res.json({status: 'OK', result: response}) + } catch (ex) { const e = ex as any; logErrorAndReturnResponse(e, e.message || e, res, logger); if (opts.throwErrors) throw e } + }) + if (!opts.allowNotImplementedMethods && !methods.PayInvoice) throw new Error('method: PayInvoice is not implemented') + app.post('/api/user/invoice/pay', async (req, res) => { + try { + if (!methods.PayInvoice) throw new Error('method: PayInvoice is not implemented') + const authContext = await opts.UserAuthGuard(req.headers['authorization']) + const request = req.body + const error = Types.PayInvoiceRequestValidate(request) + if (error !== null) return logErrorAndReturnResponse(error, 'invalid request body', res, logger) + const query = req.query + const params = req.params + const response = await methods.PayInvoice({ ...authContext, ...query, ...params }, request) + res.json({status: 'OK', result: response}) + } catch (ex) { const e = ex as any; logErrorAndReturnResponse(e, e.message || e, res, logger); if (opts.throwErrors) throw e } + }) + if (!opts.allowNotImplementedMethods && !methods.OpenChannel) throw new Error('method: OpenChannel is not implemented') + app.post('/api/user/open/channel', async (req, res) => { + try { + if (!methods.OpenChannel) throw new Error('method: OpenChannel is not implemented') + const authContext = await opts.UserAuthGuard(req.headers['authorization']) + const request = req.body + const error = Types.OpenChannelRequestValidate(request) + if (error !== null) return logErrorAndReturnResponse(error, 'invalid request body', res, logger) + const query = req.query + const params = req.params + const response = await methods.OpenChannel({ ...authContext, ...query, ...params }, request) + res.json({status: 'OK', result: response}) + } catch (ex) { const e = ex as any; logErrorAndReturnResponse(e, e.message || e, res, logger); if (opts.throwErrors) throw e } + }) + if (!opts.allowNotImplementedMethods && !methods.GetOpenChannelLNURL) throw new Error('method: GetOpenChannelLNURL is not implemented') + app.post('/api/user/lnurl_channel', async (req, res) => { + try { + if (!methods.GetOpenChannelLNURL) throw new Error('method: GetOpenChannelLNURL is not implemented') + const authContext = await opts.UserAuthGuard(req.headers['authorization']) + const query = req.query + const params = req.params + const response = await methods.GetOpenChannelLNURL({ ...authContext, ...query, ...params }) + res.json({status: 'OK', result: response}) + } catch (ex) { const e = ex as any; logErrorAndReturnResponse(e, e.message || e, res, logger); if (opts.throwErrors) throw e } + }) + if (opts.staticFiles) { + app.use(express.static(opts.staticFiles)) + } + var server: { close: () => void } | undefined + return { + Close: () => { if (!server) { throw new Error('tried closing server before starting') } else server.close() }, + Listen: (port: number) => { server = app.listen(port, () => logger.log('Example app listening on port ' + port)) } + } +} diff --git a/proto/autogenerated/ts/http_client.ts b/proto/autogenerated/ts/http_client.ts new file mode 100644 index 00000000..668d1b6e --- /dev/null +++ b/proto/autogenerated/ts/http_client.ts @@ -0,0 +1,155 @@ +// This file was autogenerated from a .proto file, DO NOT EDIT! +import axios from 'axios' +import * as Types from './types' +export type ResultError = { status: 'ERROR', reason: string } + +export type ClientParams = { + baseUrl: string + retrieveGuestAuth: () => Promise + retrieveUserAuth: () => Promise + retrieveAdminAuth: () => Promise + encryptCallback: (plain: any) => Promise + decryptCallback: (encrypted: any) => Promise + deviceId: string +} +export default (params: ClientParams) => ({ + Health: async (): Promise => { + const auth = await params.retrieveGuestAuth() + if (auth === null) throw new Error('retrieveGuestAuth() returned null') + let finalRoute = '/api/health' + const { data } = await axios.get(params.baseUrl + finalRoute, { headers: { 'authorization': auth } }) + if (data.status === 'ERROR' && typeof data.reason === 'string') return data + if (data.status === 'OK') { + return data + } + return { status: 'ERROR', reason: 'invalid response' } + }, + EncryptionExchange: async (request: Types.EncryptionExchangeRequest): Promise => { + const auth = await params.retrieveGuestAuth() + if (auth === null) throw new Error('retrieveGuestAuth() returned null') + let finalRoute = '/api/encryption/exchange' + const { data } = await axios.post(params.baseUrl + finalRoute, request, { headers: { 'authorization': auth } }) + if (data.status === 'ERROR' && typeof data.reason === 'string') return data + if (data.status === 'OK') { + return data + } + return { status: 'ERROR', reason: 'invalid response' } + }, + LndGetInfo: async (request: Types.LndGetInfoRequest): Promise => { + const auth = await params.retrieveAdminAuth() + if (auth === null) throw new Error('retrieveAdminAuth() returned null') + let finalRoute = '/api/lnd/getinfo' + const { data } = await axios.post(params.baseUrl + finalRoute, await params.encryptCallback(request), { headers: { 'authorization': auth, 'x-e2ee-device-id-x': params.deviceId } }) + if (data.status === 'ERROR' && typeof data.reason === 'string') return data + if (data.status === 'OK') { + const result = await params.decryptCallback(data.result) + const error = Types.LndGetInfoResponseValidate(result) + if (error === null) { return { status: 'OK', result: result } } else return { status: 'ERROR', reason: error.message } + } + return { status: 'ERROR', reason: 'invalid response' } + }, + AddUser: async (request: Types.AddUserRequest): Promise => { + const auth = await params.retrieveGuestAuth() + if (auth === null) throw new Error('retrieveGuestAuth() returned null') + let finalRoute = '/api/user/add' + const { data } = await axios.post(params.baseUrl + finalRoute, request, { headers: { 'authorization': auth } }) + if (data.status === 'ERROR' && typeof data.reason === 'string') return data + if (data.status === 'OK') { + const result = data.result + const error = Types.AddUserResponseValidate(result) + if (error === null) { return { status: 'OK', result: result } } else return { status: 'ERROR', reason: error.message } + } + return { status: 'ERROR', reason: 'invalid response' } + }, + AuthUser: async (request: Types.AuthUserRequest): Promise => { + const auth = await params.retrieveGuestAuth() + if (auth === null) throw new Error('retrieveGuestAuth() returned null') + let finalRoute = '/api/user/auth' + const { data } = await axios.post(params.baseUrl + finalRoute, request, { headers: { 'authorization': auth } }) + if (data.status === 'ERROR' && typeof data.reason === 'string') return data + if (data.status === 'OK') { + const result = data.result + const error = Types.AuthUserResponseValidate(result) + if (error === null) { return { status: 'OK', result: result } } else return { status: 'ERROR', reason: error.message } + } + return { status: 'ERROR', reason: 'invalid response' } + }, + NewAddress: async (request: Types.NewAddressRequest): Promise => { + const auth = await params.retrieveUserAuth() + if (auth === null) throw new Error('retrieveUserAuth() returned null') + let finalRoute = '/api/user/chain/new' + const { data } = await axios.post(params.baseUrl + finalRoute, request, { headers: { 'authorization': auth } }) + if (data.status === 'ERROR' && typeof data.reason === 'string') return data + if (data.status === 'OK') { + const result = data.result + const error = Types.NewAddressResponseValidate(result) + if (error === null) { return { status: 'OK', result: result } } else return { status: 'ERROR', reason: error.message } + } + return { status: 'ERROR', reason: 'invalid response' } + }, + PayAddress: async (request: Types.PayAddressRequest): Promise => { + const auth = await params.retrieveUserAuth() + if (auth === null) throw new Error('retrieveUserAuth() returned null') + let finalRoute = '/api/user/chain/pay' + const { data } = await axios.post(params.baseUrl + finalRoute, request, { headers: { 'authorization': auth } }) + if (data.status === 'ERROR' && typeof data.reason === 'string') return data + if (data.status === 'OK') { + const result = data.result + const error = Types.PayAddressResponseValidate(result) + if (error === null) { return { status: 'OK', result: result } } else return { status: 'ERROR', reason: error.message } + } + return { status: 'ERROR', reason: 'invalid response' } + }, + NewInvoice: async (request: Types.NewInvoiceRequest): Promise => { + const auth = await params.retrieveUserAuth() + if (auth === null) throw new Error('retrieveUserAuth() returned null') + let finalRoute = '/api/user/invoice/new' + const { data } = await axios.post(params.baseUrl + finalRoute, request, { headers: { 'authorization': auth } }) + if (data.status === 'ERROR' && typeof data.reason === 'string') return data + if (data.status === 'OK') { + const result = data.result + const error = Types.NewInvoiceResponseValidate(result) + if (error === null) { return { status: 'OK', result: result } } else return { status: 'ERROR', reason: error.message } + } + return { status: 'ERROR', reason: 'invalid response' } + }, + PayInvoice: async (request: Types.PayInvoiceRequest): Promise => { + const auth = await params.retrieveUserAuth() + if (auth === null) throw new Error('retrieveUserAuth() returned null') + let finalRoute = '/api/user/invoice/pay' + const { data } = await axios.post(params.baseUrl + finalRoute, request, { headers: { 'authorization': auth } }) + if (data.status === 'ERROR' && typeof data.reason === 'string') return data + if (data.status === 'OK') { + const result = data.result + const error = Types.PayInvoiceResponseValidate(result) + if (error === null) { return { status: 'OK', result: result } } else return { status: 'ERROR', reason: error.message } + } + return { status: 'ERROR', reason: 'invalid response' } + }, + OpenChannel: async (request: Types.OpenChannelRequest): Promise => { + const auth = await params.retrieveUserAuth() + if (auth === null) throw new Error('retrieveUserAuth() returned null') + let finalRoute = '/api/user/open/channel' + const { data } = await axios.post(params.baseUrl + finalRoute, request, { headers: { 'authorization': auth } }) + if (data.status === 'ERROR' && typeof data.reason === 'string') return data + if (data.status === 'OK') { + const result = data.result + const error = Types.OpenChannelResponseValidate(result) + if (error === null) { return { status: 'OK', result: result } } else return { status: 'ERROR', reason: error.message } + } + return { status: 'ERROR', reason: 'invalid response' } + }, + GetOpenChannelLNURL: async (): Promise => { + const auth = await params.retrieveUserAuth() + if (auth === null) throw new Error('retrieveUserAuth() returned null') + let finalRoute = '/api/user/lnurl_channel' + const { data } = await axios.post(params.baseUrl + finalRoute, {}, { headers: { 'authorization': auth } }) + if (data.status === 'ERROR' && typeof data.reason === 'string') return data + if (data.status === 'OK') { + const result = data.result + const error = Types.GetOpenChannelLNURLResponseValidate(result) + if (error === null) { return { status: 'OK', result: result } } else return { status: 'ERROR', reason: error.message } + } + return { status: 'ERROR', reason: 'invalid response' } + }, +}) diff --git a/proto/autogenerated/ts/types.ts b/proto/autogenerated/ts/types.ts new file mode 100644 index 00000000..50480939 --- /dev/null +++ b/proto/autogenerated/ts/types.ts @@ -0,0 +1,487 @@ +// This file was autogenerated from a .proto file, DO NOT EDIT! + +export type GuestContext = { +} +export type UserContext = { + user_id: string +} +export type AdminContext = { + admin_id: string +} +export type AuthContext = GuestContext | UserContext | AdminContext + +export type Health_Query = { +} +export type Health_RouteParams = { +} +export type Health_Context = Health_Query & Health_RouteParams & GuestContext +export type EncryptionExchange_Query = { +} +export type EncryptionExchange_RouteParams = { +} +export type EncryptionExchange_Context = EncryptionExchange_Query & EncryptionExchange_RouteParams & GuestContext +export type LndGetInfo_Query = { +} +export type LndGetInfo_RouteParams = { +} +export type LndGetInfo_Context = LndGetInfo_Query & LndGetInfo_RouteParams & AdminContext +export type AddUser_Query = { +} +export type AddUser_RouteParams = { +} +export type AddUser_Context = AddUser_Query & AddUser_RouteParams & GuestContext +export type AuthUser_Query = { +} +export type AuthUser_RouteParams = { +} +export type AuthUser_Context = AuthUser_Query & AuthUser_RouteParams & GuestContext +export type NewAddress_Query = { +} +export type NewAddress_RouteParams = { +} +export type NewAddress_Context = NewAddress_Query & NewAddress_RouteParams & UserContext +export type PayAddress_Query = { +} +export type PayAddress_RouteParams = { +} +export type PayAddress_Context = PayAddress_Query & PayAddress_RouteParams & UserContext +export type NewInvoice_Query = { +} +export type NewInvoice_RouteParams = { +} +export type NewInvoice_Context = NewInvoice_Query & NewInvoice_RouteParams & UserContext +export type PayInvoice_Query = { +} +export type PayInvoice_RouteParams = { +} +export type PayInvoice_Context = PayInvoice_Query & PayInvoice_RouteParams & UserContext +export type OpenChannel_Query = { +} +export type OpenChannel_RouteParams = { +} +export type OpenChannel_Context = OpenChannel_Query & OpenChannel_RouteParams & UserContext +export type GetOpenChannelLNURL_Query = { +} +export type GetOpenChannelLNURL_RouteParams = { +} +export type GetOpenChannelLNURL_Context = GetOpenChannelLNURL_Query & GetOpenChannelLNURL_RouteParams & UserContext +export type ServerMethods = { + Health?: (ctx: Health_Context) => Promise + EncryptionExchange?: (ctx: EncryptionExchange_Context, req: EncryptionExchangeRequest) => Promise + LndGetInfo?: (ctx: LndGetInfo_Context, req: LndGetInfoRequest) => Promise + AddUser?: (ctx: AddUser_Context, req: AddUserRequest) => Promise + AuthUser?: (ctx: AuthUser_Context, req: AuthUserRequest) => Promise + NewAddress?: (ctx: NewAddress_Context, req: NewAddressRequest) => Promise + PayAddress?: (ctx: PayAddress_Context, req: PayAddressRequest) => Promise + NewInvoice?: (ctx: NewInvoice_Context, req: NewInvoiceRequest) => Promise + PayInvoice?: (ctx: PayInvoice_Context, req: PayInvoiceRequest) => Promise + OpenChannel?: (ctx: OpenChannel_Context, req: OpenChannelRequest) => Promise + GetOpenChannelLNURL?: (ctx: GetOpenChannelLNURL_Context) => Promise +} + +export enum AddressType { + WITNESS_PUBKEY_HASH = 'WITNESS_PUBKEY_HASH', + NESTED_PUBKEY_HASH = 'NESTED_PUBKEY_HASH', + TAPROOT_PUBKEY = 'TAPROOT_PUBKEY', +} +const enumCheckAddressType = (e?: AddressType): boolean => { + for (const v in AddressType) if (e === v) return true + return false +} + +export type OptionsBaseMessage = { + allOptionalsAreSet?: true +} + +export type Empty = { +} +export const EmptyOptionalFields: [] = [] +export type EmptyOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] +} +export const EmptyValidate = (o?: Empty, opts: EmptyOptions = {}, path: string = 'Empty::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + return null +} + +export type PayAddressRequest = { + address: string + amout_sats: number +} +export const PayAddressRequestOptionalFields: [] = [] +export type PayAddressRequestOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + address_CustomCheck?: (v: string) => boolean + amout_sats_CustomCheck?: (v: number) => boolean +} +export const PayAddressRequestValidate = (o?: PayAddressRequest, opts: PayAddressRequestOptions = {}, path: string = 'PayAddressRequest::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.address !== 'string') return new Error(`${path}.address: is not a string`) + if (opts.address_CustomCheck && !opts.address_CustomCheck(o.address)) return new Error(`${path}.address: custom check failed`) + + if (typeof o.amout_sats !== 'number') return new Error(`${path}.amout_sats: is not a number`) + if (opts.amout_sats_CustomCheck && !opts.amout_sats_CustomCheck(o.amout_sats)) return new Error(`${path}.amout_sats: custom check failed`) + + return null +} + +export type NewInvoiceResponse = { + invoice: string +} +export const NewInvoiceResponseOptionalFields: [] = [] +export type NewInvoiceResponseOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + invoice_CustomCheck?: (v: string) => boolean +} +export const NewInvoiceResponseValidate = (o?: NewInvoiceResponse, opts: NewInvoiceResponseOptions = {}, path: string = 'NewInvoiceResponse::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.invoice !== 'string') return new Error(`${path}.invoice: is not a string`) + if (opts.invoice_CustomCheck && !opts.invoice_CustomCheck(o.invoice)) return new Error(`${path}.invoice: custom check failed`) + + return null +} + +export type OpenChannelRequest = { + destination: string + funding_amount: number + push_amount: number + close_address: string +} +export const OpenChannelRequestOptionalFields: [] = [] +export type OpenChannelRequestOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + destination_CustomCheck?: (v: string) => boolean + funding_amount_CustomCheck?: (v: number) => boolean + push_amount_CustomCheck?: (v: number) => boolean + close_address_CustomCheck?: (v: string) => boolean +} +export const OpenChannelRequestValidate = (o?: OpenChannelRequest, opts: OpenChannelRequestOptions = {}, path: string = 'OpenChannelRequest::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.destination !== 'string') return new Error(`${path}.destination: is not a string`) + if (opts.destination_CustomCheck && !opts.destination_CustomCheck(o.destination)) return new Error(`${path}.destination: custom check failed`) + + if (typeof o.funding_amount !== 'number') return new Error(`${path}.funding_amount: is not a number`) + if (opts.funding_amount_CustomCheck && !opts.funding_amount_CustomCheck(o.funding_amount)) return new Error(`${path}.funding_amount: custom check failed`) + + if (typeof o.push_amount !== 'number') return new Error(`${path}.push_amount: is not a number`) + if (opts.push_amount_CustomCheck && !opts.push_amount_CustomCheck(o.push_amount)) return new Error(`${path}.push_amount: custom check failed`) + + if (typeof o.close_address !== 'string') return new Error(`${path}.close_address: is not a string`) + if (opts.close_address_CustomCheck && !opts.close_address_CustomCheck(o.close_address)) return new Error(`${path}.close_address: custom check failed`) + + return null +} + +export type OpenChannelResponse = { + channel_id: string +} +export const OpenChannelResponseOptionalFields: [] = [] +export type OpenChannelResponseOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + channel_id_CustomCheck?: (v: string) => boolean +} +export const OpenChannelResponseValidate = (o?: OpenChannelResponse, opts: OpenChannelResponseOptions = {}, path: string = 'OpenChannelResponse::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.channel_id !== 'string') return new Error(`${path}.channel_id: is not a string`) + if (opts.channel_id_CustomCheck && !opts.channel_id_CustomCheck(o.channel_id)) return new Error(`${path}.channel_id: custom check failed`) + + return null +} + +export type LndGetInfoRequest = { + node_id: number +} +export const LndGetInfoRequestOptionalFields: [] = [] +export type LndGetInfoRequestOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + node_id_CustomCheck?: (v: number) => boolean +} +export const LndGetInfoRequestValidate = (o?: LndGetInfoRequest, opts: LndGetInfoRequestOptions = {}, path: string = 'LndGetInfoRequest::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.node_id !== 'number') return new Error(`${path}.node_id: is not a number`) + if (opts.node_id_CustomCheck && !opts.node_id_CustomCheck(o.node_id)) return new Error(`${path}.node_id: custom check failed`) + + return null +} + +export type LndGetInfoResponse = { + alias: string +} +export const LndGetInfoResponseOptionalFields: [] = [] +export type LndGetInfoResponseOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + alias_CustomCheck?: (v: string) => boolean +} +export const LndGetInfoResponseValidate = (o?: LndGetInfoResponse, opts: LndGetInfoResponseOptions = {}, path: string = 'LndGetInfoResponse::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.alias !== 'string') return new Error(`${path}.alias: is not a string`) + if (opts.alias_CustomCheck && !opts.alias_CustomCheck(o.alias)) return new Error(`${path}.alias: custom check failed`) + + return null +} + +export type NewAddressRequest = { + address_type: AddressType +} +export const NewAddressRequestOptionalFields: [] = [] +export type NewAddressRequestOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + address_type_CustomCheck?: (v: AddressType) => boolean +} +export const NewAddressRequestValidate = (o?: NewAddressRequest, opts: NewAddressRequestOptions = {}, path: string = 'NewAddressRequest::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (!enumCheckAddressType(o.address_type)) return new Error(`${path}.address_type: is not a valid AddressType`) + if (opts.address_type_CustomCheck && !opts.address_type_CustomCheck(o.address_type)) return new Error(`${path}.address_type: custom check failed`) + + return null +} + +export type NewInvoiceRequest = { + amount_sats: number +} +export const NewInvoiceRequestOptionalFields: [] = [] +export type NewInvoiceRequestOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + amount_sats_CustomCheck?: (v: number) => boolean +} +export const NewInvoiceRequestValidate = (o?: NewInvoiceRequest, opts: NewInvoiceRequestOptions = {}, path: string = 'NewInvoiceRequest::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.amount_sats !== 'number') return new Error(`${path}.amount_sats: is not a number`) + if (opts.amount_sats_CustomCheck && !opts.amount_sats_CustomCheck(o.amount_sats)) return new Error(`${path}.amount_sats: custom check failed`) + + return null +} + +export type PayInvoiceResponse = { + preimage: string +} +export const PayInvoiceResponseOptionalFields: [] = [] +export type PayInvoiceResponseOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + preimage_CustomCheck?: (v: string) => boolean +} +export const PayInvoiceResponseValidate = (o?: PayInvoiceResponse, opts: PayInvoiceResponseOptions = {}, path: string = 'PayInvoiceResponse::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.preimage !== 'string') return new Error(`${path}.preimage: is not a string`) + if (opts.preimage_CustomCheck && !opts.preimage_CustomCheck(o.preimage)) return new Error(`${path}.preimage: custom check failed`) + + return null +} + +export type PayAddressResponse = { + tx_id: string +} +export const PayAddressResponseOptionalFields: [] = [] +export type PayAddressResponseOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + tx_id_CustomCheck?: (v: string) => boolean +} +export const PayAddressResponseValidate = (o?: PayAddressResponse, opts: PayAddressResponseOptions = {}, path: string = 'PayAddressResponse::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.tx_id !== 'string') return new Error(`${path}.tx_id: is not a string`) + if (opts.tx_id_CustomCheck && !opts.tx_id_CustomCheck(o.tx_id)) return new Error(`${path}.tx_id: custom check failed`) + + return null +} + +export type PayInvoiceRequest = { + invoice: string + amount: number +} +export const PayInvoiceRequestOptionalFields: [] = [] +export type PayInvoiceRequestOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + invoice_CustomCheck?: (v: string) => boolean + amount_CustomCheck?: (v: number) => boolean +} +export const PayInvoiceRequestValidate = (o?: PayInvoiceRequest, opts: PayInvoiceRequestOptions = {}, path: string = 'PayInvoiceRequest::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.invoice !== 'string') return new Error(`${path}.invoice: is not a string`) + if (opts.invoice_CustomCheck && !opts.invoice_CustomCheck(o.invoice)) return new Error(`${path}.invoice: custom check failed`) + + if (typeof o.amount !== 'number') return new Error(`${path}.amount: is not a number`) + if (opts.amount_CustomCheck && !opts.amount_CustomCheck(o.amount)) return new Error(`${path}.amount: custom check failed`) + + return null +} + +export type AuthUserRequest = { + name: string + secret: string +} +export const AuthUserRequestOptionalFields: [] = [] +export type AuthUserRequestOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + name_CustomCheck?: (v: string) => boolean + secret_CustomCheck?: (v: string) => boolean +} +export const AuthUserRequestValidate = (o?: AuthUserRequest, opts: AuthUserRequestOptions = {}, path: string = 'AuthUserRequest::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.name !== 'string') return new Error(`${path}.name: is not a string`) + if (opts.name_CustomCheck && !opts.name_CustomCheck(o.name)) return new Error(`${path}.name: custom check failed`) + + if (typeof o.secret !== 'string') return new Error(`${path}.secret: is not a string`) + if (opts.secret_CustomCheck && !opts.secret_CustomCheck(o.secret)) return new Error(`${path}.secret: custom check failed`) + + return null +} + +export type AuthUserResponse = { + user_id: string + auth_token: string +} +export const AuthUserResponseOptionalFields: [] = [] +export type AuthUserResponseOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + user_id_CustomCheck?: (v: string) => boolean + auth_token_CustomCheck?: (v: string) => boolean +} +export const AuthUserResponseValidate = (o?: AuthUserResponse, opts: AuthUserResponseOptions = {}, path: string = 'AuthUserResponse::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.user_id !== 'string') return new Error(`${path}.user_id: is not a string`) + if (opts.user_id_CustomCheck && !opts.user_id_CustomCheck(o.user_id)) return new Error(`${path}.user_id: custom check failed`) + + if (typeof o.auth_token !== 'string') return new Error(`${path}.auth_token: is not a string`) + if (opts.auth_token_CustomCheck && !opts.auth_token_CustomCheck(o.auth_token)) return new Error(`${path}.auth_token: custom check failed`) + + return null +} + +export type EncryptionExchangeRequest = { + public_key: string + device_id: string +} +export const EncryptionExchangeRequestOptionalFields: [] = [] +export type EncryptionExchangeRequestOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + public_key_CustomCheck?: (v: string) => boolean + device_id_CustomCheck?: (v: string) => boolean +} +export const EncryptionExchangeRequestValidate = (o?: EncryptionExchangeRequest, opts: EncryptionExchangeRequestOptions = {}, path: string = 'EncryptionExchangeRequest::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.public_key !== 'string') return new Error(`${path}.public_key: is not a string`) + if (opts.public_key_CustomCheck && !opts.public_key_CustomCheck(o.public_key)) return new Error(`${path}.public_key: custom check failed`) + + if (typeof o.device_id !== 'string') return new Error(`${path}.device_id: is not a string`) + if (opts.device_id_CustomCheck && !opts.device_id_CustomCheck(o.device_id)) return new Error(`${path}.device_id: custom check failed`) + + return null +} + +export type NewAddressResponse = { + address: string +} +export const NewAddressResponseOptionalFields: [] = [] +export type NewAddressResponseOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + address_CustomCheck?: (v: string) => boolean +} +export const NewAddressResponseValidate = (o?: NewAddressResponse, opts: NewAddressResponseOptions = {}, path: string = 'NewAddressResponse::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.address !== 'string') return new Error(`${path}.address: is not a string`) + if (opts.address_CustomCheck && !opts.address_CustomCheck(o.address)) return new Error(`${path}.address: custom check failed`) + + return null +} + +export type GetOpenChannelLNURLResponse = { + lnurl: string +} +export const GetOpenChannelLNURLResponseOptionalFields: [] = [] +export type GetOpenChannelLNURLResponseOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + lnurl_CustomCheck?: (v: string) => boolean +} +export const GetOpenChannelLNURLResponseValidate = (o?: GetOpenChannelLNURLResponse, opts: GetOpenChannelLNURLResponseOptions = {}, path: string = 'GetOpenChannelLNURLResponse::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.lnurl !== 'string') return new Error(`${path}.lnurl: is not a string`) + if (opts.lnurl_CustomCheck && !opts.lnurl_CustomCheck(o.lnurl)) return new Error(`${path}.lnurl: custom check failed`) + + return null +} + +export type AddUserRequest = { + callback_url: string + name: string + secret: string +} +export const AddUserRequestOptionalFields: [] = [] +export type AddUserRequestOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + callback_url_CustomCheck?: (v: string) => boolean + name_CustomCheck?: (v: string) => boolean + secret_CustomCheck?: (v: string) => boolean +} +export const AddUserRequestValidate = (o?: AddUserRequest, opts: AddUserRequestOptions = {}, path: string = 'AddUserRequest::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.callback_url !== 'string') return new Error(`${path}.callback_url: is not a string`) + if (opts.callback_url_CustomCheck && !opts.callback_url_CustomCheck(o.callback_url)) return new Error(`${path}.callback_url: custom check failed`) + + if (typeof o.name !== 'string') return new Error(`${path}.name: is not a string`) + if (opts.name_CustomCheck && !opts.name_CustomCheck(o.name)) return new Error(`${path}.name: custom check failed`) + + if (typeof o.secret !== 'string') return new Error(`${path}.secret: is not a string`) + if (opts.secret_CustomCheck && !opts.secret_CustomCheck(o.secret)) return new Error(`${path}.secret: custom check failed`) + + return null +} + +export type AddUserResponse = { + user_id: string + auth_token: string +} +export const AddUserResponseOptionalFields: [] = [] +export type AddUserResponseOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + user_id_CustomCheck?: (v: string) => boolean + auth_token_CustomCheck?: (v: string) => boolean +} +export const AddUserResponseValidate = (o?: AddUserResponse, opts: AddUserResponseOptions = {}, path: string = 'AddUserResponse::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.user_id !== 'string') return new Error(`${path}.user_id: is not a string`) + if (opts.user_id_CustomCheck && !opts.user_id_CustomCheck(o.user_id)) return new Error(`${path}.user_id: custom check failed`) + + if (typeof o.auth_token !== 'string') return new Error(`${path}.auth_token: is not a string`) + if (opts.auth_token_CustomCheck && !opts.auth_token_CustomCheck(o.auth_token)) return new Error(`${path}.auth_token: custom check failed`) + + return null +} + diff --git a/proto/lnd/invoices.client.ts b/proto/lnd/invoices.client.ts new file mode 100644 index 00000000..098e44a0 --- /dev/null +++ b/proto/lnd/invoices.client.ts @@ -0,0 +1,139 @@ +// @generated by protobuf-ts 2.5.0 +// @generated from protobuf file "invoices.proto" (package "invoicesrpc", syntax proto3) +// tslint:disable +import type { RpcTransport } from "@protobuf-ts/runtime-rpc"; +import type { ServiceInfo } from "@protobuf-ts/runtime-rpc"; +import { Invoices } from "./invoices"; +import type { LookupInvoiceMsg } from "./invoices"; +import type { SettleInvoiceResp } from "./invoices"; +import type { SettleInvoiceMsg } from "./invoices"; +import type { AddHoldInvoiceResp } from "./invoices"; +import type { AddHoldInvoiceRequest } from "./invoices"; +import type { CancelInvoiceResp } from "./invoices"; +import type { CancelInvoiceMsg } from "./invoices"; +import type { UnaryCall } from "@protobuf-ts/runtime-rpc"; +import { stackIntercept } from "@protobuf-ts/runtime-rpc"; +import type { Invoice } from "./lightning"; +import type { SubscribeSingleInvoiceRequest } from "./invoices"; +import type { ServerStreamingCall } from "@protobuf-ts/runtime-rpc"; +import type { RpcOptions } from "@protobuf-ts/runtime-rpc"; +/** + * Invoices is a service that can be used to create, accept, settle and cancel + * invoices. + * + * @generated from protobuf service invoicesrpc.Invoices + */ +export interface IInvoicesClient { + /** + * + * SubscribeSingleInvoice returns a uni-directional stream (server -> client) + * to notify the client of state transitions of the specified invoice. + * Initially the current invoice state is always sent out. + * + * @generated from protobuf rpc: SubscribeSingleInvoice(invoicesrpc.SubscribeSingleInvoiceRequest) returns (stream lnrpc.Invoice); + */ + subscribeSingleInvoice(input: SubscribeSingleInvoiceRequest, options?: RpcOptions): ServerStreamingCall; + /** + * + * CancelInvoice cancels a currently open invoice. If the invoice is already + * canceled, this call will succeed. If the invoice is already settled, it will + * fail. + * + * @generated from protobuf rpc: CancelInvoice(invoicesrpc.CancelInvoiceMsg) returns (invoicesrpc.CancelInvoiceResp); + */ + cancelInvoice(input: CancelInvoiceMsg, options?: RpcOptions): UnaryCall; + /** + * + * AddHoldInvoice creates a hold invoice. It ties the invoice to the hash + * supplied in the request. + * + * @generated from protobuf rpc: AddHoldInvoice(invoicesrpc.AddHoldInvoiceRequest) returns (invoicesrpc.AddHoldInvoiceResp); + */ + addHoldInvoice(input: AddHoldInvoiceRequest, options?: RpcOptions): UnaryCall; + /** + * + * SettleInvoice settles an accepted invoice. If the invoice is already + * settled, this call will succeed. + * + * @generated from protobuf rpc: SettleInvoice(invoicesrpc.SettleInvoiceMsg) returns (invoicesrpc.SettleInvoiceResp); + */ + settleInvoice(input: SettleInvoiceMsg, options?: RpcOptions): UnaryCall; + /** + * + * LookupInvoiceV2 attempts to look up at invoice. An invoice can be refrenced + * using either its payment hash, payment address, or set ID. + * + * @generated from protobuf rpc: LookupInvoiceV2(invoicesrpc.LookupInvoiceMsg) returns (lnrpc.Invoice); + */ + lookupInvoiceV2(input: LookupInvoiceMsg, options?: RpcOptions): UnaryCall; +} +/** + * Invoices is a service that can be used to create, accept, settle and cancel + * invoices. + * + * @generated from protobuf service invoicesrpc.Invoices + */ +export class InvoicesClient implements IInvoicesClient, ServiceInfo { + typeName = Invoices.typeName; + methods = Invoices.methods; + options = Invoices.options; + constructor(private readonly _transport: RpcTransport) { + } + /** + * + * SubscribeSingleInvoice returns a uni-directional stream (server -> client) + * to notify the client of state transitions of the specified invoice. + * Initially the current invoice state is always sent out. + * + * @generated from protobuf rpc: SubscribeSingleInvoice(invoicesrpc.SubscribeSingleInvoiceRequest) returns (stream lnrpc.Invoice); + */ + subscribeSingleInvoice(input: SubscribeSingleInvoiceRequest, options?: RpcOptions): ServerStreamingCall { + const method = this.methods[0], opt = this._transport.mergeOptions(options); + return stackIntercept("serverStreaming", this._transport, method, opt, input); + } + /** + * + * CancelInvoice cancels a currently open invoice. If the invoice is already + * canceled, this call will succeed. If the invoice is already settled, it will + * fail. + * + * @generated from protobuf rpc: CancelInvoice(invoicesrpc.CancelInvoiceMsg) returns (invoicesrpc.CancelInvoiceResp); + */ + cancelInvoice(input: CancelInvoiceMsg, options?: RpcOptions): UnaryCall { + const method = this.methods[1], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * AddHoldInvoice creates a hold invoice. It ties the invoice to the hash + * supplied in the request. + * + * @generated from protobuf rpc: AddHoldInvoice(invoicesrpc.AddHoldInvoiceRequest) returns (invoicesrpc.AddHoldInvoiceResp); + */ + addHoldInvoice(input: AddHoldInvoiceRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[2], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * SettleInvoice settles an accepted invoice. If the invoice is already + * settled, this call will succeed. + * + * @generated from protobuf rpc: SettleInvoice(invoicesrpc.SettleInvoiceMsg) returns (invoicesrpc.SettleInvoiceResp); + */ + settleInvoice(input: SettleInvoiceMsg, options?: RpcOptions): UnaryCall { + const method = this.methods[3], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * LookupInvoiceV2 attempts to look up at invoice. An invoice can be refrenced + * using either its payment hash, payment address, or set ID. + * + * @generated from protobuf rpc: LookupInvoiceV2(invoicesrpc.LookupInvoiceMsg) returns (lnrpc.Invoice); + */ + lookupInvoiceV2(input: LookupInvoiceMsg, options?: RpcOptions): UnaryCall { + const method = this.methods[4], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } +} diff --git a/proto/lnd/invoices.ts b/proto/lnd/invoices.ts new file mode 100644 index 00000000..6e16f352 --- /dev/null +++ b/proto/lnd/invoices.ts @@ -0,0 +1,690 @@ +// @generated by protobuf-ts 2.5.0 +// @generated from protobuf file "invoices.proto" (package "invoicesrpc", syntax proto3) +// tslint:disable +import { Invoice } from "./lightning"; +import { ServiceType } from "@protobuf-ts/runtime-rpc"; +import type { BinaryWriteOptions } from "@protobuf-ts/runtime"; +import type { IBinaryWriter } from "@protobuf-ts/runtime"; +import { WireType } from "@protobuf-ts/runtime"; +import type { BinaryReadOptions } from "@protobuf-ts/runtime"; +import type { IBinaryReader } from "@protobuf-ts/runtime"; +import { UnknownFieldHandler } from "@protobuf-ts/runtime"; +import type { PartialMessage } from "@protobuf-ts/runtime"; +import { reflectionMergePartial } from "@protobuf-ts/runtime"; +import { MESSAGE_TYPE } from "@protobuf-ts/runtime"; +import { MessageType } from "@protobuf-ts/runtime"; +import { RouteHint } from "./lightning"; +/** + * @generated from protobuf message invoicesrpc.CancelInvoiceMsg + */ +export interface CancelInvoiceMsg { + /** + * Hash corresponding to the (hold) invoice to cancel. When using + * REST, this field must be encoded as base64. + * + * @generated from protobuf field: bytes payment_hash = 1; + */ + paymentHash: Uint8Array; +} +/** + * @generated from protobuf message invoicesrpc.CancelInvoiceResp + */ +export interface CancelInvoiceResp { +} +/** + * @generated from protobuf message invoicesrpc.AddHoldInvoiceRequest + */ +export interface AddHoldInvoiceRequest { + /** + * + * An optional memo to attach along with the invoice. Used for record keeping + * purposes for the invoice's creator, and will also be set in the description + * field of the encoded payment request if the description_hash field is not + * being used. + * + * @generated from protobuf field: string memo = 1; + */ + memo: string; + /** + * The hash of the preimage + * + * @generated from protobuf field: bytes hash = 2; + */ + hash: Uint8Array; + /** + * + * The value of this invoice in satoshis + * + * The fields value and value_msat are mutually exclusive. + * + * @generated from protobuf field: int64 value = 3; + */ + value: bigint; + /** + * + * The value of this invoice in millisatoshis + * + * The fields value and value_msat are mutually exclusive. + * + * @generated from protobuf field: int64 value_msat = 10; + */ + valueMsat: bigint; + /** + * + * Hash (SHA-256) of a description of the payment. Used if the description of + * payment (memo) is too long to naturally fit within the description field + * of an encoded payment request. + * + * @generated from protobuf field: bytes description_hash = 4; + */ + descriptionHash: Uint8Array; + /** + * Payment request expiry time in seconds. Default is 3600 (1 hour). + * + * @generated from protobuf field: int64 expiry = 5; + */ + expiry: bigint; + /** + * Fallback on-chain address. + * + * @generated from protobuf field: string fallback_addr = 6; + */ + fallbackAddr: string; + /** + * Delta to use for the time-lock of the CLTV extended to the final hop. + * + * @generated from protobuf field: uint64 cltv_expiry = 7; + */ + cltvExpiry: bigint; + /** + * + * Route hints that can each be individually used to assist in reaching the + * invoice's destination. + * + * @generated from protobuf field: repeated lnrpc.RouteHint route_hints = 8; + */ + routeHints: RouteHint[]; + /** + * Whether this invoice should include routing hints for private channels. + * + * @generated from protobuf field: bool private = 9; + */ + private: boolean; +} +/** + * @generated from protobuf message invoicesrpc.AddHoldInvoiceResp + */ +export interface AddHoldInvoiceResp { + /** + * + * A bare-bones invoice for a payment within the Lightning Network. With the + * details of the invoice, the sender has all the data necessary to send a + * payment to the recipient. + * + * @generated from protobuf field: string payment_request = 1; + */ + paymentRequest: string; + /** + * + * The "add" index of this invoice. Each newly created invoice will increment + * this index making it monotonically increasing. Callers to the + * SubscribeInvoices call can use this to instantly get notified of all added + * invoices with an add_index greater than this one. + * + * @generated from protobuf field: uint64 add_index = 2; + */ + addIndex: bigint; + /** + * + * The payment address of the generated invoice. This value should be used + * in all payments for this invoice as we require it for end to end + * security. + * + * @generated from protobuf field: bytes payment_addr = 3; + */ + paymentAddr: Uint8Array; +} +/** + * @generated from protobuf message invoicesrpc.SettleInvoiceMsg + */ +export interface SettleInvoiceMsg { + /** + * Externally discovered pre-image that should be used to settle the hold + * invoice. + * + * @generated from protobuf field: bytes preimage = 1; + */ + preimage: Uint8Array; +} +/** + * @generated from protobuf message invoicesrpc.SettleInvoiceResp + */ +export interface SettleInvoiceResp { +} +/** + * @generated from protobuf message invoicesrpc.SubscribeSingleInvoiceRequest + */ +export interface SubscribeSingleInvoiceRequest { + /** + * Hash corresponding to the (hold) invoice to subscribe to. When using + * REST, this field must be encoded as base64url. + * + * @generated from protobuf field: bytes r_hash = 2; + */ + rHash: Uint8Array; +} +/** + * @generated from protobuf message invoicesrpc.LookupInvoiceMsg + */ +export interface LookupInvoiceMsg { + /** + * @generated from protobuf oneof: invoice_ref + */ + invoiceRef: { + oneofKind: "paymentHash"; + /** + * When using REST, this field must be encoded as base64. + * + * @generated from protobuf field: bytes payment_hash = 1; + */ + paymentHash: Uint8Array; + } | { + oneofKind: "paymentAddr"; + /** + * @generated from protobuf field: bytes payment_addr = 2; + */ + paymentAddr: Uint8Array; + } | { + oneofKind: "setId"; + /** + * @generated from protobuf field: bytes set_id = 3; + */ + setId: Uint8Array; + } | { + oneofKind: undefined; + }; + /** + * @generated from protobuf field: invoicesrpc.LookupModifier lookup_modifier = 4; + */ + lookupModifier: LookupModifier; +} +/** + * @generated from protobuf enum invoicesrpc.LookupModifier + */ +export enum LookupModifier { + /** + * The default look up modifier, no look up behavior is changed. + * + * @generated from protobuf enum value: DEFAULT = 0; + */ + DEFAULT = 0, + /** + * + * Indicates that when a look up is done based on a set_id, then only that set + * of HTLCs related to that set ID should be returned. + * + * @generated from protobuf enum value: HTLC_SET_ONLY = 1; + */ + HTLC_SET_ONLY = 1, + /** + * + * Indicates that when a look up is done using a payment_addr, then no HTLCs + * related to the payment_addr should be returned. This is useful when one + * wants to be able to obtain the set of associated setIDs with a given + * invoice, then look up the sub-invoices "projected" by that set ID. + * + * @generated from protobuf enum value: HTLC_SET_BLANK = 2; + */ + HTLC_SET_BLANK = 2 +} +// @generated message type with reflection information, may provide speed optimized methods +class CancelInvoiceMsg$Type extends MessageType { + constructor() { + super("invoicesrpc.CancelInvoiceMsg", [ + { no: 1, name: "payment_hash", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): CancelInvoiceMsg { + const message = { paymentHash: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: CancelInvoiceMsg): CancelInvoiceMsg { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes payment_hash */ 1: + message.paymentHash = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: CancelInvoiceMsg, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes payment_hash = 1; */ + if (message.paymentHash.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.paymentHash); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message invoicesrpc.CancelInvoiceMsg + */ +export const CancelInvoiceMsg = new CancelInvoiceMsg$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class CancelInvoiceResp$Type extends MessageType { + constructor() { + super("invoicesrpc.CancelInvoiceResp", []); + } + create(value?: PartialMessage): CancelInvoiceResp { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: CancelInvoiceResp): CancelInvoiceResp { + return target ?? this.create(); + } + internalBinaryWrite(message: CancelInvoiceResp, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message invoicesrpc.CancelInvoiceResp + */ +export const CancelInvoiceResp = new CancelInvoiceResp$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class AddHoldInvoiceRequest$Type extends MessageType { + constructor() { + super("invoicesrpc.AddHoldInvoiceRequest", [ + { no: 1, name: "memo", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "hash", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 3, name: "value", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 10, name: "value_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "description_hash", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 5, name: "expiry", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 6, name: "fallback_addr", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 7, name: "cltv_expiry", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 8, name: "route_hints", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => RouteHint }, + { no: 9, name: "private", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): AddHoldInvoiceRequest { + const message = { memo: "", hash: new Uint8Array(0), value: 0n, valueMsat: 0n, descriptionHash: new Uint8Array(0), expiry: 0n, fallbackAddr: "", cltvExpiry: 0n, routeHints: [], private: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: AddHoldInvoiceRequest): AddHoldInvoiceRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string memo */ 1: + message.memo = reader.string(); + break; + case /* bytes hash */ 2: + message.hash = reader.bytes(); + break; + case /* int64 value */ 3: + message.value = reader.int64().toBigInt(); + break; + case /* int64 value_msat */ 10: + message.valueMsat = reader.int64().toBigInt(); + break; + case /* bytes description_hash */ 4: + message.descriptionHash = reader.bytes(); + break; + case /* int64 expiry */ 5: + message.expiry = reader.int64().toBigInt(); + break; + case /* string fallback_addr */ 6: + message.fallbackAddr = reader.string(); + break; + case /* uint64 cltv_expiry */ 7: + message.cltvExpiry = reader.uint64().toBigInt(); + break; + case /* repeated lnrpc.RouteHint route_hints */ 8: + message.routeHints.push(RouteHint.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* bool private */ 9: + message.private = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: AddHoldInvoiceRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string memo = 1; */ + if (message.memo !== "") + writer.tag(1, WireType.LengthDelimited).string(message.memo); + /* bytes hash = 2; */ + if (message.hash.length) + writer.tag(2, WireType.LengthDelimited).bytes(message.hash); + /* int64 value = 3; */ + if (message.value !== 0n) + writer.tag(3, WireType.Varint).int64(message.value); + /* int64 value_msat = 10; */ + if (message.valueMsat !== 0n) + writer.tag(10, WireType.Varint).int64(message.valueMsat); + /* bytes description_hash = 4; */ + if (message.descriptionHash.length) + writer.tag(4, WireType.LengthDelimited).bytes(message.descriptionHash); + /* int64 expiry = 5; */ + if (message.expiry !== 0n) + writer.tag(5, WireType.Varint).int64(message.expiry); + /* string fallback_addr = 6; */ + if (message.fallbackAddr !== "") + writer.tag(6, WireType.LengthDelimited).string(message.fallbackAddr); + /* uint64 cltv_expiry = 7; */ + if (message.cltvExpiry !== 0n) + writer.tag(7, WireType.Varint).uint64(message.cltvExpiry); + /* repeated lnrpc.RouteHint route_hints = 8; */ + for (let i = 0; i < message.routeHints.length; i++) + RouteHint.internalBinaryWrite(message.routeHints[i], writer.tag(8, WireType.LengthDelimited).fork(), options).join(); + /* bool private = 9; */ + if (message.private !== false) + writer.tag(9, WireType.Varint).bool(message.private); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message invoicesrpc.AddHoldInvoiceRequest + */ +export const AddHoldInvoiceRequest = new AddHoldInvoiceRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class AddHoldInvoiceResp$Type extends MessageType { + constructor() { + super("invoicesrpc.AddHoldInvoiceResp", [ + { no: 1, name: "payment_request", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "add_index", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "payment_addr", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): AddHoldInvoiceResp { + const message = { paymentRequest: "", addIndex: 0n, paymentAddr: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: AddHoldInvoiceResp): AddHoldInvoiceResp { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string payment_request */ 1: + message.paymentRequest = reader.string(); + break; + case /* uint64 add_index */ 2: + message.addIndex = reader.uint64().toBigInt(); + break; + case /* bytes payment_addr */ 3: + message.paymentAddr = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: AddHoldInvoiceResp, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string payment_request = 1; */ + if (message.paymentRequest !== "") + writer.tag(1, WireType.LengthDelimited).string(message.paymentRequest); + /* uint64 add_index = 2; */ + if (message.addIndex !== 0n) + writer.tag(2, WireType.Varint).uint64(message.addIndex); + /* bytes payment_addr = 3; */ + if (message.paymentAddr.length) + writer.tag(3, WireType.LengthDelimited).bytes(message.paymentAddr); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message invoicesrpc.AddHoldInvoiceResp + */ +export const AddHoldInvoiceResp = new AddHoldInvoiceResp$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class SettleInvoiceMsg$Type extends MessageType { + constructor() { + super("invoicesrpc.SettleInvoiceMsg", [ + { no: 1, name: "preimage", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): SettleInvoiceMsg { + const message = { preimage: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SettleInvoiceMsg): SettleInvoiceMsg { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes preimage */ 1: + message.preimage = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: SettleInvoiceMsg, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes preimage = 1; */ + if (message.preimage.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.preimage); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message invoicesrpc.SettleInvoiceMsg + */ +export const SettleInvoiceMsg = new SettleInvoiceMsg$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class SettleInvoiceResp$Type extends MessageType { + constructor() { + super("invoicesrpc.SettleInvoiceResp", []); + } + create(value?: PartialMessage): SettleInvoiceResp { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SettleInvoiceResp): SettleInvoiceResp { + return target ?? this.create(); + } + internalBinaryWrite(message: SettleInvoiceResp, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message invoicesrpc.SettleInvoiceResp + */ +export const SettleInvoiceResp = new SettleInvoiceResp$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class SubscribeSingleInvoiceRequest$Type extends MessageType { + constructor() { + super("invoicesrpc.SubscribeSingleInvoiceRequest", [ + { no: 2, name: "r_hash", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): SubscribeSingleInvoiceRequest { + const message = { rHash: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SubscribeSingleInvoiceRequest): SubscribeSingleInvoiceRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes r_hash */ 2: + message.rHash = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: SubscribeSingleInvoiceRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes r_hash = 2; */ + if (message.rHash.length) + writer.tag(2, WireType.LengthDelimited).bytes(message.rHash); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message invoicesrpc.SubscribeSingleInvoiceRequest + */ +export const SubscribeSingleInvoiceRequest = new SubscribeSingleInvoiceRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class LookupInvoiceMsg$Type extends MessageType { + constructor() { + super("invoicesrpc.LookupInvoiceMsg", [ + { no: 1, name: "payment_hash", kind: "scalar", oneof: "invoiceRef", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "payment_addr", kind: "scalar", oneof: "invoiceRef", T: 12 /*ScalarType.BYTES*/ }, + { no: 3, name: "set_id", kind: "scalar", oneof: "invoiceRef", T: 12 /*ScalarType.BYTES*/ }, + { no: 4, name: "lookup_modifier", kind: "enum", T: () => ["invoicesrpc.LookupModifier", LookupModifier] } + ]); + } + create(value?: PartialMessage): LookupInvoiceMsg { + const message = { invoiceRef: { oneofKind: undefined }, lookupModifier: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: LookupInvoiceMsg): LookupInvoiceMsg { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes payment_hash */ 1: + message.invoiceRef = { + oneofKind: "paymentHash", + paymentHash: reader.bytes() + }; + break; + case /* bytes payment_addr */ 2: + message.invoiceRef = { + oneofKind: "paymentAddr", + paymentAddr: reader.bytes() + }; + break; + case /* bytes set_id */ 3: + message.invoiceRef = { + oneofKind: "setId", + setId: reader.bytes() + }; + break; + case /* invoicesrpc.LookupModifier lookup_modifier */ 4: + message.lookupModifier = reader.int32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: LookupInvoiceMsg, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes payment_hash = 1; */ + if (message.invoiceRef.oneofKind === "paymentHash") + writer.tag(1, WireType.LengthDelimited).bytes(message.invoiceRef.paymentHash); + /* bytes payment_addr = 2; */ + if (message.invoiceRef.oneofKind === "paymentAddr") + writer.tag(2, WireType.LengthDelimited).bytes(message.invoiceRef.paymentAddr); + /* bytes set_id = 3; */ + if (message.invoiceRef.oneofKind === "setId") + writer.tag(3, WireType.LengthDelimited).bytes(message.invoiceRef.setId); + /* invoicesrpc.LookupModifier lookup_modifier = 4; */ + if (message.lookupModifier !== 0) + writer.tag(4, WireType.Varint).int32(message.lookupModifier); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message invoicesrpc.LookupInvoiceMsg + */ +export const LookupInvoiceMsg = new LookupInvoiceMsg$Type(); +/** + * @generated ServiceType for protobuf service invoicesrpc.Invoices + */ +export const Invoices = new ServiceType("invoicesrpc.Invoices", [ + { name: "SubscribeSingleInvoice", serverStreaming: true, options: {}, I: SubscribeSingleInvoiceRequest, O: Invoice }, + { name: "CancelInvoice", options: {}, I: CancelInvoiceMsg, O: CancelInvoiceResp }, + { name: "AddHoldInvoice", options: {}, I: AddHoldInvoiceRequest, O: AddHoldInvoiceResp }, + { name: "SettleInvoice", options: {}, I: SettleInvoiceMsg, O: SettleInvoiceResp }, + { name: "LookupInvoiceV2", options: {}, I: LookupInvoiceMsg, O: Invoice } +]); diff --git a/proto/lnd/lightning.client.ts b/proto/lnd/lightning.client.ts new file mode 100644 index 00000000..2577acfc --- /dev/null +++ b/proto/lnd/lightning.client.ts @@ -0,0 +1,1722 @@ +// @generated by protobuf-ts 2.5.0 +// @generated from protobuf file "lightning.proto" (package "lnrpc", syntax proto3) +// tslint:disable +import type { RpcTransport } from "@protobuf-ts/runtime-rpc"; +import type { ServiceInfo } from "@protobuf-ts/runtime-rpc"; +import { Lightning } from "./lightning"; +import type { LookupHtlcResponse } from "./lightning"; +import type { LookupHtlcRequest } from "./lightning"; +import type { ListAliasesResponse } from "./lightning"; +import type { ListAliasesRequest } from "./lightning"; +import type { CustomMessage } from "./lightning"; +import type { SubscribeCustomMessagesRequest } from "./lightning"; +import type { SendCustomMessageResponse } from "./lightning"; +import type { SendCustomMessageRequest } from "./lightning"; +import type { RPCMiddlewareRequest } from "./lightning"; +import type { RPCMiddlewareResponse } from "./lightning"; +import type { CheckMacPermResponse } from "./lightning"; +import type { CheckMacPermRequest } from "./lightning"; +import type { ListPermissionsResponse } from "./lightning"; +import type { ListPermissionsRequest } from "./lightning"; +import type { DeleteMacaroonIDResponse } from "./lightning"; +import type { DeleteMacaroonIDRequest } from "./lightning"; +import type { ListMacaroonIDsResponse } from "./lightning"; +import type { ListMacaroonIDsRequest } from "./lightning"; +import type { BakeMacaroonResponse } from "./lightning"; +import type { BakeMacaroonRequest } from "./lightning"; +import type { ChannelBackupSubscription } from "./lightning"; +import type { RestoreBackupResponse } from "./lightning"; +import type { RestoreChanBackupRequest } from "./lightning"; +import type { VerifyChanBackupResponse } from "./lightning"; +import type { ChanBackupSnapshot } from "./lightning"; +import type { ChanBackupExportRequest } from "./lightning"; +import type { ChannelBackup } from "./lightning"; +import type { ExportChannelBackupRequest } from "./lightning"; +import type { ForwardingHistoryResponse } from "./lightning"; +import type { ForwardingHistoryRequest } from "./lightning"; +import type { PolicyUpdateResponse } from "./lightning"; +import type { PolicyUpdateRequest } from "./lightning"; +import type { FeeReportResponse } from "./lightning"; +import type { FeeReportRequest } from "./lightning"; +import type { DebugLevelResponse } from "./lightning"; +import type { DebugLevelRequest } from "./lightning"; +import type { GraphTopologyUpdate } from "./lightning"; +import type { GraphTopologySubscription } from "./lightning"; +import type { StopResponse } from "./lightning"; +import type { StopRequest } from "./lightning"; +import type { NetworkInfo } from "./lightning"; +import type { NetworkInfoRequest } from "./lightning"; +import type { QueryRoutesResponse } from "./lightning"; +import type { QueryRoutesRequest } from "./lightning"; +import type { NodeInfo } from "./lightning"; +import type { NodeInfoRequest } from "./lightning"; +import type { ChannelEdge } from "./lightning"; +import type { ChanInfoRequest } from "./lightning"; +import type { NodeMetricsResponse } from "./lightning"; +import type { NodeMetricsRequest } from "./lightning"; +import type { ChannelGraph } from "./lightning"; +import type { ChannelGraphRequest } from "./lightning"; +import type { DeleteAllPaymentsResponse } from "./lightning"; +import type { DeleteAllPaymentsRequest } from "./lightning"; +import type { DeletePaymentResponse } from "./lightning"; +import type { DeletePaymentRequest } from "./lightning"; +import type { ListPaymentsResponse } from "./lightning"; +import type { ListPaymentsRequest } from "./lightning"; +import type { PayReq } from "./lightning"; +import type { PayReqString } from "./lightning"; +import type { InvoiceSubscription } from "./lightning"; +import type { PaymentHash } from "./lightning"; +import type { ListInvoiceResponse } from "./lightning"; +import type { ListInvoiceRequest } from "./lightning"; +import type { AddInvoiceResponse } from "./lightning"; +import type { Invoice } from "./lightning"; +import type { SendToRouteRequest } from "./lightning"; +import type { SendResponse } from "./lightning"; +import type { SendRequest } from "./lightning"; +import type { AbandonChannelResponse } from "./lightning"; +import type { AbandonChannelRequest } from "./lightning"; +import type { CloseStatusUpdate } from "./lightning"; +import type { CloseChannelRequest } from "./lightning"; +import type { ChannelAcceptRequest } from "./lightning"; +import type { ChannelAcceptResponse } from "./lightning"; +import type { DuplexStreamingCall } from "@protobuf-ts/runtime-rpc"; +import type { FundingStateStepResp } from "./lightning"; +import type { FundingTransitionMsg } from "./lightning"; +import type { BatchOpenChannelResponse } from "./lightning"; +import type { BatchOpenChannelRequest } from "./lightning"; +import type { OpenStatusUpdate } from "./lightning"; +import type { ChannelPoint } from "./lightning"; +import type { OpenChannelRequest } from "./lightning"; +import type { ClosedChannelsResponse } from "./lightning"; +import type { ClosedChannelsRequest } from "./lightning"; +import type { ChannelEventUpdate } from "./lightning"; +import type { ChannelEventSubscription } from "./lightning"; +import type { ListChannelsResponse } from "./lightning"; +import type { ListChannelsRequest } from "./lightning"; +import type { PendingChannelsResponse } from "./lightning"; +import type { PendingChannelsRequest } from "./lightning"; +import type { GetRecoveryInfoResponse } from "./lightning"; +import type { GetRecoveryInfoRequest } from "./lightning"; +import type { GetInfoResponse } from "./lightning"; +import type { GetInfoRequest } from "./lightning"; +import type { PeerEvent } from "./lightning"; +import type { PeerEventSubscription } from "./lightning"; +import type { ListPeersResponse } from "./lightning"; +import type { ListPeersRequest } from "./lightning"; +import type { DisconnectPeerResponse } from "./lightning"; +import type { DisconnectPeerRequest } from "./lightning"; +import type { ConnectPeerResponse } from "./lightning"; +import type { ConnectPeerRequest } from "./lightning"; +import type { VerifyMessageResponse } from "./lightning"; +import type { VerifyMessageRequest } from "./lightning"; +import type { SignMessageResponse } from "./lightning"; +import type { SignMessageRequest } from "./lightning"; +import type { NewAddressResponse } from "./lightning"; +import type { NewAddressRequest } from "./lightning"; +import type { SendManyResponse } from "./lightning"; +import type { SendManyRequest } from "./lightning"; +import type { Transaction } from "./lightning"; +import type { ServerStreamingCall } from "@protobuf-ts/runtime-rpc"; +import type { ListUnspentResponse } from "./lightning"; +import type { ListUnspentRequest } from "./lightning"; +import type { SendCoinsResponse } from "./lightning"; +import type { SendCoinsRequest } from "./lightning"; +import type { EstimateFeeResponse } from "./lightning"; +import type { EstimateFeeRequest } from "./lightning"; +import type { TransactionDetails } from "./lightning"; +import type { GetTransactionsRequest } from "./lightning"; +import type { ChannelBalanceResponse } from "./lightning"; +import type { ChannelBalanceRequest } from "./lightning"; +import { stackIntercept } from "@protobuf-ts/runtime-rpc"; +import type { WalletBalanceResponse } from "./lightning"; +import type { WalletBalanceRequest } from "./lightning"; +import type { UnaryCall } from "@protobuf-ts/runtime-rpc"; +import type { RpcOptions } from "@protobuf-ts/runtime-rpc"; +// +// Comments in this file will be directly parsed into the API +// Documentation as descriptions of the associated method, message, or field. +// These descriptions should go right above the definition of the object, and +// can be in either block or // comment format. +// +// An RPC method can be matched to an lncli command by placing a line in the +// beginning of the description in exactly the following format: +// lncli: `methodname` +// +// Failure to specify the exact name of the command will cause documentation +// generation to fail. +// +// More information on how exactly the gRPC documentation is generated from +// this proto file can be found here: +// https://github.com/lightninglabs/lightning-api + +/** + * Lightning is the main RPC server of the daemon. + * + * @generated from protobuf service lnrpc.Lightning + */ +export interface ILightningClient { + /** + * lncli: `walletbalance` + * WalletBalance returns total unspent outputs(confirmed and unconfirmed), all + * confirmed unspent outputs and all unconfirmed unspent outputs under control + * of the wallet. + * + * @generated from protobuf rpc: WalletBalance(lnrpc.WalletBalanceRequest) returns (lnrpc.WalletBalanceResponse); + */ + walletBalance(input: WalletBalanceRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `channelbalance` + * ChannelBalance returns a report on the total funds across all open channels, + * categorized in local/remote, pending local/remote and unsettled local/remote + * balances. + * + * @generated from protobuf rpc: ChannelBalance(lnrpc.ChannelBalanceRequest) returns (lnrpc.ChannelBalanceResponse); + */ + channelBalance(input: ChannelBalanceRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `listchaintxns` + * GetTransactions returns a list describing all the known transactions + * relevant to the wallet. + * + * @generated from protobuf rpc: GetTransactions(lnrpc.GetTransactionsRequest) returns (lnrpc.TransactionDetails); + */ + getTransactions(input: GetTransactionsRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `estimatefee` + * EstimateFee asks the chain backend to estimate the fee rate and total fees + * for a transaction that pays to multiple specified outputs. + * + * When using REST, the `AddrToAmount` map type can be set by appending + * `&AddrToAmount[
]=` to the URL. Unfortunately this + * map type doesn't appear in the REST API documentation because of a bug in + * the grpc-gateway library. + * + * @generated from protobuf rpc: EstimateFee(lnrpc.EstimateFeeRequest) returns (lnrpc.EstimateFeeResponse); + */ + estimateFee(input: EstimateFeeRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `sendcoins` + * SendCoins executes a request to send coins to a particular address. Unlike + * SendMany, this RPC call only allows creating a single output at a time. If + * neither target_conf, or sat_per_vbyte are set, then the internal wallet will + * consult its fee model to determine a fee for the default confirmation + * target. + * + * @generated from protobuf rpc: SendCoins(lnrpc.SendCoinsRequest) returns (lnrpc.SendCoinsResponse); + */ + sendCoins(input: SendCoinsRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `listunspent` + * Deprecated, use walletrpc.ListUnspent instead. + * + * ListUnspent returns a list of all utxos spendable by the wallet with a + * number of confirmations between the specified minimum and maximum. + * + * @generated from protobuf rpc: ListUnspent(lnrpc.ListUnspentRequest) returns (lnrpc.ListUnspentResponse); + */ + listUnspent(input: ListUnspentRequest, options?: RpcOptions): UnaryCall; + /** + * + * SubscribeTransactions creates a uni-directional stream from the server to + * the client in which any newly discovered transactions relevant to the + * wallet are sent over. + * + * @generated from protobuf rpc: SubscribeTransactions(lnrpc.GetTransactionsRequest) returns (stream lnrpc.Transaction); + */ + subscribeTransactions(input: GetTransactionsRequest, options?: RpcOptions): ServerStreamingCall; + /** + * lncli: `sendmany` + * SendMany handles a request for a transaction that creates multiple specified + * outputs in parallel. If neither target_conf, or sat_per_vbyte are set, then + * the internal wallet will consult its fee model to determine a fee for the + * default confirmation target. + * + * @generated from protobuf rpc: SendMany(lnrpc.SendManyRequest) returns (lnrpc.SendManyResponse); + */ + sendMany(input: SendManyRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `newaddress` + * NewAddress creates a new address under control of the local wallet. + * + * @generated from protobuf rpc: NewAddress(lnrpc.NewAddressRequest) returns (lnrpc.NewAddressResponse); + */ + newAddress(input: NewAddressRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `signmessage` + * SignMessage signs a message with this node's private key. The returned + * signature string is `zbase32` encoded and pubkey recoverable, meaning that + * only the message digest and signature are needed for verification. + * + * @generated from protobuf rpc: SignMessage(lnrpc.SignMessageRequest) returns (lnrpc.SignMessageResponse); + */ + signMessage(input: SignMessageRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `verifymessage` + * VerifyMessage verifies a signature over a msg. The signature must be + * zbase32 encoded and signed by an active node in the resident node's + * channel database. In addition to returning the validity of the signature, + * VerifyMessage also returns the recovered pubkey from the signature. + * + * @generated from protobuf rpc: VerifyMessage(lnrpc.VerifyMessageRequest) returns (lnrpc.VerifyMessageResponse); + */ + verifyMessage(input: VerifyMessageRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `connect` + * ConnectPeer attempts to establish a connection to a remote peer. This is at + * the networking level, and is used for communication between nodes. This is + * distinct from establishing a channel with a peer. + * + * @generated from protobuf rpc: ConnectPeer(lnrpc.ConnectPeerRequest) returns (lnrpc.ConnectPeerResponse); + */ + connectPeer(input: ConnectPeerRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `disconnect` + * DisconnectPeer attempts to disconnect one peer from another identified by a + * given pubKey. In the case that we currently have a pending or active channel + * with the target peer, then this action will be not be allowed. + * + * @generated from protobuf rpc: DisconnectPeer(lnrpc.DisconnectPeerRequest) returns (lnrpc.DisconnectPeerResponse); + */ + disconnectPeer(input: DisconnectPeerRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `listpeers` + * ListPeers returns a verbose listing of all currently active peers. + * + * @generated from protobuf rpc: ListPeers(lnrpc.ListPeersRequest) returns (lnrpc.ListPeersResponse); + */ + listPeers(input: ListPeersRequest, options?: RpcOptions): UnaryCall; + /** + * + * SubscribePeerEvents creates a uni-directional stream from the server to + * the client in which any events relevant to the state of peers are sent + * over. Events include peers going online and offline. + * + * @generated from protobuf rpc: SubscribePeerEvents(lnrpc.PeerEventSubscription) returns (stream lnrpc.PeerEvent); + */ + subscribePeerEvents(input: PeerEventSubscription, options?: RpcOptions): ServerStreamingCall; + /** + * lncli: `getinfo` + * GetInfo returns general information concerning the lightning node including + * it's identity pubkey, alias, the chains it is connected to, and information + * concerning the number of open+pending channels. + * + * @generated from protobuf rpc: GetInfo(lnrpc.GetInfoRequest) returns (lnrpc.GetInfoResponse); + */ + getInfo(input: GetInfoRequest, options?: RpcOptions): UnaryCall; + /** + * * lncli: `getrecoveryinfo` + * GetRecoveryInfo returns information concerning the recovery mode including + * whether it's in a recovery mode, whether the recovery is finished, and the + * progress made so far. + * + * @generated from protobuf rpc: GetRecoveryInfo(lnrpc.GetRecoveryInfoRequest) returns (lnrpc.GetRecoveryInfoResponse); + */ + getRecoveryInfo(input: GetRecoveryInfoRequest, options?: RpcOptions): UnaryCall; + // TODO(roasbeef): merge with below with bool? + + /** + * lncli: `pendingchannels` + * PendingChannels returns a list of all the channels that are currently + * considered "pending". A channel is pending if it has finished the funding + * workflow and is waiting for confirmations for the funding txn, or is in the + * process of closure, either initiated cooperatively or non-cooperatively. + * + * @generated from protobuf rpc: PendingChannels(lnrpc.PendingChannelsRequest) returns (lnrpc.PendingChannelsResponse); + */ + pendingChannels(input: PendingChannelsRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `listchannels` + * ListChannels returns a description of all the open channels that this node + * is a participant in. + * + * @generated from protobuf rpc: ListChannels(lnrpc.ListChannelsRequest) returns (lnrpc.ListChannelsResponse); + */ + listChannels(input: ListChannelsRequest, options?: RpcOptions): UnaryCall; + /** + * + * SubscribeChannelEvents creates a uni-directional stream from the server to + * the client in which any updates relevant to the state of the channels are + * sent over. Events include new active channels, inactive channels, and closed + * channels. + * + * @generated from protobuf rpc: SubscribeChannelEvents(lnrpc.ChannelEventSubscription) returns (stream lnrpc.ChannelEventUpdate); + */ + subscribeChannelEvents(input: ChannelEventSubscription, options?: RpcOptions): ServerStreamingCall; + /** + * lncli: `closedchannels` + * ClosedChannels returns a description of all the closed channels that + * this node was a participant in. + * + * @generated from protobuf rpc: ClosedChannels(lnrpc.ClosedChannelsRequest) returns (lnrpc.ClosedChannelsResponse); + */ + closedChannels(input: ClosedChannelsRequest, options?: RpcOptions): UnaryCall; + /** + * + * OpenChannelSync is a synchronous version of the OpenChannel RPC call. This + * call is meant to be consumed by clients to the REST proxy. As with all + * other sync calls, all byte slices are intended to be populated as hex + * encoded strings. + * + * @generated from protobuf rpc: OpenChannelSync(lnrpc.OpenChannelRequest) returns (lnrpc.ChannelPoint); + */ + openChannelSync(input: OpenChannelRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `openchannel` + * OpenChannel attempts to open a singly funded channel specified in the + * request to a remote peer. Users are able to specify a target number of + * blocks that the funding transaction should be confirmed in, or a manual fee + * rate to us for the funding transaction. If neither are specified, then a + * lax block confirmation target is used. Each OpenStatusUpdate will return + * the pending channel ID of the in-progress channel. Depending on the + * arguments specified in the OpenChannelRequest, this pending channel ID can + * then be used to manually progress the channel funding flow. + * + * @generated from protobuf rpc: OpenChannel(lnrpc.OpenChannelRequest) returns (stream lnrpc.OpenStatusUpdate); + */ + openChannel(input: OpenChannelRequest, options?: RpcOptions): ServerStreamingCall; + /** + * lncli: `batchopenchannel` + * BatchOpenChannel attempts to open multiple single-funded channels in a + * single transaction in an atomic way. This means either all channel open + * requests succeed at once or all attempts are aborted if any of them fail. + * This is the safer variant of using PSBTs to manually fund a batch of + * channels through the OpenChannel RPC. + * + * @generated from protobuf rpc: BatchOpenChannel(lnrpc.BatchOpenChannelRequest) returns (lnrpc.BatchOpenChannelResponse); + */ + batchOpenChannel(input: BatchOpenChannelRequest, options?: RpcOptions): UnaryCall; + /** + * + * FundingStateStep is an advanced funding related call that allows the caller + * to either execute some preparatory steps for a funding workflow, or + * manually progress a funding workflow. The primary way a funding flow is + * identified is via its pending channel ID. As an example, this method can be + * used to specify that we're expecting a funding flow for a particular + * pending channel ID, for which we need to use specific parameters. + * Alternatively, this can be used to interactively drive PSBT signing for + * funding for partially complete funding transactions. + * + * @generated from protobuf rpc: FundingStateStep(lnrpc.FundingTransitionMsg) returns (lnrpc.FundingStateStepResp); + */ + fundingStateStep(input: FundingTransitionMsg, options?: RpcOptions): UnaryCall; + /** + * + * ChannelAcceptor dispatches a bi-directional streaming RPC in which + * OpenChannel requests are sent to the client and the client responds with + * a boolean that tells LND whether or not to accept the channel. This allows + * node operators to specify their own criteria for accepting inbound channels + * through a single persistent connection. + * + * @generated from protobuf rpc: ChannelAcceptor(stream lnrpc.ChannelAcceptResponse) returns (stream lnrpc.ChannelAcceptRequest); + */ + channelAcceptor(options?: RpcOptions): DuplexStreamingCall; + /** + * lncli: `closechannel` + * CloseChannel attempts to close an active channel identified by its channel + * outpoint (ChannelPoint). The actions of this method can additionally be + * augmented to attempt a force close after a timeout period in the case of an + * inactive peer. If a non-force close (cooperative closure) is requested, + * then the user can specify either a target number of blocks until the + * closure transaction is confirmed, or a manual fee rate. If neither are + * specified, then a default lax, block confirmation target is used. + * + * @generated from protobuf rpc: CloseChannel(lnrpc.CloseChannelRequest) returns (stream lnrpc.CloseStatusUpdate); + */ + closeChannel(input: CloseChannelRequest, options?: RpcOptions): ServerStreamingCall; + /** + * lncli: `abandonchannel` + * AbandonChannel removes all channel state from the database except for a + * close summary. This method can be used to get rid of permanently unusable + * channels due to bugs fixed in newer versions of lnd. This method can also be + * used to remove externally funded channels where the funding transaction was + * never broadcast. Only available for non-externally funded channels in dev + * build. + * + * @generated from protobuf rpc: AbandonChannel(lnrpc.AbandonChannelRequest) returns (lnrpc.AbandonChannelResponse); + */ + abandonChannel(input: AbandonChannelRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `sendpayment` + * Deprecated, use routerrpc.SendPaymentV2. SendPayment dispatches a + * bi-directional streaming RPC for sending payments through the Lightning + * Network. A single RPC invocation creates a persistent bi-directional + * stream allowing clients to rapidly send payments through the Lightning + * Network with a single persistent connection. + * + * @deprecated + * @generated from protobuf rpc: SendPayment(stream lnrpc.SendRequest) returns (stream lnrpc.SendResponse); + */ + sendPayment(options?: RpcOptions): DuplexStreamingCall; + /** + * + * SendPaymentSync is the synchronous non-streaming version of SendPayment. + * This RPC is intended to be consumed by clients of the REST proxy. + * Additionally, this RPC expects the destination's public key and the payment + * hash (if any) to be encoded as hex strings. + * + * @generated from protobuf rpc: SendPaymentSync(lnrpc.SendRequest) returns (lnrpc.SendResponse); + */ + sendPaymentSync(input: SendRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `sendtoroute` + * Deprecated, use routerrpc.SendToRouteV2. SendToRoute is a bi-directional + * streaming RPC for sending payment through the Lightning Network. This + * method differs from SendPayment in that it allows users to specify a full + * route manually. This can be used for things like rebalancing, and atomic + * swaps. + * + * @deprecated + * @generated from protobuf rpc: SendToRoute(stream lnrpc.SendToRouteRequest) returns (stream lnrpc.SendResponse); + */ + sendToRoute(options?: RpcOptions): DuplexStreamingCall; + /** + * + * SendToRouteSync is a synchronous version of SendToRoute. It Will block + * until the payment either fails or succeeds. + * + * @generated from protobuf rpc: SendToRouteSync(lnrpc.SendToRouteRequest) returns (lnrpc.SendResponse); + */ + sendToRouteSync(input: SendToRouteRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `addinvoice` + * AddInvoice attempts to add a new invoice to the invoice database. Any + * duplicated invoices are rejected, therefore all invoices *must* have a + * unique payment preimage. + * + * @generated from protobuf rpc: AddInvoice(lnrpc.Invoice) returns (lnrpc.AddInvoiceResponse); + */ + addInvoice(input: Invoice, options?: RpcOptions): UnaryCall; + /** + * lncli: `listinvoices` + * ListInvoices returns a list of all the invoices currently stored within the + * database. Any active debug invoices are ignored. It has full support for + * paginated responses, allowing users to query for specific invoices through + * their add_index. This can be done by using either the first_index_offset or + * last_index_offset fields included in the response as the index_offset of the + * next request. By default, the first 100 invoices created will be returned. + * Backwards pagination is also supported through the Reversed flag. + * + * @generated from protobuf rpc: ListInvoices(lnrpc.ListInvoiceRequest) returns (lnrpc.ListInvoiceResponse); + */ + listInvoices(input: ListInvoiceRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `lookupinvoice` + * LookupInvoice attempts to look up an invoice according to its payment hash. + * The passed payment hash *must* be exactly 32 bytes, if not, an error is + * returned. + * + * @generated from protobuf rpc: LookupInvoice(lnrpc.PaymentHash) returns (lnrpc.Invoice); + */ + lookupInvoice(input: PaymentHash, options?: RpcOptions): UnaryCall; + /** + * + * SubscribeInvoices returns a uni-directional stream (server -> client) for + * notifying the client of newly added/settled invoices. The caller can + * optionally specify the add_index and/or the settle_index. If the add_index + * is specified, then we'll first start by sending add invoice events for all + * invoices with an add_index greater than the specified value. If the + * settle_index is specified, the next, we'll send out all settle events for + * invoices with a settle_index greater than the specified value. One or both + * of these fields can be set. If no fields are set, then we'll only send out + * the latest add/settle events. + * + * @generated from protobuf rpc: SubscribeInvoices(lnrpc.InvoiceSubscription) returns (stream lnrpc.Invoice); + */ + subscribeInvoices(input: InvoiceSubscription, options?: RpcOptions): ServerStreamingCall; + /** + * lncli: `decodepayreq` + * DecodePayReq takes an encoded payment request string and attempts to decode + * it, returning a full description of the conditions encoded within the + * payment request. + * + * @generated from protobuf rpc: DecodePayReq(lnrpc.PayReqString) returns (lnrpc.PayReq); + */ + decodePayReq(input: PayReqString, options?: RpcOptions): UnaryCall; + /** + * lncli: `listpayments` + * ListPayments returns a list of all outgoing payments. + * + * @generated from protobuf rpc: ListPayments(lnrpc.ListPaymentsRequest) returns (lnrpc.ListPaymentsResponse); + */ + listPayments(input: ListPaymentsRequest, options?: RpcOptions): UnaryCall; + /** + * + * DeletePayment deletes an outgoing payment from DB. Note that it will not + * attempt to delete an In-Flight payment, since that would be unsafe. + * + * @generated from protobuf rpc: DeletePayment(lnrpc.DeletePaymentRequest) returns (lnrpc.DeletePaymentResponse); + */ + deletePayment(input: DeletePaymentRequest, options?: RpcOptions): UnaryCall; + /** + * + * DeleteAllPayments deletes all outgoing payments from DB. Note that it will + * not attempt to delete In-Flight payments, since that would be unsafe. + * + * @generated from protobuf rpc: DeleteAllPayments(lnrpc.DeleteAllPaymentsRequest) returns (lnrpc.DeleteAllPaymentsResponse); + */ + deleteAllPayments(input: DeleteAllPaymentsRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `describegraph` + * DescribeGraph returns a description of the latest graph state from the + * point of view of the node. The graph information is partitioned into two + * components: all the nodes/vertexes, and all the edges that connect the + * vertexes themselves. As this is a directed graph, the edges also contain + * the node directional specific routing policy which includes: the time lock + * delta, fee information, etc. + * + * @generated from protobuf rpc: DescribeGraph(lnrpc.ChannelGraphRequest) returns (lnrpc.ChannelGraph); + */ + describeGraph(input: ChannelGraphRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `getnodemetrics` + * GetNodeMetrics returns node metrics calculated from the graph. Currently + * the only supported metric is betweenness centrality of individual nodes. + * + * @generated from protobuf rpc: GetNodeMetrics(lnrpc.NodeMetricsRequest) returns (lnrpc.NodeMetricsResponse); + */ + getNodeMetrics(input: NodeMetricsRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `getchaninfo` + * GetChanInfo returns the latest authenticated network announcement for the + * given channel identified by its channel ID: an 8-byte integer which + * uniquely identifies the location of transaction's funding output within the + * blockchain. + * + * @generated from protobuf rpc: GetChanInfo(lnrpc.ChanInfoRequest) returns (lnrpc.ChannelEdge); + */ + getChanInfo(input: ChanInfoRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `getnodeinfo` + * GetNodeInfo returns the latest advertised, aggregated, and authenticated + * channel information for the specified node identified by its public key. + * + * @generated from protobuf rpc: GetNodeInfo(lnrpc.NodeInfoRequest) returns (lnrpc.NodeInfo); + */ + getNodeInfo(input: NodeInfoRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `queryroutes` + * QueryRoutes attempts to query the daemon's Channel Router for a possible + * route to a target destination capable of carrying a specific amount of + * satoshis. The returned route contains the full details required to craft and + * send an HTLC, also including the necessary information that should be + * present within the Sphinx packet encapsulated within the HTLC. + * + * When using REST, the `dest_custom_records` map type can be set by appending + * `&dest_custom_records[]=` + * to the URL. Unfortunately this map type doesn't appear in the REST API + * documentation because of a bug in the grpc-gateway library. + * + * @generated from protobuf rpc: QueryRoutes(lnrpc.QueryRoutesRequest) returns (lnrpc.QueryRoutesResponse); + */ + queryRoutes(input: QueryRoutesRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `getnetworkinfo` + * GetNetworkInfo returns some basic stats about the known channel graph from + * the point of view of the node. + * + * @generated from protobuf rpc: GetNetworkInfo(lnrpc.NetworkInfoRequest) returns (lnrpc.NetworkInfo); + */ + getNetworkInfo(input: NetworkInfoRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `stop` + * StopDaemon will send a shutdown request to the interrupt handler, triggering + * a graceful shutdown of the daemon. + * + * @generated from protobuf rpc: StopDaemon(lnrpc.StopRequest) returns (lnrpc.StopResponse); + */ + stopDaemon(input: StopRequest, options?: RpcOptions): UnaryCall; + /** + * + * SubscribeChannelGraph launches a streaming RPC that allows the caller to + * receive notifications upon any changes to the channel graph topology from + * the point of view of the responding node. Events notified include: new + * nodes coming online, nodes updating their authenticated attributes, new + * channels being advertised, updates in the routing policy for a directional + * channel edge, and when channels are closed on-chain. + * + * @generated from protobuf rpc: SubscribeChannelGraph(lnrpc.GraphTopologySubscription) returns (stream lnrpc.GraphTopologyUpdate); + */ + subscribeChannelGraph(input: GraphTopologySubscription, options?: RpcOptions): ServerStreamingCall; + /** + * lncli: `debuglevel` + * DebugLevel allows a caller to programmatically set the logging verbosity of + * lnd. The logging can be targeted according to a coarse daemon-wide logging + * level, or in a granular fashion to specify the logging for a target + * sub-system. + * + * @generated from protobuf rpc: DebugLevel(lnrpc.DebugLevelRequest) returns (lnrpc.DebugLevelResponse); + */ + debugLevel(input: DebugLevelRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `feereport` + * FeeReport allows the caller to obtain a report detailing the current fee + * schedule enforced by the node globally for each channel. + * + * @generated from protobuf rpc: FeeReport(lnrpc.FeeReportRequest) returns (lnrpc.FeeReportResponse); + */ + feeReport(input: FeeReportRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `updatechanpolicy` + * UpdateChannelPolicy allows the caller to update the fee schedule and + * channel policies for all channels globally, or a particular channel. + * + * @generated from protobuf rpc: UpdateChannelPolicy(lnrpc.PolicyUpdateRequest) returns (lnrpc.PolicyUpdateResponse); + */ + updateChannelPolicy(input: PolicyUpdateRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `fwdinghistory` + * ForwardingHistory allows the caller to query the htlcswitch for a record of + * all HTLCs forwarded within the target time range, and integer offset + * within that time range, for a maximum number of events. If no maximum number + * of events is specified, up to 100 events will be returned. If no time-range + * is specified, then events will be returned in the order that they occured. + * + * A list of forwarding events are returned. The size of each forwarding event + * is 40 bytes, and the max message size able to be returned in gRPC is 4 MiB. + * As a result each message can only contain 50k entries. Each response has + * the index offset of the last entry. The index offset can be provided to the + * request to allow the caller to skip a series of records. + * + * @generated from protobuf rpc: ForwardingHistory(lnrpc.ForwardingHistoryRequest) returns (lnrpc.ForwardingHistoryResponse); + */ + forwardingHistory(input: ForwardingHistoryRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `exportchanbackup` + * ExportChannelBackup attempts to return an encrypted static channel backup + * for the target channel identified by it channel point. The backup is + * encrypted with a key generated from the aezeed seed of the user. The + * returned backup can either be restored using the RestoreChannelBackup + * method once lnd is running, or via the InitWallet and UnlockWallet methods + * from the WalletUnlocker service. + * + * @generated from protobuf rpc: ExportChannelBackup(lnrpc.ExportChannelBackupRequest) returns (lnrpc.ChannelBackup); + */ + exportChannelBackup(input: ExportChannelBackupRequest, options?: RpcOptions): UnaryCall; + /** + * + * ExportAllChannelBackups returns static channel backups for all existing + * channels known to lnd. A set of regular singular static channel backups for + * each channel are returned. Additionally, a multi-channel backup is returned + * as well, which contains a single encrypted blob containing the backups of + * each channel. + * + * @generated from protobuf rpc: ExportAllChannelBackups(lnrpc.ChanBackupExportRequest) returns (lnrpc.ChanBackupSnapshot); + */ + exportAllChannelBackups(input: ChanBackupExportRequest, options?: RpcOptions): UnaryCall; + /** + * + * VerifyChanBackup allows a caller to verify the integrity of a channel backup + * snapshot. This method will accept either a packed Single or a packed Multi. + * Specifying both will result in an error. + * + * @generated from protobuf rpc: VerifyChanBackup(lnrpc.ChanBackupSnapshot) returns (lnrpc.VerifyChanBackupResponse); + */ + verifyChanBackup(input: ChanBackupSnapshot, options?: RpcOptions): UnaryCall; + /** + * lncli: `restorechanbackup` + * RestoreChannelBackups accepts a set of singular channel backups, or a + * single encrypted multi-chan backup and attempts to recover any funds + * remaining within the channel. If we are able to unpack the backup, then the + * new channel will be shown under listchannels, as well as pending channels. + * + * @generated from protobuf rpc: RestoreChannelBackups(lnrpc.RestoreChanBackupRequest) returns (lnrpc.RestoreBackupResponse); + */ + restoreChannelBackups(input: RestoreChanBackupRequest, options?: RpcOptions): UnaryCall; + /** + * + * SubscribeChannelBackups allows a client to sub-subscribe to the most up to + * date information concerning the state of all channel backups. Each time a + * new channel is added, we return the new set of channels, along with a + * multi-chan backup containing the backup info for all channels. Each time a + * channel is closed, we send a new update, which contains new new chan back + * ups, but the updated set of encrypted multi-chan backups with the closed + * channel(s) removed. + * + * @generated from protobuf rpc: SubscribeChannelBackups(lnrpc.ChannelBackupSubscription) returns (stream lnrpc.ChanBackupSnapshot); + */ + subscribeChannelBackups(input: ChannelBackupSubscription, options?: RpcOptions): ServerStreamingCall; + /** + * lncli: `bakemacaroon` + * BakeMacaroon allows the creation of a new macaroon with custom read and + * write permissions. No first-party caveats are added since this can be done + * offline. + * + * @generated from protobuf rpc: BakeMacaroon(lnrpc.BakeMacaroonRequest) returns (lnrpc.BakeMacaroonResponse); + */ + bakeMacaroon(input: BakeMacaroonRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `listmacaroonids` + * ListMacaroonIDs returns all root key IDs that are in use. + * + * @generated from protobuf rpc: ListMacaroonIDs(lnrpc.ListMacaroonIDsRequest) returns (lnrpc.ListMacaroonIDsResponse); + */ + listMacaroonIDs(input: ListMacaroonIDsRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `deletemacaroonid` + * DeleteMacaroonID deletes the specified macaroon ID and invalidates all + * macaroons derived from that ID. + * + * @generated from protobuf rpc: DeleteMacaroonID(lnrpc.DeleteMacaroonIDRequest) returns (lnrpc.DeleteMacaroonIDResponse); + */ + deleteMacaroonID(input: DeleteMacaroonIDRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `listpermissions` + * ListPermissions lists all RPC method URIs and their required macaroon + * permissions to access them. + * + * @generated from protobuf rpc: ListPermissions(lnrpc.ListPermissionsRequest) returns (lnrpc.ListPermissionsResponse); + */ + listPermissions(input: ListPermissionsRequest, options?: RpcOptions): UnaryCall; + /** + * + * CheckMacaroonPermissions checks whether a request follows the constraints + * imposed on the macaroon and that the macaroon is authorized to follow the + * provided permissions. + * + * @generated from protobuf rpc: CheckMacaroonPermissions(lnrpc.CheckMacPermRequest) returns (lnrpc.CheckMacPermResponse); + */ + checkMacaroonPermissions(input: CheckMacPermRequest, options?: RpcOptions): UnaryCall; + /** + * + * RegisterRPCMiddleware adds a new gRPC middleware to the interceptor chain. A + * gRPC middleware is software component external to lnd that aims to add + * additional business logic to lnd by observing/intercepting/validating + * incoming gRPC client requests and (if needed) replacing/overwriting outgoing + * messages before they're sent to the client. When registering the middleware + * must identify itself and indicate what custom macaroon caveats it wants to + * be responsible for. Only requests that contain a macaroon with that specific + * custom caveat are then sent to the middleware for inspection. The other + * option is to register for the read-only mode in which all requests/responses + * are forwarded for interception to the middleware but the middleware is not + * allowed to modify any responses. As a security measure, _no_ middleware can + * modify responses for requests made with _unencumbered_ macaroons! + * + * @generated from protobuf rpc: RegisterRPCMiddleware(stream lnrpc.RPCMiddlewareResponse) returns (stream lnrpc.RPCMiddlewareRequest); + */ + registerRPCMiddleware(options?: RpcOptions): DuplexStreamingCall; + /** + * lncli: `sendcustom` + * SendCustomMessage sends a custom peer message. + * + * @generated from protobuf rpc: SendCustomMessage(lnrpc.SendCustomMessageRequest) returns (lnrpc.SendCustomMessageResponse); + */ + sendCustomMessage(input: SendCustomMessageRequest, options?: RpcOptions): UnaryCall; + /** + * lncli: `subscribecustom` + * SubscribeCustomMessages subscribes to a stream of incoming custom peer + * messages. + * + * @generated from protobuf rpc: SubscribeCustomMessages(lnrpc.SubscribeCustomMessagesRequest) returns (stream lnrpc.CustomMessage); + */ + subscribeCustomMessages(input: SubscribeCustomMessagesRequest, options?: RpcOptions): ServerStreamingCall; + /** + * lncli: `listaliases` + * ListAliases returns the set of all aliases that have ever existed with + * their confirmed SCID (if it exists) and/or the base SCID (in the case of + * zero conf). + * + * @generated from protobuf rpc: ListAliases(lnrpc.ListAliasesRequest) returns (lnrpc.ListAliasesResponse); + */ + listAliases(input: ListAliasesRequest, options?: RpcOptions): UnaryCall; + /** + * @generated from protobuf rpc: LookupHtlc(lnrpc.LookupHtlcRequest) returns (lnrpc.LookupHtlcResponse); + */ + lookupHtlc(input: LookupHtlcRequest, options?: RpcOptions): UnaryCall; +} +// +// Comments in this file will be directly parsed into the API +// Documentation as descriptions of the associated method, message, or field. +// These descriptions should go right above the definition of the object, and +// can be in either block or // comment format. +// +// An RPC method can be matched to an lncli command by placing a line in the +// beginning of the description in exactly the following format: +// lncli: `methodname` +// +// Failure to specify the exact name of the command will cause documentation +// generation to fail. +// +// More information on how exactly the gRPC documentation is generated from +// this proto file can be found here: +// https://github.com/lightninglabs/lightning-api + +/** + * Lightning is the main RPC server of the daemon. + * + * @generated from protobuf service lnrpc.Lightning + */ +export class LightningClient implements ILightningClient, ServiceInfo { + typeName = Lightning.typeName; + methods = Lightning.methods; + options = Lightning.options; + constructor(private readonly _transport: RpcTransport) { + } + /** + * lncli: `walletbalance` + * WalletBalance returns total unspent outputs(confirmed and unconfirmed), all + * confirmed unspent outputs and all unconfirmed unspent outputs under control + * of the wallet. + * + * @generated from protobuf rpc: WalletBalance(lnrpc.WalletBalanceRequest) returns (lnrpc.WalletBalanceResponse); + */ + walletBalance(input: WalletBalanceRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[0], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `channelbalance` + * ChannelBalance returns a report on the total funds across all open channels, + * categorized in local/remote, pending local/remote and unsettled local/remote + * balances. + * + * @generated from protobuf rpc: ChannelBalance(lnrpc.ChannelBalanceRequest) returns (lnrpc.ChannelBalanceResponse); + */ + channelBalance(input: ChannelBalanceRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[1], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `listchaintxns` + * GetTransactions returns a list describing all the known transactions + * relevant to the wallet. + * + * @generated from protobuf rpc: GetTransactions(lnrpc.GetTransactionsRequest) returns (lnrpc.TransactionDetails); + */ + getTransactions(input: GetTransactionsRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[2], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `estimatefee` + * EstimateFee asks the chain backend to estimate the fee rate and total fees + * for a transaction that pays to multiple specified outputs. + * + * When using REST, the `AddrToAmount` map type can be set by appending + * `&AddrToAmount[
]=` to the URL. Unfortunately this + * map type doesn't appear in the REST API documentation because of a bug in + * the grpc-gateway library. + * + * @generated from protobuf rpc: EstimateFee(lnrpc.EstimateFeeRequest) returns (lnrpc.EstimateFeeResponse); + */ + estimateFee(input: EstimateFeeRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[3], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `sendcoins` + * SendCoins executes a request to send coins to a particular address. Unlike + * SendMany, this RPC call only allows creating a single output at a time. If + * neither target_conf, or sat_per_vbyte are set, then the internal wallet will + * consult its fee model to determine a fee for the default confirmation + * target. + * + * @generated from protobuf rpc: SendCoins(lnrpc.SendCoinsRequest) returns (lnrpc.SendCoinsResponse); + */ + sendCoins(input: SendCoinsRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[4], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `listunspent` + * Deprecated, use walletrpc.ListUnspent instead. + * + * ListUnspent returns a list of all utxos spendable by the wallet with a + * number of confirmations between the specified minimum and maximum. + * + * @generated from protobuf rpc: ListUnspent(lnrpc.ListUnspentRequest) returns (lnrpc.ListUnspentResponse); + */ + listUnspent(input: ListUnspentRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[5], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * SubscribeTransactions creates a uni-directional stream from the server to + * the client in which any newly discovered transactions relevant to the + * wallet are sent over. + * + * @generated from protobuf rpc: SubscribeTransactions(lnrpc.GetTransactionsRequest) returns (stream lnrpc.Transaction); + */ + subscribeTransactions(input: GetTransactionsRequest, options?: RpcOptions): ServerStreamingCall { + const method = this.methods[6], opt = this._transport.mergeOptions(options); + return stackIntercept("serverStreaming", this._transport, method, opt, input); + } + /** + * lncli: `sendmany` + * SendMany handles a request for a transaction that creates multiple specified + * outputs in parallel. If neither target_conf, or sat_per_vbyte are set, then + * the internal wallet will consult its fee model to determine a fee for the + * default confirmation target. + * + * @generated from protobuf rpc: SendMany(lnrpc.SendManyRequest) returns (lnrpc.SendManyResponse); + */ + sendMany(input: SendManyRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[7], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `newaddress` + * NewAddress creates a new address under control of the local wallet. + * + * @generated from protobuf rpc: NewAddress(lnrpc.NewAddressRequest) returns (lnrpc.NewAddressResponse); + */ + newAddress(input: NewAddressRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[8], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `signmessage` + * SignMessage signs a message with this node's private key. The returned + * signature string is `zbase32` encoded and pubkey recoverable, meaning that + * only the message digest and signature are needed for verification. + * + * @generated from protobuf rpc: SignMessage(lnrpc.SignMessageRequest) returns (lnrpc.SignMessageResponse); + */ + signMessage(input: SignMessageRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[9], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `verifymessage` + * VerifyMessage verifies a signature over a msg. The signature must be + * zbase32 encoded and signed by an active node in the resident node's + * channel database. In addition to returning the validity of the signature, + * VerifyMessage also returns the recovered pubkey from the signature. + * + * @generated from protobuf rpc: VerifyMessage(lnrpc.VerifyMessageRequest) returns (lnrpc.VerifyMessageResponse); + */ + verifyMessage(input: VerifyMessageRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[10], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `connect` + * ConnectPeer attempts to establish a connection to a remote peer. This is at + * the networking level, and is used for communication between nodes. This is + * distinct from establishing a channel with a peer. + * + * @generated from protobuf rpc: ConnectPeer(lnrpc.ConnectPeerRequest) returns (lnrpc.ConnectPeerResponse); + */ + connectPeer(input: ConnectPeerRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[11], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `disconnect` + * DisconnectPeer attempts to disconnect one peer from another identified by a + * given pubKey. In the case that we currently have a pending or active channel + * with the target peer, then this action will be not be allowed. + * + * @generated from protobuf rpc: DisconnectPeer(lnrpc.DisconnectPeerRequest) returns (lnrpc.DisconnectPeerResponse); + */ + disconnectPeer(input: DisconnectPeerRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[12], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `listpeers` + * ListPeers returns a verbose listing of all currently active peers. + * + * @generated from protobuf rpc: ListPeers(lnrpc.ListPeersRequest) returns (lnrpc.ListPeersResponse); + */ + listPeers(input: ListPeersRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[13], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * SubscribePeerEvents creates a uni-directional stream from the server to + * the client in which any events relevant to the state of peers are sent + * over. Events include peers going online and offline. + * + * @generated from protobuf rpc: SubscribePeerEvents(lnrpc.PeerEventSubscription) returns (stream lnrpc.PeerEvent); + */ + subscribePeerEvents(input: PeerEventSubscription, options?: RpcOptions): ServerStreamingCall { + const method = this.methods[14], opt = this._transport.mergeOptions(options); + return stackIntercept("serverStreaming", this._transport, method, opt, input); + } + /** + * lncli: `getinfo` + * GetInfo returns general information concerning the lightning node including + * it's identity pubkey, alias, the chains it is connected to, and information + * concerning the number of open+pending channels. + * + * @generated from protobuf rpc: GetInfo(lnrpc.GetInfoRequest) returns (lnrpc.GetInfoResponse); + */ + getInfo(input: GetInfoRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[15], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * * lncli: `getrecoveryinfo` + * GetRecoveryInfo returns information concerning the recovery mode including + * whether it's in a recovery mode, whether the recovery is finished, and the + * progress made so far. + * + * @generated from protobuf rpc: GetRecoveryInfo(lnrpc.GetRecoveryInfoRequest) returns (lnrpc.GetRecoveryInfoResponse); + */ + getRecoveryInfo(input: GetRecoveryInfoRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[16], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + // TODO(roasbeef): merge with below with bool? + + /** + * lncli: `pendingchannels` + * PendingChannels returns a list of all the channels that are currently + * considered "pending". A channel is pending if it has finished the funding + * workflow and is waiting for confirmations for the funding txn, or is in the + * process of closure, either initiated cooperatively or non-cooperatively. + * + * @generated from protobuf rpc: PendingChannels(lnrpc.PendingChannelsRequest) returns (lnrpc.PendingChannelsResponse); + */ + pendingChannels(input: PendingChannelsRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[17], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `listchannels` + * ListChannels returns a description of all the open channels that this node + * is a participant in. + * + * @generated from protobuf rpc: ListChannels(lnrpc.ListChannelsRequest) returns (lnrpc.ListChannelsResponse); + */ + listChannels(input: ListChannelsRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[18], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * SubscribeChannelEvents creates a uni-directional stream from the server to + * the client in which any updates relevant to the state of the channels are + * sent over. Events include new active channels, inactive channels, and closed + * channels. + * + * @generated from protobuf rpc: SubscribeChannelEvents(lnrpc.ChannelEventSubscription) returns (stream lnrpc.ChannelEventUpdate); + */ + subscribeChannelEvents(input: ChannelEventSubscription, options?: RpcOptions): ServerStreamingCall { + const method = this.methods[19], opt = this._transport.mergeOptions(options); + return stackIntercept("serverStreaming", this._transport, method, opt, input); + } + /** + * lncli: `closedchannels` + * ClosedChannels returns a description of all the closed channels that + * this node was a participant in. + * + * @generated from protobuf rpc: ClosedChannels(lnrpc.ClosedChannelsRequest) returns (lnrpc.ClosedChannelsResponse); + */ + closedChannels(input: ClosedChannelsRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[20], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * OpenChannelSync is a synchronous version of the OpenChannel RPC call. This + * call is meant to be consumed by clients to the REST proxy. As with all + * other sync calls, all byte slices are intended to be populated as hex + * encoded strings. + * + * @generated from protobuf rpc: OpenChannelSync(lnrpc.OpenChannelRequest) returns (lnrpc.ChannelPoint); + */ + openChannelSync(input: OpenChannelRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[21], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `openchannel` + * OpenChannel attempts to open a singly funded channel specified in the + * request to a remote peer. Users are able to specify a target number of + * blocks that the funding transaction should be confirmed in, or a manual fee + * rate to us for the funding transaction. If neither are specified, then a + * lax block confirmation target is used. Each OpenStatusUpdate will return + * the pending channel ID of the in-progress channel. Depending on the + * arguments specified in the OpenChannelRequest, this pending channel ID can + * then be used to manually progress the channel funding flow. + * + * @generated from protobuf rpc: OpenChannel(lnrpc.OpenChannelRequest) returns (stream lnrpc.OpenStatusUpdate); + */ + openChannel(input: OpenChannelRequest, options?: RpcOptions): ServerStreamingCall { + const method = this.methods[22], opt = this._transport.mergeOptions(options); + return stackIntercept("serverStreaming", this._transport, method, opt, input); + } + /** + * lncli: `batchopenchannel` + * BatchOpenChannel attempts to open multiple single-funded channels in a + * single transaction in an atomic way. This means either all channel open + * requests succeed at once or all attempts are aborted if any of them fail. + * This is the safer variant of using PSBTs to manually fund a batch of + * channels through the OpenChannel RPC. + * + * @generated from protobuf rpc: BatchOpenChannel(lnrpc.BatchOpenChannelRequest) returns (lnrpc.BatchOpenChannelResponse); + */ + batchOpenChannel(input: BatchOpenChannelRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[23], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * FundingStateStep is an advanced funding related call that allows the caller + * to either execute some preparatory steps for a funding workflow, or + * manually progress a funding workflow. The primary way a funding flow is + * identified is via its pending channel ID. As an example, this method can be + * used to specify that we're expecting a funding flow for a particular + * pending channel ID, for which we need to use specific parameters. + * Alternatively, this can be used to interactively drive PSBT signing for + * funding for partially complete funding transactions. + * + * @generated from protobuf rpc: FundingStateStep(lnrpc.FundingTransitionMsg) returns (lnrpc.FundingStateStepResp); + */ + fundingStateStep(input: FundingTransitionMsg, options?: RpcOptions): UnaryCall { + const method = this.methods[24], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * ChannelAcceptor dispatches a bi-directional streaming RPC in which + * OpenChannel requests are sent to the client and the client responds with + * a boolean that tells LND whether or not to accept the channel. This allows + * node operators to specify their own criteria for accepting inbound channels + * through a single persistent connection. + * + * @generated from protobuf rpc: ChannelAcceptor(stream lnrpc.ChannelAcceptResponse) returns (stream lnrpc.ChannelAcceptRequest); + */ + channelAcceptor(options?: RpcOptions): DuplexStreamingCall { + const method = this.methods[25], opt = this._transport.mergeOptions(options); + return stackIntercept("duplex", this._transport, method, opt); + } + /** + * lncli: `closechannel` + * CloseChannel attempts to close an active channel identified by its channel + * outpoint (ChannelPoint). The actions of this method can additionally be + * augmented to attempt a force close after a timeout period in the case of an + * inactive peer. If a non-force close (cooperative closure) is requested, + * then the user can specify either a target number of blocks until the + * closure transaction is confirmed, or a manual fee rate. If neither are + * specified, then a default lax, block confirmation target is used. + * + * @generated from protobuf rpc: CloseChannel(lnrpc.CloseChannelRequest) returns (stream lnrpc.CloseStatusUpdate); + */ + closeChannel(input: CloseChannelRequest, options?: RpcOptions): ServerStreamingCall { + const method = this.methods[26], opt = this._transport.mergeOptions(options); + return stackIntercept("serverStreaming", this._transport, method, opt, input); + } + /** + * lncli: `abandonchannel` + * AbandonChannel removes all channel state from the database except for a + * close summary. This method can be used to get rid of permanently unusable + * channels due to bugs fixed in newer versions of lnd. This method can also be + * used to remove externally funded channels where the funding transaction was + * never broadcast. Only available for non-externally funded channels in dev + * build. + * + * @generated from protobuf rpc: AbandonChannel(lnrpc.AbandonChannelRequest) returns (lnrpc.AbandonChannelResponse); + */ + abandonChannel(input: AbandonChannelRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[27], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `sendpayment` + * Deprecated, use routerrpc.SendPaymentV2. SendPayment dispatches a + * bi-directional streaming RPC for sending payments through the Lightning + * Network. A single RPC invocation creates a persistent bi-directional + * stream allowing clients to rapidly send payments through the Lightning + * Network with a single persistent connection. + * + * @deprecated + * @generated from protobuf rpc: SendPayment(stream lnrpc.SendRequest) returns (stream lnrpc.SendResponse); + */ + sendPayment(options?: RpcOptions): DuplexStreamingCall { + const method = this.methods[28], opt = this._transport.mergeOptions(options); + return stackIntercept("duplex", this._transport, method, opt); + } + /** + * + * SendPaymentSync is the synchronous non-streaming version of SendPayment. + * This RPC is intended to be consumed by clients of the REST proxy. + * Additionally, this RPC expects the destination's public key and the payment + * hash (if any) to be encoded as hex strings. + * + * @generated from protobuf rpc: SendPaymentSync(lnrpc.SendRequest) returns (lnrpc.SendResponse); + */ + sendPaymentSync(input: SendRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[29], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `sendtoroute` + * Deprecated, use routerrpc.SendToRouteV2. SendToRoute is a bi-directional + * streaming RPC for sending payment through the Lightning Network. This + * method differs from SendPayment in that it allows users to specify a full + * route manually. This can be used for things like rebalancing, and atomic + * swaps. + * + * @deprecated + * @generated from protobuf rpc: SendToRoute(stream lnrpc.SendToRouteRequest) returns (stream lnrpc.SendResponse); + */ + sendToRoute(options?: RpcOptions): DuplexStreamingCall { + const method = this.methods[30], opt = this._transport.mergeOptions(options); + return stackIntercept("duplex", this._transport, method, opt); + } + /** + * + * SendToRouteSync is a synchronous version of SendToRoute. It Will block + * until the payment either fails or succeeds. + * + * @generated from protobuf rpc: SendToRouteSync(lnrpc.SendToRouteRequest) returns (lnrpc.SendResponse); + */ + sendToRouteSync(input: SendToRouteRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[31], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `addinvoice` + * AddInvoice attempts to add a new invoice to the invoice database. Any + * duplicated invoices are rejected, therefore all invoices *must* have a + * unique payment preimage. + * + * @generated from protobuf rpc: AddInvoice(lnrpc.Invoice) returns (lnrpc.AddInvoiceResponse); + */ + addInvoice(input: Invoice, options?: RpcOptions): UnaryCall { + const method = this.methods[32], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `listinvoices` + * ListInvoices returns a list of all the invoices currently stored within the + * database. Any active debug invoices are ignored. It has full support for + * paginated responses, allowing users to query for specific invoices through + * their add_index. This can be done by using either the first_index_offset or + * last_index_offset fields included in the response as the index_offset of the + * next request. By default, the first 100 invoices created will be returned. + * Backwards pagination is also supported through the Reversed flag. + * + * @generated from protobuf rpc: ListInvoices(lnrpc.ListInvoiceRequest) returns (lnrpc.ListInvoiceResponse); + */ + listInvoices(input: ListInvoiceRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[33], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `lookupinvoice` + * LookupInvoice attempts to look up an invoice according to its payment hash. + * The passed payment hash *must* be exactly 32 bytes, if not, an error is + * returned. + * + * @generated from protobuf rpc: LookupInvoice(lnrpc.PaymentHash) returns (lnrpc.Invoice); + */ + lookupInvoice(input: PaymentHash, options?: RpcOptions): UnaryCall { + const method = this.methods[34], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * SubscribeInvoices returns a uni-directional stream (server -> client) for + * notifying the client of newly added/settled invoices. The caller can + * optionally specify the add_index and/or the settle_index. If the add_index + * is specified, then we'll first start by sending add invoice events for all + * invoices with an add_index greater than the specified value. If the + * settle_index is specified, the next, we'll send out all settle events for + * invoices with a settle_index greater than the specified value. One or both + * of these fields can be set. If no fields are set, then we'll only send out + * the latest add/settle events. + * + * @generated from protobuf rpc: SubscribeInvoices(lnrpc.InvoiceSubscription) returns (stream lnrpc.Invoice); + */ + subscribeInvoices(input: InvoiceSubscription, options?: RpcOptions): ServerStreamingCall { + const method = this.methods[35], opt = this._transport.mergeOptions(options); + return stackIntercept("serverStreaming", this._transport, method, opt, input); + } + /** + * lncli: `decodepayreq` + * DecodePayReq takes an encoded payment request string and attempts to decode + * it, returning a full description of the conditions encoded within the + * payment request. + * + * @generated from protobuf rpc: DecodePayReq(lnrpc.PayReqString) returns (lnrpc.PayReq); + */ + decodePayReq(input: PayReqString, options?: RpcOptions): UnaryCall { + const method = this.methods[36], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `listpayments` + * ListPayments returns a list of all outgoing payments. + * + * @generated from protobuf rpc: ListPayments(lnrpc.ListPaymentsRequest) returns (lnrpc.ListPaymentsResponse); + */ + listPayments(input: ListPaymentsRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[37], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * DeletePayment deletes an outgoing payment from DB. Note that it will not + * attempt to delete an In-Flight payment, since that would be unsafe. + * + * @generated from protobuf rpc: DeletePayment(lnrpc.DeletePaymentRequest) returns (lnrpc.DeletePaymentResponse); + */ + deletePayment(input: DeletePaymentRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[38], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * DeleteAllPayments deletes all outgoing payments from DB. Note that it will + * not attempt to delete In-Flight payments, since that would be unsafe. + * + * @generated from protobuf rpc: DeleteAllPayments(lnrpc.DeleteAllPaymentsRequest) returns (lnrpc.DeleteAllPaymentsResponse); + */ + deleteAllPayments(input: DeleteAllPaymentsRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[39], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `describegraph` + * DescribeGraph returns a description of the latest graph state from the + * point of view of the node. The graph information is partitioned into two + * components: all the nodes/vertexes, and all the edges that connect the + * vertexes themselves. As this is a directed graph, the edges also contain + * the node directional specific routing policy which includes: the time lock + * delta, fee information, etc. + * + * @generated from protobuf rpc: DescribeGraph(lnrpc.ChannelGraphRequest) returns (lnrpc.ChannelGraph); + */ + describeGraph(input: ChannelGraphRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[40], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `getnodemetrics` + * GetNodeMetrics returns node metrics calculated from the graph. Currently + * the only supported metric is betweenness centrality of individual nodes. + * + * @generated from protobuf rpc: GetNodeMetrics(lnrpc.NodeMetricsRequest) returns (lnrpc.NodeMetricsResponse); + */ + getNodeMetrics(input: NodeMetricsRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[41], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `getchaninfo` + * GetChanInfo returns the latest authenticated network announcement for the + * given channel identified by its channel ID: an 8-byte integer which + * uniquely identifies the location of transaction's funding output within the + * blockchain. + * + * @generated from protobuf rpc: GetChanInfo(lnrpc.ChanInfoRequest) returns (lnrpc.ChannelEdge); + */ + getChanInfo(input: ChanInfoRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[42], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `getnodeinfo` + * GetNodeInfo returns the latest advertised, aggregated, and authenticated + * channel information for the specified node identified by its public key. + * + * @generated from protobuf rpc: GetNodeInfo(lnrpc.NodeInfoRequest) returns (lnrpc.NodeInfo); + */ + getNodeInfo(input: NodeInfoRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[43], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `queryroutes` + * QueryRoutes attempts to query the daemon's Channel Router for a possible + * route to a target destination capable of carrying a specific amount of + * satoshis. The returned route contains the full details required to craft and + * send an HTLC, also including the necessary information that should be + * present within the Sphinx packet encapsulated within the HTLC. + * + * When using REST, the `dest_custom_records` map type can be set by appending + * `&dest_custom_records[]=` + * to the URL. Unfortunately this map type doesn't appear in the REST API + * documentation because of a bug in the grpc-gateway library. + * + * @generated from protobuf rpc: QueryRoutes(lnrpc.QueryRoutesRequest) returns (lnrpc.QueryRoutesResponse); + */ + queryRoutes(input: QueryRoutesRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[44], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `getnetworkinfo` + * GetNetworkInfo returns some basic stats about the known channel graph from + * the point of view of the node. + * + * @generated from protobuf rpc: GetNetworkInfo(lnrpc.NetworkInfoRequest) returns (lnrpc.NetworkInfo); + */ + getNetworkInfo(input: NetworkInfoRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[45], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `stop` + * StopDaemon will send a shutdown request to the interrupt handler, triggering + * a graceful shutdown of the daemon. + * + * @generated from protobuf rpc: StopDaemon(lnrpc.StopRequest) returns (lnrpc.StopResponse); + */ + stopDaemon(input: StopRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[46], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * SubscribeChannelGraph launches a streaming RPC that allows the caller to + * receive notifications upon any changes to the channel graph topology from + * the point of view of the responding node. Events notified include: new + * nodes coming online, nodes updating their authenticated attributes, new + * channels being advertised, updates in the routing policy for a directional + * channel edge, and when channels are closed on-chain. + * + * @generated from protobuf rpc: SubscribeChannelGraph(lnrpc.GraphTopologySubscription) returns (stream lnrpc.GraphTopologyUpdate); + */ + subscribeChannelGraph(input: GraphTopologySubscription, options?: RpcOptions): ServerStreamingCall { + const method = this.methods[47], opt = this._transport.mergeOptions(options); + return stackIntercept("serverStreaming", this._transport, method, opt, input); + } + /** + * lncli: `debuglevel` + * DebugLevel allows a caller to programmatically set the logging verbosity of + * lnd. The logging can be targeted according to a coarse daemon-wide logging + * level, or in a granular fashion to specify the logging for a target + * sub-system. + * + * @generated from protobuf rpc: DebugLevel(lnrpc.DebugLevelRequest) returns (lnrpc.DebugLevelResponse); + */ + debugLevel(input: DebugLevelRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[48], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `feereport` + * FeeReport allows the caller to obtain a report detailing the current fee + * schedule enforced by the node globally for each channel. + * + * @generated from protobuf rpc: FeeReport(lnrpc.FeeReportRequest) returns (lnrpc.FeeReportResponse); + */ + feeReport(input: FeeReportRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[49], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `updatechanpolicy` + * UpdateChannelPolicy allows the caller to update the fee schedule and + * channel policies for all channels globally, or a particular channel. + * + * @generated from protobuf rpc: UpdateChannelPolicy(lnrpc.PolicyUpdateRequest) returns (lnrpc.PolicyUpdateResponse); + */ + updateChannelPolicy(input: PolicyUpdateRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[50], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `fwdinghistory` + * ForwardingHistory allows the caller to query the htlcswitch for a record of + * all HTLCs forwarded within the target time range, and integer offset + * within that time range, for a maximum number of events. If no maximum number + * of events is specified, up to 100 events will be returned. If no time-range + * is specified, then events will be returned in the order that they occured. + * + * A list of forwarding events are returned. The size of each forwarding event + * is 40 bytes, and the max message size able to be returned in gRPC is 4 MiB. + * As a result each message can only contain 50k entries. Each response has + * the index offset of the last entry. The index offset can be provided to the + * request to allow the caller to skip a series of records. + * + * @generated from protobuf rpc: ForwardingHistory(lnrpc.ForwardingHistoryRequest) returns (lnrpc.ForwardingHistoryResponse); + */ + forwardingHistory(input: ForwardingHistoryRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[51], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `exportchanbackup` + * ExportChannelBackup attempts to return an encrypted static channel backup + * for the target channel identified by it channel point. The backup is + * encrypted with a key generated from the aezeed seed of the user. The + * returned backup can either be restored using the RestoreChannelBackup + * method once lnd is running, or via the InitWallet and UnlockWallet methods + * from the WalletUnlocker service. + * + * @generated from protobuf rpc: ExportChannelBackup(lnrpc.ExportChannelBackupRequest) returns (lnrpc.ChannelBackup); + */ + exportChannelBackup(input: ExportChannelBackupRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[52], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * ExportAllChannelBackups returns static channel backups for all existing + * channels known to lnd. A set of regular singular static channel backups for + * each channel are returned. Additionally, a multi-channel backup is returned + * as well, which contains a single encrypted blob containing the backups of + * each channel. + * + * @generated from protobuf rpc: ExportAllChannelBackups(lnrpc.ChanBackupExportRequest) returns (lnrpc.ChanBackupSnapshot); + */ + exportAllChannelBackups(input: ChanBackupExportRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[53], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * VerifyChanBackup allows a caller to verify the integrity of a channel backup + * snapshot. This method will accept either a packed Single or a packed Multi. + * Specifying both will result in an error. + * + * @generated from protobuf rpc: VerifyChanBackup(lnrpc.ChanBackupSnapshot) returns (lnrpc.VerifyChanBackupResponse); + */ + verifyChanBackup(input: ChanBackupSnapshot, options?: RpcOptions): UnaryCall { + const method = this.methods[54], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `restorechanbackup` + * RestoreChannelBackups accepts a set of singular channel backups, or a + * single encrypted multi-chan backup and attempts to recover any funds + * remaining within the channel. If we are able to unpack the backup, then the + * new channel will be shown under listchannels, as well as pending channels. + * + * @generated from protobuf rpc: RestoreChannelBackups(lnrpc.RestoreChanBackupRequest) returns (lnrpc.RestoreBackupResponse); + */ + restoreChannelBackups(input: RestoreChanBackupRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[55], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * SubscribeChannelBackups allows a client to sub-subscribe to the most up to + * date information concerning the state of all channel backups. Each time a + * new channel is added, we return the new set of channels, along with a + * multi-chan backup containing the backup info for all channels. Each time a + * channel is closed, we send a new update, which contains new new chan back + * ups, but the updated set of encrypted multi-chan backups with the closed + * channel(s) removed. + * + * @generated from protobuf rpc: SubscribeChannelBackups(lnrpc.ChannelBackupSubscription) returns (stream lnrpc.ChanBackupSnapshot); + */ + subscribeChannelBackups(input: ChannelBackupSubscription, options?: RpcOptions): ServerStreamingCall { + const method = this.methods[56], opt = this._transport.mergeOptions(options); + return stackIntercept("serverStreaming", this._transport, method, opt, input); + } + /** + * lncli: `bakemacaroon` + * BakeMacaroon allows the creation of a new macaroon with custom read and + * write permissions. No first-party caveats are added since this can be done + * offline. + * + * @generated from protobuf rpc: BakeMacaroon(lnrpc.BakeMacaroonRequest) returns (lnrpc.BakeMacaroonResponse); + */ + bakeMacaroon(input: BakeMacaroonRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[57], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `listmacaroonids` + * ListMacaroonIDs returns all root key IDs that are in use. + * + * @generated from protobuf rpc: ListMacaroonIDs(lnrpc.ListMacaroonIDsRequest) returns (lnrpc.ListMacaroonIDsResponse); + */ + listMacaroonIDs(input: ListMacaroonIDsRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[58], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `deletemacaroonid` + * DeleteMacaroonID deletes the specified macaroon ID and invalidates all + * macaroons derived from that ID. + * + * @generated from protobuf rpc: DeleteMacaroonID(lnrpc.DeleteMacaroonIDRequest) returns (lnrpc.DeleteMacaroonIDResponse); + */ + deleteMacaroonID(input: DeleteMacaroonIDRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[59], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `listpermissions` + * ListPermissions lists all RPC method URIs and their required macaroon + * permissions to access them. + * + * @generated from protobuf rpc: ListPermissions(lnrpc.ListPermissionsRequest) returns (lnrpc.ListPermissionsResponse); + */ + listPermissions(input: ListPermissionsRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[60], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * CheckMacaroonPermissions checks whether a request follows the constraints + * imposed on the macaroon and that the macaroon is authorized to follow the + * provided permissions. + * + * @generated from protobuf rpc: CheckMacaroonPermissions(lnrpc.CheckMacPermRequest) returns (lnrpc.CheckMacPermResponse); + */ + checkMacaroonPermissions(input: CheckMacPermRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[61], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * RegisterRPCMiddleware adds a new gRPC middleware to the interceptor chain. A + * gRPC middleware is software component external to lnd that aims to add + * additional business logic to lnd by observing/intercepting/validating + * incoming gRPC client requests and (if needed) replacing/overwriting outgoing + * messages before they're sent to the client. When registering the middleware + * must identify itself and indicate what custom macaroon caveats it wants to + * be responsible for. Only requests that contain a macaroon with that specific + * custom caveat are then sent to the middleware for inspection. The other + * option is to register for the read-only mode in which all requests/responses + * are forwarded for interception to the middleware but the middleware is not + * allowed to modify any responses. As a security measure, _no_ middleware can + * modify responses for requests made with _unencumbered_ macaroons! + * + * @generated from protobuf rpc: RegisterRPCMiddleware(stream lnrpc.RPCMiddlewareResponse) returns (stream lnrpc.RPCMiddlewareRequest); + */ + registerRPCMiddleware(options?: RpcOptions): DuplexStreamingCall { + const method = this.methods[62], opt = this._transport.mergeOptions(options); + return stackIntercept("duplex", this._transport, method, opt); + } + /** + * lncli: `sendcustom` + * SendCustomMessage sends a custom peer message. + * + * @generated from protobuf rpc: SendCustomMessage(lnrpc.SendCustomMessageRequest) returns (lnrpc.SendCustomMessageResponse); + */ + sendCustomMessage(input: SendCustomMessageRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[63], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * lncli: `subscribecustom` + * SubscribeCustomMessages subscribes to a stream of incoming custom peer + * messages. + * + * @generated from protobuf rpc: SubscribeCustomMessages(lnrpc.SubscribeCustomMessagesRequest) returns (stream lnrpc.CustomMessage); + */ + subscribeCustomMessages(input: SubscribeCustomMessagesRequest, options?: RpcOptions): ServerStreamingCall { + const method = this.methods[64], opt = this._transport.mergeOptions(options); + return stackIntercept("serverStreaming", this._transport, method, opt, input); + } + /** + * lncli: `listaliases` + * ListAliases returns the set of all aliases that have ever existed with + * their confirmed SCID (if it exists) and/or the base SCID (in the case of + * zero conf). + * + * @generated from protobuf rpc: ListAliases(lnrpc.ListAliasesRequest) returns (lnrpc.ListAliasesResponse); + */ + listAliases(input: ListAliasesRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[65], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * @generated from protobuf rpc: LookupHtlc(lnrpc.LookupHtlcRequest) returns (lnrpc.LookupHtlcResponse); + */ + lookupHtlc(input: LookupHtlcRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[66], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } +} diff --git a/proto/lnd/lightning.ts b/proto/lnd/lightning.ts new file mode 100644 index 00000000..f8a8587a --- /dev/null +++ b/proto/lnd/lightning.ts @@ -0,0 +1,20995 @@ +// @generated by protobuf-ts 2.5.0 +// @generated from protobuf file "lightning.proto" (package "lnrpc", syntax proto3) +// tslint:disable +import { ServiceType } from "@protobuf-ts/runtime-rpc"; +import type { BinaryWriteOptions } from "@protobuf-ts/runtime"; +import type { IBinaryWriter } from "@protobuf-ts/runtime"; +import { WireType } from "@protobuf-ts/runtime"; +import type { BinaryReadOptions } from "@protobuf-ts/runtime"; +import type { IBinaryReader } from "@protobuf-ts/runtime"; +import { UnknownFieldHandler } from "@protobuf-ts/runtime"; +import type { PartialMessage } from "@protobuf-ts/runtime"; +import { reflectionMergePartial } from "@protobuf-ts/runtime"; +import { MESSAGE_TYPE } from "@protobuf-ts/runtime"; +import { MessageType } from "@protobuf-ts/runtime"; +/** + * @generated from protobuf message lnrpc.LookupHtlcRequest + */ +export interface LookupHtlcRequest { + /** + * @generated from protobuf field: uint64 chan_id = 1; + */ + chanId: bigint; + /** + * @generated from protobuf field: uint64 htlc_index = 2; + */ + htlcIndex: bigint; +} +/** + * @generated from protobuf message lnrpc.LookupHtlcResponse + */ +export interface LookupHtlcResponse { + /** + * @generated from protobuf field: bool settled = 1; + */ + settled: boolean; + /** + * @generated from protobuf field: bool offchain = 2; + */ + offchain: boolean; +} +/** + * @generated from protobuf message lnrpc.SubscribeCustomMessagesRequest + */ +export interface SubscribeCustomMessagesRequest { +} +/** + * @generated from protobuf message lnrpc.CustomMessage + */ +export interface CustomMessage { + /** + * Peer from which the message originates + * + * @generated from protobuf field: bytes peer = 1; + */ + peer: Uint8Array; + /** + * Message type. This value will be in the custom range (>= 32768). + * + * @generated from protobuf field: uint32 type = 2; + */ + type: number; + /** + * Raw message data + * + * @generated from protobuf field: bytes data = 3; + */ + data: Uint8Array; +} +/** + * @generated from protobuf message lnrpc.SendCustomMessageRequest + */ +export interface SendCustomMessageRequest { + /** + * Peer to send the message to + * + * @generated from protobuf field: bytes peer = 1; + */ + peer: Uint8Array; + /** + * Message type. This value needs to be in the custom range (>= 32768). + * + * @generated from protobuf field: uint32 type = 2; + */ + type: number; + /** + * Raw message data. + * + * @generated from protobuf field: bytes data = 3; + */ + data: Uint8Array; +} +/** + * @generated from protobuf message lnrpc.SendCustomMessageResponse + */ +export interface SendCustomMessageResponse { +} +/** + * @generated from protobuf message lnrpc.Utxo + */ +export interface Utxo { + /** + * The type of address + * + * @generated from protobuf field: lnrpc.AddressType address_type = 1; + */ + addressType: AddressType; + /** + * The address + * + * @generated from protobuf field: string address = 2; + */ + address: string; + /** + * The value of the unspent coin in satoshis + * + * @generated from protobuf field: int64 amount_sat = 3; + */ + amountSat: bigint; + /** + * The pkscript in hex + * + * @generated from protobuf field: string pk_script = 4; + */ + pkScript: string; + /** + * The outpoint in format txid:n + * + * @generated from protobuf field: lnrpc.OutPoint outpoint = 5; + */ + outpoint?: OutPoint; + /** + * The number of confirmations for the Utxo + * + * @generated from protobuf field: int64 confirmations = 6; + */ + confirmations: bigint; +} +/** + * @generated from protobuf message lnrpc.OutputDetail + */ +export interface OutputDetail { + /** + * The type of the output + * + * @generated from protobuf field: lnrpc.OutputScriptType output_type = 1; + */ + outputType: OutputScriptType; + /** + * The address + * + * @generated from protobuf field: string address = 2; + */ + address: string; + /** + * The pkscript in hex + * + * @generated from protobuf field: string pk_script = 3; + */ + pkScript: string; + /** + * The output index used in the raw transaction + * + * @generated from protobuf field: int64 output_index = 4; + */ + outputIndex: bigint; + /** + * The value of the output coin in satoshis + * + * @generated from protobuf field: int64 amount = 5; + */ + amount: bigint; + /** + * Denotes if the output is controlled by the internal wallet + * + * @generated from protobuf field: bool is_our_address = 6; + */ + isOurAddress: boolean; +} +/** + * @generated from protobuf message lnrpc.Transaction + */ +export interface Transaction { + /** + * The transaction hash + * + * @generated from protobuf field: string tx_hash = 1; + */ + txHash: string; + /** + * The transaction amount, denominated in satoshis + * + * @generated from protobuf field: int64 amount = 2; + */ + amount: bigint; + /** + * The number of confirmations + * + * @generated from protobuf field: int32 num_confirmations = 3; + */ + numConfirmations: number; + /** + * The hash of the block this transaction was included in + * + * @generated from protobuf field: string block_hash = 4; + */ + blockHash: string; + /** + * The height of the block this transaction was included in + * + * @generated from protobuf field: int32 block_height = 5; + */ + blockHeight: number; + /** + * Timestamp of this transaction + * + * @generated from protobuf field: int64 time_stamp = 6; + */ + timeStamp: bigint; + /** + * Fees paid for this transaction + * + * @generated from protobuf field: int64 total_fees = 7; + */ + totalFees: bigint; + /** + * Addresses that received funds for this transaction. Deprecated as it is + * now incorporated in the output_details field. + * + * @deprecated + * @generated from protobuf field: repeated string dest_addresses = 8 [deprecated = true]; + */ + destAddresses: string[]; + /** + * Outputs that received funds for this transaction + * + * @generated from protobuf field: repeated lnrpc.OutputDetail output_details = 11; + */ + outputDetails: OutputDetail[]; + /** + * The raw transaction hex. + * + * @generated from protobuf field: string raw_tx_hex = 9; + */ + rawTxHex: string; + /** + * A label that was optionally set on transaction broadcast. + * + * @generated from protobuf field: string label = 10; + */ + label: string; + /** + * PreviousOutpoints/Inputs of this transaction. + * + * @generated from protobuf field: repeated lnrpc.PreviousOutPoint previous_outpoints = 12; + */ + previousOutpoints: PreviousOutPoint[]; +} +/** + * @generated from protobuf message lnrpc.GetTransactionsRequest + */ +export interface GetTransactionsRequest { + /** + * + * The height from which to list transactions, inclusive. If this value is + * greater than end_height, transactions will be read in reverse. + * + * @generated from protobuf field: int32 start_height = 1; + */ + startHeight: number; + /** + * + * The height until which to list transactions, inclusive. To include + * unconfirmed transactions, this value should be set to -1, which will + * return transactions from start_height until the current chain tip and + * unconfirmed transactions. If no end_height is provided, the call will + * default to this option. + * + * @generated from protobuf field: int32 end_height = 2; + */ + endHeight: number; + /** + * An optional filter to only include transactions relevant to an account. + * + * @generated from protobuf field: string account = 3; + */ + account: string; +} +/** + * @generated from protobuf message lnrpc.TransactionDetails + */ +export interface TransactionDetails { + /** + * The list of transactions relevant to the wallet. + * + * @generated from protobuf field: repeated lnrpc.Transaction transactions = 1; + */ + transactions: Transaction[]; +} +/** + * @generated from protobuf message lnrpc.FeeLimit + */ +export interface FeeLimit { + /** + * @generated from protobuf oneof: limit + */ + limit: { + oneofKind: "fixed"; + /** + * + * The fee limit expressed as a fixed amount of satoshis. + * + * The fields fixed and fixed_msat are mutually exclusive. + * + * @generated from protobuf field: int64 fixed = 1; + */ + fixed: bigint; + } | { + oneofKind: "fixedMsat"; + /** + * + * The fee limit expressed as a fixed amount of millisatoshis. + * + * The fields fixed and fixed_msat are mutually exclusive. + * + * @generated from protobuf field: int64 fixed_msat = 3; + */ + fixedMsat: bigint; + } | { + oneofKind: "percent"; + /** + * The fee limit expressed as a percentage of the payment amount. + * + * @generated from protobuf field: int64 percent = 2; + */ + percent: bigint; + } | { + oneofKind: undefined; + }; +} +/** + * @generated from protobuf message lnrpc.SendRequest + */ +export interface SendRequest { + /** + * + * The identity pubkey of the payment recipient. When using REST, this field + * must be encoded as base64. + * + * @generated from protobuf field: bytes dest = 1; + */ + dest: Uint8Array; + /** + * + * The hex-encoded identity pubkey of the payment recipient. Deprecated now + * that the REST gateway supports base64 encoding of bytes fields. + * + * @deprecated + * @generated from protobuf field: string dest_string = 2 [deprecated = true]; + */ + destString: string; + /** + * + * The amount to send expressed in satoshis. + * + * The fields amt and amt_msat are mutually exclusive. + * + * @generated from protobuf field: int64 amt = 3; + */ + amt: bigint; + /** + * + * The amount to send expressed in millisatoshis. + * + * The fields amt and amt_msat are mutually exclusive. + * + * @generated from protobuf field: int64 amt_msat = 12; + */ + amtMsat: bigint; + /** + * + * The hash to use within the payment's HTLC. When using REST, this field + * must be encoded as base64. + * + * @generated from protobuf field: bytes payment_hash = 4; + */ + paymentHash: Uint8Array; + /** + * + * The hex-encoded hash to use within the payment's HTLC. Deprecated now + * that the REST gateway supports base64 encoding of bytes fields. + * + * @deprecated + * @generated from protobuf field: string payment_hash_string = 5 [deprecated = true]; + */ + paymentHashString: string; + /** + * + * A bare-bones invoice for a payment within the Lightning Network. With the + * details of the invoice, the sender has all the data necessary to send a + * payment to the recipient. + * + * @generated from protobuf field: string payment_request = 6; + */ + paymentRequest: string; + /** + * + * The CLTV delta from the current height that should be used to set the + * timelock for the final hop. + * + * @generated from protobuf field: int32 final_cltv_delta = 7; + */ + finalCltvDelta: number; + /** + * + * The maximum number of satoshis that will be paid as a fee of the payment. + * This value can be represented either as a percentage of the amount being + * sent, or as a fixed amount of the maximum fee the user is willing the pay to + * send the payment. If not specified, lnd will use a default value of 100% + * fees for small amounts (<=1k sat) or 5% fees for larger amounts. + * + * @generated from protobuf field: lnrpc.FeeLimit fee_limit = 8; + */ + feeLimit?: FeeLimit; + /** + * + * The channel id of the channel that must be taken to the first hop. If zero, + * any channel may be used. + * + * @generated from protobuf field: uint64 outgoing_chan_id = 9 [jstype = JS_STRING]; + */ + outgoingChanId: string; + /** + * + * The pubkey of the last hop of the route. If empty, any hop may be used. + * + * @generated from protobuf field: bytes last_hop_pubkey = 13; + */ + lastHopPubkey: Uint8Array; + /** + * + * An optional maximum total time lock for the route. This should not exceed + * lnd's `--max-cltv-expiry` setting. If zero, then the value of + * `--max-cltv-expiry` is enforced. + * + * @generated from protobuf field: uint32 cltv_limit = 10; + */ + cltvLimit: number; + /** + * + * An optional field that can be used to pass an arbitrary set of TLV records + * to a peer which understands the new records. This can be used to pass + * application specific data during the payment attempt. Record types are + * required to be in the custom range >= 65536. When using REST, the values + * must be encoded as base64. + * + * @generated from protobuf field: map dest_custom_records = 11; + */ + destCustomRecords: { + [key: string]: Uint8Array; + }; + /** + * If set, circular payments to self are permitted. + * + * @generated from protobuf field: bool allow_self_payment = 14; + */ + allowSelfPayment: boolean; + /** + * + * Features assumed to be supported by the final node. All transitive feature + * dependencies must also be set properly. For a given feature bit pair, either + * optional or remote may be set, but not both. If this field is nil or empty, + * the router will try to load destination features from the graph as a + * fallback. + * + * @generated from protobuf field: repeated lnrpc.FeatureBit dest_features = 15; + */ + destFeatures: FeatureBit[]; + /** + * + * The payment address of the generated invoice. + * + * @generated from protobuf field: bytes payment_addr = 16; + */ + paymentAddr: Uint8Array; +} +/** + * @generated from protobuf message lnrpc.SendResponse + */ +export interface SendResponse { + /** + * @generated from protobuf field: string payment_error = 1; + */ + paymentError: string; + /** + * @generated from protobuf field: bytes payment_preimage = 2; + */ + paymentPreimage: Uint8Array; + /** + * @generated from protobuf field: lnrpc.Route payment_route = 3; + */ + paymentRoute?: Route; + /** + * @generated from protobuf field: bytes payment_hash = 4; + */ + paymentHash: Uint8Array; +} +/** + * @generated from protobuf message lnrpc.SendToRouteRequest + */ +export interface SendToRouteRequest { + /** + * + * The payment hash to use for the HTLC. When using REST, this field must be + * encoded as base64. + * + * @generated from protobuf field: bytes payment_hash = 1; + */ + paymentHash: Uint8Array; + /** + * + * An optional hex-encoded payment hash to be used for the HTLC. Deprecated now + * that the REST gateway supports base64 encoding of bytes fields. + * + * @deprecated + * @generated from protobuf field: string payment_hash_string = 2 [deprecated = true]; + */ + paymentHashString: string; + /** + * Route that should be used to attempt to complete the payment. + * + * @generated from protobuf field: lnrpc.Route route = 4; + */ + route?: Route; +} +/** + * @generated from protobuf message lnrpc.ChannelAcceptRequest + */ +export interface ChannelAcceptRequest { + /** + * The pubkey of the node that wishes to open an inbound channel. + * + * @generated from protobuf field: bytes node_pubkey = 1; + */ + nodePubkey: Uint8Array; + /** + * The hash of the genesis block that the proposed channel resides in. + * + * @generated from protobuf field: bytes chain_hash = 2; + */ + chainHash: Uint8Array; + /** + * The pending channel id. + * + * @generated from protobuf field: bytes pending_chan_id = 3; + */ + pendingChanId: Uint8Array; + /** + * The funding amount in satoshis that initiator wishes to use in the + * channel. + * + * @generated from protobuf field: uint64 funding_amt = 4; + */ + fundingAmt: bigint; + /** + * The push amount of the proposed channel in millisatoshis. + * + * @generated from protobuf field: uint64 push_amt = 5; + */ + pushAmt: bigint; + /** + * The dust limit of the initiator's commitment tx. + * + * @generated from protobuf field: uint64 dust_limit = 6; + */ + dustLimit: bigint; + /** + * The maximum amount of coins in millisatoshis that can be pending in this + * channel. + * + * @generated from protobuf field: uint64 max_value_in_flight = 7; + */ + maxValueInFlight: bigint; + /** + * The minimum amount of satoshis the initiator requires us to have at all + * times. + * + * @generated from protobuf field: uint64 channel_reserve = 8; + */ + channelReserve: bigint; + /** + * The smallest HTLC in millisatoshis that the initiator will accept. + * + * @generated from protobuf field: uint64 min_htlc = 9; + */ + minHtlc: bigint; + /** + * The initial fee rate that the initiator suggests for both commitment + * transactions. + * + * @generated from protobuf field: uint64 fee_per_kw = 10; + */ + feePerKw: bigint; + /** + * + * The number of blocks to use for the relative time lock in the pay-to-self + * output of both commitment transactions. + * + * @generated from protobuf field: uint32 csv_delay = 11; + */ + csvDelay: number; + /** + * The total number of incoming HTLC's that the initiator will accept. + * + * @generated from protobuf field: uint32 max_accepted_htlcs = 12; + */ + maxAcceptedHtlcs: number; + /** + * A bit-field which the initiator uses to specify proposed channel + * behavior. + * + * @generated from protobuf field: uint32 channel_flags = 13; + */ + channelFlags: number; + /** + * The commitment type the initiator wishes to use for the proposed channel. + * + * @generated from protobuf field: lnrpc.CommitmentType commitment_type = 14; + */ + commitmentType: CommitmentType; + /** + * Whether the initiator wants to open a zero-conf channel via the channel + * type. + * + * @generated from protobuf field: bool wants_zero_conf = 15; + */ + wantsZeroConf: boolean; + /** + * Whether the initiator wants to use the scid-alias channel type. This is + * separate from the feature bit. + * + * @generated from protobuf field: bool wants_scid_alias = 16; + */ + wantsScidAlias: boolean; +} +/** + * @generated from protobuf message lnrpc.ChannelAcceptResponse + */ +export interface ChannelAcceptResponse { + /** + * Whether or not the client accepts the channel. + * + * @generated from protobuf field: bool accept = 1; + */ + accept: boolean; + /** + * The pending channel id to which this response applies. + * + * @generated from protobuf field: bytes pending_chan_id = 2; + */ + pendingChanId: Uint8Array; + /** + * + * An optional error to send the initiating party to indicate why the channel + * was rejected. This field *should not* contain sensitive information, it will + * be sent to the initiating party. This field should only be set if accept is + * false, the channel will be rejected if an error is set with accept=true + * because the meaning of this response is ambiguous. Limited to 500 + * characters. + * + * @generated from protobuf field: string error = 3; + */ + error: string; + /** + * + * The upfront shutdown address to use if the initiating peer supports option + * upfront shutdown script (see ListPeers for the features supported). Note + * that the channel open will fail if this value is set for a peer that does + * not support this feature bit. + * + * @generated from protobuf field: string upfront_shutdown = 4; + */ + upfrontShutdown: string; + /** + * + * The csv delay (in blocks) that we require for the remote party. + * + * @generated from protobuf field: uint32 csv_delay = 5; + */ + csvDelay: number; + /** + * + * The reserve amount in satoshis that we require the remote peer to adhere to. + * We require that the remote peer always have some reserve amount allocated to + * them so that there is always a disincentive to broadcast old state (if they + * hold 0 sats on their side of the channel, there is nothing to lose). + * + * @generated from protobuf field: uint64 reserve_sat = 6; + */ + reserveSat: bigint; + /** + * + * The maximum amount of funds in millisatoshis that we allow the remote peer + * to have in outstanding htlcs. + * + * @generated from protobuf field: uint64 in_flight_max_msat = 7; + */ + inFlightMaxMsat: bigint; + /** + * + * The maximum number of htlcs that the remote peer can offer us. + * + * @generated from protobuf field: uint32 max_htlc_count = 8; + */ + maxHtlcCount: number; + /** + * + * The minimum value in millisatoshis for incoming htlcs on the channel. + * + * @generated from protobuf field: uint64 min_htlc_in = 9; + */ + minHtlcIn: bigint; + /** + * + * The number of confirmations we require before we consider the channel open. + * + * @generated from protobuf field: uint32 min_accept_depth = 10; + */ + minAcceptDepth: number; + /** + * + * Whether the responder wants this to be a zero-conf channel. This will fail + * if either side does not have the scid-alias feature bit set. The minimum + * depth field must be zero if this is true. + * + * @generated from protobuf field: bool zero_conf = 11; + */ + zeroConf: boolean; +} +/** + * @generated from protobuf message lnrpc.ChannelPoint + */ +export interface ChannelPoint { + /** + * @generated from protobuf oneof: funding_txid + */ + fundingTxid: { + oneofKind: "fundingTxidBytes"; + /** + * + * Txid of the funding transaction. When using REST, this field must be + * encoded as base64. + * + * @generated from protobuf field: bytes funding_txid_bytes = 1; + */ + fundingTxidBytes: Uint8Array; + } | { + oneofKind: "fundingTxidStr"; + /** + * + * Hex-encoded string representing the byte-reversed hash of the funding + * transaction. + * + * @generated from protobuf field: string funding_txid_str = 2; + */ + fundingTxidStr: string; + } | { + oneofKind: undefined; + }; + /** + * The index of the output of the funding transaction + * + * @generated from protobuf field: uint32 output_index = 3; + */ + outputIndex: number; +} +/** + * @generated from protobuf message lnrpc.OutPoint + */ +export interface OutPoint { + /** + * Raw bytes representing the transaction id. + * + * @generated from protobuf field: bytes txid_bytes = 1; + */ + txidBytes: Uint8Array; + /** + * Reversed, hex-encoded string representing the transaction id. + * + * @generated from protobuf field: string txid_str = 2; + */ + txidStr: string; + /** + * The index of the output on the transaction. + * + * @generated from protobuf field: uint32 output_index = 3; + */ + outputIndex: number; +} +/** + * @generated from protobuf message lnrpc.PreviousOutPoint + */ +export interface PreviousOutPoint { + /** + * The outpoint in format txid:n. + * + * @generated from protobuf field: string outpoint = 1; + */ + outpoint: string; + /** + * Denotes if the outpoint is controlled by the internal wallet. + * The flag will only detect p2wkh, np2wkh and p2tr inputs as its own. + * + * @generated from protobuf field: bool is_our_output = 2; + */ + isOurOutput: boolean; +} +/** + * @generated from protobuf message lnrpc.LightningAddress + */ +export interface LightningAddress { + /** + * The identity pubkey of the Lightning node. + * + * @generated from protobuf field: string pubkey = 1; + */ + pubkey: string; + /** + * The network location of the lightning node, e.g. `69.69.69.69:1337` or + * `localhost:10011`. + * + * @generated from protobuf field: string host = 2; + */ + host: string; +} +/** + * @generated from protobuf message lnrpc.EstimateFeeRequest + */ +export interface EstimateFeeRequest { + /** + * The map from addresses to amounts for the transaction. + * + * @generated from protobuf field: map AddrToAmount = 1 [json_name = "AddrToAmount"]; + */ + addrToAmount: { + [key: string]: bigint; + }; + /** + * The target number of blocks that this transaction should be confirmed + * by. + * + * @generated from protobuf field: int32 target_conf = 2; + */ + targetConf: number; + /** + * The minimum number of confirmations each one of your outputs used for + * the transaction must satisfy. + * + * @generated from protobuf field: int32 min_confs = 3; + */ + minConfs: number; + /** + * Whether unconfirmed outputs should be used as inputs for the transaction. + * + * @generated from protobuf field: bool spend_unconfirmed = 4; + */ + spendUnconfirmed: boolean; +} +/** + * @generated from protobuf message lnrpc.EstimateFeeResponse + */ +export interface EstimateFeeResponse { + /** + * The total fee in satoshis. + * + * @generated from protobuf field: int64 fee_sat = 1; + */ + feeSat: bigint; + /** + * Deprecated, use sat_per_vbyte. + * The fee rate in satoshi/vbyte. + * + * @deprecated + * @generated from protobuf field: int64 feerate_sat_per_byte = 2 [deprecated = true]; + */ + feerateSatPerByte: bigint; + /** + * The fee rate in satoshi/vbyte. + * + * @generated from protobuf field: uint64 sat_per_vbyte = 3; + */ + satPerVbyte: bigint; +} +/** + * @generated from protobuf message lnrpc.SendManyRequest + */ +export interface SendManyRequest { + /** + * The map from addresses to amounts + * + * @generated from protobuf field: map AddrToAmount = 1 [json_name = "AddrToAmount"]; + */ + addrToAmount: { + [key: string]: bigint; + }; + /** + * The target number of blocks that this transaction should be confirmed + * by. + * + * @generated from protobuf field: int32 target_conf = 3; + */ + targetConf: number; + /** + * A manual fee rate set in sat/vbyte that should be used when crafting the + * transaction. + * + * @generated from protobuf field: uint64 sat_per_vbyte = 4; + */ + satPerVbyte: bigint; + /** + * Deprecated, use sat_per_vbyte. + * A manual fee rate set in sat/vbyte that should be used when crafting the + * transaction. + * + * @deprecated + * @generated from protobuf field: int64 sat_per_byte = 5 [deprecated = true]; + */ + satPerByte: bigint; + /** + * An optional label for the transaction, limited to 500 characters. + * + * @generated from protobuf field: string label = 6; + */ + label: string; + /** + * The minimum number of confirmations each one of your outputs used for + * the transaction must satisfy. + * + * @generated from protobuf field: int32 min_confs = 7; + */ + minConfs: number; + /** + * Whether unconfirmed outputs should be used as inputs for the transaction. + * + * @generated from protobuf field: bool spend_unconfirmed = 8; + */ + spendUnconfirmed: boolean; +} +/** + * @generated from protobuf message lnrpc.SendManyResponse + */ +export interface SendManyResponse { + /** + * The id of the transaction + * + * @generated from protobuf field: string txid = 1; + */ + txid: string; +} +/** + * @generated from protobuf message lnrpc.SendCoinsRequest + */ +export interface SendCoinsRequest { + /** + * The address to send coins to + * + * @generated from protobuf field: string addr = 1; + */ + addr: string; + /** + * The amount in satoshis to send + * + * @generated from protobuf field: int64 amount = 2; + */ + amount: bigint; + /** + * The target number of blocks that this transaction should be confirmed + * by. + * + * @generated from protobuf field: int32 target_conf = 3; + */ + targetConf: number; + /** + * A manual fee rate set in sat/vbyte that should be used when crafting the + * transaction. + * + * @generated from protobuf field: uint64 sat_per_vbyte = 4; + */ + satPerVbyte: bigint; + /** + * Deprecated, use sat_per_vbyte. + * A manual fee rate set in sat/vbyte that should be used when crafting the + * transaction. + * + * @deprecated + * @generated from protobuf field: int64 sat_per_byte = 5 [deprecated = true]; + */ + satPerByte: bigint; + /** + * + * If set, then the amount field will be ignored, and lnd will attempt to + * send all the coins under control of the internal wallet to the specified + * address. + * + * @generated from protobuf field: bool send_all = 6; + */ + sendAll: boolean; + /** + * An optional label for the transaction, limited to 500 characters. + * + * @generated from protobuf field: string label = 7; + */ + label: string; + /** + * The minimum number of confirmations each one of your outputs used for + * the transaction must satisfy. + * + * @generated from protobuf field: int32 min_confs = 8; + */ + minConfs: number; + /** + * Whether unconfirmed outputs should be used as inputs for the transaction. + * + * @generated from protobuf field: bool spend_unconfirmed = 9; + */ + spendUnconfirmed: boolean; +} +/** + * @generated from protobuf message lnrpc.SendCoinsResponse + */ +export interface SendCoinsResponse { + /** + * The transaction ID of the transaction + * + * @generated from protobuf field: string txid = 1; + */ + txid: string; +} +/** + * @generated from protobuf message lnrpc.ListUnspentRequest + */ +export interface ListUnspentRequest { + /** + * The minimum number of confirmations to be included. + * + * @generated from protobuf field: int32 min_confs = 1; + */ + minConfs: number; + /** + * The maximum number of confirmations to be included. + * + * @generated from protobuf field: int32 max_confs = 2; + */ + maxConfs: number; + /** + * An optional filter to only include outputs belonging to an account. + * + * @generated from protobuf field: string account = 3; + */ + account: string; +} +/** + * @generated from protobuf message lnrpc.ListUnspentResponse + */ +export interface ListUnspentResponse { + /** + * A list of utxos + * + * @generated from protobuf field: repeated lnrpc.Utxo utxos = 1; + */ + utxos: Utxo[]; +} +/** + * @generated from protobuf message lnrpc.NewAddressRequest + */ +export interface NewAddressRequest { + /** + * The type of address to generate. + * + * @generated from protobuf field: lnrpc.AddressType type = 1; + */ + type: AddressType; + /** + * + * The name of the account to generate a new address for. If empty, the + * default wallet account is used. + * + * @generated from protobuf field: string account = 2; + */ + account: string; +} +/** + * @generated from protobuf message lnrpc.NewAddressResponse + */ +export interface NewAddressResponse { + /** + * The newly generated wallet address + * + * @generated from protobuf field: string address = 1; + */ + address: string; +} +/** + * @generated from protobuf message lnrpc.SignMessageRequest + */ +export interface SignMessageRequest { + /** + * + * The message to be signed. When using REST, this field must be encoded as + * base64. + * + * @generated from protobuf field: bytes msg = 1; + */ + msg: Uint8Array; + /** + * + * Instead of the default double-SHA256 hashing of the message before signing, + * only use one round of hashing instead. + * + * @generated from protobuf field: bool single_hash = 2; + */ + singleHash: boolean; +} +/** + * @generated from protobuf message lnrpc.SignMessageResponse + */ +export interface SignMessageResponse { + /** + * The signature for the given message + * + * @generated from protobuf field: string signature = 1; + */ + signature: string; +} +/** + * @generated from protobuf message lnrpc.VerifyMessageRequest + */ +export interface VerifyMessageRequest { + /** + * + * The message over which the signature is to be verified. When using REST, + * this field must be encoded as base64. + * + * @generated from protobuf field: bytes msg = 1; + */ + msg: Uint8Array; + /** + * The signature to be verified over the given message + * + * @generated from protobuf field: string signature = 2; + */ + signature: string; +} +/** + * @generated from protobuf message lnrpc.VerifyMessageResponse + */ +export interface VerifyMessageResponse { + /** + * Whether the signature was valid over the given message + * + * @generated from protobuf field: bool valid = 1; + */ + valid: boolean; + /** + * The pubkey recovered from the signature + * + * @generated from protobuf field: string pubkey = 2; + */ + pubkey: string; +} +/** + * @generated from protobuf message lnrpc.ConnectPeerRequest + */ +export interface ConnectPeerRequest { + /** + * + * Lightning address of the peer to connect to. + * + * @generated from protobuf field: lnrpc.LightningAddress addr = 1; + */ + addr?: LightningAddress; + /** + * + * If set, the daemon will attempt to persistently connect to the target + * peer. Otherwise, the call will be synchronous. + * + * @generated from protobuf field: bool perm = 2; + */ + perm: boolean; + /** + * + * The connection timeout value (in seconds) for this request. It won't affect + * other requests. + * + * @generated from protobuf field: uint64 timeout = 3; + */ + timeout: bigint; +} +/** + * @generated from protobuf message lnrpc.ConnectPeerResponse + */ +export interface ConnectPeerResponse { +} +/** + * @generated from protobuf message lnrpc.DisconnectPeerRequest + */ +export interface DisconnectPeerRequest { + /** + * The pubkey of the node to disconnect from + * + * @generated from protobuf field: string pub_key = 1; + */ + pubKey: string; +} +/** + * @generated from protobuf message lnrpc.DisconnectPeerResponse + */ +export interface DisconnectPeerResponse { +} +/** + * @generated from protobuf message lnrpc.HTLC + */ +export interface HTLC { + /** + * @generated from protobuf field: bool incoming = 1; + */ + incoming: boolean; + /** + * @generated from protobuf field: int64 amount = 2; + */ + amount: bigint; + /** + * @generated from protobuf field: bytes hash_lock = 3; + */ + hashLock: Uint8Array; + /** + * @generated from protobuf field: uint32 expiration_height = 4; + */ + expirationHeight: number; + /** + * Index identifying the htlc on the channel. + * + * @generated from protobuf field: uint64 htlc_index = 5; + */ + htlcIndex: bigint; + /** + * If this HTLC is involved in a forwarding operation, this field indicates + * the forwarding channel. For an outgoing htlc, it is the incoming channel. + * For an incoming htlc, it is the outgoing channel. When the htlc + * originates from this node or this node is the final destination, + * forwarding_channel will be zero. The forwarding channel will also be zero + * for htlcs that need to be forwarded but don't have a forwarding decision + * persisted yet. + * + * @generated from protobuf field: uint64 forwarding_channel = 6; + */ + forwardingChannel: bigint; + /** + * Index identifying the htlc on the forwarding channel. + * + * @generated from protobuf field: uint64 forwarding_htlc_index = 7; + */ + forwardingHtlcIndex: bigint; +} +/** + * @generated from protobuf message lnrpc.ChannelConstraints + */ +export interface ChannelConstraints { + /** + * + * The CSV delay expressed in relative blocks. If the channel is force closed, + * we will need to wait for this many blocks before we can regain our funds. + * + * @generated from protobuf field: uint32 csv_delay = 1; + */ + csvDelay: number; + /** + * The minimum satoshis this node is required to reserve in its balance. + * + * @generated from protobuf field: uint64 chan_reserve_sat = 2; + */ + chanReserveSat: bigint; + /** + * The dust limit (in satoshis) of the initiator's commitment tx. + * + * @generated from protobuf field: uint64 dust_limit_sat = 3; + */ + dustLimitSat: bigint; + /** + * The maximum amount of coins in millisatoshis that can be pending in this + * channel. + * + * @generated from protobuf field: uint64 max_pending_amt_msat = 4; + */ + maxPendingAmtMsat: bigint; + /** + * The smallest HTLC in millisatoshis that the initiator will accept. + * + * @generated from protobuf field: uint64 min_htlc_msat = 5; + */ + minHtlcMsat: bigint; + /** + * The total number of incoming HTLC's that the initiator will accept. + * + * @generated from protobuf field: uint32 max_accepted_htlcs = 6; + */ + maxAcceptedHtlcs: number; +} +/** + * @generated from protobuf message lnrpc.Channel + */ +export interface Channel { + /** + * Whether this channel is active or not + * + * @generated from protobuf field: bool active = 1; + */ + active: boolean; + /** + * The identity pubkey of the remote node + * + * @generated from protobuf field: string remote_pubkey = 2; + */ + remotePubkey: string; + /** + * + * The outpoint (txid:index) of the funding transaction. With this value, Bob + * will be able to generate a signature for Alice's version of the commitment + * transaction. + * + * @generated from protobuf field: string channel_point = 3; + */ + channelPoint: string; + /** + * + * The unique channel ID for the channel. The first 3 bytes are the block + * height, the next 3 the index within the block, and the last 2 bytes are the + * output index for the channel. + * + * @generated from protobuf field: uint64 chan_id = 4 [jstype = JS_STRING]; + */ + chanId: string; + /** + * The total amount of funds held in this channel + * + * @generated from protobuf field: int64 capacity = 5; + */ + capacity: bigint; + /** + * This node's current balance in this channel + * + * @generated from protobuf field: int64 local_balance = 6; + */ + localBalance: bigint; + /** + * The counterparty's current balance in this channel + * + * @generated from protobuf field: int64 remote_balance = 7; + */ + remoteBalance: bigint; + /** + * + * The amount calculated to be paid in fees for the current set of commitment + * transactions. The fee amount is persisted with the channel in order to + * allow the fee amount to be removed and recalculated with each channel state + * update, including updates that happen after a system restart. + * + * @generated from protobuf field: int64 commit_fee = 8; + */ + commitFee: bigint; + /** + * The weight of the commitment transaction + * + * @generated from protobuf field: int64 commit_weight = 9; + */ + commitWeight: bigint; + /** + * + * The required number of satoshis per kilo-weight that the requester will pay + * at all times, for both the funding transaction and commitment transaction. + * This value can later be updated once the channel is open. + * + * @generated from protobuf field: int64 fee_per_kw = 10; + */ + feePerKw: bigint; + /** + * The unsettled balance in this channel + * + * @generated from protobuf field: int64 unsettled_balance = 11; + */ + unsettledBalance: bigint; + /** + * + * The total number of satoshis we've sent within this channel. + * + * @generated from protobuf field: int64 total_satoshis_sent = 12; + */ + totalSatoshisSent: bigint; + /** + * + * The total number of satoshis we've received within this channel. + * + * @generated from protobuf field: int64 total_satoshis_received = 13; + */ + totalSatoshisReceived: bigint; + /** + * + * The total number of updates conducted within this channel. + * + * @generated from protobuf field: uint64 num_updates = 14; + */ + numUpdates: bigint; + /** + * + * The list of active, uncleared HTLCs currently pending within the channel. + * + * @generated from protobuf field: repeated lnrpc.HTLC pending_htlcs = 15; + */ + pendingHtlcs: HTLC[]; + /** + * + * Deprecated. The CSV delay expressed in relative blocks. If the channel is + * force closed, we will need to wait for this many blocks before we can regain + * our funds. + * + * @deprecated + * @generated from protobuf field: uint32 csv_delay = 16 [deprecated = true]; + */ + csvDelay: number; + /** + * Whether this channel is advertised to the network or not. + * + * @generated from protobuf field: bool private = 17; + */ + private: boolean; + /** + * True if we were the ones that created the channel. + * + * @generated from protobuf field: bool initiator = 18; + */ + initiator: boolean; + /** + * A set of flags showing the current state of the channel. + * + * @generated from protobuf field: string chan_status_flags = 19; + */ + chanStatusFlags: string; + /** + * Deprecated. The minimum satoshis this node is required to reserve in its + * balance. + * + * @deprecated + * @generated from protobuf field: int64 local_chan_reserve_sat = 20 [deprecated = true]; + */ + localChanReserveSat: bigint; + /** + * + * Deprecated. The minimum satoshis the other node is required to reserve in + * its balance. + * + * @deprecated + * @generated from protobuf field: int64 remote_chan_reserve_sat = 21 [deprecated = true]; + */ + remoteChanReserveSat: bigint; + /** + * Deprecated. Use commitment_type. + * + * @deprecated + * @generated from protobuf field: bool static_remote_key = 22 [deprecated = true]; + */ + staticRemoteKey: boolean; + /** + * The commitment type used by this channel. + * + * @generated from protobuf field: lnrpc.CommitmentType commitment_type = 26; + */ + commitmentType: CommitmentType; + /** + * + * The number of seconds that the channel has been monitored by the channel + * scoring system. Scores are currently not persisted, so this value may be + * less than the lifetime of the channel [EXPERIMENTAL]. + * + * @generated from protobuf field: int64 lifetime = 23; + */ + lifetime: bigint; + /** + * + * The number of seconds that the remote peer has been observed as being online + * by the channel scoring system over the lifetime of the channel + * [EXPERIMENTAL]. + * + * @generated from protobuf field: int64 uptime = 24; + */ + uptime: bigint; + /** + * + * Close address is the address that we will enforce payout to on cooperative + * close if the channel was opened utilizing option upfront shutdown. This + * value can be set on channel open by setting close_address in an open channel + * request. If this value is not set, you can still choose a payout address by + * cooperatively closing with the delivery_address field set. + * + * @generated from protobuf field: string close_address = 25; + */ + closeAddress: string; + /** + * + * The amount that the initiator of the channel optionally pushed to the remote + * party on channel open. This amount will be zero if the channel initiator did + * not push any funds to the remote peer. If the initiator field is true, we + * pushed this amount to our peer, if it is false, the remote peer pushed this + * amount to us. + * + * @generated from protobuf field: uint64 push_amount_sat = 27; + */ + pushAmountSat: bigint; + /** + * + * This uint32 indicates if this channel is to be considered 'frozen'. A + * frozen channel doest not allow a cooperative channel close by the + * initiator. The thaw_height is the height that this restriction stops + * applying to the channel. This field is optional, not setting it or using a + * value of zero will mean the channel has no additional restrictions. The + * height can be interpreted in two ways: as a relative height if the value is + * less than 500,000, or as an absolute height otherwise. + * + * @generated from protobuf field: uint32 thaw_height = 28; + */ + thawHeight: number; + /** + * List constraints for the local node. + * + * @generated from protobuf field: lnrpc.ChannelConstraints local_constraints = 29; + */ + localConstraints?: ChannelConstraints; + /** + * List constraints for the remote node. + * + * @generated from protobuf field: lnrpc.ChannelConstraints remote_constraints = 30; + */ + remoteConstraints?: ChannelConstraints; + /** + * + * This lists out the set of alias short channel ids that exist for a channel. + * This may be empty. + * + * @generated from protobuf field: repeated uint64 alias_scids = 31; + */ + aliasScids: bigint[]; + /** + * Whether or not this is a zero-conf channel. + * + * @generated from protobuf field: bool zero_conf = 32; + */ + zeroConf: boolean; + /** + * This is the confirmed / on-chain zero-conf SCID. + * + * @generated from protobuf field: uint64 zero_conf_confirmed_scid = 33; + */ + zeroConfConfirmedScid: bigint; +} +/** + * @generated from protobuf message lnrpc.ListChannelsRequest + */ +export interface ListChannelsRequest { + /** + * @generated from protobuf field: bool active_only = 1; + */ + activeOnly: boolean; + /** + * @generated from protobuf field: bool inactive_only = 2; + */ + inactiveOnly: boolean; + /** + * @generated from protobuf field: bool public_only = 3; + */ + publicOnly: boolean; + /** + * @generated from protobuf field: bool private_only = 4; + */ + privateOnly: boolean; + /** + * + * Filters the response for channels with a target peer's pubkey. If peer is + * empty, all channels will be returned. + * + * @generated from protobuf field: bytes peer = 5; + */ + peer: Uint8Array; +} +/** + * @generated from protobuf message lnrpc.ListChannelsResponse + */ +export interface ListChannelsResponse { + /** + * The list of active channels + * + * @generated from protobuf field: repeated lnrpc.Channel channels = 11; + */ + channels: Channel[]; +} +/** + * @generated from protobuf message lnrpc.AliasMap + */ +export interface AliasMap { + /** + * + * For non-zero-conf channels, this is the confirmed SCID. Otherwise, this is + * the first assigned "base" alias. + * + * @generated from protobuf field: uint64 base_scid = 1; + */ + baseScid: bigint; + /** + * The set of all aliases stored for the base SCID. + * + * @generated from protobuf field: repeated uint64 aliases = 2; + */ + aliases: bigint[]; +} +/** + * @generated from protobuf message lnrpc.ListAliasesRequest + */ +export interface ListAliasesRequest { +} +/** + * @generated from protobuf message lnrpc.ListAliasesResponse + */ +export interface ListAliasesResponse { + /** + * @generated from protobuf field: repeated lnrpc.AliasMap alias_maps = 1; + */ + aliasMaps: AliasMap[]; +} +/** + * @generated from protobuf message lnrpc.ChannelCloseSummary + */ +export interface ChannelCloseSummary { + /** + * The outpoint (txid:index) of the funding transaction. + * + * @generated from protobuf field: string channel_point = 1; + */ + channelPoint: string; + /** + * The unique channel ID for the channel. + * + * @generated from protobuf field: uint64 chan_id = 2 [jstype = JS_STRING]; + */ + chanId: string; + /** + * The hash of the genesis block that this channel resides within. + * + * @generated from protobuf field: string chain_hash = 3; + */ + chainHash: string; + /** + * The txid of the transaction which ultimately closed this channel. + * + * @generated from protobuf field: string closing_tx_hash = 4; + */ + closingTxHash: string; + /** + * Public key of the remote peer that we formerly had a channel with. + * + * @generated from protobuf field: string remote_pubkey = 5; + */ + remotePubkey: string; + /** + * Total capacity of the channel. + * + * @generated from protobuf field: int64 capacity = 6; + */ + capacity: bigint; + /** + * Height at which the funding transaction was spent. + * + * @generated from protobuf field: uint32 close_height = 7; + */ + closeHeight: number; + /** + * Settled balance at the time of channel closure + * + * @generated from protobuf field: int64 settled_balance = 8; + */ + settledBalance: bigint; + /** + * The sum of all the time-locked outputs at the time of channel closure + * + * @generated from protobuf field: int64 time_locked_balance = 9; + */ + timeLockedBalance: bigint; + /** + * Details on how the channel was closed. + * + * @generated from protobuf field: lnrpc.ChannelCloseSummary.ClosureType close_type = 10; + */ + closeType: ChannelCloseSummary_ClosureType; + /** + * + * Open initiator is the party that initiated opening the channel. Note that + * this value may be unknown if the channel was closed before we migrated to + * store open channel information after close. + * + * @generated from protobuf field: lnrpc.Initiator open_initiator = 11; + */ + openInitiator: Initiator; + /** + * + * Close initiator indicates which party initiated the close. This value will + * be unknown for channels that were cooperatively closed before we started + * tracking cooperative close initiators. Note that this indicates which party + * initiated a close, and it is possible for both to initiate cooperative or + * force closes, although only one party's close will be confirmed on chain. + * + * @generated from protobuf field: lnrpc.Initiator close_initiator = 12; + */ + closeInitiator: Initiator; + /** + * @generated from protobuf field: repeated lnrpc.Resolution resolutions = 13; + */ + resolutions: Resolution[]; + /** + * + * This lists out the set of alias short channel ids that existed for the + * closed channel. This may be empty. + * + * @generated from protobuf field: repeated uint64 alias_scids = 14; + */ + aliasScids: bigint[]; + /** + * The confirmed SCID for a zero-conf channel. + * + * @generated from protobuf field: uint64 zero_conf_confirmed_scid = 15 [jstype = JS_STRING]; + */ + zeroConfConfirmedScid: string; +} +/** + * @generated from protobuf enum lnrpc.ChannelCloseSummary.ClosureType + */ +export enum ChannelCloseSummary_ClosureType { + /** + * @generated from protobuf enum value: COOPERATIVE_CLOSE = 0; + */ + COOPERATIVE_CLOSE = 0, + /** + * @generated from protobuf enum value: LOCAL_FORCE_CLOSE = 1; + */ + LOCAL_FORCE_CLOSE = 1, + /** + * @generated from protobuf enum value: REMOTE_FORCE_CLOSE = 2; + */ + REMOTE_FORCE_CLOSE = 2, + /** + * @generated from protobuf enum value: BREACH_CLOSE = 3; + */ + BREACH_CLOSE = 3, + /** + * @generated from protobuf enum value: FUNDING_CANCELED = 4; + */ + FUNDING_CANCELED = 4, + /** + * @generated from protobuf enum value: ABANDONED = 5; + */ + ABANDONED = 5 +} +/** + * @generated from protobuf message lnrpc.Resolution + */ +export interface Resolution { + /** + * The type of output we are resolving. + * + * @generated from protobuf field: lnrpc.ResolutionType resolution_type = 1; + */ + resolutionType: ResolutionType; + /** + * The outcome of our on chain action that resolved the outpoint. + * + * @generated from protobuf field: lnrpc.ResolutionOutcome outcome = 2; + */ + outcome: ResolutionOutcome; + /** + * The outpoint that was spent by the resolution. + * + * @generated from protobuf field: lnrpc.OutPoint outpoint = 3; + */ + outpoint?: OutPoint; + /** + * The amount that was claimed by the resolution. + * + * @generated from protobuf field: uint64 amount_sat = 4; + */ + amountSat: bigint; + /** + * The hex-encoded transaction ID of the sweep transaction that spent the + * output. + * + * @generated from protobuf field: string sweep_txid = 5; + */ + sweepTxid: string; +} +/** + * @generated from protobuf message lnrpc.ClosedChannelsRequest + */ +export interface ClosedChannelsRequest { + /** + * @generated from protobuf field: bool cooperative = 1; + */ + cooperative: boolean; + /** + * @generated from protobuf field: bool local_force = 2; + */ + localForce: boolean; + /** + * @generated from protobuf field: bool remote_force = 3; + */ + remoteForce: boolean; + /** + * @generated from protobuf field: bool breach = 4; + */ + breach: boolean; + /** + * @generated from protobuf field: bool funding_canceled = 5; + */ + fundingCanceled: boolean; + /** + * @generated from protobuf field: bool abandoned = 6; + */ + abandoned: boolean; +} +/** + * @generated from protobuf message lnrpc.ClosedChannelsResponse + */ +export interface ClosedChannelsResponse { + /** + * @generated from protobuf field: repeated lnrpc.ChannelCloseSummary channels = 1; + */ + channels: ChannelCloseSummary[]; +} +/** + * @generated from protobuf message lnrpc.Peer + */ +export interface Peer { + /** + * The identity pubkey of the peer + * + * @generated from protobuf field: string pub_key = 1; + */ + pubKey: string; + /** + * Network address of the peer; eg `127.0.0.1:10011` + * + * @generated from protobuf field: string address = 3; + */ + address: string; + /** + * Bytes of data transmitted to this peer + * + * @generated from protobuf field: uint64 bytes_sent = 4; + */ + bytesSent: bigint; + /** + * Bytes of data transmitted from this peer + * + * @generated from protobuf field: uint64 bytes_recv = 5; + */ + bytesRecv: bigint; + /** + * Satoshis sent to this peer + * + * @generated from protobuf field: int64 sat_sent = 6; + */ + satSent: bigint; + /** + * Satoshis received from this peer + * + * @generated from protobuf field: int64 sat_recv = 7; + */ + satRecv: bigint; + /** + * A channel is inbound if the counterparty initiated the channel + * + * @generated from protobuf field: bool inbound = 8; + */ + inbound: boolean; + /** + * Ping time to this peer + * + * @generated from protobuf field: int64 ping_time = 9; + */ + pingTime: bigint; + /** + * The type of sync we are currently performing with this peer. + * + * @generated from protobuf field: lnrpc.Peer.SyncType sync_type = 10; + */ + syncType: Peer_SyncType; + /** + * Features advertised by the remote peer in their init message. + * + * @generated from protobuf field: map features = 11; + */ + features: { + [key: number]: Feature; + }; + /** + * + * The latest errors received from our peer with timestamps, limited to the 10 + * most recent errors. These errors are tracked across peer connections, but + * are not persisted across lnd restarts. Note that these errors are only + * stored for peers that we have channels open with, to prevent peers from + * spamming us with errors at no cost. + * + * @generated from protobuf field: repeated lnrpc.TimestampedError errors = 12; + */ + errors: TimestampedError[]; + /** + * + * The number of times we have recorded this peer going offline or coming + * online, recorded across restarts. Note that this value is decreased over + * time if the peer has not recently flapped, so that we can forgive peers + * with historically high flap counts. + * + * @generated from protobuf field: int32 flap_count = 13; + */ + flapCount: number; + /** + * + * The timestamp of the last flap we observed for this peer. If this value is + * zero, we have not observed any flaps for this peer. + * + * @generated from protobuf field: int64 last_flap_ns = 14; + */ + lastFlapNs: bigint; + /** + * + * The last ping payload the peer has sent to us. + * + * @generated from protobuf field: bytes last_ping_payload = 15; + */ + lastPingPayload: Uint8Array; +} +/** + * @generated from protobuf enum lnrpc.Peer.SyncType + */ +export enum Peer_SyncType { + /** + * + * Denotes that we cannot determine the peer's current sync type. + * + * @generated from protobuf enum value: UNKNOWN_SYNC = 0; + */ + UNKNOWN_SYNC = 0, + /** + * + * Denotes that we are actively receiving new graph updates from the peer. + * + * @generated from protobuf enum value: ACTIVE_SYNC = 1; + */ + ACTIVE_SYNC = 1, + /** + * + * Denotes that we are not receiving new graph updates from the peer. + * + * @generated from protobuf enum value: PASSIVE_SYNC = 2; + */ + PASSIVE_SYNC = 2, + /** + * + * Denotes that this peer is pinned into an active sync. + * + * @generated from protobuf enum value: PINNED_SYNC = 3; + */ + PINNED_SYNC = 3 +} +/** + * @generated from protobuf message lnrpc.TimestampedError + */ +export interface TimestampedError { + /** + * The unix timestamp in seconds when the error occurred. + * + * @generated from protobuf field: uint64 timestamp = 1; + */ + timestamp: bigint; + /** + * The string representation of the error sent by our peer. + * + * @generated from protobuf field: string error = 2; + */ + error: string; +} +/** + * @generated from protobuf message lnrpc.ListPeersRequest + */ +export interface ListPeersRequest { + /** + * + * If true, only the last error that our peer sent us will be returned with + * the peer's information, rather than the full set of historic errors we have + * stored. + * + * @generated from protobuf field: bool latest_error = 1; + */ + latestError: boolean; +} +/** + * @generated from protobuf message lnrpc.ListPeersResponse + */ +export interface ListPeersResponse { + /** + * The list of currently connected peers + * + * @generated from protobuf field: repeated lnrpc.Peer peers = 1; + */ + peers: Peer[]; +} +/** + * @generated from protobuf message lnrpc.PeerEventSubscription + */ +export interface PeerEventSubscription { +} +/** + * @generated from protobuf message lnrpc.PeerEvent + */ +export interface PeerEvent { + /** + * The identity pubkey of the peer. + * + * @generated from protobuf field: string pub_key = 1; + */ + pubKey: string; + /** + * @generated from protobuf field: lnrpc.PeerEvent.EventType type = 2; + */ + type: PeerEvent_EventType; +} +/** + * @generated from protobuf enum lnrpc.PeerEvent.EventType + */ +export enum PeerEvent_EventType { + /** + * @generated from protobuf enum value: PEER_ONLINE = 0; + */ + PEER_ONLINE = 0, + /** + * @generated from protobuf enum value: PEER_OFFLINE = 1; + */ + PEER_OFFLINE = 1 +} +/** + * @generated from protobuf message lnrpc.GetInfoRequest + */ +export interface GetInfoRequest { +} +/** + * @generated from protobuf message lnrpc.GetInfoResponse + */ +export interface GetInfoResponse { + /** + * The version of the LND software that the node is running. + * + * @generated from protobuf field: string version = 14; + */ + version: string; + /** + * The SHA1 commit hash that the daemon is compiled with. + * + * @generated from protobuf field: string commit_hash = 20; + */ + commitHash: string; + /** + * The identity pubkey of the current node. + * + * @generated from protobuf field: string identity_pubkey = 1; + */ + identityPubkey: string; + /** + * If applicable, the alias of the current node, e.g. "bob" + * + * @generated from protobuf field: string alias = 2; + */ + alias: string; + /** + * The color of the current node in hex code format + * + * @generated from protobuf field: string color = 17; + */ + color: string; + /** + * Number of pending channels + * + * @generated from protobuf field: uint32 num_pending_channels = 3; + */ + numPendingChannels: number; + /** + * Number of active channels + * + * @generated from protobuf field: uint32 num_active_channels = 4; + */ + numActiveChannels: number; + /** + * Number of inactive channels + * + * @generated from protobuf field: uint32 num_inactive_channels = 15; + */ + numInactiveChannels: number; + /** + * Number of peers + * + * @generated from protobuf field: uint32 num_peers = 5; + */ + numPeers: number; + /** + * The node's current view of the height of the best block + * + * @generated from protobuf field: uint32 block_height = 6; + */ + blockHeight: number; + /** + * The node's current view of the hash of the best block + * + * @generated from protobuf field: string block_hash = 8; + */ + blockHash: string; + /** + * Timestamp of the block best known to the wallet + * + * @generated from protobuf field: int64 best_header_timestamp = 13; + */ + bestHeaderTimestamp: bigint; + /** + * Whether the wallet's view is synced to the main chain + * + * @generated from protobuf field: bool synced_to_chain = 9; + */ + syncedToChain: boolean; + /** + * Whether we consider ourselves synced with the public channel graph. + * + * @generated from protobuf field: bool synced_to_graph = 18; + */ + syncedToGraph: boolean; + /** + * + * Whether the current node is connected to testnet. This field is + * deprecated and the network field should be used instead + * + * @deprecated + * @generated from protobuf field: bool testnet = 10 [deprecated = true]; + */ + testnet: boolean; + /** + * A list of active chains the node is connected to + * + * @generated from protobuf field: repeated lnrpc.Chain chains = 16; + */ + chains: Chain[]; + /** + * The URIs of the current node. + * + * @generated from protobuf field: repeated string uris = 12; + */ + uris: string[]; + /** + * + * Features that our node has advertised in our init message, node + * announcements and invoices. + * + * @generated from protobuf field: map features = 19; + */ + features: { + [key: number]: Feature; + }; + /** + * + * Indicates whether the HTLC interceptor API is in always-on mode. + * + * @generated from protobuf field: bool require_htlc_interceptor = 21; + */ + requireHtlcInterceptor: boolean; +} +/** + * @generated from protobuf message lnrpc.GetRecoveryInfoRequest + */ +export interface GetRecoveryInfoRequest { +} +/** + * @generated from protobuf message lnrpc.GetRecoveryInfoResponse + */ +export interface GetRecoveryInfoResponse { + /** + * Whether the wallet is in recovery mode + * + * @generated from protobuf field: bool recovery_mode = 1; + */ + recoveryMode: boolean; + /** + * Whether the wallet recovery progress is finished + * + * @generated from protobuf field: bool recovery_finished = 2; + */ + recoveryFinished: boolean; + /** + * The recovery progress, ranging from 0 to 1. + * + * @generated from protobuf field: double progress = 3; + */ + progress: number; +} +/** + * @generated from protobuf message lnrpc.Chain + */ +export interface Chain { + /** + * The blockchain the node is on (eg bitcoin, litecoin) + * + * @generated from protobuf field: string chain = 1; + */ + chain: string; + /** + * The network the node is on (eg regtest, testnet, mainnet) + * + * @generated from protobuf field: string network = 2; + */ + network: string; +} +/** + * @generated from protobuf message lnrpc.ConfirmationUpdate + */ +export interface ConfirmationUpdate { + /** + * @generated from protobuf field: bytes block_sha = 1; + */ + blockSha: Uint8Array; + /** + * @generated from protobuf field: int32 block_height = 2; + */ + blockHeight: number; + /** + * @generated from protobuf field: uint32 num_confs_left = 3; + */ + numConfsLeft: number; +} +/** + * @generated from protobuf message lnrpc.ChannelOpenUpdate + */ +export interface ChannelOpenUpdate { + /** + * @generated from protobuf field: lnrpc.ChannelPoint channel_point = 1; + */ + channelPoint?: ChannelPoint; +} +/** + * @generated from protobuf message lnrpc.ChannelCloseUpdate + */ +export interface ChannelCloseUpdate { + /** + * @generated from protobuf field: bytes closing_txid = 1; + */ + closingTxid: Uint8Array; + /** + * @generated from protobuf field: bool success = 2; + */ + success: boolean; +} +/** + * @generated from protobuf message lnrpc.CloseChannelRequest + */ +export interface CloseChannelRequest { + /** + * + * The outpoint (txid:index) of the funding transaction. With this value, Bob + * will be able to generate a signature for Alice's version of the commitment + * transaction. + * + * @generated from protobuf field: lnrpc.ChannelPoint channel_point = 1; + */ + channelPoint?: ChannelPoint; + /** + * If true, then the channel will be closed forcibly. This means the + * current commitment transaction will be signed and broadcast. + * + * @generated from protobuf field: bool force = 2; + */ + force: boolean; + /** + * The target number of blocks that the closure transaction should be + * confirmed by. + * + * @generated from protobuf field: int32 target_conf = 3; + */ + targetConf: number; + /** + * Deprecated, use sat_per_vbyte. + * A manual fee rate set in sat/vbyte that should be used when crafting the + * closure transaction. + * + * @deprecated + * @generated from protobuf field: int64 sat_per_byte = 4 [deprecated = true]; + */ + satPerByte: bigint; + /** + * + * An optional address to send funds to in the case of a cooperative close. + * If the channel was opened with an upfront shutdown script and this field + * is set, the request to close will fail because the channel must pay out + * to the upfront shutdown addresss. + * + * @generated from protobuf field: string delivery_address = 5; + */ + deliveryAddress: string; + /** + * A manual fee rate set in sat/vbyte that should be used when crafting the + * closure transaction. + * + * @generated from protobuf field: uint64 sat_per_vbyte = 6; + */ + satPerVbyte: bigint; + /** + * The maximum fee rate the closer is willing to pay. + * + * NOTE: This field is only respected if we're the initiator of the channel. + * + * @generated from protobuf field: uint64 max_fee_per_vbyte = 7; + */ + maxFeePerVbyte: bigint; +} +/** + * @generated from protobuf message lnrpc.CloseStatusUpdate + */ +export interface CloseStatusUpdate { + /** + * @generated from protobuf oneof: update + */ + update: { + oneofKind: "closePending"; + /** + * @generated from protobuf field: lnrpc.PendingUpdate close_pending = 1; + */ + closePending: PendingUpdate; + } | { + oneofKind: "chanClose"; + /** + * @generated from protobuf field: lnrpc.ChannelCloseUpdate chan_close = 3; + */ + chanClose: ChannelCloseUpdate; + } | { + oneofKind: undefined; + }; +} +/** + * @generated from protobuf message lnrpc.PendingUpdate + */ +export interface PendingUpdate { + /** + * @generated from protobuf field: bytes txid = 1; + */ + txid: Uint8Array; + /** + * @generated from protobuf field: uint32 output_index = 2; + */ + outputIndex: number; +} +/** + * @generated from protobuf message lnrpc.ReadyForPsbtFunding + */ +export interface ReadyForPsbtFunding { + /** + * + * The P2WSH address of the channel funding multisig address that the below + * specified amount in satoshis needs to be sent to. + * + * @generated from protobuf field: string funding_address = 1; + */ + fundingAddress: string; + /** + * + * The exact amount in satoshis that needs to be sent to the above address to + * fund the pending channel. + * + * @generated from protobuf field: int64 funding_amount = 2; + */ + fundingAmount: bigint; + /** + * + * A raw PSBT that contains the pending channel output. If a base PSBT was + * provided in the PsbtShim, this is the base PSBT with one additional output. + * If no base PSBT was specified, this is an otherwise empty PSBT with exactly + * one output. + * + * @generated from protobuf field: bytes psbt = 3; + */ + psbt: Uint8Array; +} +/** + * @generated from protobuf message lnrpc.BatchOpenChannelRequest + */ +export interface BatchOpenChannelRequest { + /** + * The list of channels to open. + * + * @generated from protobuf field: repeated lnrpc.BatchOpenChannel channels = 1; + */ + channels: BatchOpenChannel[]; + /** + * The target number of blocks that the funding transaction should be + * confirmed by. + * + * @generated from protobuf field: int32 target_conf = 2; + */ + targetConf: number; + /** + * A manual fee rate set in sat/vByte that should be used when crafting the + * funding transaction. + * + * @generated from protobuf field: int64 sat_per_vbyte = 3; + */ + satPerVbyte: bigint; + /** + * The minimum number of confirmations each one of your outputs used for + * the funding transaction must satisfy. + * + * @generated from protobuf field: int32 min_confs = 4; + */ + minConfs: number; + /** + * Whether unconfirmed outputs should be used as inputs for the funding + * transaction. + * + * @generated from protobuf field: bool spend_unconfirmed = 5; + */ + spendUnconfirmed: boolean; + /** + * An optional label for the batch transaction, limited to 500 characters. + * + * @generated from protobuf field: string label = 6; + */ + label: string; +} +/** + * @generated from protobuf message lnrpc.BatchOpenChannel + */ +export interface BatchOpenChannel { + /** + * The pubkey of the node to open a channel with. When using REST, this + * field must be encoded as base64. + * + * @generated from protobuf field: bytes node_pubkey = 1; + */ + nodePubkey: Uint8Array; + /** + * The number of satoshis the wallet should commit to the channel. + * + * @generated from protobuf field: int64 local_funding_amount = 2; + */ + localFundingAmount: bigint; + /** + * The number of satoshis to push to the remote side as part of the initial + * commitment state. + * + * @generated from protobuf field: int64 push_sat = 3; + */ + pushSat: bigint; + /** + * Whether this channel should be private, not announced to the greater + * network. + * + * @generated from protobuf field: bool private = 4; + */ + private: boolean; + /** + * The minimum value in millisatoshi we will require for incoming HTLCs on + * the channel. + * + * @generated from protobuf field: int64 min_htlc_msat = 5; + */ + minHtlcMsat: bigint; + /** + * The delay we require on the remote's commitment transaction. If this is + * not set, it will be scaled automatically with the channel size. + * + * @generated from protobuf field: uint32 remote_csv_delay = 6; + */ + remoteCsvDelay: number; + /** + * + * Close address is an optional address which specifies the address to which + * funds should be paid out to upon cooperative close. This field may only be + * set if the peer supports the option upfront feature bit (call listpeers + * to check). The remote peer will only accept cooperative closes to this + * address if it is set. + * + * Note: If this value is set on channel creation, you will *not* be able to + * cooperatively close out to a different address. + * + * @generated from protobuf field: string close_address = 7; + */ + closeAddress: string; + /** + * + * An optional, unique identifier of 32 random bytes that will be used as the + * pending channel ID to identify the channel while it is in the pre-pending + * state. + * + * @generated from protobuf field: bytes pending_chan_id = 8; + */ + pendingChanId: Uint8Array; + /** + * + * The explicit commitment type to use. Note this field will only be used if + * the remote peer supports explicit channel negotiation. + * + * @generated from protobuf field: lnrpc.CommitmentType commitment_type = 9; + */ + commitmentType: CommitmentType; +} +/** + * @generated from protobuf message lnrpc.BatchOpenChannelResponse + */ +export interface BatchOpenChannelResponse { + /** + * @generated from protobuf field: repeated lnrpc.PendingUpdate pending_channels = 1; + */ + pendingChannels: PendingUpdate[]; +} +/** + * @generated from protobuf message lnrpc.OpenChannelRequest + */ +export interface OpenChannelRequest { + /** + * A manual fee rate set in sat/vbyte that should be used when crafting the + * funding transaction. + * + * @generated from protobuf field: uint64 sat_per_vbyte = 1; + */ + satPerVbyte: bigint; + /** + * + * The pubkey of the node to open a channel with. When using REST, this field + * must be encoded as base64. + * + * @generated from protobuf field: bytes node_pubkey = 2; + */ + nodePubkey: Uint8Array; + /** + * + * The hex encoded pubkey of the node to open a channel with. Deprecated now + * that the REST gateway supports base64 encoding of bytes fields. + * + * @deprecated + * @generated from protobuf field: string node_pubkey_string = 3 [deprecated = true]; + */ + nodePubkeyString: string; + /** + * The number of satoshis the wallet should commit to the channel + * + * @generated from protobuf field: int64 local_funding_amount = 4; + */ + localFundingAmount: bigint; + /** + * The number of satoshis to push to the remote side as part of the initial + * commitment state + * + * @generated from protobuf field: int64 push_sat = 5; + */ + pushSat: bigint; + /** + * The target number of blocks that the funding transaction should be + * confirmed by. + * + * @generated from protobuf field: int32 target_conf = 6; + */ + targetConf: number; + /** + * Deprecated, use sat_per_vbyte. + * A manual fee rate set in sat/vbyte that should be used when crafting the + * funding transaction. + * + * @deprecated + * @generated from protobuf field: int64 sat_per_byte = 7 [deprecated = true]; + */ + satPerByte: bigint; + /** + * Whether this channel should be private, not announced to the greater + * network. + * + * @generated from protobuf field: bool private = 8; + */ + private: boolean; + /** + * The minimum value in millisatoshi we will require for incoming HTLCs on + * the channel. + * + * @generated from protobuf field: int64 min_htlc_msat = 9; + */ + minHtlcMsat: bigint; + /** + * The delay we require on the remote's commitment transaction. If this is + * not set, it will be scaled automatically with the channel size. + * + * @generated from protobuf field: uint32 remote_csv_delay = 10; + */ + remoteCsvDelay: number; + /** + * The minimum number of confirmations each one of your outputs used for + * the funding transaction must satisfy. + * + * @generated from protobuf field: int32 min_confs = 11; + */ + minConfs: number; + /** + * Whether unconfirmed outputs should be used as inputs for the funding + * transaction. + * + * @generated from protobuf field: bool spend_unconfirmed = 12; + */ + spendUnconfirmed: boolean; + /** + * + * Close address is an optional address which specifies the address to which + * funds should be paid out to upon cooperative close. This field may only be + * set if the peer supports the option upfront feature bit (call listpeers + * to check). The remote peer will only accept cooperative closes to this + * address if it is set. + * + * Note: If this value is set on channel creation, you will *not* be able to + * cooperatively close out to a different address. + * + * @generated from protobuf field: string close_address = 13; + */ + closeAddress: string; + /** + * + * Funding shims are an optional argument that allow the caller to intercept + * certain funding functionality. For example, a shim can be provided to use a + * particular key for the commitment key (ideally cold) rather than use one + * that is generated by the wallet as normal, or signal that signing will be + * carried out in an interactive manner (PSBT based). + * + * @generated from protobuf field: lnrpc.FundingShim funding_shim = 14; + */ + fundingShim?: FundingShim; + /** + * + * The maximum amount of coins in millisatoshi that can be pending within + * the channel. It only applies to the remote party. + * + * @generated from protobuf field: uint64 remote_max_value_in_flight_msat = 15; + */ + remoteMaxValueInFlightMsat: bigint; + /** + * + * The maximum number of concurrent HTLCs we will allow the remote party to add + * to the commitment transaction. + * + * @generated from protobuf field: uint32 remote_max_htlcs = 16; + */ + remoteMaxHtlcs: number; + /** + * + * Max local csv is the maximum csv delay we will allow for our own commitment + * transaction. + * + * @generated from protobuf field: uint32 max_local_csv = 17; + */ + maxLocalCsv: number; + /** + * + * The explicit commitment type to use. Note this field will only be used if + * the remote peer supports explicit channel negotiation. + * + * @generated from protobuf field: lnrpc.CommitmentType commitment_type = 18; + */ + commitmentType: CommitmentType; + /** + * + * If this is true, then a zero-conf channel open will be attempted. + * + * @generated from protobuf field: bool zero_conf = 19; + */ + zeroConf: boolean; + /** + * + * If this is true, then an option-scid-alias channel-type open will be + * attempted. + * + * @generated from protobuf field: bool scid_alias = 20; + */ + scidAlias: boolean; + /** + * + * The base fee charged regardless of the number of milli-satoshis sent. + * + * @generated from protobuf field: uint64 base_fee = 21; + */ + baseFee: bigint; + /** + * + * The fee rate in ppm (parts per million) that will be charged in + * proportion of the value of each forwarded HTLC. + * + * @generated from protobuf field: uint64 fee_rate = 22; + */ + feeRate: bigint; + /** + * + * If use_base_fee is true the open channel announcement will update the + * channel base fee with the value specified in base_fee. In the case of + * a base_fee of 0 use_base_fee is needed downstream to distinguish whether + * to use the default base fee value specified in the config or 0. + * + * @generated from protobuf field: bool use_base_fee = 23; + */ + useBaseFee: boolean; + /** + * + * If use_fee_rate is true the open channel announcement will update the + * channel fee rate with the value specified in fee_rate. In the case of + * a fee_rate of 0 use_fee_rate is needed downstream to distinguish whether + * to use the default fee rate value specified in the config or 0. + * + * @generated from protobuf field: bool use_fee_rate = 24; + */ + useFeeRate: boolean; + /** + * + * The number of satoshis we require the remote peer to reserve. This value, + * if specified, must be above the dust limit and below 20% of the channel + * capacity. + * + * @generated from protobuf field: uint64 remote_chan_reserve_sat = 25; + */ + remoteChanReserveSat: bigint; +} +/** + * @generated from protobuf message lnrpc.OpenStatusUpdate + */ +export interface OpenStatusUpdate { + /** + * @generated from protobuf oneof: update + */ + update: { + oneofKind: "chanPending"; + /** + * + * Signals that the channel is now fully negotiated and the funding + * transaction published. + * + * @generated from protobuf field: lnrpc.PendingUpdate chan_pending = 1; + */ + chanPending: PendingUpdate; + } | { + oneofKind: "chanOpen"; + /** + * + * Signals that the channel's funding transaction has now reached the + * required number of confirmations on chain and can be used. + * + * @generated from protobuf field: lnrpc.ChannelOpenUpdate chan_open = 3; + */ + chanOpen: ChannelOpenUpdate; + } | { + oneofKind: "psbtFund"; + /** + * + * Signals that the funding process has been suspended and the construction + * of a PSBT that funds the channel PK script is now required. + * + * @generated from protobuf field: lnrpc.ReadyForPsbtFunding psbt_fund = 5; + */ + psbtFund: ReadyForPsbtFunding; + } | { + oneofKind: undefined; + }; + /** + * + * The pending channel ID of the created channel. This value may be used to + * further the funding flow manually via the FundingStateStep method. + * + * @generated from protobuf field: bytes pending_chan_id = 4; + */ + pendingChanId: Uint8Array; +} +/** + * @generated from protobuf message lnrpc.KeyLocator + */ +export interface KeyLocator { + /** + * The family of key being identified. + * + * @generated from protobuf field: int32 key_family = 1; + */ + keyFamily: number; + /** + * The precise index of the key being identified. + * + * @generated from protobuf field: int32 key_index = 2; + */ + keyIndex: number; +} +/** + * @generated from protobuf message lnrpc.KeyDescriptor + */ +export interface KeyDescriptor { + /** + * + * The raw bytes of the key being identified. + * + * @generated from protobuf field: bytes raw_key_bytes = 1; + */ + rawKeyBytes: Uint8Array; + /** + * + * The key locator that identifies which key to use for signing. + * + * @generated from protobuf field: lnrpc.KeyLocator key_loc = 2; + */ + keyLoc?: KeyLocator; +} +/** + * @generated from protobuf message lnrpc.ChanPointShim + */ +export interface ChanPointShim { + /** + * + * The size of the pre-crafted output to be used as the channel point for this + * channel funding. + * + * @generated from protobuf field: int64 amt = 1; + */ + amt: bigint; + /** + * The target channel point to refrence in created commitment transactions. + * + * @generated from protobuf field: lnrpc.ChannelPoint chan_point = 2; + */ + chanPoint?: ChannelPoint; + /** + * Our local key to use when creating the multi-sig output. + * + * @generated from protobuf field: lnrpc.KeyDescriptor local_key = 3; + */ + localKey?: KeyDescriptor; + /** + * The key of the remote party to use when creating the multi-sig output. + * + * @generated from protobuf field: bytes remote_key = 4; + */ + remoteKey: Uint8Array; + /** + * + * If non-zero, then this will be used as the pending channel ID on the wire + * protocol to initate the funding request. This is an optional field, and + * should only be set if the responder is already expecting a specific pending + * channel ID. + * + * @generated from protobuf field: bytes pending_chan_id = 5; + */ + pendingChanId: Uint8Array; + /** + * + * This uint32 indicates if this channel is to be considered 'frozen'. A frozen + * channel does not allow a cooperative channel close by the initiator. The + * thaw_height is the height that this restriction stops applying to the + * channel. The height can be interpreted in two ways: as a relative height if + * the value is less than 500,000, or as an absolute height otherwise. + * + * @generated from protobuf field: uint32 thaw_height = 6; + */ + thawHeight: number; +} +/** + * @generated from protobuf message lnrpc.PsbtShim + */ +export interface PsbtShim { + /** + * + * A unique identifier of 32 random bytes that will be used as the pending + * channel ID to identify the PSBT state machine when interacting with it and + * on the wire protocol to initiate the funding request. + * + * @generated from protobuf field: bytes pending_chan_id = 1; + */ + pendingChanId: Uint8Array; + /** + * + * An optional base PSBT the new channel output will be added to. If this is + * non-empty, it must be a binary serialized PSBT. + * + * @generated from protobuf field: bytes base_psbt = 2; + */ + basePsbt: Uint8Array; + /** + * + * If a channel should be part of a batch (multiple channel openings in one + * transaction), it can be dangerous if the whole batch transaction is + * published too early before all channel opening negotiations are completed. + * This flag prevents this particular channel from broadcasting the transaction + * after the negotiation with the remote peer. In a batch of channel openings + * this flag should be set to true for every channel but the very last. + * + * @generated from protobuf field: bool no_publish = 3; + */ + noPublish: boolean; +} +/** + * @generated from protobuf message lnrpc.FundingShim + */ +export interface FundingShim { + /** + * @generated from protobuf oneof: shim + */ + shim: { + oneofKind: "chanPointShim"; + /** + * + * A channel shim where the channel point was fully constructed outside + * of lnd's wallet and the transaction might already be published. + * + * @generated from protobuf field: lnrpc.ChanPointShim chan_point_shim = 1; + */ + chanPointShim: ChanPointShim; + } | { + oneofKind: "psbtShim"; + /** + * + * A channel shim that uses a PSBT to fund and sign the channel funding + * transaction. + * + * @generated from protobuf field: lnrpc.PsbtShim psbt_shim = 2; + */ + psbtShim: PsbtShim; + } | { + oneofKind: undefined; + }; +} +/** + * @generated from protobuf message lnrpc.FundingShimCancel + */ +export interface FundingShimCancel { + /** + * The pending channel ID of the channel to cancel the funding shim for. + * + * @generated from protobuf field: bytes pending_chan_id = 1; + */ + pendingChanId: Uint8Array; +} +/** + * @generated from protobuf message lnrpc.FundingPsbtVerify + */ +export interface FundingPsbtVerify { + /** + * + * The funded but not yet signed PSBT that sends the exact channel capacity + * amount to the PK script returned in the open channel message in a previous + * step. + * + * @generated from protobuf field: bytes funded_psbt = 1; + */ + fundedPsbt: Uint8Array; + /** + * The pending channel ID of the channel to get the PSBT for. + * + * @generated from protobuf field: bytes pending_chan_id = 2; + */ + pendingChanId: Uint8Array; + /** + * + * Can only be used if the no_publish flag was set to true in the OpenChannel + * call meaning that the caller is solely responsible for publishing the final + * funding transaction. If skip_finalize is set to true then lnd will not wait + * for a FundingPsbtFinalize state step and instead assumes that a transaction + * with the same TXID as the passed in PSBT will eventually confirm. + * IT IS ABSOLUTELY IMPERATIVE that the TXID of the transaction that is + * eventually published does have the _same TXID_ as the verified PSBT. That + * means no inputs or outputs can change, only signatures can be added. If the + * TXID changes between this call and the publish step then the channel will + * never be created and the funds will be in limbo. + * + * @generated from protobuf field: bool skip_finalize = 3; + */ + skipFinalize: boolean; +} +/** + * @generated from protobuf message lnrpc.FundingPsbtFinalize + */ +export interface FundingPsbtFinalize { + /** + * + * The funded PSBT that contains all witness data to send the exact channel + * capacity amount to the PK script returned in the open channel message in a + * previous step. Cannot be set at the same time as final_raw_tx. + * + * @generated from protobuf field: bytes signed_psbt = 1; + */ + signedPsbt: Uint8Array; + /** + * The pending channel ID of the channel to get the PSBT for. + * + * @generated from protobuf field: bytes pending_chan_id = 2; + */ + pendingChanId: Uint8Array; + /** + * + * As an alternative to the signed PSBT with all witness data, the final raw + * wire format transaction can also be specified directly. Cannot be set at the + * same time as signed_psbt. + * + * @generated from protobuf field: bytes final_raw_tx = 3; + */ + finalRawTx: Uint8Array; +} +/** + * @generated from protobuf message lnrpc.FundingTransitionMsg + */ +export interface FundingTransitionMsg { + /** + * @generated from protobuf oneof: trigger + */ + trigger: { + oneofKind: "shimRegister"; + /** + * + * The funding shim to register. This should be used before any + * channel funding has began by the remote party, as it is intended as a + * preparatory step for the full channel funding. + * + * @generated from protobuf field: lnrpc.FundingShim shim_register = 1; + */ + shimRegister: FundingShim; + } | { + oneofKind: "shimCancel"; + /** + * Used to cancel an existing registered funding shim. + * + * @generated from protobuf field: lnrpc.FundingShimCancel shim_cancel = 2; + */ + shimCancel: FundingShimCancel; + } | { + oneofKind: "psbtVerify"; + /** + * + * Used to continue a funding flow that was initiated to be executed + * through a PSBT. This step verifies that the PSBT contains the correct + * outputs to fund the channel. + * + * @generated from protobuf field: lnrpc.FundingPsbtVerify psbt_verify = 3; + */ + psbtVerify: FundingPsbtVerify; + } | { + oneofKind: "psbtFinalize"; + /** + * + * Used to continue a funding flow that was initiated to be executed + * through a PSBT. This step finalizes the funded and signed PSBT, finishes + * negotiation with the peer and finally publishes the resulting funding + * transaction. + * + * @generated from protobuf field: lnrpc.FundingPsbtFinalize psbt_finalize = 4; + */ + psbtFinalize: FundingPsbtFinalize; + } | { + oneofKind: undefined; + }; +} +/** + * @generated from protobuf message lnrpc.FundingStateStepResp + */ +export interface FundingStateStepResp { +} +/** + * @generated from protobuf message lnrpc.PendingHTLC + */ +export interface PendingHTLC { + /** + * The direction within the channel that the htlc was sent + * + * @generated from protobuf field: bool incoming = 1; + */ + incoming: boolean; + /** + * The total value of the htlc + * + * @generated from protobuf field: int64 amount = 2; + */ + amount: bigint; + /** + * The final output to be swept back to the user's wallet + * + * @generated from protobuf field: string outpoint = 3; + */ + outpoint: string; + /** + * The next block height at which we can spend the current stage + * + * @generated from protobuf field: uint32 maturity_height = 4; + */ + maturityHeight: number; + /** + * + * The number of blocks remaining until the current stage can be swept. + * Negative values indicate how many blocks have passed since becoming + * mature. + * + * @generated from protobuf field: int32 blocks_til_maturity = 5; + */ + blocksTilMaturity: number; + /** + * Indicates whether the htlc is in its first or second stage of recovery + * + * @generated from protobuf field: uint32 stage = 6; + */ + stage: number; +} +/** + * @generated from protobuf message lnrpc.PendingChannelsRequest + */ +export interface PendingChannelsRequest { +} +/** + * @generated from protobuf message lnrpc.PendingChannelsResponse + */ +export interface PendingChannelsResponse { + /** + * The balance in satoshis encumbered in pending channels + * + * @generated from protobuf field: int64 total_limbo_balance = 1; + */ + totalLimboBalance: bigint; + /** + * Channels pending opening + * + * @generated from protobuf field: repeated lnrpc.PendingChannelsResponse.PendingOpenChannel pending_open_channels = 2; + */ + pendingOpenChannels: PendingChannelsResponse_PendingOpenChannel[]; + /** + * + * Deprecated: Channels pending closing previously contained cooperatively + * closed channels with a single confirmation. These channels are now + * considered closed from the time we see them on chain. + * + * @deprecated + * @generated from protobuf field: repeated lnrpc.PendingChannelsResponse.ClosedChannel pending_closing_channels = 3 [deprecated = true]; + */ + pendingClosingChannels: PendingChannelsResponse_ClosedChannel[]; + /** + * Channels pending force closing + * + * @generated from protobuf field: repeated lnrpc.PendingChannelsResponse.ForceClosedChannel pending_force_closing_channels = 4; + */ + pendingForceClosingChannels: PendingChannelsResponse_ForceClosedChannel[]; + /** + * Channels waiting for closing tx to confirm + * + * @generated from protobuf field: repeated lnrpc.PendingChannelsResponse.WaitingCloseChannel waiting_close_channels = 5; + */ + waitingCloseChannels: PendingChannelsResponse_WaitingCloseChannel[]; +} +/** + * @generated from protobuf message lnrpc.PendingChannelsResponse.PendingChannel + */ +export interface PendingChannelsResponse_PendingChannel { + /** + * @generated from protobuf field: string remote_node_pub = 1; + */ + remoteNodePub: string; + /** + * @generated from protobuf field: string channel_point = 2; + */ + channelPoint: string; + /** + * @generated from protobuf field: int64 capacity = 3; + */ + capacity: bigint; + /** + * @generated from protobuf field: int64 local_balance = 4; + */ + localBalance: bigint; + /** + * @generated from protobuf field: int64 remote_balance = 5; + */ + remoteBalance: bigint; + /** + * The minimum satoshis this node is required to reserve in its + * balance. + * + * @generated from protobuf field: int64 local_chan_reserve_sat = 6; + */ + localChanReserveSat: bigint; + /** + * + * The minimum satoshis the other node is required to reserve in its + * balance. + * + * @generated from protobuf field: int64 remote_chan_reserve_sat = 7; + */ + remoteChanReserveSat: bigint; + /** + * The party that initiated opening the channel. + * + * @generated from protobuf field: lnrpc.Initiator initiator = 8; + */ + initiator: Initiator; + /** + * The commitment type used by this channel. + * + * @generated from protobuf field: lnrpc.CommitmentType commitment_type = 9; + */ + commitmentType: CommitmentType; + /** + * Total number of forwarding packages created in this channel. + * + * @generated from protobuf field: int64 num_forwarding_packages = 10; + */ + numForwardingPackages: bigint; + /** + * A set of flags showing the current state of the channel. + * + * @generated from protobuf field: string chan_status_flags = 11; + */ + chanStatusFlags: string; + /** + * Whether this channel is advertised to the network or not. + * + * @generated from protobuf field: bool private = 12; + */ + private: boolean; +} +/** + * @generated from protobuf message lnrpc.PendingChannelsResponse.PendingOpenChannel + */ +export interface PendingChannelsResponse_PendingOpenChannel { + /** + * The pending channel + * + * @generated from protobuf field: lnrpc.PendingChannelsResponse.PendingChannel channel = 1; + */ + channel?: PendingChannelsResponse_PendingChannel; + /** + * + * The amount calculated to be paid in fees for the current set of + * commitment transactions. The fee amount is persisted with the channel + * in order to allow the fee amount to be removed and recalculated with + * each channel state update, including updates that happen after a system + * restart. + * + * @generated from protobuf field: int64 commit_fee = 4; + */ + commitFee: bigint; + /** + * The weight of the commitment transaction + * + * @generated from protobuf field: int64 commit_weight = 5; + */ + commitWeight: bigint; + /** + * + * The required number of satoshis per kilo-weight that the requester will + * pay at all times, for both the funding transaction and commitment + * transaction. This value can later be updated once the channel is open. + * + * @generated from protobuf field: int64 fee_per_kw = 6; + */ + feePerKw: bigint; +} +/** + * @generated from protobuf message lnrpc.PendingChannelsResponse.WaitingCloseChannel + */ +export interface PendingChannelsResponse_WaitingCloseChannel { + /** + * The pending channel waiting for closing tx to confirm + * + * @generated from protobuf field: lnrpc.PendingChannelsResponse.PendingChannel channel = 1; + */ + channel?: PendingChannelsResponse_PendingChannel; + /** + * The balance in satoshis encumbered in this channel + * + * @generated from protobuf field: int64 limbo_balance = 2; + */ + limboBalance: bigint; + /** + * + * A list of valid commitment transactions. Any of these can confirm at + * this point. + * + * @generated from protobuf field: lnrpc.PendingChannelsResponse.Commitments commitments = 3; + */ + commitments?: PendingChannelsResponse_Commitments; + /** + * The transaction id of the closing transaction + * + * @generated from protobuf field: string closing_txid = 4; + */ + closingTxid: string; +} +/** + * @generated from protobuf message lnrpc.PendingChannelsResponse.Commitments + */ +export interface PendingChannelsResponse_Commitments { + /** + * Hash of the local version of the commitment tx. + * + * @generated from protobuf field: string local_txid = 1; + */ + localTxid: string; + /** + * Hash of the remote version of the commitment tx. + * + * @generated from protobuf field: string remote_txid = 2; + */ + remoteTxid: string; + /** + * Hash of the remote pending version of the commitment tx. + * + * @generated from protobuf field: string remote_pending_txid = 3; + */ + remotePendingTxid: string; + /** + * + * The amount in satoshis calculated to be paid in fees for the local + * commitment. + * + * @generated from protobuf field: uint64 local_commit_fee_sat = 4; + */ + localCommitFeeSat: bigint; + /** + * + * The amount in satoshis calculated to be paid in fees for the remote + * commitment. + * + * @generated from protobuf field: uint64 remote_commit_fee_sat = 5; + */ + remoteCommitFeeSat: bigint; + /** + * + * The amount in satoshis calculated to be paid in fees for the remote + * pending commitment. + * + * @generated from protobuf field: uint64 remote_pending_commit_fee_sat = 6; + */ + remotePendingCommitFeeSat: bigint; +} +/** + * @generated from protobuf message lnrpc.PendingChannelsResponse.ClosedChannel + */ +export interface PendingChannelsResponse_ClosedChannel { + /** + * The pending channel to be closed + * + * @generated from protobuf field: lnrpc.PendingChannelsResponse.PendingChannel channel = 1; + */ + channel?: PendingChannelsResponse_PendingChannel; + /** + * The transaction id of the closing transaction + * + * @generated from protobuf field: string closing_txid = 2; + */ + closingTxid: string; +} +/** + * @generated from protobuf message lnrpc.PendingChannelsResponse.ForceClosedChannel + */ +export interface PendingChannelsResponse_ForceClosedChannel { + /** + * The pending channel to be force closed + * + * @generated from protobuf field: lnrpc.PendingChannelsResponse.PendingChannel channel = 1; + */ + channel?: PendingChannelsResponse_PendingChannel; + /** + * The transaction id of the closing transaction + * + * @generated from protobuf field: string closing_txid = 2; + */ + closingTxid: string; + /** + * The balance in satoshis encumbered in this pending channel + * + * @generated from protobuf field: int64 limbo_balance = 3; + */ + limboBalance: bigint; + /** + * The height at which funds can be swept into the wallet + * + * @generated from protobuf field: uint32 maturity_height = 4; + */ + maturityHeight: number; + /** + * + * Remaining # of blocks until the commitment output can be swept. + * Negative values indicate how many blocks have passed since becoming + * mature. + * + * @generated from protobuf field: int32 blocks_til_maturity = 5; + */ + blocksTilMaturity: number; + /** + * The total value of funds successfully recovered from this channel + * + * @generated from protobuf field: int64 recovered_balance = 6; + */ + recoveredBalance: bigint; + /** + * @generated from protobuf field: repeated lnrpc.PendingHTLC pending_htlcs = 8; + */ + pendingHtlcs: PendingHTLC[]; + /** + * @generated from protobuf field: lnrpc.PendingChannelsResponse.ForceClosedChannel.AnchorState anchor = 9; + */ + anchor: PendingChannelsResponse_ForceClosedChannel_AnchorState; +} +/** + * + * There are three resolution states for the anchor: + * limbo, lost and recovered. Derive the current state + * from the limbo and recovered balances. + * + * @generated from protobuf enum lnrpc.PendingChannelsResponse.ForceClosedChannel.AnchorState + */ +export enum PendingChannelsResponse_ForceClosedChannel_AnchorState { + /** + * The recovered_balance is zero and limbo_balance is non-zero. + * + * @generated from protobuf enum value: LIMBO = 0; + */ + LIMBO = 0, + /** + * The recovered_balance is non-zero. + * + * @generated from protobuf enum value: RECOVERED = 1; + */ + RECOVERED = 1, + /** + * A state that is neither LIMBO nor RECOVERED. + * + * @generated from protobuf enum value: LOST = 2; + */ + LOST = 2 +} +/** + * @generated from protobuf message lnrpc.ChannelEventSubscription + */ +export interface ChannelEventSubscription { +} +/** + * @generated from protobuf message lnrpc.ChannelEventUpdate + */ +export interface ChannelEventUpdate { + /** + * @generated from protobuf oneof: channel + */ + channel: { + oneofKind: "openChannel"; + /** + * @generated from protobuf field: lnrpc.Channel open_channel = 1; + */ + openChannel: Channel; + } | { + oneofKind: "closedChannel"; + /** + * @generated from protobuf field: lnrpc.ChannelCloseSummary closed_channel = 2; + */ + closedChannel: ChannelCloseSummary; + } | { + oneofKind: "activeChannel"; + /** + * @generated from protobuf field: lnrpc.ChannelPoint active_channel = 3; + */ + activeChannel: ChannelPoint; + } | { + oneofKind: "inactiveChannel"; + /** + * @generated from protobuf field: lnrpc.ChannelPoint inactive_channel = 4; + */ + inactiveChannel: ChannelPoint; + } | { + oneofKind: "pendingOpenChannel"; + /** + * @generated from protobuf field: lnrpc.PendingUpdate pending_open_channel = 6; + */ + pendingOpenChannel: PendingUpdate; + } | { + oneofKind: "fullyResolvedChannel"; + /** + * @generated from protobuf field: lnrpc.ChannelPoint fully_resolved_channel = 7; + */ + fullyResolvedChannel: ChannelPoint; + } | { + oneofKind: undefined; + }; + /** + * @generated from protobuf field: lnrpc.ChannelEventUpdate.UpdateType type = 5; + */ + type: ChannelEventUpdate_UpdateType; +} +/** + * @generated from protobuf enum lnrpc.ChannelEventUpdate.UpdateType + */ +export enum ChannelEventUpdate_UpdateType { + /** + * @generated from protobuf enum value: OPEN_CHANNEL = 0; + */ + OPEN_CHANNEL = 0, + /** + * @generated from protobuf enum value: CLOSED_CHANNEL = 1; + */ + CLOSED_CHANNEL = 1, + /** + * @generated from protobuf enum value: ACTIVE_CHANNEL = 2; + */ + ACTIVE_CHANNEL = 2, + /** + * @generated from protobuf enum value: INACTIVE_CHANNEL = 3; + */ + INACTIVE_CHANNEL = 3, + /** + * @generated from protobuf enum value: PENDING_OPEN_CHANNEL = 4; + */ + PENDING_OPEN_CHANNEL = 4, + /** + * @generated from protobuf enum value: FULLY_RESOLVED_CHANNEL = 5; + */ + FULLY_RESOLVED_CHANNEL = 5 +} +/** + * @generated from protobuf message lnrpc.WalletAccountBalance + */ +export interface WalletAccountBalance { + /** + * The confirmed balance of the account (with >= 1 confirmations). + * + * @generated from protobuf field: int64 confirmed_balance = 1; + */ + confirmedBalance: bigint; + /** + * The unconfirmed balance of the account (with 0 confirmations). + * + * @generated from protobuf field: int64 unconfirmed_balance = 2; + */ + unconfirmedBalance: bigint; +} +/** + * @generated from protobuf message lnrpc.WalletBalanceRequest + */ +export interface WalletBalanceRequest { +} +/** + * @generated from protobuf message lnrpc.WalletBalanceResponse + */ +export interface WalletBalanceResponse { + /** + * The balance of the wallet + * + * @generated from protobuf field: int64 total_balance = 1; + */ + totalBalance: bigint; + /** + * The confirmed balance of a wallet(with >= 1 confirmations) + * + * @generated from protobuf field: int64 confirmed_balance = 2; + */ + confirmedBalance: bigint; + /** + * The unconfirmed balance of a wallet(with 0 confirmations) + * + * @generated from protobuf field: int64 unconfirmed_balance = 3; + */ + unconfirmedBalance: bigint; + /** + * The total amount of wallet UTXOs held in outputs that are locked for + * other usage. + * + * @generated from protobuf field: int64 locked_balance = 5; + */ + lockedBalance: bigint; + /** + * The amount of reserve required. + * + * @generated from protobuf field: int64 reserved_balance_anchor_chan = 6; + */ + reservedBalanceAnchorChan: bigint; + /** + * A mapping of each wallet account's name to its balance. + * + * @generated from protobuf field: map account_balance = 4; + */ + accountBalance: { + [key: string]: WalletAccountBalance; + }; +} +/** + * @generated from protobuf message lnrpc.Amount + */ +export interface Amount { + /** + * Value denominated in satoshis. + * + * @generated from protobuf field: uint64 sat = 1; + */ + sat: bigint; + /** + * Value denominated in milli-satoshis. + * + * @generated from protobuf field: uint64 msat = 2; + */ + msat: bigint; +} +/** + * @generated from protobuf message lnrpc.ChannelBalanceRequest + */ +export interface ChannelBalanceRequest { +} +/** + * @generated from protobuf message lnrpc.ChannelBalanceResponse + */ +export interface ChannelBalanceResponse { + /** + * Deprecated. Sum of channels balances denominated in satoshis + * + * @deprecated + * @generated from protobuf field: int64 balance = 1 [deprecated = true]; + */ + balance: bigint; + /** + * Deprecated. Sum of channels pending balances denominated in satoshis + * + * @deprecated + * @generated from protobuf field: int64 pending_open_balance = 2 [deprecated = true]; + */ + pendingOpenBalance: bigint; + /** + * Sum of channels local balances. + * + * @generated from protobuf field: lnrpc.Amount local_balance = 3; + */ + localBalance?: Amount; + /** + * Sum of channels remote balances. + * + * @generated from protobuf field: lnrpc.Amount remote_balance = 4; + */ + remoteBalance?: Amount; + /** + * Sum of channels local unsettled balances. + * + * @generated from protobuf field: lnrpc.Amount unsettled_local_balance = 5; + */ + unsettledLocalBalance?: Amount; + /** + * Sum of channels remote unsettled balances. + * + * @generated from protobuf field: lnrpc.Amount unsettled_remote_balance = 6; + */ + unsettledRemoteBalance?: Amount; + /** + * Sum of channels pending local balances. + * + * @generated from protobuf field: lnrpc.Amount pending_open_local_balance = 7; + */ + pendingOpenLocalBalance?: Amount; + /** + * Sum of channels pending remote balances. + * + * @generated from protobuf field: lnrpc.Amount pending_open_remote_balance = 8; + */ + pendingOpenRemoteBalance?: Amount; +} +/** + * @generated from protobuf message lnrpc.QueryRoutesRequest + */ +export interface QueryRoutesRequest { + /** + * The 33-byte hex-encoded public key for the payment destination + * + * @generated from protobuf field: string pub_key = 1; + */ + pubKey: string; + /** + * + * The amount to send expressed in satoshis. + * + * The fields amt and amt_msat are mutually exclusive. + * + * @generated from protobuf field: int64 amt = 2; + */ + amt: bigint; + /** + * + * The amount to send expressed in millisatoshis. + * + * The fields amt and amt_msat are mutually exclusive. + * + * @generated from protobuf field: int64 amt_msat = 12; + */ + amtMsat: bigint; + /** + * + * An optional CLTV delta from the current height that should be used for the + * timelock of the final hop. Note that unlike SendPayment, QueryRoutes does + * not add any additional block padding on top of final_ctlv_delta. This + * padding of a few blocks needs to be added manually or otherwise failures may + * happen when a block comes in while the payment is in flight. + * + * @generated from protobuf field: int32 final_cltv_delta = 4; + */ + finalCltvDelta: number; + /** + * + * The maximum number of satoshis that will be paid as a fee of the payment. + * This value can be represented either as a percentage of the amount being + * sent, or as a fixed amount of the maximum fee the user is willing the pay to + * send the payment. If not specified, lnd will use a default value of 100% + * fees for small amounts (<=1k sat) or 5% fees for larger amounts. + * + * @generated from protobuf field: lnrpc.FeeLimit fee_limit = 5; + */ + feeLimit?: FeeLimit; + /** + * + * A list of nodes to ignore during path finding. When using REST, these fields + * must be encoded as base64. + * + * @generated from protobuf field: repeated bytes ignored_nodes = 6; + */ + ignoredNodes: Uint8Array[]; + /** + * + * Deprecated. A list of edges to ignore during path finding. + * + * @deprecated + * @generated from protobuf field: repeated lnrpc.EdgeLocator ignored_edges = 7 [deprecated = true]; + */ + ignoredEdges: EdgeLocator[]; + /** + * + * The source node where the request route should originated from. If empty, + * self is assumed. + * + * @generated from protobuf field: string source_pub_key = 8; + */ + sourcePubKey: string; + /** + * + * If set to true, edge probabilities from mission control will be used to get + * the optimal route. + * + * @generated from protobuf field: bool use_mission_control = 9; + */ + useMissionControl: boolean; + /** + * + * A list of directed node pairs that will be ignored during path finding. + * + * @generated from protobuf field: repeated lnrpc.NodePair ignored_pairs = 10; + */ + ignoredPairs: NodePair[]; + /** + * + * An optional maximum total time lock for the route. If the source is empty or + * ourselves, this should not exceed lnd's `--max-cltv-expiry` setting. If + * zero, then the value of `--max-cltv-expiry` is used as the limit. + * + * @generated from protobuf field: uint32 cltv_limit = 11; + */ + cltvLimit: number; + /** + * + * An optional field that can be used to pass an arbitrary set of TLV records + * to a peer which understands the new records. This can be used to pass + * application specific data during the payment attempt. If the destination + * does not support the specified records, an error will be returned. + * Record types are required to be in the custom range >= 65536. When using + * REST, the values must be encoded as base64. + * + * @generated from protobuf field: map dest_custom_records = 13; + */ + destCustomRecords: { + [key: string]: Uint8Array; + }; + /** + * + * The channel id of the channel that must be taken to the first hop. If zero, + * any channel may be used. + * + * @generated from protobuf field: uint64 outgoing_chan_id = 14 [jstype = JS_STRING]; + */ + outgoingChanId: string; + /** + * + * The pubkey of the last hop of the route. If empty, any hop may be used. + * + * @generated from protobuf field: bytes last_hop_pubkey = 15; + */ + lastHopPubkey: Uint8Array; + /** + * + * Optional route hints to reach the destination through private channels. + * + * @generated from protobuf field: repeated lnrpc.RouteHint route_hints = 16; + */ + routeHints: RouteHint[]; + /** + * + * Features assumed to be supported by the final node. All transitive feature + * dependencies must also be set properly. For a given feature bit pair, either + * optional or remote may be set, but not both. If this field is nil or empty, + * the router will try to load destination features from the graph as a + * fallback. + * + * @generated from protobuf field: repeated lnrpc.FeatureBit dest_features = 17; + */ + destFeatures: FeatureBit[]; + /** + * + * The time preference for this payment. Set to -1 to optimize for fees + * only, to 1 to optimize for reliability only or a value inbetween for a mix. + * + * @generated from protobuf field: double time_pref = 18; + */ + timePref: number; +} +/** + * @generated from protobuf message lnrpc.NodePair + */ +export interface NodePair { + /** + * + * The sending node of the pair. When using REST, this field must be encoded as + * base64. + * + * @generated from protobuf field: bytes from = 1; + */ + from: Uint8Array; + /** + * + * The receiving node of the pair. When using REST, this field must be encoded + * as base64. + * + * @generated from protobuf field: bytes to = 2; + */ + to: Uint8Array; +} +/** + * @generated from protobuf message lnrpc.EdgeLocator + */ +export interface EdgeLocator { + /** + * The short channel id of this edge. + * + * @generated from protobuf field: uint64 channel_id = 1 [jstype = JS_STRING]; + */ + channelId: string; + /** + * + * The direction of this edge. If direction_reverse is false, the direction + * of this edge is from the channel endpoint with the lexicographically smaller + * pub key to the endpoint with the larger pub key. If direction_reverse is + * is true, the edge goes the other way. + * + * @generated from protobuf field: bool direction_reverse = 2; + */ + directionReverse: boolean; +} +/** + * @generated from protobuf message lnrpc.QueryRoutesResponse + */ +export interface QueryRoutesResponse { + /** + * + * The route that results from the path finding operation. This is still a + * repeated field to retain backwards compatibility. + * + * @generated from protobuf field: repeated lnrpc.Route routes = 1; + */ + routes: Route[]; + /** + * + * The success probability of the returned route based on the current mission + * control state. [EXPERIMENTAL] + * + * @generated from protobuf field: double success_prob = 2; + */ + successProb: number; +} +/** + * @generated from protobuf message lnrpc.Hop + */ +export interface Hop { + /** + * + * The unique channel ID for the channel. The first 3 bytes are the block + * height, the next 3 the index within the block, and the last 2 bytes are the + * output index for the channel. + * + * @generated from protobuf field: uint64 chan_id = 1 [jstype = JS_STRING]; + */ + chanId: string; + /** + * @deprecated + * @generated from protobuf field: int64 chan_capacity = 2 [deprecated = true]; + */ + chanCapacity: bigint; + /** + * @deprecated + * @generated from protobuf field: int64 amt_to_forward = 3 [deprecated = true]; + */ + amtToForward: bigint; + /** + * @deprecated + * @generated from protobuf field: int64 fee = 4 [deprecated = true]; + */ + fee: bigint; + /** + * @generated from protobuf field: uint32 expiry = 5; + */ + expiry: number; + /** + * @generated from protobuf field: int64 amt_to_forward_msat = 6; + */ + amtToForwardMsat: bigint; + /** + * @generated from protobuf field: int64 fee_msat = 7; + */ + feeMsat: bigint; + /** + * + * An optional public key of the hop. If the public key is given, the payment + * can be executed without relying on a copy of the channel graph. + * + * @generated from protobuf field: string pub_key = 8; + */ + pubKey: string; + /** + * + * If set to true, then this hop will be encoded using the new variable length + * TLV format. Note that if any custom tlv_records below are specified, then + * this field MUST be set to true for them to be encoded properly. + * + * @deprecated + * @generated from protobuf field: bool tlv_payload = 9 [deprecated = true]; + */ + tlvPayload: boolean; + /** + * + * An optional TLV record that signals the use of an MPP payment. If present, + * the receiver will enforce that the same mpp_record is included in the final + * hop payload of all non-zero payments in the HTLC set. If empty, a regular + * single-shot payment is or was attempted. + * + * @generated from protobuf field: lnrpc.MPPRecord mpp_record = 10; + */ + mppRecord?: MPPRecord; + /** + * + * An optional TLV record that signals the use of an AMP payment. If present, + * the receiver will treat all received payments including the same + * (payment_addr, set_id) pair as being part of one logical payment. The + * payment will be settled by XORing the root_share's together and deriving the + * child hashes and preimages according to BOLT XX. Must be used in conjunction + * with mpp_record. + * + * @generated from protobuf field: lnrpc.AMPRecord amp_record = 12; + */ + ampRecord?: AMPRecord; + /** + * + * An optional set of key-value TLV records. This is useful within the context + * of the SendToRoute call as it allows callers to specify arbitrary K-V pairs + * to drop off at each hop within the onion. + * + * @generated from protobuf field: map custom_records = 11; + */ + customRecords: { + [key: string]: Uint8Array; + }; + /** + * The payment metadata to send along with the payment to the payee. + * + * @generated from protobuf field: bytes metadata = 13; + */ + metadata: Uint8Array; +} +/** + * @generated from protobuf message lnrpc.MPPRecord + */ +export interface MPPRecord { + /** + * + * A unique, random identifier used to authenticate the sender as the intended + * payer of a multi-path payment. The payment_addr must be the same for all + * subpayments, and match the payment_addr provided in the receiver's invoice. + * The same payment_addr must be used on all subpayments. + * + * @generated from protobuf field: bytes payment_addr = 11; + */ + paymentAddr: Uint8Array; + /** + * + * The total amount in milli-satoshis being sent as part of a larger multi-path + * payment. The caller is responsible for ensuring subpayments to the same node + * and payment_hash sum exactly to total_amt_msat. The same + * total_amt_msat must be used on all subpayments. + * + * @generated from protobuf field: int64 total_amt_msat = 10; + */ + totalAmtMsat: bigint; +} +/** + * @generated from protobuf message lnrpc.AMPRecord + */ +export interface AMPRecord { + /** + * @generated from protobuf field: bytes root_share = 1; + */ + rootShare: Uint8Array; + /** + * @generated from protobuf field: bytes set_id = 2; + */ + setId: Uint8Array; + /** + * @generated from protobuf field: uint32 child_index = 3; + */ + childIndex: number; +} +/** + * + * A path through the channel graph which runs over one or more channels in + * succession. This struct carries all the information required to craft the + * Sphinx onion packet, and send the payment along the first hop in the path. A + * route is only selected as valid if all the channels have sufficient capacity to + * carry the initial payment amount after fees are accounted for. + * + * @generated from protobuf message lnrpc.Route + */ +export interface Route { + /** + * + * The cumulative (final) time lock across the entire route. This is the CLTV + * value that should be extended to the first hop in the route. All other hops + * will decrement the time-lock as advertised, leaving enough time for all + * hops to wait for or present the payment preimage to complete the payment. + * + * @generated from protobuf field: uint32 total_time_lock = 1; + */ + totalTimeLock: number; + /** + * + * The sum of the fees paid at each hop within the final route. In the case + * of a one-hop payment, this value will be zero as we don't need to pay a fee + * to ourselves. + * + * @deprecated + * @generated from protobuf field: int64 total_fees = 2 [deprecated = true]; + */ + totalFees: bigint; + /** + * + * The total amount of funds required to complete a payment over this route. + * This value includes the cumulative fees at each hop. As a result, the HTLC + * extended to the first-hop in the route will need to have at least this many + * satoshis, otherwise the route will fail at an intermediate node due to an + * insufficient amount of fees. + * + * @deprecated + * @generated from protobuf field: int64 total_amt = 3 [deprecated = true]; + */ + totalAmt: bigint; + /** + * + * Contains details concerning the specific forwarding details at each hop. + * + * @generated from protobuf field: repeated lnrpc.Hop hops = 4; + */ + hops: Hop[]; + /** + * + * The total fees in millisatoshis. + * + * @generated from protobuf field: int64 total_fees_msat = 5; + */ + totalFeesMsat: bigint; + /** + * + * The total amount in millisatoshis. + * + * @generated from protobuf field: int64 total_amt_msat = 6; + */ + totalAmtMsat: bigint; +} +/** + * @generated from protobuf message lnrpc.NodeInfoRequest + */ +export interface NodeInfoRequest { + /** + * The 33-byte hex-encoded compressed public of the target node + * + * @generated from protobuf field: string pub_key = 1; + */ + pubKey: string; + /** + * If true, will include all known channels associated with the node. + * + * @generated from protobuf field: bool include_channels = 2; + */ + includeChannels: boolean; +} +/** + * @generated from protobuf message lnrpc.NodeInfo + */ +export interface NodeInfo { + /** + * + * An individual vertex/node within the channel graph. A node is + * connected to other nodes by one or more channel edges emanating from it. As + * the graph is directed, a node will also have an incoming edge attached to + * it for each outgoing edge. + * + * @generated from protobuf field: lnrpc.LightningNode node = 1; + */ + node?: LightningNode; + /** + * The total number of channels for the node. + * + * @generated from protobuf field: uint32 num_channels = 2; + */ + numChannels: number; + /** + * The sum of all channels capacity for the node, denominated in satoshis. + * + * @generated from protobuf field: int64 total_capacity = 3; + */ + totalCapacity: bigint; + /** + * A list of all public channels for the node. + * + * @generated from protobuf field: repeated lnrpc.ChannelEdge channels = 4; + */ + channels: ChannelEdge[]; +} +/** + * + * An individual vertex/node within the channel graph. A node is + * connected to other nodes by one or more channel edges emanating from it. As the + * graph is directed, a node will also have an incoming edge attached to it for + * each outgoing edge. + * + * @generated from protobuf message lnrpc.LightningNode + */ +export interface LightningNode { + /** + * @generated from protobuf field: uint32 last_update = 1; + */ + lastUpdate: number; + /** + * @generated from protobuf field: string pub_key = 2; + */ + pubKey: string; + /** + * @generated from protobuf field: string alias = 3; + */ + alias: string; + /** + * @generated from protobuf field: repeated lnrpc.NodeAddress addresses = 4; + */ + addresses: NodeAddress[]; + /** + * @generated from protobuf field: string color = 5; + */ + color: string; + /** + * @generated from protobuf field: map features = 6; + */ + features: { + [key: number]: Feature; + }; + /** + * Custom node announcement tlv records. + * + * @generated from protobuf field: map custom_records = 7; + */ + customRecords: { + [key: string]: Uint8Array; + }; +} +/** + * @generated from protobuf message lnrpc.NodeAddress + */ +export interface NodeAddress { + /** + * @generated from protobuf field: string network = 1; + */ + network: string; + /** + * @generated from protobuf field: string addr = 2; + */ + addr: string; +} +/** + * @generated from protobuf message lnrpc.RoutingPolicy + */ +export interface RoutingPolicy { + /** + * @generated from protobuf field: uint32 time_lock_delta = 1; + */ + timeLockDelta: number; + /** + * @generated from protobuf field: int64 min_htlc = 2; + */ + minHtlc: bigint; + /** + * @generated from protobuf field: int64 fee_base_msat = 3; + */ + feeBaseMsat: bigint; + /** + * @generated from protobuf field: int64 fee_rate_milli_msat = 4; + */ + feeRateMilliMsat: bigint; + /** + * @generated from protobuf field: bool disabled = 5; + */ + disabled: boolean; + /** + * @generated from protobuf field: uint64 max_htlc_msat = 6; + */ + maxHtlcMsat: bigint; + /** + * @generated from protobuf field: uint32 last_update = 7; + */ + lastUpdate: number; + /** + * Custom channel update tlv records. + * + * @generated from protobuf field: map custom_records = 8; + */ + customRecords: { + [key: string]: Uint8Array; + }; +} +/** + * + * A fully authenticated channel along with all its unique attributes. + * Once an authenticated channel announcement has been processed on the network, + * then an instance of ChannelEdgeInfo encapsulating the channels attributes is + * stored. The other portions relevant to routing policy of a channel are stored + * within a ChannelEdgePolicy for each direction of the channel. + * + * @generated from protobuf message lnrpc.ChannelEdge + */ +export interface ChannelEdge { + /** + * + * The unique channel ID for the channel. The first 3 bytes are the block + * height, the next 3 the index within the block, and the last 2 bytes are the + * output index for the channel. + * + * @generated from protobuf field: uint64 channel_id = 1 [jstype = JS_STRING]; + */ + channelId: string; + /** + * @generated from protobuf field: string chan_point = 2; + */ + chanPoint: string; + /** + * @deprecated + * @generated from protobuf field: uint32 last_update = 3 [deprecated = true]; + */ + lastUpdate: number; + /** + * @generated from protobuf field: string node1_pub = 4; + */ + node1Pub: string; + /** + * @generated from protobuf field: string node2_pub = 5; + */ + node2Pub: string; + /** + * @generated from protobuf field: int64 capacity = 6; + */ + capacity: bigint; + /** + * @generated from protobuf field: lnrpc.RoutingPolicy node1_policy = 7; + */ + node1Policy?: RoutingPolicy; + /** + * @generated from protobuf field: lnrpc.RoutingPolicy node2_policy = 8; + */ + node2Policy?: RoutingPolicy; + /** + * Custom channel announcement tlv records. + * + * @generated from protobuf field: map custom_records = 9; + */ + customRecords: { + [key: string]: Uint8Array; + }; +} +/** + * @generated from protobuf message lnrpc.ChannelGraphRequest + */ +export interface ChannelGraphRequest { + /** + * + * Whether unannounced channels are included in the response or not. If set, + * unannounced channels are included. Unannounced channels are both private + * channels, and public channels that are not yet announced to the network. + * + * @generated from protobuf field: bool include_unannounced = 1; + */ + includeUnannounced: boolean; +} +/** + * Returns a new instance of the directed channel graph. + * + * @generated from protobuf message lnrpc.ChannelGraph + */ +export interface ChannelGraph { + /** + * The list of `LightningNode`s in this channel graph + * + * @generated from protobuf field: repeated lnrpc.LightningNode nodes = 1; + */ + nodes: LightningNode[]; + /** + * The list of `ChannelEdge`s in this channel graph + * + * @generated from protobuf field: repeated lnrpc.ChannelEdge edges = 2; + */ + edges: ChannelEdge[]; +} +/** + * @generated from protobuf message lnrpc.NodeMetricsRequest + */ +export interface NodeMetricsRequest { + /** + * The requested node metrics. + * + * @generated from protobuf field: repeated lnrpc.NodeMetricType types = 1; + */ + types: NodeMetricType[]; +} +/** + * @generated from protobuf message lnrpc.NodeMetricsResponse + */ +export interface NodeMetricsResponse { + /** + * + * Betweenness centrality is the sum of the ratio of shortest paths that pass + * through the node for each pair of nodes in the graph (not counting paths + * starting or ending at this node). + * Map of node pubkey to betweenness centrality of the node. Normalized + * values are in the [0,1] closed interval. + * + * @generated from protobuf field: map betweenness_centrality = 1; + */ + betweennessCentrality: { + [key: string]: FloatMetric; + }; +} +/** + * @generated from protobuf message lnrpc.FloatMetric + */ +export interface FloatMetric { + /** + * Arbitrary float value. + * + * @generated from protobuf field: double value = 1; + */ + value: number; + /** + * The value normalized to [0,1] or [-1,1]. + * + * @generated from protobuf field: double normalized_value = 2; + */ + normalizedValue: number; +} +/** + * @generated from protobuf message lnrpc.ChanInfoRequest + */ +export interface ChanInfoRequest { + /** + * + * The unique channel ID for the channel. The first 3 bytes are the block + * height, the next 3 the index within the block, and the last 2 bytes are the + * output index for the channel. + * + * @generated from protobuf field: uint64 chan_id = 1 [jstype = JS_STRING]; + */ + chanId: string; +} +/** + * @generated from protobuf message lnrpc.NetworkInfoRequest + */ +export interface NetworkInfoRequest { +} +/** + * @generated from protobuf message lnrpc.NetworkInfo + */ +export interface NetworkInfo { + /** + * @generated from protobuf field: uint32 graph_diameter = 1; + */ + graphDiameter: number; + /** + * @generated from protobuf field: double avg_out_degree = 2; + */ + avgOutDegree: number; + /** + * @generated from protobuf field: uint32 max_out_degree = 3; + */ + maxOutDegree: number; + /** + * @generated from protobuf field: uint32 num_nodes = 4; + */ + numNodes: number; + /** + * @generated from protobuf field: uint32 num_channels = 5; + */ + numChannels: number; + /** + * @generated from protobuf field: int64 total_network_capacity = 6; + */ + totalNetworkCapacity: bigint; + /** + * @generated from protobuf field: double avg_channel_size = 7; + */ + avgChannelSize: number; + /** + * @generated from protobuf field: int64 min_channel_size = 8; + */ + minChannelSize: bigint; + /** + * @generated from protobuf field: int64 max_channel_size = 9; + */ + maxChannelSize: bigint; + /** + * @generated from protobuf field: int64 median_channel_size_sat = 10; + */ + medianChannelSizeSat: bigint; + /** + * The number of edges marked as zombies. + * + * @generated from protobuf field: uint64 num_zombie_chans = 11; + */ + numZombieChans: bigint; +} +/** + * @generated from protobuf message lnrpc.StopRequest + */ +export interface StopRequest { +} +/** + * @generated from protobuf message lnrpc.StopResponse + */ +export interface StopResponse { +} +/** + * @generated from protobuf message lnrpc.GraphTopologySubscription + */ +export interface GraphTopologySubscription { +} +/** + * @generated from protobuf message lnrpc.GraphTopologyUpdate + */ +export interface GraphTopologyUpdate { + /** + * @generated from protobuf field: repeated lnrpc.NodeUpdate node_updates = 1; + */ + nodeUpdates: NodeUpdate[]; + /** + * @generated from protobuf field: repeated lnrpc.ChannelEdgeUpdate channel_updates = 2; + */ + channelUpdates: ChannelEdgeUpdate[]; + /** + * @generated from protobuf field: repeated lnrpc.ClosedChannelUpdate closed_chans = 3; + */ + closedChans: ClosedChannelUpdate[]; +} +/** + * @generated from protobuf message lnrpc.NodeUpdate + */ +export interface NodeUpdate { + /** + * + * Deprecated, use node_addresses. + * + * @deprecated + * @generated from protobuf field: repeated string addresses = 1 [deprecated = true]; + */ + addresses: string[]; + /** + * @generated from protobuf field: string identity_key = 2; + */ + identityKey: string; + /** + * + * Deprecated, use features. + * + * @deprecated + * @generated from protobuf field: bytes global_features = 3 [deprecated = true]; + */ + globalFeatures: Uint8Array; + /** + * @generated from protobuf field: string alias = 4; + */ + alias: string; + /** + * @generated from protobuf field: string color = 5; + */ + color: string; + /** + * @generated from protobuf field: repeated lnrpc.NodeAddress node_addresses = 7; + */ + nodeAddresses: NodeAddress[]; + /** + * + * Features that the node has advertised in the init message, node + * announcements and invoices. + * + * @generated from protobuf field: map features = 6; + */ + features: { + [key: number]: Feature; + }; +} +/** + * @generated from protobuf message lnrpc.ChannelEdgeUpdate + */ +export interface ChannelEdgeUpdate { + /** + * + * The unique channel ID for the channel. The first 3 bytes are the block + * height, the next 3 the index within the block, and the last 2 bytes are the + * output index for the channel. + * + * @generated from protobuf field: uint64 chan_id = 1 [jstype = JS_STRING]; + */ + chanId: string; + /** + * @generated from protobuf field: lnrpc.ChannelPoint chan_point = 2; + */ + chanPoint?: ChannelPoint; + /** + * @generated from protobuf field: int64 capacity = 3; + */ + capacity: bigint; + /** + * @generated from protobuf field: lnrpc.RoutingPolicy routing_policy = 4; + */ + routingPolicy?: RoutingPolicy; + /** + * @generated from protobuf field: string advertising_node = 5; + */ + advertisingNode: string; + /** + * @generated from protobuf field: string connecting_node = 6; + */ + connectingNode: string; +} +/** + * @generated from protobuf message lnrpc.ClosedChannelUpdate + */ +export interface ClosedChannelUpdate { + /** + * + * The unique channel ID for the channel. The first 3 bytes are the block + * height, the next 3 the index within the block, and the last 2 bytes are the + * output index for the channel. + * + * @generated from protobuf field: uint64 chan_id = 1 [jstype = JS_STRING]; + */ + chanId: string; + /** + * @generated from protobuf field: int64 capacity = 2; + */ + capacity: bigint; + /** + * @generated from protobuf field: uint32 closed_height = 3; + */ + closedHeight: number; + /** + * @generated from protobuf field: lnrpc.ChannelPoint chan_point = 4; + */ + chanPoint?: ChannelPoint; +} +/** + * @generated from protobuf message lnrpc.HopHint + */ +export interface HopHint { + /** + * The public key of the node at the start of the channel. + * + * @generated from protobuf field: string node_id = 1; + */ + nodeId: string; + /** + * The unique identifier of the channel. + * + * @generated from protobuf field: uint64 chan_id = 2 [jstype = JS_STRING]; + */ + chanId: string; + /** + * The base fee of the channel denominated in millisatoshis. + * + * @generated from protobuf field: uint32 fee_base_msat = 3; + */ + feeBaseMsat: number; + /** + * + * The fee rate of the channel for sending one satoshi across it denominated in + * millionths of a satoshi. + * + * @generated from protobuf field: uint32 fee_proportional_millionths = 4; + */ + feeProportionalMillionths: number; + /** + * The time-lock delta of the channel. + * + * @generated from protobuf field: uint32 cltv_expiry_delta = 5; + */ + cltvExpiryDelta: number; +} +/** + * @generated from protobuf message lnrpc.SetID + */ +export interface SetID { + /** + * @generated from protobuf field: bytes set_id = 1; + */ + setId: Uint8Array; +} +/** + * @generated from protobuf message lnrpc.RouteHint + */ +export interface RouteHint { + /** + * + * A list of hop hints that when chained together can assist in reaching a + * specific destination. + * + * @generated from protobuf field: repeated lnrpc.HopHint hop_hints = 1; + */ + hopHints: HopHint[]; +} +/** + * @generated from protobuf message lnrpc.AMPInvoiceState + */ +export interface AMPInvoiceState { + /** + * The state the HTLCs associated with this setID are in. + * + * @generated from protobuf field: lnrpc.InvoiceHTLCState state = 1; + */ + state: InvoiceHTLCState; + /** + * The settle index of this HTLC set, if the invoice state is settled. + * + * @generated from protobuf field: uint64 settle_index = 2; + */ + settleIndex: bigint; + /** + * The time this HTLC set was settled expressed in unix epoch. + * + * @generated from protobuf field: int64 settle_time = 3; + */ + settleTime: bigint; + /** + * The total amount paid for the sub-invoice expressed in milli satoshis. + * + * @generated from protobuf field: int64 amt_paid_msat = 5; + */ + amtPaidMsat: bigint; +} +/** + * @generated from protobuf message lnrpc.Invoice + */ +export interface Invoice { + /** + * + * An optional memo to attach along with the invoice. Used for record keeping + * purposes for the invoice's creator, and will also be set in the description + * field of the encoded payment request if the description_hash field is not + * being used. + * + * @generated from protobuf field: string memo = 1; + */ + memo: string; + /** + * + * The hex-encoded preimage (32 byte) which will allow settling an incoming + * HTLC payable to this preimage. When using REST, this field must be encoded + * as base64. + * + * @generated from protobuf field: bytes r_preimage = 3; + */ + rPreimage: Uint8Array; + /** + * + * The hash of the preimage. When using REST, this field must be encoded as + * base64. + * Note: Output only, don't specify for creating an invoice. + * + * @generated from protobuf field: bytes r_hash = 4; + */ + rHash: Uint8Array; + /** + * + * The value of this invoice in satoshis + * + * The fields value and value_msat are mutually exclusive. + * + * @generated from protobuf field: int64 value = 5; + */ + value: bigint; + /** + * + * The value of this invoice in millisatoshis + * + * The fields value and value_msat are mutually exclusive. + * + * @generated from protobuf field: int64 value_msat = 23; + */ + valueMsat: bigint; + /** + * + * Whether this invoice has been fulfilled + * + * The field is deprecated. Use the state field instead (compare to SETTLED). + * + * @deprecated + * @generated from protobuf field: bool settled = 6 [deprecated = true]; + */ + settled: boolean; + /** + * + * When this invoice was created. + * Note: Output only, don't specify for creating an invoice. + * + * @generated from protobuf field: int64 creation_date = 7; + */ + creationDate: bigint; + /** + * + * When this invoice was settled. + * Note: Output only, don't specify for creating an invoice. + * + * @generated from protobuf field: int64 settle_date = 8; + */ + settleDate: bigint; + /** + * + * A bare-bones invoice for a payment within the Lightning Network. With the + * details of the invoice, the sender has all the data necessary to send a + * payment to the recipient. + * Note: Output only, don't specify for creating an invoice. + * + * @generated from protobuf field: string payment_request = 9; + */ + paymentRequest: string; + /** + * + * Hash (SHA-256) of a description of the payment. Used if the description of + * payment (memo) is too long to naturally fit within the description field + * of an encoded payment request. When using REST, this field must be encoded + * as base64. + * + * @generated from protobuf field: bytes description_hash = 10; + */ + descriptionHash: Uint8Array; + /** + * Payment request expiry time in seconds. Default is 3600 (1 hour). + * + * @generated from protobuf field: int64 expiry = 11; + */ + expiry: bigint; + /** + * Fallback on-chain address. + * + * @generated from protobuf field: string fallback_addr = 12; + */ + fallbackAddr: string; + /** + * Delta to use for the time-lock of the CLTV extended to the final hop. + * + * @generated from protobuf field: uint64 cltv_expiry = 13; + */ + cltvExpiry: bigint; + /** + * + * Route hints that can each be individually used to assist in reaching the + * invoice's destination. + * + * @generated from protobuf field: repeated lnrpc.RouteHint route_hints = 14; + */ + routeHints: RouteHint[]; + /** + * Whether this invoice should include routing hints for private channels. + * + * @generated from protobuf field: bool private = 15; + */ + private: boolean; + /** + * + * The "add" index of this invoice. Each newly created invoice will increment + * this index making it monotonically increasing. Callers to the + * SubscribeInvoices call can use this to instantly get notified of all added + * invoices with an add_index greater than this one. + * Note: Output only, don't specify for creating an invoice. + * + * @generated from protobuf field: uint64 add_index = 16; + */ + addIndex: bigint; + /** + * + * The "settle" index of this invoice. Each newly settled invoice will + * increment this index making it monotonically increasing. Callers to the + * SubscribeInvoices call can use this to instantly get notified of all + * settled invoices with an settle_index greater than this one. + * Note: Output only, don't specify for creating an invoice. + * + * @generated from protobuf field: uint64 settle_index = 17; + */ + settleIndex: bigint; + /** + * Deprecated, use amt_paid_sat or amt_paid_msat. + * + * @deprecated + * @generated from protobuf field: int64 amt_paid = 18 [deprecated = true]; + */ + amtPaid: bigint; + /** + * + * The amount that was accepted for this invoice, in satoshis. This will ONLY + * be set if this invoice has been settled. We provide this field as if the + * invoice was created with a zero value, then we need to record what amount + * was ultimately accepted. Additionally, it's possible that the sender paid + * MORE that was specified in the original invoice. So we'll record that here + * as well. + * Note: Output only, don't specify for creating an invoice. + * + * @generated from protobuf field: int64 amt_paid_sat = 19; + */ + amtPaidSat: bigint; + /** + * + * The amount that was accepted for this invoice, in millisatoshis. This will + * ONLY be set if this invoice has been settled. We provide this field as if + * the invoice was created with a zero value, then we need to record what + * amount was ultimately accepted. Additionally, it's possible that the sender + * paid MORE that was specified in the original invoice. So we'll record that + * here as well. + * Note: Output only, don't specify for creating an invoice. + * + * @generated from protobuf field: int64 amt_paid_msat = 20; + */ + amtPaidMsat: bigint; + /** + * + * The state the invoice is in. + * Note: Output only, don't specify for creating an invoice. + * + * @generated from protobuf field: lnrpc.Invoice.InvoiceState state = 21; + */ + state: Invoice_InvoiceState; + /** + * + * List of HTLCs paying to this invoice [EXPERIMENTAL]. + * Note: Output only, don't specify for creating an invoice. + * + * @generated from protobuf field: repeated lnrpc.InvoiceHTLC htlcs = 22; + */ + htlcs: InvoiceHTLC[]; + /** + * + * List of features advertised on the invoice. + * Note: Output only, don't specify for creating an invoice. + * + * @generated from protobuf field: map features = 24; + */ + features: { + [key: number]: Feature; + }; + /** + * + * Indicates if this invoice was a spontaneous payment that arrived via keysend + * [EXPERIMENTAL]. + * Note: Output only, don't specify for creating an invoice. + * + * @generated from protobuf field: bool is_keysend = 25; + */ + isKeysend: boolean; + /** + * + * The payment address of this invoice. This value will be used in MPP + * payments, and also for newer invoices that always require the MPP payload + * for added end-to-end security. + * Note: Output only, don't specify for creating an invoice. + * + * @generated from protobuf field: bytes payment_addr = 26; + */ + paymentAddr: Uint8Array; + /** + * + * Signals whether or not this is an AMP invoice. + * + * @generated from protobuf field: bool is_amp = 27; + */ + isAmp: boolean; + /** + * + * [EXPERIMENTAL]: + * + * Maps a 32-byte hex-encoded set ID to the sub-invoice AMP state for the + * given set ID. This field is always populated for AMP invoices, and can be + * used along side LookupInvoice to obtain the HTLC information related to a + * given sub-invoice. + * Note: Output only, don't specify for creating an invoice. + * + * @generated from protobuf field: map amp_invoice_state = 28; + */ + ampInvoiceState: { + [key: string]: AMPInvoiceState; + }; +} +/** + * @generated from protobuf enum lnrpc.Invoice.InvoiceState + */ +export enum Invoice_InvoiceState { + /** + * @generated from protobuf enum value: OPEN = 0; + */ + OPEN = 0, + /** + * @generated from protobuf enum value: SETTLED = 1; + */ + SETTLED = 1, + /** + * @generated from protobuf enum value: CANCELED = 2; + */ + CANCELED = 2, + /** + * @generated from protobuf enum value: ACCEPTED = 3; + */ + ACCEPTED = 3 +} +/** + * Details of an HTLC that paid to an invoice + * + * @generated from protobuf message lnrpc.InvoiceHTLC + */ +export interface InvoiceHTLC { + /** + * Short channel id over which the htlc was received. + * + * @generated from protobuf field: uint64 chan_id = 1 [jstype = JS_STRING]; + */ + chanId: string; + /** + * Index identifying the htlc on the channel. + * + * @generated from protobuf field: uint64 htlc_index = 2; + */ + htlcIndex: bigint; + /** + * The amount of the htlc in msat. + * + * @generated from protobuf field: uint64 amt_msat = 3; + */ + amtMsat: bigint; + /** + * Block height at which this htlc was accepted. + * + * @generated from protobuf field: int32 accept_height = 4; + */ + acceptHeight: number; + /** + * Time at which this htlc was accepted. + * + * @generated from protobuf field: int64 accept_time = 5; + */ + acceptTime: bigint; + /** + * Time at which this htlc was settled or canceled. + * + * @generated from protobuf field: int64 resolve_time = 6; + */ + resolveTime: bigint; + /** + * Block height at which this htlc expires. + * + * @generated from protobuf field: int32 expiry_height = 7; + */ + expiryHeight: number; + /** + * Current state the htlc is in. + * + * @generated from protobuf field: lnrpc.InvoiceHTLCState state = 8; + */ + state: InvoiceHTLCState; + /** + * Custom tlv records. + * + * @generated from protobuf field: map custom_records = 9; + */ + customRecords: { + [key: string]: Uint8Array; + }; + /** + * The total amount of the mpp payment in msat. + * + * @generated from protobuf field: uint64 mpp_total_amt_msat = 10; + */ + mppTotalAmtMsat: bigint; + /** + * Details relevant to AMP HTLCs, only populated if this is an AMP HTLC. + * + * @generated from protobuf field: lnrpc.AMP amp = 11; + */ + amp?: AMP; +} +/** + * Details specific to AMP HTLCs. + * + * @generated from protobuf message lnrpc.AMP + */ +export interface AMP { + /** + * An n-of-n secret share of the root seed from which child payment hashes + * and preimages are derived. + * + * @generated from protobuf field: bytes root_share = 1; + */ + rootShare: Uint8Array; + /** + * An identifier for the HTLC set that this HTLC belongs to. + * + * @generated from protobuf field: bytes set_id = 2; + */ + setId: Uint8Array; + /** + * A nonce used to randomize the child preimage and child hash from a given + * root_share. + * + * @generated from protobuf field: uint32 child_index = 3; + */ + childIndex: number; + /** + * The payment hash of the AMP HTLC. + * + * @generated from protobuf field: bytes hash = 4; + */ + hash: Uint8Array; + /** + * The preimage used to settle this AMP htlc. This field will only be + * populated if the invoice is in InvoiceState_ACCEPTED or + * InvoiceState_SETTLED. + * + * @generated from protobuf field: bytes preimage = 5; + */ + preimage: Uint8Array; +} +/** + * @generated from protobuf message lnrpc.AddInvoiceResponse + */ +export interface AddInvoiceResponse { + /** + * @generated from protobuf field: bytes r_hash = 1; + */ + rHash: Uint8Array; + /** + * + * A bare-bones invoice for a payment within the Lightning Network. With the + * details of the invoice, the sender has all the data necessary to send a + * payment to the recipient. + * + * @generated from protobuf field: string payment_request = 2; + */ + paymentRequest: string; + /** + * + * The "add" index of this invoice. Each newly created invoice will increment + * this index making it monotonically increasing. Callers to the + * SubscribeInvoices call can use this to instantly get notified of all added + * invoices with an add_index greater than this one. + * + * @generated from protobuf field: uint64 add_index = 16; + */ + addIndex: bigint; + /** + * + * The payment address of the generated invoice. This value should be used + * in all payments for this invoice as we require it for end to end + * security. + * + * @generated from protobuf field: bytes payment_addr = 17; + */ + paymentAddr: Uint8Array; +} +/** + * @generated from protobuf message lnrpc.PaymentHash + */ +export interface PaymentHash { + /** + * + * The hex-encoded payment hash of the invoice to be looked up. The passed + * payment hash must be exactly 32 bytes, otherwise an error is returned. + * Deprecated now that the REST gateway supports base64 encoding of bytes + * fields. + * + * @deprecated + * @generated from protobuf field: string r_hash_str = 1 [deprecated = true]; + */ + rHashStr: string; + /** + * + * The payment hash of the invoice to be looked up. When using REST, this field + * must be encoded as base64. + * + * @generated from protobuf field: bytes r_hash = 2; + */ + rHash: Uint8Array; +} +/** + * @generated from protobuf message lnrpc.ListInvoiceRequest + */ +export interface ListInvoiceRequest { + /** + * + * If set, only invoices that are not settled and not canceled will be returned + * in the response. + * + * @generated from protobuf field: bool pending_only = 1; + */ + pendingOnly: boolean; + /** + * + * The index of an invoice that will be used as either the start or end of a + * query to determine which invoices should be returned in the response. + * + * @generated from protobuf field: uint64 index_offset = 4; + */ + indexOffset: bigint; + /** + * The max number of invoices to return in the response to this query. + * + * @generated from protobuf field: uint64 num_max_invoices = 5; + */ + numMaxInvoices: bigint; + /** + * + * If set, the invoices returned will result from seeking backwards from the + * specified index offset. This can be used to paginate backwards. + * + * @generated from protobuf field: bool reversed = 6; + */ + reversed: boolean; +} +/** + * @generated from protobuf message lnrpc.ListInvoiceResponse + */ +export interface ListInvoiceResponse { + /** + * + * A list of invoices from the time slice of the time series specified in the + * request. + * + * @generated from protobuf field: repeated lnrpc.Invoice invoices = 1; + */ + invoices: Invoice[]; + /** + * + * The index of the last item in the set of returned invoices. This can be used + * to seek further, pagination style. + * + * @generated from protobuf field: uint64 last_index_offset = 2; + */ + lastIndexOffset: bigint; + /** + * + * The index of the last item in the set of returned invoices. This can be used + * to seek backwards, pagination style. + * + * @generated from protobuf field: uint64 first_index_offset = 3; + */ + firstIndexOffset: bigint; +} +/** + * @generated from protobuf message lnrpc.InvoiceSubscription + */ +export interface InvoiceSubscription { + /** + * + * If specified (non-zero), then we'll first start by sending out + * notifications for all added indexes with an add_index greater than this + * value. This allows callers to catch up on any events they missed while they + * weren't connected to the streaming RPC. + * + * @generated from protobuf field: uint64 add_index = 1; + */ + addIndex: bigint; + /** + * + * If specified (non-zero), then we'll first start by sending out + * notifications for all settled indexes with an settle_index greater than + * this value. This allows callers to catch up on any events they missed while + * they weren't connected to the streaming RPC. + * + * @generated from protobuf field: uint64 settle_index = 2; + */ + settleIndex: bigint; +} +/** + * @generated from protobuf message lnrpc.Payment + */ +export interface Payment { + /** + * The payment hash + * + * @generated from protobuf field: string payment_hash = 1; + */ + paymentHash: string; + /** + * Deprecated, use value_sat or value_msat. + * + * @deprecated + * @generated from protobuf field: int64 value = 2 [deprecated = true]; + */ + value: bigint; + /** + * Deprecated, use creation_time_ns + * + * @deprecated + * @generated from protobuf field: int64 creation_date = 3 [deprecated = true]; + */ + creationDate: bigint; + /** + * Deprecated, use fee_sat or fee_msat. + * + * @deprecated + * @generated from protobuf field: int64 fee = 5 [deprecated = true]; + */ + fee: bigint; + /** + * The payment preimage + * + * @generated from protobuf field: string payment_preimage = 6; + */ + paymentPreimage: string; + /** + * The value of the payment in satoshis + * + * @generated from protobuf field: int64 value_sat = 7; + */ + valueSat: bigint; + /** + * The value of the payment in milli-satoshis + * + * @generated from protobuf field: int64 value_msat = 8; + */ + valueMsat: bigint; + /** + * The optional payment request being fulfilled. + * + * @generated from protobuf field: string payment_request = 9; + */ + paymentRequest: string; + /** + * The status of the payment. + * + * @generated from protobuf field: lnrpc.Payment.PaymentStatus status = 10; + */ + status: Payment_PaymentStatus; + /** + * The fee paid for this payment in satoshis + * + * @generated from protobuf field: int64 fee_sat = 11; + */ + feeSat: bigint; + /** + * The fee paid for this payment in milli-satoshis + * + * @generated from protobuf field: int64 fee_msat = 12; + */ + feeMsat: bigint; + /** + * The time in UNIX nanoseconds at which the payment was created. + * + * @generated from protobuf field: int64 creation_time_ns = 13; + */ + creationTimeNs: bigint; + /** + * The HTLCs made in attempt to settle the payment. + * + * @generated from protobuf field: repeated lnrpc.HTLCAttempt htlcs = 14; + */ + htlcs: HTLCAttempt[]; + /** + * + * The creation index of this payment. Each payment can be uniquely identified + * by this index, which may not strictly increment by 1 for payments made in + * older versions of lnd. + * + * @generated from protobuf field: uint64 payment_index = 15; + */ + paymentIndex: bigint; + /** + * @generated from protobuf field: lnrpc.PaymentFailureReason failure_reason = 16; + */ + failureReason: PaymentFailureReason; +} +/** + * @generated from protobuf enum lnrpc.Payment.PaymentStatus + */ +export enum Payment_PaymentStatus { + /** + * @generated from protobuf enum value: UNKNOWN = 0; + */ + UNKNOWN = 0, + /** + * @generated from protobuf enum value: IN_FLIGHT = 1; + */ + IN_FLIGHT = 1, + /** + * @generated from protobuf enum value: SUCCEEDED = 2; + */ + SUCCEEDED = 2, + /** + * @generated from protobuf enum value: FAILED = 3; + */ + FAILED = 3 +} +/** + * @generated from protobuf message lnrpc.HTLCAttempt + */ +export interface HTLCAttempt { + /** + * The unique ID that is used for this attempt. + * + * @generated from protobuf field: uint64 attempt_id = 7; + */ + attemptId: bigint; + /** + * The status of the HTLC. + * + * @generated from protobuf field: lnrpc.HTLCAttempt.HTLCStatus status = 1; + */ + status: HTLCAttempt_HTLCStatus; + /** + * The route taken by this HTLC. + * + * @generated from protobuf field: lnrpc.Route route = 2; + */ + route?: Route; + /** + * The time in UNIX nanoseconds at which this HTLC was sent. + * + * @generated from protobuf field: int64 attempt_time_ns = 3; + */ + attemptTimeNs: bigint; + /** + * + * The time in UNIX nanoseconds at which this HTLC was settled or failed. + * This value will not be set if the HTLC is still IN_FLIGHT. + * + * @generated from protobuf field: int64 resolve_time_ns = 4; + */ + resolveTimeNs: bigint; + /** + * Detailed htlc failure info. + * + * @generated from protobuf field: lnrpc.Failure failure = 5; + */ + failure?: Failure; + /** + * The preimage that was used to settle the HTLC. + * + * @generated from protobuf field: bytes preimage = 6; + */ + preimage: Uint8Array; +} +/** + * @generated from protobuf enum lnrpc.HTLCAttempt.HTLCStatus + */ +export enum HTLCAttempt_HTLCStatus { + /** + * @generated from protobuf enum value: IN_FLIGHT = 0; + */ + IN_FLIGHT = 0, + /** + * @generated from protobuf enum value: SUCCEEDED = 1; + */ + SUCCEEDED = 1, + /** + * @generated from protobuf enum value: FAILED = 2; + */ + FAILED = 2 +} +/** + * @generated from protobuf message lnrpc.ListPaymentsRequest + */ +export interface ListPaymentsRequest { + /** + * + * If true, then return payments that have not yet fully completed. This means + * that pending payments, as well as failed payments will show up if this + * field is set to true. This flag doesn't change the meaning of the indices, + * which are tied to individual payments. + * + * @generated from protobuf field: bool include_incomplete = 1; + */ + includeIncomplete: boolean; + /** + * + * The index of a payment that will be used as either the start or end of a + * query to determine which payments should be returned in the response. The + * index_offset is exclusive. In the case of a zero index_offset, the query + * will start with the oldest payment when paginating forwards, or will end + * with the most recent payment when paginating backwards. + * + * @generated from protobuf field: uint64 index_offset = 2; + */ + indexOffset: bigint; + /** + * The maximal number of payments returned in the response to this query. + * + * @generated from protobuf field: uint64 max_payments = 3; + */ + maxPayments: bigint; + /** + * + * If set, the payments returned will result from seeking backwards from the + * specified index offset. This can be used to paginate backwards. The order + * of the returned payments is always oldest first (ascending index order). + * + * @generated from protobuf field: bool reversed = 4; + */ + reversed: boolean; + /** + * + * If set, all payments (complete and incomplete, independent of the + * max_payments parameter) will be counted. Note that setting this to true will + * increase the run time of the call significantly on systems that have a lot + * of payments, as all of them have to be iterated through to be counted. + * + * @generated from protobuf field: bool count_total_payments = 5; + */ + countTotalPayments: boolean; +} +/** + * @generated from protobuf message lnrpc.ListPaymentsResponse + */ +export interface ListPaymentsResponse { + /** + * The list of payments + * + * @generated from protobuf field: repeated lnrpc.Payment payments = 1; + */ + payments: Payment[]; + /** + * + * The index of the first item in the set of returned payments. This can be + * used as the index_offset to continue seeking backwards in the next request. + * + * @generated from protobuf field: uint64 first_index_offset = 2; + */ + firstIndexOffset: bigint; + /** + * + * The index of the last item in the set of returned payments. This can be used + * as the index_offset to continue seeking forwards in the next request. + * + * @generated from protobuf field: uint64 last_index_offset = 3; + */ + lastIndexOffset: bigint; + /** + * + * Will only be set if count_total_payments in the request was set. Represents + * the total number of payments (complete and incomplete, independent of the + * number of payments requested in the query) currently present in the payments + * database. + * + * @generated from protobuf field: uint64 total_num_payments = 4; + */ + totalNumPayments: bigint; +} +/** + * @generated from protobuf message lnrpc.DeletePaymentRequest + */ +export interface DeletePaymentRequest { + /** + * Payment hash to delete. + * + * @generated from protobuf field: bytes payment_hash = 1; + */ + paymentHash: Uint8Array; + /** + * + * Only delete failed HTLCs from the payment, not the payment itself. + * + * @generated from protobuf field: bool failed_htlcs_only = 2; + */ + failedHtlcsOnly: boolean; +} +/** + * @generated from protobuf message lnrpc.DeleteAllPaymentsRequest + */ +export interface DeleteAllPaymentsRequest { + /** + * Only delete failed payments. + * + * @generated from protobuf field: bool failed_payments_only = 1; + */ + failedPaymentsOnly: boolean; + /** + * + * Only delete failed HTLCs from payments, not the payment itself. + * + * @generated from protobuf field: bool failed_htlcs_only = 2; + */ + failedHtlcsOnly: boolean; +} +/** + * @generated from protobuf message lnrpc.DeletePaymentResponse + */ +export interface DeletePaymentResponse { +} +/** + * @generated from protobuf message lnrpc.DeleteAllPaymentsResponse + */ +export interface DeleteAllPaymentsResponse { +} +/** + * @generated from protobuf message lnrpc.AbandonChannelRequest + */ +export interface AbandonChannelRequest { + /** + * @generated from protobuf field: lnrpc.ChannelPoint channel_point = 1; + */ + channelPoint?: ChannelPoint; + /** + * @generated from protobuf field: bool pending_funding_shim_only = 2; + */ + pendingFundingShimOnly: boolean; + /** + * + * Override the requirement for being in dev mode by setting this to true and + * confirming the user knows what they are doing and this is a potential foot + * gun to lose funds if used on active channels. + * + * @generated from protobuf field: bool i_know_what_i_am_doing = 3; + */ + iKnowWhatIAmDoing: boolean; +} +/** + * @generated from protobuf message lnrpc.AbandonChannelResponse + */ +export interface AbandonChannelResponse { +} +/** + * @generated from protobuf message lnrpc.DebugLevelRequest + */ +export interface DebugLevelRequest { + /** + * @generated from protobuf field: bool show = 1; + */ + show: boolean; + /** + * @generated from protobuf field: string level_spec = 2; + */ + levelSpec: string; +} +/** + * @generated from protobuf message lnrpc.DebugLevelResponse + */ +export interface DebugLevelResponse { + /** + * @generated from protobuf field: string sub_systems = 1; + */ + subSystems: string; +} +/** + * @generated from protobuf message lnrpc.PayReqString + */ +export interface PayReqString { + /** + * The payment request string to be decoded + * + * @generated from protobuf field: string pay_req = 1; + */ + payReq: string; +} +/** + * @generated from protobuf message lnrpc.PayReq + */ +export interface PayReq { + /** + * @generated from protobuf field: string destination = 1; + */ + destination: string; + /** + * @generated from protobuf field: string payment_hash = 2; + */ + paymentHash: string; + /** + * @generated from protobuf field: int64 num_satoshis = 3; + */ + numSatoshis: bigint; + /** + * @generated from protobuf field: int64 timestamp = 4; + */ + timestamp: bigint; + /** + * @generated from protobuf field: int64 expiry = 5; + */ + expiry: bigint; + /** + * @generated from protobuf field: string description = 6; + */ + description: string; + /** + * @generated from protobuf field: string description_hash = 7; + */ + descriptionHash: string; + /** + * @generated from protobuf field: string fallback_addr = 8; + */ + fallbackAddr: string; + /** + * @generated from protobuf field: int64 cltv_expiry = 9; + */ + cltvExpiry: bigint; + /** + * @generated from protobuf field: repeated lnrpc.RouteHint route_hints = 10; + */ + routeHints: RouteHint[]; + /** + * @generated from protobuf field: bytes payment_addr = 11; + */ + paymentAddr: Uint8Array; + /** + * @generated from protobuf field: int64 num_msat = 12; + */ + numMsat: bigint; + /** + * @generated from protobuf field: map features = 13; + */ + features: { + [key: number]: Feature; + }; +} +/** + * @generated from protobuf message lnrpc.Feature + */ +export interface Feature { + /** + * @generated from protobuf field: string name = 2; + */ + name: string; + /** + * @generated from protobuf field: bool is_required = 3; + */ + isRequired: boolean; + /** + * @generated from protobuf field: bool is_known = 4; + */ + isKnown: boolean; +} +/** + * @generated from protobuf message lnrpc.FeeReportRequest + */ +export interface FeeReportRequest { +} +/** + * @generated from protobuf message lnrpc.ChannelFeeReport + */ +export interface ChannelFeeReport { + /** + * The short channel id that this fee report belongs to. + * + * @generated from protobuf field: uint64 chan_id = 5 [jstype = JS_STRING]; + */ + chanId: string; + /** + * The channel that this fee report belongs to. + * + * @generated from protobuf field: string channel_point = 1; + */ + channelPoint: string; + /** + * The base fee charged regardless of the number of milli-satoshis sent. + * + * @generated from protobuf field: int64 base_fee_msat = 2; + */ + baseFeeMsat: bigint; + /** + * The amount charged per milli-satoshis transferred expressed in + * millionths of a satoshi. + * + * @generated from protobuf field: int64 fee_per_mil = 3; + */ + feePerMil: bigint; + /** + * The effective fee rate in milli-satoshis. Computed by dividing the + * fee_per_mil value by 1 million. + * + * @generated from protobuf field: double fee_rate = 4; + */ + feeRate: number; +} +/** + * @generated from protobuf message lnrpc.FeeReportResponse + */ +export interface FeeReportResponse { + /** + * An array of channel fee reports which describes the current fee schedule + * for each channel. + * + * @generated from protobuf field: repeated lnrpc.ChannelFeeReport channel_fees = 1; + */ + channelFees: ChannelFeeReport[]; + /** + * The total amount of fee revenue (in satoshis) the switch has collected + * over the past 24 hrs. + * + * @generated from protobuf field: uint64 day_fee_sum = 2; + */ + dayFeeSum: bigint; + /** + * The total amount of fee revenue (in satoshis) the switch has collected + * over the past 1 week. + * + * @generated from protobuf field: uint64 week_fee_sum = 3; + */ + weekFeeSum: bigint; + /** + * The total amount of fee revenue (in satoshis) the switch has collected + * over the past 1 month. + * + * @generated from protobuf field: uint64 month_fee_sum = 4; + */ + monthFeeSum: bigint; +} +/** + * @generated from protobuf message lnrpc.PolicyUpdateRequest + */ +export interface PolicyUpdateRequest { + /** + * @generated from protobuf oneof: scope + */ + scope: { + oneofKind: "global"; + /** + * If set, then this update applies to all currently active channels. + * + * @generated from protobuf field: bool global = 1; + */ + global: boolean; + } | { + oneofKind: "chanPoint"; + /** + * If set, this update will target a specific channel. + * + * @generated from protobuf field: lnrpc.ChannelPoint chan_point = 2; + */ + chanPoint: ChannelPoint; + } | { + oneofKind: undefined; + }; + /** + * The base fee charged regardless of the number of milli-satoshis sent. + * + * @generated from protobuf field: int64 base_fee_msat = 3; + */ + baseFeeMsat: bigint; + /** + * The effective fee rate in milli-satoshis. The precision of this value + * goes up to 6 decimal places, so 1e-6. + * + * @generated from protobuf field: double fee_rate = 4; + */ + feeRate: number; + /** + * The effective fee rate in micro-satoshis (parts per million). + * + * @generated from protobuf field: uint32 fee_rate_ppm = 9; + */ + feeRatePpm: number; + /** + * The required timelock delta for HTLCs forwarded over the channel. + * + * @generated from protobuf field: uint32 time_lock_delta = 5; + */ + timeLockDelta: number; + /** + * If set, the maximum HTLC size in milli-satoshis. If unset, the maximum + * HTLC will be unchanged. + * + * @generated from protobuf field: uint64 max_htlc_msat = 6; + */ + maxHtlcMsat: bigint; + /** + * The minimum HTLC size in milli-satoshis. Only applied if + * min_htlc_msat_specified is true. + * + * @generated from protobuf field: uint64 min_htlc_msat = 7; + */ + minHtlcMsat: bigint; + /** + * If true, min_htlc_msat is applied. + * + * @generated from protobuf field: bool min_htlc_msat_specified = 8; + */ + minHtlcMsatSpecified: boolean; +} +/** + * @generated from protobuf message lnrpc.FailedUpdate + */ +export interface FailedUpdate { + /** + * The outpoint in format txid:n + * + * @generated from protobuf field: lnrpc.OutPoint outpoint = 1; + */ + outpoint?: OutPoint; + /** + * Reason for the policy update failure. + * + * @generated from protobuf field: lnrpc.UpdateFailure reason = 2; + */ + reason: UpdateFailure; + /** + * A string representation of the policy update error. + * + * @generated from protobuf field: string update_error = 3; + */ + updateError: string; +} +/** + * @generated from protobuf message lnrpc.PolicyUpdateResponse + */ +export interface PolicyUpdateResponse { + /** + * List of failed policy updates. + * + * @generated from protobuf field: repeated lnrpc.FailedUpdate failed_updates = 1; + */ + failedUpdates: FailedUpdate[]; +} +/** + * @generated from protobuf message lnrpc.ForwardingHistoryRequest + */ +export interface ForwardingHistoryRequest { + /** + * Start time is the starting point of the forwarding history request. All + * records beyond this point will be included, respecting the end time, and + * the index offset. + * + * @generated from protobuf field: uint64 start_time = 1; + */ + startTime: bigint; + /** + * End time is the end point of the forwarding history request. The + * response will carry at most 50k records between the start time and the + * end time. The index offset can be used to implement pagination. + * + * @generated from protobuf field: uint64 end_time = 2; + */ + endTime: bigint; + /** + * Index offset is the offset in the time series to start at. As each + * response can only contain 50k records, callers can use this to skip + * around within a packed time series. + * + * @generated from protobuf field: uint32 index_offset = 3; + */ + indexOffset: number; + /** + * The max number of events to return in the response to this query. + * + * @generated from protobuf field: uint32 num_max_events = 4; + */ + numMaxEvents: number; + /** + * Informs the server if the peer alias should be looked up for each + * forwarding event. + * + * @generated from protobuf field: bool peer_alias_lookup = 5; + */ + peerAliasLookup: boolean; +} +/** + * @generated from protobuf message lnrpc.ForwardingEvent + */ +export interface ForwardingEvent { + /** + * Timestamp is the time (unix epoch offset) that this circuit was + * completed. Deprecated by timestamp_ns. + * + * @deprecated + * @generated from protobuf field: uint64 timestamp = 1 [deprecated = true]; + */ + timestamp: bigint; + /** + * The incoming channel ID that carried the HTLC that created the circuit. + * + * @generated from protobuf field: uint64 chan_id_in = 2 [jstype = JS_STRING]; + */ + chanIdIn: string; + /** + * The outgoing channel ID that carried the preimage that completed the + * circuit. + * + * @generated from protobuf field: uint64 chan_id_out = 4 [jstype = JS_STRING]; + */ + chanIdOut: string; + /** + * The total amount (in satoshis) of the incoming HTLC that created half + * the circuit. + * + * @generated from protobuf field: uint64 amt_in = 5; + */ + amtIn: bigint; + /** + * The total amount (in satoshis) of the outgoing HTLC that created the + * second half of the circuit. + * + * @generated from protobuf field: uint64 amt_out = 6; + */ + amtOut: bigint; + /** + * The total fee (in satoshis) that this payment circuit carried. + * + * @generated from protobuf field: uint64 fee = 7; + */ + fee: bigint; + /** + * The total fee (in milli-satoshis) that this payment circuit carried. + * + * @generated from protobuf field: uint64 fee_msat = 8; + */ + feeMsat: bigint; + /** + * The total amount (in milli-satoshis) of the incoming HTLC that created + * half the circuit. + * + * @generated from protobuf field: uint64 amt_in_msat = 9; + */ + amtInMsat: bigint; + /** + * The total amount (in milli-satoshis) of the outgoing HTLC that created + * the second half of the circuit. + * + * @generated from protobuf field: uint64 amt_out_msat = 10; + */ + amtOutMsat: bigint; + /** + * The number of nanoseconds elapsed since January 1, 1970 UTC when this + * circuit was completed. + * + * @generated from protobuf field: uint64 timestamp_ns = 11; + */ + timestampNs: bigint; + /** + * The peer alias of the incoming channel. + * + * @generated from protobuf field: string peer_alias_in = 12; + */ + peerAliasIn: string; + /** + * The peer alias of the outgoing channel. + * + * @generated from protobuf field: string peer_alias_out = 13; + */ + peerAliasOut: string; +} +/** + * @generated from protobuf message lnrpc.ForwardingHistoryResponse + */ +export interface ForwardingHistoryResponse { + /** + * A list of forwarding events from the time slice of the time series + * specified in the request. + * + * @generated from protobuf field: repeated lnrpc.ForwardingEvent forwarding_events = 1; + */ + forwardingEvents: ForwardingEvent[]; + /** + * The index of the last time in the set of returned forwarding events. Can + * be used to seek further, pagination style. + * + * @generated from protobuf field: uint32 last_offset_index = 2; + */ + lastOffsetIndex: number; +} +/** + * @generated from protobuf message lnrpc.ExportChannelBackupRequest + */ +export interface ExportChannelBackupRequest { + /** + * The target channel point to obtain a back up for. + * + * @generated from protobuf field: lnrpc.ChannelPoint chan_point = 1; + */ + chanPoint?: ChannelPoint; +} +/** + * @generated from protobuf message lnrpc.ChannelBackup + */ +export interface ChannelBackup { + /** + * + * Identifies the channel that this backup belongs to. + * + * @generated from protobuf field: lnrpc.ChannelPoint chan_point = 1; + */ + chanPoint?: ChannelPoint; + /** + * + * Is an encrypted single-chan backup. this can be passed to + * RestoreChannelBackups, or the WalletUnlocker Init and Unlock methods in + * order to trigger the recovery protocol. When using REST, this field must be + * encoded as base64. + * + * @generated from protobuf field: bytes chan_backup = 2; + */ + chanBackup: Uint8Array; +} +/** + * @generated from protobuf message lnrpc.MultiChanBackup + */ +export interface MultiChanBackup { + /** + * + * Is the set of all channels that are included in this multi-channel backup. + * + * @generated from protobuf field: repeated lnrpc.ChannelPoint chan_points = 1; + */ + chanPoints: ChannelPoint[]; + /** + * + * A single encrypted blob containing all the static channel backups of the + * channel listed above. This can be stored as a single file or blob, and + * safely be replaced with any prior/future versions. When using REST, this + * field must be encoded as base64. + * + * @generated from protobuf field: bytes multi_chan_backup = 2; + */ + multiChanBackup: Uint8Array; +} +/** + * @generated from protobuf message lnrpc.ChanBackupExportRequest + */ +export interface ChanBackupExportRequest { +} +/** + * @generated from protobuf message lnrpc.ChanBackupSnapshot + */ +export interface ChanBackupSnapshot { + /** + * + * The set of new channels that have been added since the last channel backup + * snapshot was requested. + * + * @generated from protobuf field: lnrpc.ChannelBackups single_chan_backups = 1; + */ + singleChanBackups?: ChannelBackups; + /** + * + * A multi-channel backup that covers all open channels currently known to + * lnd. + * + * @generated from protobuf field: lnrpc.MultiChanBackup multi_chan_backup = 2; + */ + multiChanBackup?: MultiChanBackup; +} +/** + * @generated from protobuf message lnrpc.ChannelBackups + */ +export interface ChannelBackups { + /** + * + * A set of single-chan static channel backups. + * + * @generated from protobuf field: repeated lnrpc.ChannelBackup chan_backups = 1; + */ + chanBackups: ChannelBackup[]; +} +/** + * @generated from protobuf message lnrpc.RestoreChanBackupRequest + */ +export interface RestoreChanBackupRequest { + /** + * @generated from protobuf oneof: backup + */ + backup: { + oneofKind: "chanBackups"; + /** + * + * The channels to restore as a list of channel/backup pairs. + * + * @generated from protobuf field: lnrpc.ChannelBackups chan_backups = 1; + */ + chanBackups: ChannelBackups; + } | { + oneofKind: "multiChanBackup"; + /** + * + * The channels to restore in the packed multi backup format. When using + * REST, this field must be encoded as base64. + * + * @generated from protobuf field: bytes multi_chan_backup = 2; + */ + multiChanBackup: Uint8Array; + } | { + oneofKind: undefined; + }; +} +/** + * @generated from protobuf message lnrpc.RestoreBackupResponse + */ +export interface RestoreBackupResponse { +} +/** + * @generated from protobuf message lnrpc.ChannelBackupSubscription + */ +export interface ChannelBackupSubscription { +} +/** + * @generated from protobuf message lnrpc.VerifyChanBackupResponse + */ +export interface VerifyChanBackupResponse { +} +/** + * @generated from protobuf message lnrpc.MacaroonPermission + */ +export interface MacaroonPermission { + /** + * The entity a permission grants access to. + * + * @generated from protobuf field: string entity = 1; + */ + entity: string; + /** + * The action that is granted. + * + * @generated from protobuf field: string action = 2; + */ + action: string; +} +/** + * @generated from protobuf message lnrpc.BakeMacaroonRequest + */ +export interface BakeMacaroonRequest { + /** + * The list of permissions the new macaroon should grant. + * + * @generated from protobuf field: repeated lnrpc.MacaroonPermission permissions = 1; + */ + permissions: MacaroonPermission[]; + /** + * The root key ID used to create the macaroon, must be a positive integer. + * + * @generated from protobuf field: uint64 root_key_id = 2; + */ + rootKeyId: bigint; + /** + * + * Informs the RPC on whether to allow external permissions that LND is not + * aware of. + * + * @generated from protobuf field: bool allow_external_permissions = 3; + */ + allowExternalPermissions: boolean; +} +/** + * @generated from protobuf message lnrpc.BakeMacaroonResponse + */ +export interface BakeMacaroonResponse { + /** + * The hex encoded macaroon, serialized in binary format. + * + * @generated from protobuf field: string macaroon = 1; + */ + macaroon: string; +} +/** + * @generated from protobuf message lnrpc.ListMacaroonIDsRequest + */ +export interface ListMacaroonIDsRequest { +} +/** + * @generated from protobuf message lnrpc.ListMacaroonIDsResponse + */ +export interface ListMacaroonIDsResponse { + /** + * The list of root key IDs that are in use. + * + * @generated from protobuf field: repeated uint64 root_key_ids = 1; + */ + rootKeyIds: bigint[]; +} +/** + * @generated from protobuf message lnrpc.DeleteMacaroonIDRequest + */ +export interface DeleteMacaroonIDRequest { + /** + * The root key ID to be removed. + * + * @generated from protobuf field: uint64 root_key_id = 1; + */ + rootKeyId: bigint; +} +/** + * @generated from protobuf message lnrpc.DeleteMacaroonIDResponse + */ +export interface DeleteMacaroonIDResponse { + /** + * A boolean indicates that the deletion is successful. + * + * @generated from protobuf field: bool deleted = 1; + */ + deleted: boolean; +} +/** + * @generated from protobuf message lnrpc.MacaroonPermissionList + */ +export interface MacaroonPermissionList { + /** + * A list of macaroon permissions. + * + * @generated from protobuf field: repeated lnrpc.MacaroonPermission permissions = 1; + */ + permissions: MacaroonPermission[]; +} +/** + * @generated from protobuf message lnrpc.ListPermissionsRequest + */ +export interface ListPermissionsRequest { +} +/** + * @generated from protobuf message lnrpc.ListPermissionsResponse + */ +export interface ListPermissionsResponse { + /** + * + * A map between all RPC method URIs and their required macaroon permissions to + * access them. + * + * @generated from protobuf field: map method_permissions = 1; + */ + methodPermissions: { + [key: string]: MacaroonPermissionList; + }; +} +/** + * @generated from protobuf message lnrpc.Failure + */ +export interface Failure { + /** + * Failure code as defined in the Lightning spec + * + * @generated from protobuf field: lnrpc.Failure.FailureCode code = 1; + */ + code: Failure_FailureCode; + /** + * An optional channel update message. + * + * @generated from protobuf field: lnrpc.ChannelUpdate channel_update = 3; + */ + channelUpdate?: ChannelUpdate; + /** + * A failure type-dependent htlc value. + * + * @generated from protobuf field: uint64 htlc_msat = 4; + */ + htlcMsat: bigint; + /** + * The sha256 sum of the onion payload. + * + * @generated from protobuf field: bytes onion_sha_256 = 5; + */ + onionSha256: Uint8Array; + /** + * A failure type-dependent cltv expiry value. + * + * @generated from protobuf field: uint32 cltv_expiry = 6; + */ + cltvExpiry: number; + /** + * A failure type-dependent flags value. + * + * @generated from protobuf field: uint32 flags = 7; + */ + flags: number; + /** + * + * The position in the path of the intermediate or final node that generated + * the failure message. Position zero is the sender node. + * + * @generated from protobuf field: uint32 failure_source_index = 8; + */ + failureSourceIndex: number; + /** + * A failure type-dependent block height. + * + * @generated from protobuf field: uint32 height = 9; + */ + height: number; +} +/** + * @generated from protobuf enum lnrpc.Failure.FailureCode + */ +export enum Failure_FailureCode { + /** + * + * The numbers assigned in this enumeration match the failure codes as + * defined in BOLT #4. Because protobuf 3 requires enums to start with 0, + * a RESERVED value is added. + * + * @generated from protobuf enum value: RESERVED = 0; + */ + RESERVED = 0, + /** + * @generated from protobuf enum value: INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS = 1; + */ + INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS = 1, + /** + * @generated from protobuf enum value: INCORRECT_PAYMENT_AMOUNT = 2; + */ + INCORRECT_PAYMENT_AMOUNT = 2, + /** + * @generated from protobuf enum value: FINAL_INCORRECT_CLTV_EXPIRY = 3; + */ + FINAL_INCORRECT_CLTV_EXPIRY = 3, + /** + * @generated from protobuf enum value: FINAL_INCORRECT_HTLC_AMOUNT = 4; + */ + FINAL_INCORRECT_HTLC_AMOUNT = 4, + /** + * @generated from protobuf enum value: FINAL_EXPIRY_TOO_SOON = 5; + */ + FINAL_EXPIRY_TOO_SOON = 5, + /** + * @generated from protobuf enum value: INVALID_REALM = 6; + */ + INVALID_REALM = 6, + /** + * @generated from protobuf enum value: EXPIRY_TOO_SOON = 7; + */ + EXPIRY_TOO_SOON = 7, + /** + * @generated from protobuf enum value: INVALID_ONION_VERSION = 8; + */ + INVALID_ONION_VERSION = 8, + /** + * @generated from protobuf enum value: INVALID_ONION_HMAC = 9; + */ + INVALID_ONION_HMAC = 9, + /** + * @generated from protobuf enum value: INVALID_ONION_KEY = 10; + */ + INVALID_ONION_KEY = 10, + /** + * @generated from protobuf enum value: AMOUNT_BELOW_MINIMUM = 11; + */ + AMOUNT_BELOW_MINIMUM = 11, + /** + * @generated from protobuf enum value: FEE_INSUFFICIENT = 12; + */ + FEE_INSUFFICIENT = 12, + /** + * @generated from protobuf enum value: INCORRECT_CLTV_EXPIRY = 13; + */ + INCORRECT_CLTV_EXPIRY = 13, + /** + * @generated from protobuf enum value: CHANNEL_DISABLED = 14; + */ + CHANNEL_DISABLED = 14, + /** + * @generated from protobuf enum value: TEMPORARY_CHANNEL_FAILURE = 15; + */ + TEMPORARY_CHANNEL_FAILURE = 15, + /** + * @generated from protobuf enum value: REQUIRED_NODE_FEATURE_MISSING = 16; + */ + REQUIRED_NODE_FEATURE_MISSING = 16, + /** + * @generated from protobuf enum value: REQUIRED_CHANNEL_FEATURE_MISSING = 17; + */ + REQUIRED_CHANNEL_FEATURE_MISSING = 17, + /** + * @generated from protobuf enum value: UNKNOWN_NEXT_PEER = 18; + */ + UNKNOWN_NEXT_PEER = 18, + /** + * @generated from protobuf enum value: TEMPORARY_NODE_FAILURE = 19; + */ + TEMPORARY_NODE_FAILURE = 19, + /** + * @generated from protobuf enum value: PERMANENT_NODE_FAILURE = 20; + */ + PERMANENT_NODE_FAILURE = 20, + /** + * @generated from protobuf enum value: PERMANENT_CHANNEL_FAILURE = 21; + */ + PERMANENT_CHANNEL_FAILURE = 21, + /** + * @generated from protobuf enum value: EXPIRY_TOO_FAR = 22; + */ + EXPIRY_TOO_FAR = 22, + /** + * @generated from protobuf enum value: MPP_TIMEOUT = 23; + */ + MPP_TIMEOUT = 23, + /** + * @generated from protobuf enum value: INVALID_ONION_PAYLOAD = 24; + */ + INVALID_ONION_PAYLOAD = 24, + /** + * + * An internal error occurred. + * + * @generated from protobuf enum value: INTERNAL_FAILURE = 997; + */ + INTERNAL_FAILURE = 997, + /** + * + * The error source is known, but the failure itself couldn't be decoded. + * + * @generated from protobuf enum value: UNKNOWN_FAILURE = 998; + */ + UNKNOWN_FAILURE = 998, + /** + * + * An unreadable failure result is returned if the received failure message + * cannot be decrypted. In that case the error source is unknown. + * + * @generated from protobuf enum value: UNREADABLE_FAILURE = 999; + */ + UNREADABLE_FAILURE = 999 +} +/** + * @generated from protobuf message lnrpc.ChannelUpdate + */ +export interface ChannelUpdate { + /** + * + * The signature that validates the announced data and proves the ownership + * of node id. + * + * @generated from protobuf field: bytes signature = 1; + */ + signature: Uint8Array; + /** + * + * The target chain that this channel was opened within. This value + * should be the genesis hash of the target chain. Along with the short + * channel ID, this uniquely identifies the channel globally in a + * blockchain. + * + * @generated from protobuf field: bytes chain_hash = 2; + */ + chainHash: Uint8Array; + /** + * + * The unique description of the funding transaction. + * + * @generated from protobuf field: uint64 chan_id = 3 [jstype = JS_STRING]; + */ + chanId: string; + /** + * + * A timestamp that allows ordering in the case of multiple announcements. + * We should ignore the message if timestamp is not greater than the + * last-received. + * + * @generated from protobuf field: uint32 timestamp = 4; + */ + timestamp: number; + /** + * + * The bitfield that describes whether optional fields are present in this + * update. Currently, the least-significant bit must be set to 1 if the + * optional field MaxHtlc is present. + * + * @generated from protobuf field: uint32 message_flags = 10; + */ + messageFlags: number; + /** + * + * The bitfield that describes additional meta-data concerning how the + * update is to be interpreted. Currently, the least-significant bit must be + * set to 0 if the creating node corresponds to the first node in the + * previously sent channel announcement and 1 otherwise. If the second bit + * is set, then the channel is set to be disabled. + * + * @generated from protobuf field: uint32 channel_flags = 5; + */ + channelFlags: number; + /** + * + * The minimum number of blocks this node requires to be added to the expiry + * of HTLCs. This is a security parameter determined by the node operator. + * This value represents the required gap between the time locks of the + * incoming and outgoing HTLC's set to this node. + * + * @generated from protobuf field: uint32 time_lock_delta = 6; + */ + timeLockDelta: number; + /** + * + * The minimum HTLC value which will be accepted. + * + * @generated from protobuf field: uint64 htlc_minimum_msat = 7; + */ + htlcMinimumMsat: bigint; + /** + * + * The base fee that must be used for incoming HTLC's to this particular + * channel. This value will be tacked onto the required for a payment + * independent of the size of the payment. + * + * @generated from protobuf field: uint32 base_fee = 8; + */ + baseFee: number; + /** + * + * The fee rate that will be charged per millionth of a satoshi. + * + * @generated from protobuf field: uint32 fee_rate = 9; + */ + feeRate: number; + /** + * + * The maximum HTLC value which will be accepted. + * + * @generated from protobuf field: uint64 htlc_maximum_msat = 11; + */ + htlcMaximumMsat: bigint; + /** + * + * The set of data that was appended to this message, some of which we may + * not actually know how to iterate or parse. By holding onto this data, we + * ensure that we're able to properly validate the set of signatures that + * cover these new fields, and ensure we're able to make upgrades to the + * network in a forwards compatible manner. + * + * @generated from protobuf field: bytes extra_opaque_data = 12; + */ + extraOpaqueData: Uint8Array; +} +/** + * @generated from protobuf message lnrpc.MacaroonId + */ +export interface MacaroonId { + /** + * @generated from protobuf field: bytes nonce = 1; + */ + nonce: Uint8Array; + /** + * @generated from protobuf field: bytes storageId = 2; + */ + storageId: Uint8Array; + /** + * @generated from protobuf field: repeated lnrpc.Op ops = 3; + */ + ops: Op[]; +} +/** + * @generated from protobuf message lnrpc.Op + */ +export interface Op { + /** + * @generated from protobuf field: string entity = 1; + */ + entity: string; + /** + * @generated from protobuf field: repeated string actions = 2; + */ + actions: string[]; +} +/** + * @generated from protobuf message lnrpc.CheckMacPermRequest + */ +export interface CheckMacPermRequest { + /** + * @generated from protobuf field: bytes macaroon = 1; + */ + macaroon: Uint8Array; + /** + * @generated from protobuf field: repeated lnrpc.MacaroonPermission permissions = 2; + */ + permissions: MacaroonPermission[]; + /** + * @generated from protobuf field: string fullMethod = 3; + */ + fullMethod: string; +} +/** + * @generated from protobuf message lnrpc.CheckMacPermResponse + */ +export interface CheckMacPermResponse { + /** + * @generated from protobuf field: bool valid = 1; + */ + valid: boolean; +} +/** + * @generated from protobuf message lnrpc.RPCMiddlewareRequest + */ +export interface RPCMiddlewareRequest { + /** + * + * The unique ID of the intercepted original gRPC request. Useful for mapping + * request to response when implementing full duplex message interception. For + * streaming requests, this will be the same ID for all incoming and outgoing + * middleware intercept messages of the _same_ stream. + * + * @generated from protobuf field: uint64 request_id = 1; + */ + requestId: bigint; + /** + * + * The raw bytes of the complete macaroon as sent by the gRPC client in the + * original request. This might be empty for a request that doesn't require + * macaroons such as the wallet unlocker RPCs. + * + * @generated from protobuf field: bytes raw_macaroon = 2; + */ + rawMacaroon: Uint8Array; + /** + * + * The parsed condition of the macaroon's custom caveat for convenient access. + * This field only contains the value of the custom caveat that the handling + * middleware has registered itself for. The condition _must_ be validated for + * messages of intercept_type stream_auth and request! + * + * @generated from protobuf field: string custom_caveat_condition = 3; + */ + customCaveatCondition: string; + /** + * @generated from protobuf oneof: intercept_type + */ + interceptType: { + oneofKind: "streamAuth"; + /** + * + * Intercept stream authentication: each new streaming RPC call that is + * initiated against lnd and contains the middleware's custom macaroon + * caveat can be approved or denied based upon the macaroon in the stream + * header. This message will only be sent for streaming RPCs, unary RPCs + * must handle the macaroon authentication in the request interception to + * avoid an additional message round trip between lnd and the middleware. + * + * @generated from protobuf field: lnrpc.StreamAuth stream_auth = 4; + */ + streamAuth: StreamAuth; + } | { + oneofKind: "request"; + /** + * + * Intercept incoming gRPC client request message: all incoming messages, + * both on streaming and unary RPCs, are forwarded to the middleware for + * inspection. For unary RPC messages the middleware is also expected to + * validate the custom macaroon caveat of the request. + * + * @generated from protobuf field: lnrpc.RPCMessage request = 5; + */ + request: RPCMessage; + } | { + oneofKind: "response"; + /** + * + * Intercept outgoing gRPC response message: all outgoing messages, both on + * streaming and unary RPCs, are forwarded to the middleware for inspection + * and amendment. The response in this message is the original response as + * it was generated by the main RPC server. It can either be accepted + * (=forwarded to the client), replaced/overwritten with a new message of + * the same type, or replaced by an error message. + * + * @generated from protobuf field: lnrpc.RPCMessage response = 6; + */ + response: RPCMessage; + } | { + oneofKind: "regComplete"; + /** + * + * This is used to indicate to the client that the server has successfully + * registered the interceptor. This is only used in the very first message + * that the server sends to the client after the client sends the server + * the middleware registration message. + * + * @generated from protobuf field: bool reg_complete = 8; + */ + regComplete: boolean; + } | { + oneofKind: undefined; + }; + /** + * + * The unique message ID of this middleware intercept message. There can be + * multiple middleware intercept messages per single gRPC request (one for the + * incoming request and one for the outgoing response) or gRPC stream (one for + * each incoming message and one for each outgoing response). This message ID + * must be referenced when responding (accepting/rejecting/modifying) to an + * intercept message. + * + * @generated from protobuf field: uint64 msg_id = 7; + */ + msgId: bigint; +} +/** + * @generated from protobuf message lnrpc.StreamAuth + */ +export interface StreamAuth { + /** + * + * The full URI (in the format /./MethodName, for + * example /lnrpc.Lightning/GetInfo) of the streaming RPC method that was just + * established. + * + * @generated from protobuf field: string method_full_uri = 1; + */ + methodFullUri: string; +} +/** + * @generated from protobuf message lnrpc.RPCMessage + */ +export interface RPCMessage { + /** + * + * The full URI (in the format /./MethodName, for + * example /lnrpc.Lightning/GetInfo) of the RPC method the message was sent + * to/from. + * + * @generated from protobuf field: string method_full_uri = 1; + */ + methodFullUri: string; + /** + * + * Indicates whether the message was sent over a streaming RPC method or not. + * + * @generated from protobuf field: bool stream_rpc = 2; + */ + streamRpc: boolean; + /** + * + * The full canonical gRPC name of the message type (in the format + * .TypeName, for example lnrpc.GetInfoRequest). In case of an + * error being returned from lnd, this simply contains the string "error". + * + * @generated from protobuf field: string type_name = 3; + */ + typeName: string; + /** + * + * The full content of the gRPC message, serialized in the binary protobuf + * format. + * + * @generated from protobuf field: bytes serialized = 4; + */ + serialized: Uint8Array; + /** + * + * Indicates that the response from lnd was an error, not a gRPC response. If + * this is set to true then the type_name contains the string "error" and + * serialized contains the error string. + * + * @generated from protobuf field: bool is_error = 5; + */ + isError: boolean; +} +/** + * @generated from protobuf message lnrpc.RPCMiddlewareResponse + */ +export interface RPCMiddlewareResponse { + /** + * + * The request message ID this response refers to. Must always be set when + * giving feedback to an intercept but is ignored for the initial registration + * message. + * + * @generated from protobuf field: uint64 ref_msg_id = 1; + */ + refMsgId: bigint; + /** + * @generated from protobuf oneof: middleware_message + */ + middlewareMessage: { + oneofKind: "register"; + /** + * + * The registration message identifies the middleware that's being + * registered in lnd. The registration message must be sent immediately + * after initiating the RegisterRpcMiddleware stream, otherwise lnd will + * time out the attempt and terminate the request. NOTE: The middleware + * will only receive interception messages for requests that contain a + * macaroon with the custom caveat that the middleware declares it is + * responsible for handling in the registration message! As a security + * measure, _no_ middleware can intercept requests made with _unencumbered_ + * macaroons! + * + * @generated from protobuf field: lnrpc.MiddlewareRegistration register = 2; + */ + register: MiddlewareRegistration; + } | { + oneofKind: "feedback"; + /** + * + * The middleware received an interception request and gives feedback to + * it. The request_id indicates what message the feedback refers to. + * + * @generated from protobuf field: lnrpc.InterceptFeedback feedback = 3; + */ + feedback: InterceptFeedback; + } | { + oneofKind: undefined; + }; +} +/** + * @generated from protobuf message lnrpc.MiddlewareRegistration + */ +export interface MiddlewareRegistration { + /** + * + * The name of the middleware to register. The name should be as informative + * as possible and is logged on registration. + * + * @generated from protobuf field: string middleware_name = 1; + */ + middlewareName: string; + /** + * + * The name of the custom macaroon caveat that this middleware is responsible + * for. Only requests/responses that contain a macaroon with the registered + * custom caveat are forwarded for interception to the middleware. The + * exception being the read-only mode: All requests/responses are forwarded to + * a middleware that requests read-only access but such a middleware won't be + * allowed to _alter_ responses. As a security measure, _no_ middleware can + * change responses to requests made with _unencumbered_ macaroons! + * NOTE: Cannot be used at the same time as read_only_mode. + * + * @generated from protobuf field: string custom_macaroon_caveat_name = 2; + */ + customMacaroonCaveatName: string; + /** + * + * Instead of defining a custom macaroon caveat name a middleware can register + * itself for read-only access only. In that mode all requests/responses are + * forwarded to the middleware but the middleware isn't allowed to alter any of + * the responses. + * NOTE: Cannot be used at the same time as custom_macaroon_caveat_name. + * + * @generated from protobuf field: bool read_only_mode = 3; + */ + readOnlyMode: boolean; +} +/** + * @generated from protobuf message lnrpc.InterceptFeedback + */ +export interface InterceptFeedback { + /** + * + * The error to return to the user. If this is non-empty, the incoming gRPC + * stream/request is aborted and the error is returned to the gRPC client. If + * this value is empty, it means the middleware accepts the stream/request/ + * response and the processing of it can continue. + * + * @generated from protobuf field: string error = 1; + */ + error: string; + /** + * + * A boolean indicating that the gRPC message should be replaced/overwritten. + * This boolean is needed because in protobuf an empty message is serialized as + * a 0-length or nil byte slice and we wouldn't be able to distinguish between + * an empty replacement message and the "don't replace anything" case. + * + * @generated from protobuf field: bool replace_response = 2; + */ + replaceResponse: boolean; + /** + * + * If the replace_response field is set to true, this field must contain the + * binary serialized gRPC message in the protobuf format. + * + * @generated from protobuf field: bytes replacement_serialized = 3; + */ + replacementSerialized: Uint8Array; +} +/** + * @generated from protobuf enum lnrpc.OutputScriptType + */ +export enum OutputScriptType { + /** + * @generated from protobuf enum value: SCRIPT_TYPE_PUBKEY_HASH = 0; + */ + SCRIPT_TYPE_PUBKEY_HASH = 0, + /** + * @generated from protobuf enum value: SCRIPT_TYPE_SCRIPT_HASH = 1; + */ + SCRIPT_TYPE_SCRIPT_HASH = 1, + /** + * @generated from protobuf enum value: SCRIPT_TYPE_WITNESS_V0_PUBKEY_HASH = 2; + */ + SCRIPT_TYPE_WITNESS_V0_PUBKEY_HASH = 2, + /** + * @generated from protobuf enum value: SCRIPT_TYPE_WITNESS_V0_SCRIPT_HASH = 3; + */ + SCRIPT_TYPE_WITNESS_V0_SCRIPT_HASH = 3, + /** + * @generated from protobuf enum value: SCRIPT_TYPE_PUBKEY = 4; + */ + SCRIPT_TYPE_PUBKEY = 4, + /** + * @generated from protobuf enum value: SCRIPT_TYPE_MULTISIG = 5; + */ + SCRIPT_TYPE_MULTISIG = 5, + /** + * @generated from protobuf enum value: SCRIPT_TYPE_NULLDATA = 6; + */ + SCRIPT_TYPE_NULLDATA = 6, + /** + * @generated from protobuf enum value: SCRIPT_TYPE_NON_STANDARD = 7; + */ + SCRIPT_TYPE_NON_STANDARD = 7, + /** + * @generated from protobuf enum value: SCRIPT_TYPE_WITNESS_UNKNOWN = 8; + */ + SCRIPT_TYPE_WITNESS_UNKNOWN = 8, + /** + * @generated from protobuf enum value: SCRIPT_TYPE_WITNESS_V1_TAPROOT = 9; + */ + SCRIPT_TYPE_WITNESS_V1_TAPROOT = 9 +} +/** + * + * `AddressType` has to be one of: + * + * - `p2wkh`: Pay to witness key hash (`WITNESS_PUBKEY_HASH` = 0) + * - `np2wkh`: Pay to nested witness key hash (`NESTED_PUBKEY_HASH` = 1) + * - `p2tr`: Pay to taproot pubkey (`TAPROOT_PUBKEY` = 4) + * + * @generated from protobuf enum lnrpc.AddressType + */ +export enum AddressType { + /** + * @generated from protobuf enum value: WITNESS_PUBKEY_HASH = 0; + */ + WITNESS_PUBKEY_HASH = 0, + /** + * @generated from protobuf enum value: NESTED_PUBKEY_HASH = 1; + */ + NESTED_PUBKEY_HASH = 1, + /** + * @generated from protobuf enum value: UNUSED_WITNESS_PUBKEY_HASH = 2; + */ + UNUSED_WITNESS_PUBKEY_HASH = 2, + /** + * @generated from protobuf enum value: UNUSED_NESTED_PUBKEY_HASH = 3; + */ + UNUSED_NESTED_PUBKEY_HASH = 3, + /** + * @generated from protobuf enum value: TAPROOT_PUBKEY = 4; + */ + TAPROOT_PUBKEY = 4, + /** + * @generated from protobuf enum value: UNUSED_TAPROOT_PUBKEY = 5; + */ + UNUSED_TAPROOT_PUBKEY = 5 +} +/** + * @generated from protobuf enum lnrpc.CommitmentType + */ +export enum CommitmentType { + /** + * + * Returned when the commitment type isn't known or unavailable. + * + * @generated from protobuf enum value: UNKNOWN_COMMITMENT_TYPE = 0; + */ + UNKNOWN_COMMITMENT_TYPE = 0, + /** + * + * A channel using the legacy commitment format having tweaked to_remote + * keys. + * + * @generated from protobuf enum value: LEGACY = 1; + */ + LEGACY = 1, + /** + * + * A channel that uses the modern commitment format where the key in the + * output of the remote party does not change each state. This makes back + * up and recovery easier as when the channel is closed, the funds go + * directly to that key. + * + * @generated from protobuf enum value: STATIC_REMOTE_KEY = 2; + */ + STATIC_REMOTE_KEY = 2, + /** + * + * A channel that uses a commitment format that has anchor outputs on the + * commitments, allowing fee bumping after a force close transaction has + * been broadcast. + * + * @generated from protobuf enum value: ANCHORS = 3; + */ + ANCHORS = 3, + /** + * + * A channel that uses a commitment type that builds upon the anchors + * commitment format, but in addition requires a CLTV clause to spend outputs + * paying to the channel initiator. This is intended for use on leased channels + * to guarantee that the channel initiator has no incentives to close a leased + * channel before its maturity date. + * + * @generated from protobuf enum value: SCRIPT_ENFORCED_LEASE = 4; + */ + SCRIPT_ENFORCED_LEASE = 4 +} +/** + * @generated from protobuf enum lnrpc.Initiator + */ +export enum Initiator { + /** + * @generated from protobuf enum value: INITIATOR_UNKNOWN = 0; + */ + UNKNOWN = 0, + /** + * @generated from protobuf enum value: INITIATOR_LOCAL = 1; + */ + LOCAL = 1, + /** + * @generated from protobuf enum value: INITIATOR_REMOTE = 2; + */ + REMOTE = 2, + /** + * @generated from protobuf enum value: INITIATOR_BOTH = 3; + */ + BOTH = 3 +} +/** + * @generated from protobuf enum lnrpc.ResolutionType + */ +export enum ResolutionType { + /** + * @generated from protobuf enum value: TYPE_UNKNOWN = 0; + */ + TYPE_UNKNOWN = 0, + /** + * We resolved an anchor output. + * + * @generated from protobuf enum value: ANCHOR = 1; + */ + ANCHOR = 1, + /** + * + * We are resolving an incoming htlc on chain. This if this htlc is + * claimed, we swept the incoming htlc with the preimage. If it is timed + * out, our peer swept the timeout path. + * + * @generated from protobuf enum value: INCOMING_HTLC = 2; + */ + INCOMING_HTLC = 2, + /** + * + * We are resolving an outgoing htlc on chain. If this htlc is claimed, + * the remote party swept the htlc with the preimage. If it is timed out, + * we swept it with the timeout path. + * + * @generated from protobuf enum value: OUTGOING_HTLC = 3; + */ + OUTGOING_HTLC = 3, + /** + * We force closed and need to sweep our time locked commitment output. + * + * @generated from protobuf enum value: COMMIT = 4; + */ + COMMIT = 4 +} +/** + * @generated from protobuf enum lnrpc.ResolutionOutcome + */ +export enum ResolutionOutcome { + /** + * Outcome unknown. + * + * @generated from protobuf enum value: OUTCOME_UNKNOWN = 0; + */ + OUTCOME_UNKNOWN = 0, + /** + * An output was claimed on chain. + * + * @generated from protobuf enum value: CLAIMED = 1; + */ + CLAIMED = 1, + /** + * An output was left unclaimed on chain. + * + * @generated from protobuf enum value: UNCLAIMED = 2; + */ + UNCLAIMED = 2, + /** + * + * ResolverOutcomeAbandoned indicates that an output that we did not + * claim on chain, for example an anchor that we did not sweep and a + * third party claimed on chain, or a htlc that we could not decode + * so left unclaimed. + * + * @generated from protobuf enum value: ABANDONED = 3; + */ + ABANDONED = 3, + /** + * + * If we force closed our channel, our htlcs need to be claimed in two + * stages. This outcome represents the broadcast of a timeout or success + * transaction for this two stage htlc claim. + * + * @generated from protobuf enum value: FIRST_STAGE = 4; + */ + FIRST_STAGE = 4, + /** + * A htlc was timed out on chain. + * + * @generated from protobuf enum value: TIMEOUT = 5; + */ + TIMEOUT = 5 +} +/** + * @generated from protobuf enum lnrpc.NodeMetricType + */ +export enum NodeMetricType { + /** + * @generated from protobuf enum value: UNKNOWN = 0; + */ + UNKNOWN = 0, + /** + * @generated from protobuf enum value: BETWEENNESS_CENTRALITY = 1; + */ + BETWEENNESS_CENTRALITY = 1 +} +/** + * @generated from protobuf enum lnrpc.InvoiceHTLCState + */ +export enum InvoiceHTLCState { + /** + * @generated from protobuf enum value: ACCEPTED = 0; + */ + ACCEPTED = 0, + /** + * @generated from protobuf enum value: SETTLED = 1; + */ + SETTLED = 1, + /** + * @generated from protobuf enum value: CANCELED = 2; + */ + CANCELED = 2 +} +/** + * @generated from protobuf enum lnrpc.PaymentFailureReason + */ +export enum PaymentFailureReason { + /** + * + * Payment isn't failed (yet). + * + * @generated from protobuf enum value: FAILURE_REASON_NONE = 0; + */ + FAILURE_REASON_NONE = 0, + /** + * + * There are more routes to try, but the payment timeout was exceeded. + * + * @generated from protobuf enum value: FAILURE_REASON_TIMEOUT = 1; + */ + FAILURE_REASON_TIMEOUT = 1, + /** + * + * All possible routes were tried and failed permanently. Or were no + * routes to the destination at all. + * + * @generated from protobuf enum value: FAILURE_REASON_NO_ROUTE = 2; + */ + FAILURE_REASON_NO_ROUTE = 2, + /** + * + * A non-recoverable error has occured. + * + * @generated from protobuf enum value: FAILURE_REASON_ERROR = 3; + */ + FAILURE_REASON_ERROR = 3, + /** + * + * Payment details incorrect (unknown hash, invalid amt or + * invalid final cltv delta) + * + * @generated from protobuf enum value: FAILURE_REASON_INCORRECT_PAYMENT_DETAILS = 4; + */ + FAILURE_REASON_INCORRECT_PAYMENT_DETAILS = 4, + /** + * + * Insufficient local balance. + * + * @generated from protobuf enum value: FAILURE_REASON_INSUFFICIENT_BALANCE = 5; + */ + FAILURE_REASON_INSUFFICIENT_BALANCE = 5 +} +/** + * @generated from protobuf enum lnrpc.FeatureBit + */ +export enum FeatureBit { + /** + * @generated from protobuf enum value: DATALOSS_PROTECT_REQ = 0; + */ + DATALOSS_PROTECT_REQ = 0, + /** + * @generated from protobuf enum value: DATALOSS_PROTECT_OPT = 1; + */ + DATALOSS_PROTECT_OPT = 1, + /** + * @generated from protobuf enum value: INITIAL_ROUING_SYNC = 3; + */ + INITIAL_ROUING_SYNC = 3, + /** + * @generated from protobuf enum value: UPFRONT_SHUTDOWN_SCRIPT_REQ = 4; + */ + UPFRONT_SHUTDOWN_SCRIPT_REQ = 4, + /** + * @generated from protobuf enum value: UPFRONT_SHUTDOWN_SCRIPT_OPT = 5; + */ + UPFRONT_SHUTDOWN_SCRIPT_OPT = 5, + /** + * @generated from protobuf enum value: GOSSIP_QUERIES_REQ = 6; + */ + GOSSIP_QUERIES_REQ = 6, + /** + * @generated from protobuf enum value: GOSSIP_QUERIES_OPT = 7; + */ + GOSSIP_QUERIES_OPT = 7, + /** + * @generated from protobuf enum value: TLV_ONION_REQ = 8; + */ + TLV_ONION_REQ = 8, + /** + * @generated from protobuf enum value: TLV_ONION_OPT = 9; + */ + TLV_ONION_OPT = 9, + /** + * @generated from protobuf enum value: EXT_GOSSIP_QUERIES_REQ = 10; + */ + EXT_GOSSIP_QUERIES_REQ = 10, + /** + * @generated from protobuf enum value: EXT_GOSSIP_QUERIES_OPT = 11; + */ + EXT_GOSSIP_QUERIES_OPT = 11, + /** + * @generated from protobuf enum value: STATIC_REMOTE_KEY_REQ = 12; + */ + STATIC_REMOTE_KEY_REQ = 12, + /** + * @generated from protobuf enum value: STATIC_REMOTE_KEY_OPT = 13; + */ + STATIC_REMOTE_KEY_OPT = 13, + /** + * @generated from protobuf enum value: PAYMENT_ADDR_REQ = 14; + */ + PAYMENT_ADDR_REQ = 14, + /** + * @generated from protobuf enum value: PAYMENT_ADDR_OPT = 15; + */ + PAYMENT_ADDR_OPT = 15, + /** + * @generated from protobuf enum value: MPP_REQ = 16; + */ + MPP_REQ = 16, + /** + * @generated from protobuf enum value: MPP_OPT = 17; + */ + MPP_OPT = 17, + /** + * @generated from protobuf enum value: WUMBO_CHANNELS_REQ = 18; + */ + WUMBO_CHANNELS_REQ = 18, + /** + * @generated from protobuf enum value: WUMBO_CHANNELS_OPT = 19; + */ + WUMBO_CHANNELS_OPT = 19, + /** + * @generated from protobuf enum value: ANCHORS_REQ = 20; + */ + ANCHORS_REQ = 20, + /** + * @generated from protobuf enum value: ANCHORS_OPT = 21; + */ + ANCHORS_OPT = 21, + /** + * @generated from protobuf enum value: ANCHORS_ZERO_FEE_HTLC_REQ = 22; + */ + ANCHORS_ZERO_FEE_HTLC_REQ = 22, + /** + * @generated from protobuf enum value: ANCHORS_ZERO_FEE_HTLC_OPT = 23; + */ + ANCHORS_ZERO_FEE_HTLC_OPT = 23, + /** + * @generated from protobuf enum value: AMP_REQ = 30; + */ + AMP_REQ = 30, + /** + * @generated from protobuf enum value: AMP_OPT = 31; + */ + AMP_OPT = 31 +} +/** + * @generated from protobuf enum lnrpc.UpdateFailure + */ +export enum UpdateFailure { + /** + * @generated from protobuf enum value: UPDATE_FAILURE_UNKNOWN = 0; + */ + UNKNOWN = 0, + /** + * @generated from protobuf enum value: UPDATE_FAILURE_PENDING = 1; + */ + PENDING = 1, + /** + * @generated from protobuf enum value: UPDATE_FAILURE_NOT_FOUND = 2; + */ + NOT_FOUND = 2, + /** + * @generated from protobuf enum value: UPDATE_FAILURE_INTERNAL_ERR = 3; + */ + INTERNAL_ERR = 3, + /** + * @generated from protobuf enum value: UPDATE_FAILURE_INVALID_PARAMETER = 4; + */ + INVALID_PARAMETER = 4 +} +// @generated message type with reflection information, may provide speed optimized methods +class LookupHtlcRequest$Type extends MessageType { + constructor() { + super("lnrpc.LookupHtlcRequest", [ + { no: 1, name: "chan_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 2, name: "htlc_index", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): LookupHtlcRequest { + const message = { chanId: 0n, htlcIndex: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: LookupHtlcRequest): LookupHtlcRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint64 chan_id */ 1: + message.chanId = reader.uint64().toBigInt(); + break; + case /* uint64 htlc_index */ 2: + message.htlcIndex = reader.uint64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: LookupHtlcRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint64 chan_id = 1; */ + if (message.chanId !== 0n) + writer.tag(1, WireType.Varint).uint64(message.chanId); + /* uint64 htlc_index = 2; */ + if (message.htlcIndex !== 0n) + writer.tag(2, WireType.Varint).uint64(message.htlcIndex); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.LookupHtlcRequest + */ +export const LookupHtlcRequest = new LookupHtlcRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class LookupHtlcResponse$Type extends MessageType { + constructor() { + super("lnrpc.LookupHtlcResponse", [ + { no: 1, name: "settled", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 2, name: "offchain", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): LookupHtlcResponse { + const message = { settled: false, offchain: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: LookupHtlcResponse): LookupHtlcResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bool settled */ 1: + message.settled = reader.bool(); + break; + case /* bool offchain */ 2: + message.offchain = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: LookupHtlcResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bool settled = 1; */ + if (message.settled !== false) + writer.tag(1, WireType.Varint).bool(message.settled); + /* bool offchain = 2; */ + if (message.offchain !== false) + writer.tag(2, WireType.Varint).bool(message.offchain); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.LookupHtlcResponse + */ +export const LookupHtlcResponse = new LookupHtlcResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class SubscribeCustomMessagesRequest$Type extends MessageType { + constructor() { + super("lnrpc.SubscribeCustomMessagesRequest", []); + } + create(value?: PartialMessage): SubscribeCustomMessagesRequest { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SubscribeCustomMessagesRequest): SubscribeCustomMessagesRequest { + return target ?? this.create(); + } + internalBinaryWrite(message: SubscribeCustomMessagesRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.SubscribeCustomMessagesRequest + */ +export const SubscribeCustomMessagesRequest = new SubscribeCustomMessagesRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class CustomMessage$Type extends MessageType { + constructor() { + super("lnrpc.CustomMessage", [ + { no: 1, name: "peer", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "type", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 3, name: "data", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): CustomMessage { + const message = { peer: new Uint8Array(0), type: 0, data: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: CustomMessage): CustomMessage { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes peer */ 1: + message.peer = reader.bytes(); + break; + case /* uint32 type */ 2: + message.type = reader.uint32(); + break; + case /* bytes data */ 3: + message.data = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: CustomMessage, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes peer = 1; */ + if (message.peer.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.peer); + /* uint32 type = 2; */ + if (message.type !== 0) + writer.tag(2, WireType.Varint).uint32(message.type); + /* bytes data = 3; */ + if (message.data.length) + writer.tag(3, WireType.LengthDelimited).bytes(message.data); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.CustomMessage + */ +export const CustomMessage = new CustomMessage$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class SendCustomMessageRequest$Type extends MessageType { + constructor() { + super("lnrpc.SendCustomMessageRequest", [ + { no: 1, name: "peer", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "type", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 3, name: "data", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): SendCustomMessageRequest { + const message = { peer: new Uint8Array(0), type: 0, data: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SendCustomMessageRequest): SendCustomMessageRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes peer */ 1: + message.peer = reader.bytes(); + break; + case /* uint32 type */ 2: + message.type = reader.uint32(); + break; + case /* bytes data */ 3: + message.data = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: SendCustomMessageRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes peer = 1; */ + if (message.peer.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.peer); + /* uint32 type = 2; */ + if (message.type !== 0) + writer.tag(2, WireType.Varint).uint32(message.type); + /* bytes data = 3; */ + if (message.data.length) + writer.tag(3, WireType.LengthDelimited).bytes(message.data); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.SendCustomMessageRequest + */ +export const SendCustomMessageRequest = new SendCustomMessageRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class SendCustomMessageResponse$Type extends MessageType { + constructor() { + super("lnrpc.SendCustomMessageResponse", []); + } + create(value?: PartialMessage): SendCustomMessageResponse { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SendCustomMessageResponse): SendCustomMessageResponse { + return target ?? this.create(); + } + internalBinaryWrite(message: SendCustomMessageResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.SendCustomMessageResponse + */ +export const SendCustomMessageResponse = new SendCustomMessageResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class Utxo$Type extends MessageType { + constructor() { + super("lnrpc.Utxo", [ + { no: 1, name: "address_type", kind: "enum", T: () => ["lnrpc.AddressType", AddressType] }, + { no: 2, name: "address", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 3, name: "amount_sat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "pk_script", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 5, name: "outpoint", kind: "message", T: () => OutPoint }, + { no: 6, name: "confirmations", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): Utxo { + const message = { addressType: 0, address: "", amountSat: 0n, pkScript: "", confirmations: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: Utxo): Utxo { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.AddressType address_type */ 1: + message.addressType = reader.int32(); + break; + case /* string address */ 2: + message.address = reader.string(); + break; + case /* int64 amount_sat */ 3: + message.amountSat = reader.int64().toBigInt(); + break; + case /* string pk_script */ 4: + message.pkScript = reader.string(); + break; + case /* lnrpc.OutPoint outpoint */ 5: + message.outpoint = OutPoint.internalBinaryRead(reader, reader.uint32(), options, message.outpoint); + break; + case /* int64 confirmations */ 6: + message.confirmations = reader.int64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: Utxo, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.AddressType address_type = 1; */ + if (message.addressType !== 0) + writer.tag(1, WireType.Varint).int32(message.addressType); + /* string address = 2; */ + if (message.address !== "") + writer.tag(2, WireType.LengthDelimited).string(message.address); + /* int64 amount_sat = 3; */ + if (message.amountSat !== 0n) + writer.tag(3, WireType.Varint).int64(message.amountSat); + /* string pk_script = 4; */ + if (message.pkScript !== "") + writer.tag(4, WireType.LengthDelimited).string(message.pkScript); + /* lnrpc.OutPoint outpoint = 5; */ + if (message.outpoint) + OutPoint.internalBinaryWrite(message.outpoint, writer.tag(5, WireType.LengthDelimited).fork(), options).join(); + /* int64 confirmations = 6; */ + if (message.confirmations !== 0n) + writer.tag(6, WireType.Varint).int64(message.confirmations); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.Utxo + */ +export const Utxo = new Utxo$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class OutputDetail$Type extends MessageType { + constructor() { + super("lnrpc.OutputDetail", [ + { no: 1, name: "output_type", kind: "enum", T: () => ["lnrpc.OutputScriptType", OutputScriptType] }, + { no: 2, name: "address", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 3, name: "pk_script", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 4, name: "output_index", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 5, name: "amount", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 6, name: "is_our_address", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): OutputDetail { + const message = { outputType: 0, address: "", pkScript: "", outputIndex: 0n, amount: 0n, isOurAddress: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: OutputDetail): OutputDetail { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.OutputScriptType output_type */ 1: + message.outputType = reader.int32(); + break; + case /* string address */ 2: + message.address = reader.string(); + break; + case /* string pk_script */ 3: + message.pkScript = reader.string(); + break; + case /* int64 output_index */ 4: + message.outputIndex = reader.int64().toBigInt(); + break; + case /* int64 amount */ 5: + message.amount = reader.int64().toBigInt(); + break; + case /* bool is_our_address */ 6: + message.isOurAddress = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: OutputDetail, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.OutputScriptType output_type = 1; */ + if (message.outputType !== 0) + writer.tag(1, WireType.Varint).int32(message.outputType); + /* string address = 2; */ + if (message.address !== "") + writer.tag(2, WireType.LengthDelimited).string(message.address); + /* string pk_script = 3; */ + if (message.pkScript !== "") + writer.tag(3, WireType.LengthDelimited).string(message.pkScript); + /* int64 output_index = 4; */ + if (message.outputIndex !== 0n) + writer.tag(4, WireType.Varint).int64(message.outputIndex); + /* int64 amount = 5; */ + if (message.amount !== 0n) + writer.tag(5, WireType.Varint).int64(message.amount); + /* bool is_our_address = 6; */ + if (message.isOurAddress !== false) + writer.tag(6, WireType.Varint).bool(message.isOurAddress); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.OutputDetail + */ +export const OutputDetail = new OutputDetail$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class Transaction$Type extends MessageType { + constructor() { + super("lnrpc.Transaction", [ + { no: 1, name: "tx_hash", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "amount", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "num_confirmations", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 4, name: "block_hash", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 5, name: "block_height", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 6, name: "time_stamp", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 7, name: "total_fees", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 8, name: "dest_addresses", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/ }, + { no: 11, name: "output_details", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => OutputDetail }, + { no: 9, name: "raw_tx_hex", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 10, name: "label", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 12, name: "previous_outpoints", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => PreviousOutPoint } + ]); + } + create(value?: PartialMessage): Transaction { + const message = { txHash: "", amount: 0n, numConfirmations: 0, blockHash: "", blockHeight: 0, timeStamp: 0n, totalFees: 0n, destAddresses: [], outputDetails: [], rawTxHex: "", label: "", previousOutpoints: [] }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: Transaction): Transaction { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string tx_hash */ 1: + message.txHash = reader.string(); + break; + case /* int64 amount */ 2: + message.amount = reader.int64().toBigInt(); + break; + case /* int32 num_confirmations */ 3: + message.numConfirmations = reader.int32(); + break; + case /* string block_hash */ 4: + message.blockHash = reader.string(); + break; + case /* int32 block_height */ 5: + message.blockHeight = reader.int32(); + break; + case /* int64 time_stamp */ 6: + message.timeStamp = reader.int64().toBigInt(); + break; + case /* int64 total_fees */ 7: + message.totalFees = reader.int64().toBigInt(); + break; + case /* repeated string dest_addresses = 8 [deprecated = true];*/ 8: + message.destAddresses.push(reader.string()); + break; + case /* repeated lnrpc.OutputDetail output_details */ 11: + message.outputDetails.push(OutputDetail.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* string raw_tx_hex */ 9: + message.rawTxHex = reader.string(); + break; + case /* string label */ 10: + message.label = reader.string(); + break; + case /* repeated lnrpc.PreviousOutPoint previous_outpoints */ 12: + message.previousOutpoints.push(PreviousOutPoint.internalBinaryRead(reader, reader.uint32(), options)); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: Transaction, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string tx_hash = 1; */ + if (message.txHash !== "") + writer.tag(1, WireType.LengthDelimited).string(message.txHash); + /* int64 amount = 2; */ + if (message.amount !== 0n) + writer.tag(2, WireType.Varint).int64(message.amount); + /* int32 num_confirmations = 3; */ + if (message.numConfirmations !== 0) + writer.tag(3, WireType.Varint).int32(message.numConfirmations); + /* string block_hash = 4; */ + if (message.blockHash !== "") + writer.tag(4, WireType.LengthDelimited).string(message.blockHash); + /* int32 block_height = 5; */ + if (message.blockHeight !== 0) + writer.tag(5, WireType.Varint).int32(message.blockHeight); + /* int64 time_stamp = 6; */ + if (message.timeStamp !== 0n) + writer.tag(6, WireType.Varint).int64(message.timeStamp); + /* int64 total_fees = 7; */ + if (message.totalFees !== 0n) + writer.tag(7, WireType.Varint).int64(message.totalFees); + /* repeated string dest_addresses = 8 [deprecated = true]; */ + for (let i = 0; i < message.destAddresses.length; i++) + writer.tag(8, WireType.LengthDelimited).string(message.destAddresses[i]); + /* repeated lnrpc.OutputDetail output_details = 11; */ + for (let i = 0; i < message.outputDetails.length; i++) + OutputDetail.internalBinaryWrite(message.outputDetails[i], writer.tag(11, WireType.LengthDelimited).fork(), options).join(); + /* string raw_tx_hex = 9; */ + if (message.rawTxHex !== "") + writer.tag(9, WireType.LengthDelimited).string(message.rawTxHex); + /* string label = 10; */ + if (message.label !== "") + writer.tag(10, WireType.LengthDelimited).string(message.label); + /* repeated lnrpc.PreviousOutPoint previous_outpoints = 12; */ + for (let i = 0; i < message.previousOutpoints.length; i++) + PreviousOutPoint.internalBinaryWrite(message.previousOutpoints[i], writer.tag(12, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.Transaction + */ +export const Transaction = new Transaction$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class GetTransactionsRequest$Type extends MessageType { + constructor() { + super("lnrpc.GetTransactionsRequest", [ + { no: 1, name: "start_height", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 2, name: "end_height", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 3, name: "account", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): GetTransactionsRequest { + const message = { startHeight: 0, endHeight: 0, account: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: GetTransactionsRequest): GetTransactionsRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* int32 start_height */ 1: + message.startHeight = reader.int32(); + break; + case /* int32 end_height */ 2: + message.endHeight = reader.int32(); + break; + case /* string account */ 3: + message.account = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: GetTransactionsRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* int32 start_height = 1; */ + if (message.startHeight !== 0) + writer.tag(1, WireType.Varint).int32(message.startHeight); + /* int32 end_height = 2; */ + if (message.endHeight !== 0) + writer.tag(2, WireType.Varint).int32(message.endHeight); + /* string account = 3; */ + if (message.account !== "") + writer.tag(3, WireType.LengthDelimited).string(message.account); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.GetTransactionsRequest + */ +export const GetTransactionsRequest = new GetTransactionsRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class TransactionDetails$Type extends MessageType { + constructor() { + super("lnrpc.TransactionDetails", [ + { no: 1, name: "transactions", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => Transaction } + ]); + } + create(value?: PartialMessage): TransactionDetails { + const message = { transactions: [] }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: TransactionDetails): TransactionDetails { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated lnrpc.Transaction transactions */ 1: + message.transactions.push(Transaction.internalBinaryRead(reader, reader.uint32(), options)); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: TransactionDetails, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated lnrpc.Transaction transactions = 1; */ + for (let i = 0; i < message.transactions.length; i++) + Transaction.internalBinaryWrite(message.transactions[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.TransactionDetails + */ +export const TransactionDetails = new TransactionDetails$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class FeeLimit$Type extends MessageType { + constructor() { + super("lnrpc.FeeLimit", [ + { no: 1, name: "fixed", kind: "scalar", oneof: "limit", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "fixed_msat", kind: "scalar", oneof: "limit", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 2, name: "percent", kind: "scalar", oneof: "limit", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): FeeLimit { + const message = { limit: { oneofKind: undefined } }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: FeeLimit): FeeLimit { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* int64 fixed */ 1: + message.limit = { + oneofKind: "fixed", + fixed: reader.int64().toBigInt() + }; + break; + case /* int64 fixed_msat */ 3: + message.limit = { + oneofKind: "fixedMsat", + fixedMsat: reader.int64().toBigInt() + }; + break; + case /* int64 percent */ 2: + message.limit = { + oneofKind: "percent", + percent: reader.int64().toBigInt() + }; + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: FeeLimit, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* int64 fixed = 1; */ + if (message.limit.oneofKind === "fixed") + writer.tag(1, WireType.Varint).int64(message.limit.fixed); + /* int64 fixed_msat = 3; */ + if (message.limit.oneofKind === "fixedMsat") + writer.tag(3, WireType.Varint).int64(message.limit.fixedMsat); + /* int64 percent = 2; */ + if (message.limit.oneofKind === "percent") + writer.tag(2, WireType.Varint).int64(message.limit.percent); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.FeeLimit + */ +export const FeeLimit = new FeeLimit$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class SendRequest$Type extends MessageType { + constructor() { + super("lnrpc.SendRequest", [ + { no: 1, name: "dest", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "dest_string", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 3, name: "amt", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 12, name: "amt_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "payment_hash", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 5, name: "payment_hash_string", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 6, name: "payment_request", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 7, name: "final_cltv_delta", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 8, name: "fee_limit", kind: "message", T: () => FeeLimit }, + { no: 9, name: "outgoing_chan_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/ }, + { no: 13, name: "last_hop_pubkey", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 10, name: "cltv_limit", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 11, name: "dest_custom_records", kind: "map", K: 4 /*ScalarType.UINT64*/, V: { kind: "scalar", T: 12 /*ScalarType.BYTES*/ } }, + { no: 14, name: "allow_self_payment", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 15, name: "dest_features", kind: "enum", repeat: 1 /*RepeatType.PACKED*/, T: () => ["lnrpc.FeatureBit", FeatureBit] }, + { no: 16, name: "payment_addr", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): SendRequest { + const message = { dest: new Uint8Array(0), destString: "", amt: 0n, amtMsat: 0n, paymentHash: new Uint8Array(0), paymentHashString: "", paymentRequest: "", finalCltvDelta: 0, outgoingChanId: "0", lastHopPubkey: new Uint8Array(0), cltvLimit: 0, destCustomRecords: {}, allowSelfPayment: false, destFeatures: [], paymentAddr: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SendRequest): SendRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes dest */ 1: + message.dest = reader.bytes(); + break; + case /* string dest_string = 2 [deprecated = true];*/ 2: + message.destString = reader.string(); + break; + case /* int64 amt */ 3: + message.amt = reader.int64().toBigInt(); + break; + case /* int64 amt_msat */ 12: + message.amtMsat = reader.int64().toBigInt(); + break; + case /* bytes payment_hash */ 4: + message.paymentHash = reader.bytes(); + break; + case /* string payment_hash_string = 5 [deprecated = true];*/ 5: + message.paymentHashString = reader.string(); + break; + case /* string payment_request */ 6: + message.paymentRequest = reader.string(); + break; + case /* int32 final_cltv_delta */ 7: + message.finalCltvDelta = reader.int32(); + break; + case /* lnrpc.FeeLimit fee_limit */ 8: + message.feeLimit = FeeLimit.internalBinaryRead(reader, reader.uint32(), options, message.feeLimit); + break; + case /* uint64 outgoing_chan_id = 9 [jstype = JS_STRING];*/ 9: + message.outgoingChanId = reader.uint64().toString(); + break; + case /* bytes last_hop_pubkey */ 13: + message.lastHopPubkey = reader.bytes(); + break; + case /* uint32 cltv_limit */ 10: + message.cltvLimit = reader.uint32(); + break; + case /* map dest_custom_records */ 11: + this.binaryReadMap11(message.destCustomRecords, reader, options); + break; + case /* bool allow_self_payment */ 14: + message.allowSelfPayment = reader.bool(); + break; + case /* repeated lnrpc.FeatureBit dest_features */ 15: + if (wireType === WireType.LengthDelimited) + for (let e = reader.int32() + reader.pos; reader.pos < e;) + message.destFeatures.push(reader.int32()); + else + message.destFeatures.push(reader.int32()); + break; + case /* bytes payment_addr */ 16: + message.paymentAddr = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + private binaryReadMap11(map: SendRequest["destCustomRecords"], reader: IBinaryReader, options: BinaryReadOptions): void { + let len = reader.uint32(), end = reader.pos + len, key: keyof SendRequest["destCustomRecords"] | undefined, val: SendRequest["destCustomRecords"][any] | undefined; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + key = reader.uint64().toString(); + break; + case 2: + val = reader.bytes(); + break; + default: throw new globalThis.Error("unknown map entry field for field lnrpc.SendRequest.dest_custom_records"); + } + } + map[key ?? "0"] = val ?? new Uint8Array(0); + } + internalBinaryWrite(message: SendRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes dest = 1; */ + if (message.dest.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.dest); + /* string dest_string = 2 [deprecated = true]; */ + if (message.destString !== "") + writer.tag(2, WireType.LengthDelimited).string(message.destString); + /* int64 amt = 3; */ + if (message.amt !== 0n) + writer.tag(3, WireType.Varint).int64(message.amt); + /* int64 amt_msat = 12; */ + if (message.amtMsat !== 0n) + writer.tag(12, WireType.Varint).int64(message.amtMsat); + /* bytes payment_hash = 4; */ + if (message.paymentHash.length) + writer.tag(4, WireType.LengthDelimited).bytes(message.paymentHash); + /* string payment_hash_string = 5 [deprecated = true]; */ + if (message.paymentHashString !== "") + writer.tag(5, WireType.LengthDelimited).string(message.paymentHashString); + /* string payment_request = 6; */ + if (message.paymentRequest !== "") + writer.tag(6, WireType.LengthDelimited).string(message.paymentRequest); + /* int32 final_cltv_delta = 7; */ + if (message.finalCltvDelta !== 0) + writer.tag(7, WireType.Varint).int32(message.finalCltvDelta); + /* lnrpc.FeeLimit fee_limit = 8; */ + if (message.feeLimit) + FeeLimit.internalBinaryWrite(message.feeLimit, writer.tag(8, WireType.LengthDelimited).fork(), options).join(); + /* uint64 outgoing_chan_id = 9 [jstype = JS_STRING]; */ + if (message.outgoingChanId !== "0") + writer.tag(9, WireType.Varint).uint64(message.outgoingChanId); + /* bytes last_hop_pubkey = 13; */ + if (message.lastHopPubkey.length) + writer.tag(13, WireType.LengthDelimited).bytes(message.lastHopPubkey); + /* uint32 cltv_limit = 10; */ + if (message.cltvLimit !== 0) + writer.tag(10, WireType.Varint).uint32(message.cltvLimit); + /* map dest_custom_records = 11; */ + for (let k of Object.keys(message.destCustomRecords)) + writer.tag(11, WireType.LengthDelimited).fork().tag(1, WireType.Varint).uint64(k).tag(2, WireType.LengthDelimited).bytes(message.destCustomRecords[k]).join(); + /* bool allow_self_payment = 14; */ + if (message.allowSelfPayment !== false) + writer.tag(14, WireType.Varint).bool(message.allowSelfPayment); + /* repeated lnrpc.FeatureBit dest_features = 15; */ + if (message.destFeatures.length) { + writer.tag(15, WireType.LengthDelimited).fork(); + for (let i = 0; i < message.destFeatures.length; i++) + writer.int32(message.destFeatures[i]); + writer.join(); + } + /* bytes payment_addr = 16; */ + if (message.paymentAddr.length) + writer.tag(16, WireType.LengthDelimited).bytes(message.paymentAddr); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.SendRequest + */ +export const SendRequest = new SendRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class SendResponse$Type extends MessageType { + constructor() { + super("lnrpc.SendResponse", [ + { no: 1, name: "payment_error", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "payment_preimage", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 3, name: "payment_route", kind: "message", T: () => Route }, + { no: 4, name: "payment_hash", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): SendResponse { + const message = { paymentError: "", paymentPreimage: new Uint8Array(0), paymentHash: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SendResponse): SendResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string payment_error */ 1: + message.paymentError = reader.string(); + break; + case /* bytes payment_preimage */ 2: + message.paymentPreimage = reader.bytes(); + break; + case /* lnrpc.Route payment_route */ 3: + message.paymentRoute = Route.internalBinaryRead(reader, reader.uint32(), options, message.paymentRoute); + break; + case /* bytes payment_hash */ 4: + message.paymentHash = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: SendResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string payment_error = 1; */ + if (message.paymentError !== "") + writer.tag(1, WireType.LengthDelimited).string(message.paymentError); + /* bytes payment_preimage = 2; */ + if (message.paymentPreimage.length) + writer.tag(2, WireType.LengthDelimited).bytes(message.paymentPreimage); + /* lnrpc.Route payment_route = 3; */ + if (message.paymentRoute) + Route.internalBinaryWrite(message.paymentRoute, writer.tag(3, WireType.LengthDelimited).fork(), options).join(); + /* bytes payment_hash = 4; */ + if (message.paymentHash.length) + writer.tag(4, WireType.LengthDelimited).bytes(message.paymentHash); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.SendResponse + */ +export const SendResponse = new SendResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class SendToRouteRequest$Type extends MessageType { + constructor() { + super("lnrpc.SendToRouteRequest", [ + { no: 1, name: "payment_hash", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "payment_hash_string", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 4, name: "route", kind: "message", T: () => Route } + ]); + } + create(value?: PartialMessage): SendToRouteRequest { + const message = { paymentHash: new Uint8Array(0), paymentHashString: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SendToRouteRequest): SendToRouteRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes payment_hash */ 1: + message.paymentHash = reader.bytes(); + break; + case /* string payment_hash_string = 2 [deprecated = true];*/ 2: + message.paymentHashString = reader.string(); + break; + case /* lnrpc.Route route */ 4: + message.route = Route.internalBinaryRead(reader, reader.uint32(), options, message.route); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: SendToRouteRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes payment_hash = 1; */ + if (message.paymentHash.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.paymentHash); + /* string payment_hash_string = 2 [deprecated = true]; */ + if (message.paymentHashString !== "") + writer.tag(2, WireType.LengthDelimited).string(message.paymentHashString); + /* lnrpc.Route route = 4; */ + if (message.route) + Route.internalBinaryWrite(message.route, writer.tag(4, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.SendToRouteRequest + */ +export const SendToRouteRequest = new SendToRouteRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ChannelAcceptRequest$Type extends MessageType { + constructor() { + super("lnrpc.ChannelAcceptRequest", [ + { no: 1, name: "node_pubkey", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "chain_hash", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 3, name: "pending_chan_id", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 4, name: "funding_amt", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 5, name: "push_amt", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 6, name: "dust_limit", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 7, name: "max_value_in_flight", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 8, name: "channel_reserve", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 9, name: "min_htlc", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 10, name: "fee_per_kw", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 11, name: "csv_delay", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 12, name: "max_accepted_htlcs", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 13, name: "channel_flags", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 14, name: "commitment_type", kind: "enum", T: () => ["lnrpc.CommitmentType", CommitmentType] }, + { no: 15, name: "wants_zero_conf", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 16, name: "wants_scid_alias", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): ChannelAcceptRequest { + const message = { nodePubkey: new Uint8Array(0), chainHash: new Uint8Array(0), pendingChanId: new Uint8Array(0), fundingAmt: 0n, pushAmt: 0n, dustLimit: 0n, maxValueInFlight: 0n, channelReserve: 0n, minHtlc: 0n, feePerKw: 0n, csvDelay: 0, maxAcceptedHtlcs: 0, channelFlags: 0, commitmentType: 0, wantsZeroConf: false, wantsScidAlias: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ChannelAcceptRequest): ChannelAcceptRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes node_pubkey */ 1: + message.nodePubkey = reader.bytes(); + break; + case /* bytes chain_hash */ 2: + message.chainHash = reader.bytes(); + break; + case /* bytes pending_chan_id */ 3: + message.pendingChanId = reader.bytes(); + break; + case /* uint64 funding_amt */ 4: + message.fundingAmt = reader.uint64().toBigInt(); + break; + case /* uint64 push_amt */ 5: + message.pushAmt = reader.uint64().toBigInt(); + break; + case /* uint64 dust_limit */ 6: + message.dustLimit = reader.uint64().toBigInt(); + break; + case /* uint64 max_value_in_flight */ 7: + message.maxValueInFlight = reader.uint64().toBigInt(); + break; + case /* uint64 channel_reserve */ 8: + message.channelReserve = reader.uint64().toBigInt(); + break; + case /* uint64 min_htlc */ 9: + message.minHtlc = reader.uint64().toBigInt(); + break; + case /* uint64 fee_per_kw */ 10: + message.feePerKw = reader.uint64().toBigInt(); + break; + case /* uint32 csv_delay */ 11: + message.csvDelay = reader.uint32(); + break; + case /* uint32 max_accepted_htlcs */ 12: + message.maxAcceptedHtlcs = reader.uint32(); + break; + case /* uint32 channel_flags */ 13: + message.channelFlags = reader.uint32(); + break; + case /* lnrpc.CommitmentType commitment_type */ 14: + message.commitmentType = reader.int32(); + break; + case /* bool wants_zero_conf */ 15: + message.wantsZeroConf = reader.bool(); + break; + case /* bool wants_scid_alias */ 16: + message.wantsScidAlias = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ChannelAcceptRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes node_pubkey = 1; */ + if (message.nodePubkey.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.nodePubkey); + /* bytes chain_hash = 2; */ + if (message.chainHash.length) + writer.tag(2, WireType.LengthDelimited).bytes(message.chainHash); + /* bytes pending_chan_id = 3; */ + if (message.pendingChanId.length) + writer.tag(3, WireType.LengthDelimited).bytes(message.pendingChanId); + /* uint64 funding_amt = 4; */ + if (message.fundingAmt !== 0n) + writer.tag(4, WireType.Varint).uint64(message.fundingAmt); + /* uint64 push_amt = 5; */ + if (message.pushAmt !== 0n) + writer.tag(5, WireType.Varint).uint64(message.pushAmt); + /* uint64 dust_limit = 6; */ + if (message.dustLimit !== 0n) + writer.tag(6, WireType.Varint).uint64(message.dustLimit); + /* uint64 max_value_in_flight = 7; */ + if (message.maxValueInFlight !== 0n) + writer.tag(7, WireType.Varint).uint64(message.maxValueInFlight); + /* uint64 channel_reserve = 8; */ + if (message.channelReserve !== 0n) + writer.tag(8, WireType.Varint).uint64(message.channelReserve); + /* uint64 min_htlc = 9; */ + if (message.minHtlc !== 0n) + writer.tag(9, WireType.Varint).uint64(message.minHtlc); + /* uint64 fee_per_kw = 10; */ + if (message.feePerKw !== 0n) + writer.tag(10, WireType.Varint).uint64(message.feePerKw); + /* uint32 csv_delay = 11; */ + if (message.csvDelay !== 0) + writer.tag(11, WireType.Varint).uint32(message.csvDelay); + /* uint32 max_accepted_htlcs = 12; */ + if (message.maxAcceptedHtlcs !== 0) + writer.tag(12, WireType.Varint).uint32(message.maxAcceptedHtlcs); + /* uint32 channel_flags = 13; */ + if (message.channelFlags !== 0) + writer.tag(13, WireType.Varint).uint32(message.channelFlags); + /* lnrpc.CommitmentType commitment_type = 14; */ + if (message.commitmentType !== 0) + writer.tag(14, WireType.Varint).int32(message.commitmentType); + /* bool wants_zero_conf = 15; */ + if (message.wantsZeroConf !== false) + writer.tag(15, WireType.Varint).bool(message.wantsZeroConf); + /* bool wants_scid_alias = 16; */ + if (message.wantsScidAlias !== false) + writer.tag(16, WireType.Varint).bool(message.wantsScidAlias); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ChannelAcceptRequest + */ +export const ChannelAcceptRequest = new ChannelAcceptRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ChannelAcceptResponse$Type extends MessageType { + constructor() { + super("lnrpc.ChannelAcceptResponse", [ + { no: 1, name: "accept", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 2, name: "pending_chan_id", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 3, name: "error", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 4, name: "upfront_shutdown", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 5, name: "csv_delay", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 6, name: "reserve_sat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 7, name: "in_flight_max_msat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 8, name: "max_htlc_count", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 9, name: "min_htlc_in", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 10, name: "min_accept_depth", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 11, name: "zero_conf", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): ChannelAcceptResponse { + const message = { accept: false, pendingChanId: new Uint8Array(0), error: "", upfrontShutdown: "", csvDelay: 0, reserveSat: 0n, inFlightMaxMsat: 0n, maxHtlcCount: 0, minHtlcIn: 0n, minAcceptDepth: 0, zeroConf: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ChannelAcceptResponse): ChannelAcceptResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bool accept */ 1: + message.accept = reader.bool(); + break; + case /* bytes pending_chan_id */ 2: + message.pendingChanId = reader.bytes(); + break; + case /* string error */ 3: + message.error = reader.string(); + break; + case /* string upfront_shutdown */ 4: + message.upfrontShutdown = reader.string(); + break; + case /* uint32 csv_delay */ 5: + message.csvDelay = reader.uint32(); + break; + case /* uint64 reserve_sat */ 6: + message.reserveSat = reader.uint64().toBigInt(); + break; + case /* uint64 in_flight_max_msat */ 7: + message.inFlightMaxMsat = reader.uint64().toBigInt(); + break; + case /* uint32 max_htlc_count */ 8: + message.maxHtlcCount = reader.uint32(); + break; + case /* uint64 min_htlc_in */ 9: + message.minHtlcIn = reader.uint64().toBigInt(); + break; + case /* uint32 min_accept_depth */ 10: + message.minAcceptDepth = reader.uint32(); + break; + case /* bool zero_conf */ 11: + message.zeroConf = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ChannelAcceptResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bool accept = 1; */ + if (message.accept !== false) + writer.tag(1, WireType.Varint).bool(message.accept); + /* bytes pending_chan_id = 2; */ + if (message.pendingChanId.length) + writer.tag(2, WireType.LengthDelimited).bytes(message.pendingChanId); + /* string error = 3; */ + if (message.error !== "") + writer.tag(3, WireType.LengthDelimited).string(message.error); + /* string upfront_shutdown = 4; */ + if (message.upfrontShutdown !== "") + writer.tag(4, WireType.LengthDelimited).string(message.upfrontShutdown); + /* uint32 csv_delay = 5; */ + if (message.csvDelay !== 0) + writer.tag(5, WireType.Varint).uint32(message.csvDelay); + /* uint64 reserve_sat = 6; */ + if (message.reserveSat !== 0n) + writer.tag(6, WireType.Varint).uint64(message.reserveSat); + /* uint64 in_flight_max_msat = 7; */ + if (message.inFlightMaxMsat !== 0n) + writer.tag(7, WireType.Varint).uint64(message.inFlightMaxMsat); + /* uint32 max_htlc_count = 8; */ + if (message.maxHtlcCount !== 0) + writer.tag(8, WireType.Varint).uint32(message.maxHtlcCount); + /* uint64 min_htlc_in = 9; */ + if (message.minHtlcIn !== 0n) + writer.tag(9, WireType.Varint).uint64(message.minHtlcIn); + /* uint32 min_accept_depth = 10; */ + if (message.minAcceptDepth !== 0) + writer.tag(10, WireType.Varint).uint32(message.minAcceptDepth); + /* bool zero_conf = 11; */ + if (message.zeroConf !== false) + writer.tag(11, WireType.Varint).bool(message.zeroConf); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ChannelAcceptResponse + */ +export const ChannelAcceptResponse = new ChannelAcceptResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ChannelPoint$Type extends MessageType { + constructor() { + super("lnrpc.ChannelPoint", [ + { no: 1, name: "funding_txid_bytes", kind: "scalar", oneof: "fundingTxid", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "funding_txid_str", kind: "scalar", oneof: "fundingTxid", T: 9 /*ScalarType.STRING*/ }, + { no: 3, name: "output_index", kind: "scalar", T: 13 /*ScalarType.UINT32*/ } + ]); + } + create(value?: PartialMessage): ChannelPoint { + const message = { fundingTxid: { oneofKind: undefined }, outputIndex: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ChannelPoint): ChannelPoint { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes funding_txid_bytes */ 1: + message.fundingTxid = { + oneofKind: "fundingTxidBytes", + fundingTxidBytes: reader.bytes() + }; + break; + case /* string funding_txid_str */ 2: + message.fundingTxid = { + oneofKind: "fundingTxidStr", + fundingTxidStr: reader.string() + }; + break; + case /* uint32 output_index */ 3: + message.outputIndex = reader.uint32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ChannelPoint, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes funding_txid_bytes = 1; */ + if (message.fundingTxid.oneofKind === "fundingTxidBytes") + writer.tag(1, WireType.LengthDelimited).bytes(message.fundingTxid.fundingTxidBytes); + /* string funding_txid_str = 2; */ + if (message.fundingTxid.oneofKind === "fundingTxidStr") + writer.tag(2, WireType.LengthDelimited).string(message.fundingTxid.fundingTxidStr); + /* uint32 output_index = 3; */ + if (message.outputIndex !== 0) + writer.tag(3, WireType.Varint).uint32(message.outputIndex); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ChannelPoint + */ +export const ChannelPoint = new ChannelPoint$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class OutPoint$Type extends MessageType { + constructor() { + super("lnrpc.OutPoint", [ + { no: 1, name: "txid_bytes", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "txid_str", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 3, name: "output_index", kind: "scalar", T: 13 /*ScalarType.UINT32*/ } + ]); + } + create(value?: PartialMessage): OutPoint { + const message = { txidBytes: new Uint8Array(0), txidStr: "", outputIndex: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: OutPoint): OutPoint { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes txid_bytes */ 1: + message.txidBytes = reader.bytes(); + break; + case /* string txid_str */ 2: + message.txidStr = reader.string(); + break; + case /* uint32 output_index */ 3: + message.outputIndex = reader.uint32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: OutPoint, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes txid_bytes = 1; */ + if (message.txidBytes.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.txidBytes); + /* string txid_str = 2; */ + if (message.txidStr !== "") + writer.tag(2, WireType.LengthDelimited).string(message.txidStr); + /* uint32 output_index = 3; */ + if (message.outputIndex !== 0) + writer.tag(3, WireType.Varint).uint32(message.outputIndex); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.OutPoint + */ +export const OutPoint = new OutPoint$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PreviousOutPoint$Type extends MessageType { + constructor() { + super("lnrpc.PreviousOutPoint", [ + { no: 1, name: "outpoint", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "is_our_output", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): PreviousOutPoint { + const message = { outpoint: "", isOurOutput: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PreviousOutPoint): PreviousOutPoint { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string outpoint */ 1: + message.outpoint = reader.string(); + break; + case /* bool is_our_output */ 2: + message.isOurOutput = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PreviousOutPoint, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string outpoint = 1; */ + if (message.outpoint !== "") + writer.tag(1, WireType.LengthDelimited).string(message.outpoint); + /* bool is_our_output = 2; */ + if (message.isOurOutput !== false) + writer.tag(2, WireType.Varint).bool(message.isOurOutput); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.PreviousOutPoint + */ +export const PreviousOutPoint = new PreviousOutPoint$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class LightningAddress$Type extends MessageType { + constructor() { + super("lnrpc.LightningAddress", [ + { no: 1, name: "pubkey", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "host", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): LightningAddress { + const message = { pubkey: "", host: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: LightningAddress): LightningAddress { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string pubkey */ 1: + message.pubkey = reader.string(); + break; + case /* string host */ 2: + message.host = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: LightningAddress, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string pubkey = 1; */ + if (message.pubkey !== "") + writer.tag(1, WireType.LengthDelimited).string(message.pubkey); + /* string host = 2; */ + if (message.host !== "") + writer.tag(2, WireType.LengthDelimited).string(message.host); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.LightningAddress + */ +export const LightningAddress = new LightningAddress$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class EstimateFeeRequest$Type extends MessageType { + constructor() { + super("lnrpc.EstimateFeeRequest", [ + { no: 1, name: "AddrToAmount", kind: "map", jsonName: "AddrToAmount", K: 9 /*ScalarType.STRING*/, V: { kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ } }, + { no: 2, name: "target_conf", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 3, name: "min_confs", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 4, name: "spend_unconfirmed", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): EstimateFeeRequest { + const message = { addrToAmount: {}, targetConf: 0, minConfs: 0, spendUnconfirmed: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: EstimateFeeRequest): EstimateFeeRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* map AddrToAmount = 1 [json_name = "AddrToAmount"];*/ 1: + this.binaryReadMap1(message.addrToAmount, reader, options); + break; + case /* int32 target_conf */ 2: + message.targetConf = reader.int32(); + break; + case /* int32 min_confs */ 3: + message.minConfs = reader.int32(); + break; + case /* bool spend_unconfirmed */ 4: + message.spendUnconfirmed = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + private binaryReadMap1(map: EstimateFeeRequest["addrToAmount"], reader: IBinaryReader, options: BinaryReadOptions): void { + let len = reader.uint32(), end = reader.pos + len, key: keyof EstimateFeeRequest["addrToAmount"] | undefined, val: EstimateFeeRequest["addrToAmount"][any] | undefined; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + key = reader.string(); + break; + case 2: + val = reader.int64().toBigInt(); + break; + default: throw new globalThis.Error("unknown map entry field for field lnrpc.EstimateFeeRequest.AddrToAmount"); + } + } + map[key ?? ""] = val ?? 0n; + } + internalBinaryWrite(message: EstimateFeeRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* map AddrToAmount = 1 [json_name = "AddrToAmount"]; */ + for (let k of Object.keys(message.addrToAmount)) + writer.tag(1, WireType.LengthDelimited).fork().tag(1, WireType.LengthDelimited).string(k).tag(2, WireType.Varint).int64(message.addrToAmount[k]).join(); + /* int32 target_conf = 2; */ + if (message.targetConf !== 0) + writer.tag(2, WireType.Varint).int32(message.targetConf); + /* int32 min_confs = 3; */ + if (message.minConfs !== 0) + writer.tag(3, WireType.Varint).int32(message.minConfs); + /* bool spend_unconfirmed = 4; */ + if (message.spendUnconfirmed !== false) + writer.tag(4, WireType.Varint).bool(message.spendUnconfirmed); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.EstimateFeeRequest + */ +export const EstimateFeeRequest = new EstimateFeeRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class EstimateFeeResponse$Type extends MessageType { + constructor() { + super("lnrpc.EstimateFeeResponse", [ + { no: 1, name: "fee_sat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 2, name: "feerate_sat_per_byte", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "sat_per_vbyte", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): EstimateFeeResponse { + const message = { feeSat: 0n, feerateSatPerByte: 0n, satPerVbyte: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: EstimateFeeResponse): EstimateFeeResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* int64 fee_sat */ 1: + message.feeSat = reader.int64().toBigInt(); + break; + case /* int64 feerate_sat_per_byte = 2 [deprecated = true];*/ 2: + message.feerateSatPerByte = reader.int64().toBigInt(); + break; + case /* uint64 sat_per_vbyte */ 3: + message.satPerVbyte = reader.uint64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: EstimateFeeResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* int64 fee_sat = 1; */ + if (message.feeSat !== 0n) + writer.tag(1, WireType.Varint).int64(message.feeSat); + /* int64 feerate_sat_per_byte = 2 [deprecated = true]; */ + if (message.feerateSatPerByte !== 0n) + writer.tag(2, WireType.Varint).int64(message.feerateSatPerByte); + /* uint64 sat_per_vbyte = 3; */ + if (message.satPerVbyte !== 0n) + writer.tag(3, WireType.Varint).uint64(message.satPerVbyte); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.EstimateFeeResponse + */ +export const EstimateFeeResponse = new EstimateFeeResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class SendManyRequest$Type extends MessageType { + constructor() { + super("lnrpc.SendManyRequest", [ + { no: 1, name: "AddrToAmount", kind: "map", jsonName: "AddrToAmount", K: 9 /*ScalarType.STRING*/, V: { kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ } }, + { no: 3, name: "target_conf", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 4, name: "sat_per_vbyte", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 5, name: "sat_per_byte", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 6, name: "label", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 7, name: "min_confs", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 8, name: "spend_unconfirmed", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): SendManyRequest { + const message = { addrToAmount: {}, targetConf: 0, satPerVbyte: 0n, satPerByte: 0n, label: "", minConfs: 0, spendUnconfirmed: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SendManyRequest): SendManyRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* map AddrToAmount = 1 [json_name = "AddrToAmount"];*/ 1: + this.binaryReadMap1(message.addrToAmount, reader, options); + break; + case /* int32 target_conf */ 3: + message.targetConf = reader.int32(); + break; + case /* uint64 sat_per_vbyte */ 4: + message.satPerVbyte = reader.uint64().toBigInt(); + break; + case /* int64 sat_per_byte = 5 [deprecated = true];*/ 5: + message.satPerByte = reader.int64().toBigInt(); + break; + case /* string label */ 6: + message.label = reader.string(); + break; + case /* int32 min_confs */ 7: + message.minConfs = reader.int32(); + break; + case /* bool spend_unconfirmed */ 8: + message.spendUnconfirmed = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + private binaryReadMap1(map: SendManyRequest["addrToAmount"], reader: IBinaryReader, options: BinaryReadOptions): void { + let len = reader.uint32(), end = reader.pos + len, key: keyof SendManyRequest["addrToAmount"] | undefined, val: SendManyRequest["addrToAmount"][any] | undefined; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + key = reader.string(); + break; + case 2: + val = reader.int64().toBigInt(); + break; + default: throw new globalThis.Error("unknown map entry field for field lnrpc.SendManyRequest.AddrToAmount"); + } + } + map[key ?? ""] = val ?? 0n; + } + internalBinaryWrite(message: SendManyRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* map AddrToAmount = 1 [json_name = "AddrToAmount"]; */ + for (let k of Object.keys(message.addrToAmount)) + writer.tag(1, WireType.LengthDelimited).fork().tag(1, WireType.LengthDelimited).string(k).tag(2, WireType.Varint).int64(message.addrToAmount[k]).join(); + /* int32 target_conf = 3; */ + if (message.targetConf !== 0) + writer.tag(3, WireType.Varint).int32(message.targetConf); + /* uint64 sat_per_vbyte = 4; */ + if (message.satPerVbyte !== 0n) + writer.tag(4, WireType.Varint).uint64(message.satPerVbyte); + /* int64 sat_per_byte = 5 [deprecated = true]; */ + if (message.satPerByte !== 0n) + writer.tag(5, WireType.Varint).int64(message.satPerByte); + /* string label = 6; */ + if (message.label !== "") + writer.tag(6, WireType.LengthDelimited).string(message.label); + /* int32 min_confs = 7; */ + if (message.minConfs !== 0) + writer.tag(7, WireType.Varint).int32(message.minConfs); + /* bool spend_unconfirmed = 8; */ + if (message.spendUnconfirmed !== false) + writer.tag(8, WireType.Varint).bool(message.spendUnconfirmed); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.SendManyRequest + */ +export const SendManyRequest = new SendManyRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class SendManyResponse$Type extends MessageType { + constructor() { + super("lnrpc.SendManyResponse", [ + { no: 1, name: "txid", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): SendManyResponse { + const message = { txid: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SendManyResponse): SendManyResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string txid */ 1: + message.txid = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: SendManyResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string txid = 1; */ + if (message.txid !== "") + writer.tag(1, WireType.LengthDelimited).string(message.txid); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.SendManyResponse + */ +export const SendManyResponse = new SendManyResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class SendCoinsRequest$Type extends MessageType { + constructor() { + super("lnrpc.SendCoinsRequest", [ + { no: 1, name: "addr", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "amount", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "target_conf", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 4, name: "sat_per_vbyte", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 5, name: "sat_per_byte", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 6, name: "send_all", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 7, name: "label", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 8, name: "min_confs", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 9, name: "spend_unconfirmed", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): SendCoinsRequest { + const message = { addr: "", amount: 0n, targetConf: 0, satPerVbyte: 0n, satPerByte: 0n, sendAll: false, label: "", minConfs: 0, spendUnconfirmed: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SendCoinsRequest): SendCoinsRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string addr */ 1: + message.addr = reader.string(); + break; + case /* int64 amount */ 2: + message.amount = reader.int64().toBigInt(); + break; + case /* int32 target_conf */ 3: + message.targetConf = reader.int32(); + break; + case /* uint64 sat_per_vbyte */ 4: + message.satPerVbyte = reader.uint64().toBigInt(); + break; + case /* int64 sat_per_byte = 5 [deprecated = true];*/ 5: + message.satPerByte = reader.int64().toBigInt(); + break; + case /* bool send_all */ 6: + message.sendAll = reader.bool(); + break; + case /* string label */ 7: + message.label = reader.string(); + break; + case /* int32 min_confs */ 8: + message.minConfs = reader.int32(); + break; + case /* bool spend_unconfirmed */ 9: + message.spendUnconfirmed = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: SendCoinsRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string addr = 1; */ + if (message.addr !== "") + writer.tag(1, WireType.LengthDelimited).string(message.addr); + /* int64 amount = 2; */ + if (message.amount !== 0n) + writer.tag(2, WireType.Varint).int64(message.amount); + /* int32 target_conf = 3; */ + if (message.targetConf !== 0) + writer.tag(3, WireType.Varint).int32(message.targetConf); + /* uint64 sat_per_vbyte = 4; */ + if (message.satPerVbyte !== 0n) + writer.tag(4, WireType.Varint).uint64(message.satPerVbyte); + /* int64 sat_per_byte = 5 [deprecated = true]; */ + if (message.satPerByte !== 0n) + writer.tag(5, WireType.Varint).int64(message.satPerByte); + /* bool send_all = 6; */ + if (message.sendAll !== false) + writer.tag(6, WireType.Varint).bool(message.sendAll); + /* string label = 7; */ + if (message.label !== "") + writer.tag(7, WireType.LengthDelimited).string(message.label); + /* int32 min_confs = 8; */ + if (message.minConfs !== 0) + writer.tag(8, WireType.Varint).int32(message.minConfs); + /* bool spend_unconfirmed = 9; */ + if (message.spendUnconfirmed !== false) + writer.tag(9, WireType.Varint).bool(message.spendUnconfirmed); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.SendCoinsRequest + */ +export const SendCoinsRequest = new SendCoinsRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class SendCoinsResponse$Type extends MessageType { + constructor() { + super("lnrpc.SendCoinsResponse", [ + { no: 1, name: "txid", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): SendCoinsResponse { + const message = { txid: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SendCoinsResponse): SendCoinsResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string txid */ 1: + message.txid = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: SendCoinsResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string txid = 1; */ + if (message.txid !== "") + writer.tag(1, WireType.LengthDelimited).string(message.txid); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.SendCoinsResponse + */ +export const SendCoinsResponse = new SendCoinsResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ListUnspentRequest$Type extends MessageType { + constructor() { + super("lnrpc.ListUnspentRequest", [ + { no: 1, name: "min_confs", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 2, name: "max_confs", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 3, name: "account", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): ListUnspentRequest { + const message = { minConfs: 0, maxConfs: 0, account: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ListUnspentRequest): ListUnspentRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* int32 min_confs */ 1: + message.minConfs = reader.int32(); + break; + case /* int32 max_confs */ 2: + message.maxConfs = reader.int32(); + break; + case /* string account */ 3: + message.account = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ListUnspentRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* int32 min_confs = 1; */ + if (message.minConfs !== 0) + writer.tag(1, WireType.Varint).int32(message.minConfs); + /* int32 max_confs = 2; */ + if (message.maxConfs !== 0) + writer.tag(2, WireType.Varint).int32(message.maxConfs); + /* string account = 3; */ + if (message.account !== "") + writer.tag(3, WireType.LengthDelimited).string(message.account); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ListUnspentRequest + */ +export const ListUnspentRequest = new ListUnspentRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ListUnspentResponse$Type extends MessageType { + constructor() { + super("lnrpc.ListUnspentResponse", [ + { no: 1, name: "utxos", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => Utxo } + ]); + } + create(value?: PartialMessage): ListUnspentResponse { + const message = { utxos: [] }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ListUnspentResponse): ListUnspentResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated lnrpc.Utxo utxos */ 1: + message.utxos.push(Utxo.internalBinaryRead(reader, reader.uint32(), options)); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ListUnspentResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated lnrpc.Utxo utxos = 1; */ + for (let i = 0; i < message.utxos.length; i++) + Utxo.internalBinaryWrite(message.utxos[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ListUnspentResponse + */ +export const ListUnspentResponse = new ListUnspentResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class NewAddressRequest$Type extends MessageType { + constructor() { + super("lnrpc.NewAddressRequest", [ + { no: 1, name: "type", kind: "enum", T: () => ["lnrpc.AddressType", AddressType] }, + { no: 2, name: "account", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): NewAddressRequest { + const message = { type: 0, account: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: NewAddressRequest): NewAddressRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.AddressType type */ 1: + message.type = reader.int32(); + break; + case /* string account */ 2: + message.account = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: NewAddressRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.AddressType type = 1; */ + if (message.type !== 0) + writer.tag(1, WireType.Varint).int32(message.type); + /* string account = 2; */ + if (message.account !== "") + writer.tag(2, WireType.LengthDelimited).string(message.account); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.NewAddressRequest + */ +export const NewAddressRequest = new NewAddressRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class NewAddressResponse$Type extends MessageType { + constructor() { + super("lnrpc.NewAddressResponse", [ + { no: 1, name: "address", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): NewAddressResponse { + const message = { address: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: NewAddressResponse): NewAddressResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string address */ 1: + message.address = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: NewAddressResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string address = 1; */ + if (message.address !== "") + writer.tag(1, WireType.LengthDelimited).string(message.address); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.NewAddressResponse + */ +export const NewAddressResponse = new NewAddressResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class SignMessageRequest$Type extends MessageType { + constructor() { + super("lnrpc.SignMessageRequest", [ + { no: 1, name: "msg", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "single_hash", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): SignMessageRequest { + const message = { msg: new Uint8Array(0), singleHash: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SignMessageRequest): SignMessageRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes msg */ 1: + message.msg = reader.bytes(); + break; + case /* bool single_hash */ 2: + message.singleHash = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: SignMessageRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes msg = 1; */ + if (message.msg.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.msg); + /* bool single_hash = 2; */ + if (message.singleHash !== false) + writer.tag(2, WireType.Varint).bool(message.singleHash); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.SignMessageRequest + */ +export const SignMessageRequest = new SignMessageRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class SignMessageResponse$Type extends MessageType { + constructor() { + super("lnrpc.SignMessageResponse", [ + { no: 1, name: "signature", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): SignMessageResponse { + const message = { signature: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SignMessageResponse): SignMessageResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string signature */ 1: + message.signature = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: SignMessageResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string signature = 1; */ + if (message.signature !== "") + writer.tag(1, WireType.LengthDelimited).string(message.signature); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.SignMessageResponse + */ +export const SignMessageResponse = new SignMessageResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class VerifyMessageRequest$Type extends MessageType { + constructor() { + super("lnrpc.VerifyMessageRequest", [ + { no: 1, name: "msg", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "signature", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): VerifyMessageRequest { + const message = { msg: new Uint8Array(0), signature: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: VerifyMessageRequest): VerifyMessageRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes msg */ 1: + message.msg = reader.bytes(); + break; + case /* string signature */ 2: + message.signature = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: VerifyMessageRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes msg = 1; */ + if (message.msg.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.msg); + /* string signature = 2; */ + if (message.signature !== "") + writer.tag(2, WireType.LengthDelimited).string(message.signature); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.VerifyMessageRequest + */ +export const VerifyMessageRequest = new VerifyMessageRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class VerifyMessageResponse$Type extends MessageType { + constructor() { + super("lnrpc.VerifyMessageResponse", [ + { no: 1, name: "valid", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 2, name: "pubkey", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): VerifyMessageResponse { + const message = { valid: false, pubkey: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: VerifyMessageResponse): VerifyMessageResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bool valid */ 1: + message.valid = reader.bool(); + break; + case /* string pubkey */ 2: + message.pubkey = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: VerifyMessageResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bool valid = 1; */ + if (message.valid !== false) + writer.tag(1, WireType.Varint).bool(message.valid); + /* string pubkey = 2; */ + if (message.pubkey !== "") + writer.tag(2, WireType.LengthDelimited).string(message.pubkey); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.VerifyMessageResponse + */ +export const VerifyMessageResponse = new VerifyMessageResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ConnectPeerRequest$Type extends MessageType { + constructor() { + super("lnrpc.ConnectPeerRequest", [ + { no: 1, name: "addr", kind: "message", T: () => LightningAddress }, + { no: 2, name: "perm", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 3, name: "timeout", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): ConnectPeerRequest { + const message = { perm: false, timeout: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ConnectPeerRequest): ConnectPeerRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.LightningAddress addr */ 1: + message.addr = LightningAddress.internalBinaryRead(reader, reader.uint32(), options, message.addr); + break; + case /* bool perm */ 2: + message.perm = reader.bool(); + break; + case /* uint64 timeout */ 3: + message.timeout = reader.uint64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ConnectPeerRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.LightningAddress addr = 1; */ + if (message.addr) + LightningAddress.internalBinaryWrite(message.addr, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* bool perm = 2; */ + if (message.perm !== false) + writer.tag(2, WireType.Varint).bool(message.perm); + /* uint64 timeout = 3; */ + if (message.timeout !== 0n) + writer.tag(3, WireType.Varint).uint64(message.timeout); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ConnectPeerRequest + */ +export const ConnectPeerRequest = new ConnectPeerRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ConnectPeerResponse$Type extends MessageType { + constructor() { + super("lnrpc.ConnectPeerResponse", []); + } + create(value?: PartialMessage): ConnectPeerResponse { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ConnectPeerResponse): ConnectPeerResponse { + return target ?? this.create(); + } + internalBinaryWrite(message: ConnectPeerResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ConnectPeerResponse + */ +export const ConnectPeerResponse = new ConnectPeerResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class DisconnectPeerRequest$Type extends MessageType { + constructor() { + super("lnrpc.DisconnectPeerRequest", [ + { no: 1, name: "pub_key", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): DisconnectPeerRequest { + const message = { pubKey: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: DisconnectPeerRequest): DisconnectPeerRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string pub_key */ 1: + message.pubKey = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: DisconnectPeerRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string pub_key = 1; */ + if (message.pubKey !== "") + writer.tag(1, WireType.LengthDelimited).string(message.pubKey); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.DisconnectPeerRequest + */ +export const DisconnectPeerRequest = new DisconnectPeerRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class DisconnectPeerResponse$Type extends MessageType { + constructor() { + super("lnrpc.DisconnectPeerResponse", []); + } + create(value?: PartialMessage): DisconnectPeerResponse { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: DisconnectPeerResponse): DisconnectPeerResponse { + return target ?? this.create(); + } + internalBinaryWrite(message: DisconnectPeerResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.DisconnectPeerResponse + */ +export const DisconnectPeerResponse = new DisconnectPeerResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class HTLC$Type extends MessageType { + constructor() { + super("lnrpc.HTLC", [ + { no: 1, name: "incoming", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 2, name: "amount", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "hash_lock", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 4, name: "expiration_height", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 5, name: "htlc_index", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 6, name: "forwarding_channel", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 7, name: "forwarding_htlc_index", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): HTLC { + const message = { incoming: false, amount: 0n, hashLock: new Uint8Array(0), expirationHeight: 0, htlcIndex: 0n, forwardingChannel: 0n, forwardingHtlcIndex: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: HTLC): HTLC { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bool incoming */ 1: + message.incoming = reader.bool(); + break; + case /* int64 amount */ 2: + message.amount = reader.int64().toBigInt(); + break; + case /* bytes hash_lock */ 3: + message.hashLock = reader.bytes(); + break; + case /* uint32 expiration_height */ 4: + message.expirationHeight = reader.uint32(); + break; + case /* uint64 htlc_index */ 5: + message.htlcIndex = reader.uint64().toBigInt(); + break; + case /* uint64 forwarding_channel */ 6: + message.forwardingChannel = reader.uint64().toBigInt(); + break; + case /* uint64 forwarding_htlc_index */ 7: + message.forwardingHtlcIndex = reader.uint64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: HTLC, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bool incoming = 1; */ + if (message.incoming !== false) + writer.tag(1, WireType.Varint).bool(message.incoming); + /* int64 amount = 2; */ + if (message.amount !== 0n) + writer.tag(2, WireType.Varint).int64(message.amount); + /* bytes hash_lock = 3; */ + if (message.hashLock.length) + writer.tag(3, WireType.LengthDelimited).bytes(message.hashLock); + /* uint32 expiration_height = 4; */ + if (message.expirationHeight !== 0) + writer.tag(4, WireType.Varint).uint32(message.expirationHeight); + /* uint64 htlc_index = 5; */ + if (message.htlcIndex !== 0n) + writer.tag(5, WireType.Varint).uint64(message.htlcIndex); + /* uint64 forwarding_channel = 6; */ + if (message.forwardingChannel !== 0n) + writer.tag(6, WireType.Varint).uint64(message.forwardingChannel); + /* uint64 forwarding_htlc_index = 7; */ + if (message.forwardingHtlcIndex !== 0n) + writer.tag(7, WireType.Varint).uint64(message.forwardingHtlcIndex); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.HTLC + */ +export const HTLC = new HTLC$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ChannelConstraints$Type extends MessageType { + constructor() { + super("lnrpc.ChannelConstraints", [ + { no: 1, name: "csv_delay", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 2, name: "chan_reserve_sat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "dust_limit_sat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "max_pending_amt_msat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 5, name: "min_htlc_msat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 6, name: "max_accepted_htlcs", kind: "scalar", T: 13 /*ScalarType.UINT32*/ } + ]); + } + create(value?: PartialMessage): ChannelConstraints { + const message = { csvDelay: 0, chanReserveSat: 0n, dustLimitSat: 0n, maxPendingAmtMsat: 0n, minHtlcMsat: 0n, maxAcceptedHtlcs: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ChannelConstraints): ChannelConstraints { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint32 csv_delay */ 1: + message.csvDelay = reader.uint32(); + break; + case /* uint64 chan_reserve_sat */ 2: + message.chanReserveSat = reader.uint64().toBigInt(); + break; + case /* uint64 dust_limit_sat */ 3: + message.dustLimitSat = reader.uint64().toBigInt(); + break; + case /* uint64 max_pending_amt_msat */ 4: + message.maxPendingAmtMsat = reader.uint64().toBigInt(); + break; + case /* uint64 min_htlc_msat */ 5: + message.minHtlcMsat = reader.uint64().toBigInt(); + break; + case /* uint32 max_accepted_htlcs */ 6: + message.maxAcceptedHtlcs = reader.uint32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ChannelConstraints, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint32 csv_delay = 1; */ + if (message.csvDelay !== 0) + writer.tag(1, WireType.Varint).uint32(message.csvDelay); + /* uint64 chan_reserve_sat = 2; */ + if (message.chanReserveSat !== 0n) + writer.tag(2, WireType.Varint).uint64(message.chanReserveSat); + /* uint64 dust_limit_sat = 3; */ + if (message.dustLimitSat !== 0n) + writer.tag(3, WireType.Varint).uint64(message.dustLimitSat); + /* uint64 max_pending_amt_msat = 4; */ + if (message.maxPendingAmtMsat !== 0n) + writer.tag(4, WireType.Varint).uint64(message.maxPendingAmtMsat); + /* uint64 min_htlc_msat = 5; */ + if (message.minHtlcMsat !== 0n) + writer.tag(5, WireType.Varint).uint64(message.minHtlcMsat); + /* uint32 max_accepted_htlcs = 6; */ + if (message.maxAcceptedHtlcs !== 0) + writer.tag(6, WireType.Varint).uint32(message.maxAcceptedHtlcs); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ChannelConstraints + */ +export const ChannelConstraints = new ChannelConstraints$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class Channel$Type extends MessageType { + constructor() { + super("lnrpc.Channel", [ + { no: 1, name: "active", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 2, name: "remote_pubkey", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 3, name: "channel_point", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 4, name: "chan_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/ }, + { no: 5, name: "capacity", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 6, name: "local_balance", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 7, name: "remote_balance", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 8, name: "commit_fee", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 9, name: "commit_weight", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 10, name: "fee_per_kw", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 11, name: "unsettled_balance", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 12, name: "total_satoshis_sent", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 13, name: "total_satoshis_received", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 14, name: "num_updates", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 15, name: "pending_htlcs", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => HTLC }, + { no: 16, name: "csv_delay", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 17, name: "private", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 18, name: "initiator", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 19, name: "chan_status_flags", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 20, name: "local_chan_reserve_sat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 21, name: "remote_chan_reserve_sat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 22, name: "static_remote_key", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 26, name: "commitment_type", kind: "enum", T: () => ["lnrpc.CommitmentType", CommitmentType] }, + { no: 23, name: "lifetime", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 24, name: "uptime", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 25, name: "close_address", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 27, name: "push_amount_sat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 28, name: "thaw_height", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 29, name: "local_constraints", kind: "message", T: () => ChannelConstraints }, + { no: 30, name: "remote_constraints", kind: "message", T: () => ChannelConstraints }, + { no: 31, name: "alias_scids", kind: "scalar", repeat: 1 /*RepeatType.PACKED*/, T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 32, name: "zero_conf", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 33, name: "zero_conf_confirmed_scid", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): Channel { + const message = { active: false, remotePubkey: "", channelPoint: "", chanId: "0", capacity: 0n, localBalance: 0n, remoteBalance: 0n, commitFee: 0n, commitWeight: 0n, feePerKw: 0n, unsettledBalance: 0n, totalSatoshisSent: 0n, totalSatoshisReceived: 0n, numUpdates: 0n, pendingHtlcs: [], csvDelay: 0, private: false, initiator: false, chanStatusFlags: "", localChanReserveSat: 0n, remoteChanReserveSat: 0n, staticRemoteKey: false, commitmentType: 0, lifetime: 0n, uptime: 0n, closeAddress: "", pushAmountSat: 0n, thawHeight: 0, aliasScids: [], zeroConf: false, zeroConfConfirmedScid: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: Channel): Channel { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bool active */ 1: + message.active = reader.bool(); + break; + case /* string remote_pubkey */ 2: + message.remotePubkey = reader.string(); + break; + case /* string channel_point */ 3: + message.channelPoint = reader.string(); + break; + case /* uint64 chan_id = 4 [jstype = JS_STRING];*/ 4: + message.chanId = reader.uint64().toString(); + break; + case /* int64 capacity */ 5: + message.capacity = reader.int64().toBigInt(); + break; + case /* int64 local_balance */ 6: + message.localBalance = reader.int64().toBigInt(); + break; + case /* int64 remote_balance */ 7: + message.remoteBalance = reader.int64().toBigInt(); + break; + case /* int64 commit_fee */ 8: + message.commitFee = reader.int64().toBigInt(); + break; + case /* int64 commit_weight */ 9: + message.commitWeight = reader.int64().toBigInt(); + break; + case /* int64 fee_per_kw */ 10: + message.feePerKw = reader.int64().toBigInt(); + break; + case /* int64 unsettled_balance */ 11: + message.unsettledBalance = reader.int64().toBigInt(); + break; + case /* int64 total_satoshis_sent */ 12: + message.totalSatoshisSent = reader.int64().toBigInt(); + break; + case /* int64 total_satoshis_received */ 13: + message.totalSatoshisReceived = reader.int64().toBigInt(); + break; + case /* uint64 num_updates */ 14: + message.numUpdates = reader.uint64().toBigInt(); + break; + case /* repeated lnrpc.HTLC pending_htlcs */ 15: + message.pendingHtlcs.push(HTLC.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* uint32 csv_delay = 16 [deprecated = true];*/ 16: + message.csvDelay = reader.uint32(); + break; + case /* bool private */ 17: + message.private = reader.bool(); + break; + case /* bool initiator */ 18: + message.initiator = reader.bool(); + break; + case /* string chan_status_flags */ 19: + message.chanStatusFlags = reader.string(); + break; + case /* int64 local_chan_reserve_sat = 20 [deprecated = true];*/ 20: + message.localChanReserveSat = reader.int64().toBigInt(); + break; + case /* int64 remote_chan_reserve_sat = 21 [deprecated = true];*/ 21: + message.remoteChanReserveSat = reader.int64().toBigInt(); + break; + case /* bool static_remote_key = 22 [deprecated = true];*/ 22: + message.staticRemoteKey = reader.bool(); + break; + case /* lnrpc.CommitmentType commitment_type */ 26: + message.commitmentType = reader.int32(); + break; + case /* int64 lifetime */ 23: + message.lifetime = reader.int64().toBigInt(); + break; + case /* int64 uptime */ 24: + message.uptime = reader.int64().toBigInt(); + break; + case /* string close_address */ 25: + message.closeAddress = reader.string(); + break; + case /* uint64 push_amount_sat */ 27: + message.pushAmountSat = reader.uint64().toBigInt(); + break; + case /* uint32 thaw_height */ 28: + message.thawHeight = reader.uint32(); + break; + case /* lnrpc.ChannelConstraints local_constraints */ 29: + message.localConstraints = ChannelConstraints.internalBinaryRead(reader, reader.uint32(), options, message.localConstraints); + break; + case /* lnrpc.ChannelConstraints remote_constraints */ 30: + message.remoteConstraints = ChannelConstraints.internalBinaryRead(reader, reader.uint32(), options, message.remoteConstraints); + break; + case /* repeated uint64 alias_scids */ 31: + if (wireType === WireType.LengthDelimited) + for (let e = reader.int32() + reader.pos; reader.pos < e;) + message.aliasScids.push(reader.uint64().toBigInt()); + else + message.aliasScids.push(reader.uint64().toBigInt()); + break; + case /* bool zero_conf */ 32: + message.zeroConf = reader.bool(); + break; + case /* uint64 zero_conf_confirmed_scid */ 33: + message.zeroConfConfirmedScid = reader.uint64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: Channel, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bool active = 1; */ + if (message.active !== false) + writer.tag(1, WireType.Varint).bool(message.active); + /* string remote_pubkey = 2; */ + if (message.remotePubkey !== "") + writer.tag(2, WireType.LengthDelimited).string(message.remotePubkey); + /* string channel_point = 3; */ + if (message.channelPoint !== "") + writer.tag(3, WireType.LengthDelimited).string(message.channelPoint); + /* uint64 chan_id = 4 [jstype = JS_STRING]; */ + if (message.chanId !== "0") + writer.tag(4, WireType.Varint).uint64(message.chanId); + /* int64 capacity = 5; */ + if (message.capacity !== 0n) + writer.tag(5, WireType.Varint).int64(message.capacity); + /* int64 local_balance = 6; */ + if (message.localBalance !== 0n) + writer.tag(6, WireType.Varint).int64(message.localBalance); + /* int64 remote_balance = 7; */ + if (message.remoteBalance !== 0n) + writer.tag(7, WireType.Varint).int64(message.remoteBalance); + /* int64 commit_fee = 8; */ + if (message.commitFee !== 0n) + writer.tag(8, WireType.Varint).int64(message.commitFee); + /* int64 commit_weight = 9; */ + if (message.commitWeight !== 0n) + writer.tag(9, WireType.Varint).int64(message.commitWeight); + /* int64 fee_per_kw = 10; */ + if (message.feePerKw !== 0n) + writer.tag(10, WireType.Varint).int64(message.feePerKw); + /* int64 unsettled_balance = 11; */ + if (message.unsettledBalance !== 0n) + writer.tag(11, WireType.Varint).int64(message.unsettledBalance); + /* int64 total_satoshis_sent = 12; */ + if (message.totalSatoshisSent !== 0n) + writer.tag(12, WireType.Varint).int64(message.totalSatoshisSent); + /* int64 total_satoshis_received = 13; */ + if (message.totalSatoshisReceived !== 0n) + writer.tag(13, WireType.Varint).int64(message.totalSatoshisReceived); + /* uint64 num_updates = 14; */ + if (message.numUpdates !== 0n) + writer.tag(14, WireType.Varint).uint64(message.numUpdates); + /* repeated lnrpc.HTLC pending_htlcs = 15; */ + for (let i = 0; i < message.pendingHtlcs.length; i++) + HTLC.internalBinaryWrite(message.pendingHtlcs[i], writer.tag(15, WireType.LengthDelimited).fork(), options).join(); + /* uint32 csv_delay = 16 [deprecated = true]; */ + if (message.csvDelay !== 0) + writer.tag(16, WireType.Varint).uint32(message.csvDelay); + /* bool private = 17; */ + if (message.private !== false) + writer.tag(17, WireType.Varint).bool(message.private); + /* bool initiator = 18; */ + if (message.initiator !== false) + writer.tag(18, WireType.Varint).bool(message.initiator); + /* string chan_status_flags = 19; */ + if (message.chanStatusFlags !== "") + writer.tag(19, WireType.LengthDelimited).string(message.chanStatusFlags); + /* int64 local_chan_reserve_sat = 20 [deprecated = true]; */ + if (message.localChanReserveSat !== 0n) + writer.tag(20, WireType.Varint).int64(message.localChanReserveSat); + /* int64 remote_chan_reserve_sat = 21 [deprecated = true]; */ + if (message.remoteChanReserveSat !== 0n) + writer.tag(21, WireType.Varint).int64(message.remoteChanReserveSat); + /* bool static_remote_key = 22 [deprecated = true]; */ + if (message.staticRemoteKey !== false) + writer.tag(22, WireType.Varint).bool(message.staticRemoteKey); + /* lnrpc.CommitmentType commitment_type = 26; */ + if (message.commitmentType !== 0) + writer.tag(26, WireType.Varint).int32(message.commitmentType); + /* int64 lifetime = 23; */ + if (message.lifetime !== 0n) + writer.tag(23, WireType.Varint).int64(message.lifetime); + /* int64 uptime = 24; */ + if (message.uptime !== 0n) + writer.tag(24, WireType.Varint).int64(message.uptime); + /* string close_address = 25; */ + if (message.closeAddress !== "") + writer.tag(25, WireType.LengthDelimited).string(message.closeAddress); + /* uint64 push_amount_sat = 27; */ + if (message.pushAmountSat !== 0n) + writer.tag(27, WireType.Varint).uint64(message.pushAmountSat); + /* uint32 thaw_height = 28; */ + if (message.thawHeight !== 0) + writer.tag(28, WireType.Varint).uint32(message.thawHeight); + /* lnrpc.ChannelConstraints local_constraints = 29; */ + if (message.localConstraints) + ChannelConstraints.internalBinaryWrite(message.localConstraints, writer.tag(29, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.ChannelConstraints remote_constraints = 30; */ + if (message.remoteConstraints) + ChannelConstraints.internalBinaryWrite(message.remoteConstraints, writer.tag(30, WireType.LengthDelimited).fork(), options).join(); + /* repeated uint64 alias_scids = 31; */ + if (message.aliasScids.length) { + writer.tag(31, WireType.LengthDelimited).fork(); + for (let i = 0; i < message.aliasScids.length; i++) + writer.uint64(message.aliasScids[i]); + writer.join(); + } + /* bool zero_conf = 32; */ + if (message.zeroConf !== false) + writer.tag(32, WireType.Varint).bool(message.zeroConf); + /* uint64 zero_conf_confirmed_scid = 33; */ + if (message.zeroConfConfirmedScid !== 0n) + writer.tag(33, WireType.Varint).uint64(message.zeroConfConfirmedScid); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.Channel + */ +export const Channel = new Channel$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ListChannelsRequest$Type extends MessageType { + constructor() { + super("lnrpc.ListChannelsRequest", [ + { no: 1, name: "active_only", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 2, name: "inactive_only", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 3, name: "public_only", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 4, name: "private_only", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 5, name: "peer", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): ListChannelsRequest { + const message = { activeOnly: false, inactiveOnly: false, publicOnly: false, privateOnly: false, peer: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ListChannelsRequest): ListChannelsRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bool active_only */ 1: + message.activeOnly = reader.bool(); + break; + case /* bool inactive_only */ 2: + message.inactiveOnly = reader.bool(); + break; + case /* bool public_only */ 3: + message.publicOnly = reader.bool(); + break; + case /* bool private_only */ 4: + message.privateOnly = reader.bool(); + break; + case /* bytes peer */ 5: + message.peer = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ListChannelsRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bool active_only = 1; */ + if (message.activeOnly !== false) + writer.tag(1, WireType.Varint).bool(message.activeOnly); + /* bool inactive_only = 2; */ + if (message.inactiveOnly !== false) + writer.tag(2, WireType.Varint).bool(message.inactiveOnly); + /* bool public_only = 3; */ + if (message.publicOnly !== false) + writer.tag(3, WireType.Varint).bool(message.publicOnly); + /* bool private_only = 4; */ + if (message.privateOnly !== false) + writer.tag(4, WireType.Varint).bool(message.privateOnly); + /* bytes peer = 5; */ + if (message.peer.length) + writer.tag(5, WireType.LengthDelimited).bytes(message.peer); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ListChannelsRequest + */ +export const ListChannelsRequest = new ListChannelsRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ListChannelsResponse$Type extends MessageType { + constructor() { + super("lnrpc.ListChannelsResponse", [ + { no: 11, name: "channels", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => Channel } + ]); + } + create(value?: PartialMessage): ListChannelsResponse { + const message = { channels: [] }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ListChannelsResponse): ListChannelsResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated lnrpc.Channel channels */ 11: + message.channels.push(Channel.internalBinaryRead(reader, reader.uint32(), options)); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ListChannelsResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated lnrpc.Channel channels = 11; */ + for (let i = 0; i < message.channels.length; i++) + Channel.internalBinaryWrite(message.channels[i], writer.tag(11, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ListChannelsResponse + */ +export const ListChannelsResponse = new ListChannelsResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class AliasMap$Type extends MessageType { + constructor() { + super("lnrpc.AliasMap", [ + { no: 1, name: "base_scid", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 2, name: "aliases", kind: "scalar", repeat: 1 /*RepeatType.PACKED*/, T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): AliasMap { + const message = { baseScid: 0n, aliases: [] }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: AliasMap): AliasMap { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint64 base_scid */ 1: + message.baseScid = reader.uint64().toBigInt(); + break; + case /* repeated uint64 aliases */ 2: + if (wireType === WireType.LengthDelimited) + for (let e = reader.int32() + reader.pos; reader.pos < e;) + message.aliases.push(reader.uint64().toBigInt()); + else + message.aliases.push(reader.uint64().toBigInt()); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: AliasMap, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint64 base_scid = 1; */ + if (message.baseScid !== 0n) + writer.tag(1, WireType.Varint).uint64(message.baseScid); + /* repeated uint64 aliases = 2; */ + if (message.aliases.length) { + writer.tag(2, WireType.LengthDelimited).fork(); + for (let i = 0; i < message.aliases.length; i++) + writer.uint64(message.aliases[i]); + writer.join(); + } + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.AliasMap + */ +export const AliasMap = new AliasMap$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ListAliasesRequest$Type extends MessageType { + constructor() { + super("lnrpc.ListAliasesRequest", []); + } + create(value?: PartialMessage): ListAliasesRequest { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ListAliasesRequest): ListAliasesRequest { + return target ?? this.create(); + } + internalBinaryWrite(message: ListAliasesRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ListAliasesRequest + */ +export const ListAliasesRequest = new ListAliasesRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ListAliasesResponse$Type extends MessageType { + constructor() { + super("lnrpc.ListAliasesResponse", [ + { no: 1, name: "alias_maps", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => AliasMap } + ]); + } + create(value?: PartialMessage): ListAliasesResponse { + const message = { aliasMaps: [] }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ListAliasesResponse): ListAliasesResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated lnrpc.AliasMap alias_maps */ 1: + message.aliasMaps.push(AliasMap.internalBinaryRead(reader, reader.uint32(), options)); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ListAliasesResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated lnrpc.AliasMap alias_maps = 1; */ + for (let i = 0; i < message.aliasMaps.length; i++) + AliasMap.internalBinaryWrite(message.aliasMaps[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ListAliasesResponse + */ +export const ListAliasesResponse = new ListAliasesResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ChannelCloseSummary$Type extends MessageType { + constructor() { + super("lnrpc.ChannelCloseSummary", [ + { no: 1, name: "channel_point", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "chan_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/ }, + { no: 3, name: "chain_hash", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 4, name: "closing_tx_hash", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 5, name: "remote_pubkey", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 6, name: "capacity", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 7, name: "close_height", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 8, name: "settled_balance", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 9, name: "time_locked_balance", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 10, name: "close_type", kind: "enum", T: () => ["lnrpc.ChannelCloseSummary.ClosureType", ChannelCloseSummary_ClosureType] }, + { no: 11, name: "open_initiator", kind: "enum", T: () => ["lnrpc.Initiator", Initiator, "INITIATOR_"] }, + { no: 12, name: "close_initiator", kind: "enum", T: () => ["lnrpc.Initiator", Initiator, "INITIATOR_"] }, + { no: 13, name: "resolutions", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => Resolution }, + { no: 14, name: "alias_scids", kind: "scalar", repeat: 1 /*RepeatType.PACKED*/, T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 15, name: "zero_conf_confirmed_scid", kind: "scalar", T: 4 /*ScalarType.UINT64*/ } + ]); + } + create(value?: PartialMessage): ChannelCloseSummary { + const message = { channelPoint: "", chanId: "0", chainHash: "", closingTxHash: "", remotePubkey: "", capacity: 0n, closeHeight: 0, settledBalance: 0n, timeLockedBalance: 0n, closeType: 0, openInitiator: 0, closeInitiator: 0, resolutions: [], aliasScids: [], zeroConfConfirmedScid: "0" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ChannelCloseSummary): ChannelCloseSummary { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string channel_point */ 1: + message.channelPoint = reader.string(); + break; + case /* uint64 chan_id = 2 [jstype = JS_STRING];*/ 2: + message.chanId = reader.uint64().toString(); + break; + case /* string chain_hash */ 3: + message.chainHash = reader.string(); + break; + case /* string closing_tx_hash */ 4: + message.closingTxHash = reader.string(); + break; + case /* string remote_pubkey */ 5: + message.remotePubkey = reader.string(); + break; + case /* int64 capacity */ 6: + message.capacity = reader.int64().toBigInt(); + break; + case /* uint32 close_height */ 7: + message.closeHeight = reader.uint32(); + break; + case /* int64 settled_balance */ 8: + message.settledBalance = reader.int64().toBigInt(); + break; + case /* int64 time_locked_balance */ 9: + message.timeLockedBalance = reader.int64().toBigInt(); + break; + case /* lnrpc.ChannelCloseSummary.ClosureType close_type */ 10: + message.closeType = reader.int32(); + break; + case /* lnrpc.Initiator open_initiator */ 11: + message.openInitiator = reader.int32(); + break; + case /* lnrpc.Initiator close_initiator */ 12: + message.closeInitiator = reader.int32(); + break; + case /* repeated lnrpc.Resolution resolutions */ 13: + message.resolutions.push(Resolution.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* repeated uint64 alias_scids */ 14: + if (wireType === WireType.LengthDelimited) + for (let e = reader.int32() + reader.pos; reader.pos < e;) + message.aliasScids.push(reader.uint64().toBigInt()); + else + message.aliasScids.push(reader.uint64().toBigInt()); + break; + case /* uint64 zero_conf_confirmed_scid = 15 [jstype = JS_STRING];*/ 15: + message.zeroConfConfirmedScid = reader.uint64().toString(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ChannelCloseSummary, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string channel_point = 1; */ + if (message.channelPoint !== "") + writer.tag(1, WireType.LengthDelimited).string(message.channelPoint); + /* uint64 chan_id = 2 [jstype = JS_STRING]; */ + if (message.chanId !== "0") + writer.tag(2, WireType.Varint).uint64(message.chanId); + /* string chain_hash = 3; */ + if (message.chainHash !== "") + writer.tag(3, WireType.LengthDelimited).string(message.chainHash); + /* string closing_tx_hash = 4; */ + if (message.closingTxHash !== "") + writer.tag(4, WireType.LengthDelimited).string(message.closingTxHash); + /* string remote_pubkey = 5; */ + if (message.remotePubkey !== "") + writer.tag(5, WireType.LengthDelimited).string(message.remotePubkey); + /* int64 capacity = 6; */ + if (message.capacity !== 0n) + writer.tag(6, WireType.Varint).int64(message.capacity); + /* uint32 close_height = 7; */ + if (message.closeHeight !== 0) + writer.tag(7, WireType.Varint).uint32(message.closeHeight); + /* int64 settled_balance = 8; */ + if (message.settledBalance !== 0n) + writer.tag(8, WireType.Varint).int64(message.settledBalance); + /* int64 time_locked_balance = 9; */ + if (message.timeLockedBalance !== 0n) + writer.tag(9, WireType.Varint).int64(message.timeLockedBalance); + /* lnrpc.ChannelCloseSummary.ClosureType close_type = 10; */ + if (message.closeType !== 0) + writer.tag(10, WireType.Varint).int32(message.closeType); + /* lnrpc.Initiator open_initiator = 11; */ + if (message.openInitiator !== 0) + writer.tag(11, WireType.Varint).int32(message.openInitiator); + /* lnrpc.Initiator close_initiator = 12; */ + if (message.closeInitiator !== 0) + writer.tag(12, WireType.Varint).int32(message.closeInitiator); + /* repeated lnrpc.Resolution resolutions = 13; */ + for (let i = 0; i < message.resolutions.length; i++) + Resolution.internalBinaryWrite(message.resolutions[i], writer.tag(13, WireType.LengthDelimited).fork(), options).join(); + /* repeated uint64 alias_scids = 14; */ + if (message.aliasScids.length) { + writer.tag(14, WireType.LengthDelimited).fork(); + for (let i = 0; i < message.aliasScids.length; i++) + writer.uint64(message.aliasScids[i]); + writer.join(); + } + /* uint64 zero_conf_confirmed_scid = 15 [jstype = JS_STRING]; */ + if (message.zeroConfConfirmedScid !== "0") + writer.tag(15, WireType.Varint).uint64(message.zeroConfConfirmedScid); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ChannelCloseSummary + */ +export const ChannelCloseSummary = new ChannelCloseSummary$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class Resolution$Type extends MessageType { + constructor() { + super("lnrpc.Resolution", [ + { no: 1, name: "resolution_type", kind: "enum", T: () => ["lnrpc.ResolutionType", ResolutionType] }, + { no: 2, name: "outcome", kind: "enum", T: () => ["lnrpc.ResolutionOutcome", ResolutionOutcome] }, + { no: 3, name: "outpoint", kind: "message", T: () => OutPoint }, + { no: 4, name: "amount_sat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 5, name: "sweep_txid", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): Resolution { + const message = { resolutionType: 0, outcome: 0, amountSat: 0n, sweepTxid: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: Resolution): Resolution { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.ResolutionType resolution_type */ 1: + message.resolutionType = reader.int32(); + break; + case /* lnrpc.ResolutionOutcome outcome */ 2: + message.outcome = reader.int32(); + break; + case /* lnrpc.OutPoint outpoint */ 3: + message.outpoint = OutPoint.internalBinaryRead(reader, reader.uint32(), options, message.outpoint); + break; + case /* uint64 amount_sat */ 4: + message.amountSat = reader.uint64().toBigInt(); + break; + case /* string sweep_txid */ 5: + message.sweepTxid = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: Resolution, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.ResolutionType resolution_type = 1; */ + if (message.resolutionType !== 0) + writer.tag(1, WireType.Varint).int32(message.resolutionType); + /* lnrpc.ResolutionOutcome outcome = 2; */ + if (message.outcome !== 0) + writer.tag(2, WireType.Varint).int32(message.outcome); + /* lnrpc.OutPoint outpoint = 3; */ + if (message.outpoint) + OutPoint.internalBinaryWrite(message.outpoint, writer.tag(3, WireType.LengthDelimited).fork(), options).join(); + /* uint64 amount_sat = 4; */ + if (message.amountSat !== 0n) + writer.tag(4, WireType.Varint).uint64(message.amountSat); + /* string sweep_txid = 5; */ + if (message.sweepTxid !== "") + writer.tag(5, WireType.LengthDelimited).string(message.sweepTxid); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.Resolution + */ +export const Resolution = new Resolution$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ClosedChannelsRequest$Type extends MessageType { + constructor() { + super("lnrpc.ClosedChannelsRequest", [ + { no: 1, name: "cooperative", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 2, name: "local_force", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 3, name: "remote_force", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 4, name: "breach", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 5, name: "funding_canceled", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 6, name: "abandoned", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): ClosedChannelsRequest { + const message = { cooperative: false, localForce: false, remoteForce: false, breach: false, fundingCanceled: false, abandoned: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ClosedChannelsRequest): ClosedChannelsRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bool cooperative */ 1: + message.cooperative = reader.bool(); + break; + case /* bool local_force */ 2: + message.localForce = reader.bool(); + break; + case /* bool remote_force */ 3: + message.remoteForce = reader.bool(); + break; + case /* bool breach */ 4: + message.breach = reader.bool(); + break; + case /* bool funding_canceled */ 5: + message.fundingCanceled = reader.bool(); + break; + case /* bool abandoned */ 6: + message.abandoned = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ClosedChannelsRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bool cooperative = 1; */ + if (message.cooperative !== false) + writer.tag(1, WireType.Varint).bool(message.cooperative); + /* bool local_force = 2; */ + if (message.localForce !== false) + writer.tag(2, WireType.Varint).bool(message.localForce); + /* bool remote_force = 3; */ + if (message.remoteForce !== false) + writer.tag(3, WireType.Varint).bool(message.remoteForce); + /* bool breach = 4; */ + if (message.breach !== false) + writer.tag(4, WireType.Varint).bool(message.breach); + /* bool funding_canceled = 5; */ + if (message.fundingCanceled !== false) + writer.tag(5, WireType.Varint).bool(message.fundingCanceled); + /* bool abandoned = 6; */ + if (message.abandoned !== false) + writer.tag(6, WireType.Varint).bool(message.abandoned); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ClosedChannelsRequest + */ +export const ClosedChannelsRequest = new ClosedChannelsRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ClosedChannelsResponse$Type extends MessageType { + constructor() { + super("lnrpc.ClosedChannelsResponse", [ + { no: 1, name: "channels", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => ChannelCloseSummary } + ]); + } + create(value?: PartialMessage): ClosedChannelsResponse { + const message = { channels: [] }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ClosedChannelsResponse): ClosedChannelsResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated lnrpc.ChannelCloseSummary channels */ 1: + message.channels.push(ChannelCloseSummary.internalBinaryRead(reader, reader.uint32(), options)); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ClosedChannelsResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated lnrpc.ChannelCloseSummary channels = 1; */ + for (let i = 0; i < message.channels.length; i++) + ChannelCloseSummary.internalBinaryWrite(message.channels[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ClosedChannelsResponse + */ +export const ClosedChannelsResponse = new ClosedChannelsResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class Peer$Type extends MessageType { + constructor() { + super("lnrpc.Peer", [ + { no: 1, name: "pub_key", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 3, name: "address", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 4, name: "bytes_sent", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 5, name: "bytes_recv", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 6, name: "sat_sent", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 7, name: "sat_recv", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 8, name: "inbound", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 9, name: "ping_time", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 10, name: "sync_type", kind: "enum", T: () => ["lnrpc.Peer.SyncType", Peer_SyncType] }, + { no: 11, name: "features", kind: "map", K: 13 /*ScalarType.UINT32*/, V: { kind: "message", T: () => Feature } }, + { no: 12, name: "errors", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => TimestampedError }, + { no: 13, name: "flap_count", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 14, name: "last_flap_ns", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 15, name: "last_ping_payload", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): Peer { + const message = { pubKey: "", address: "", bytesSent: 0n, bytesRecv: 0n, satSent: 0n, satRecv: 0n, inbound: false, pingTime: 0n, syncType: 0, features: {}, errors: [], flapCount: 0, lastFlapNs: 0n, lastPingPayload: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: Peer): Peer { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string pub_key */ 1: + message.pubKey = reader.string(); + break; + case /* string address */ 3: + message.address = reader.string(); + break; + case /* uint64 bytes_sent */ 4: + message.bytesSent = reader.uint64().toBigInt(); + break; + case /* uint64 bytes_recv */ 5: + message.bytesRecv = reader.uint64().toBigInt(); + break; + case /* int64 sat_sent */ 6: + message.satSent = reader.int64().toBigInt(); + break; + case /* int64 sat_recv */ 7: + message.satRecv = reader.int64().toBigInt(); + break; + case /* bool inbound */ 8: + message.inbound = reader.bool(); + break; + case /* int64 ping_time */ 9: + message.pingTime = reader.int64().toBigInt(); + break; + case /* lnrpc.Peer.SyncType sync_type */ 10: + message.syncType = reader.int32(); + break; + case /* map features */ 11: + this.binaryReadMap11(message.features, reader, options); + break; + case /* repeated lnrpc.TimestampedError errors */ 12: + message.errors.push(TimestampedError.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* int32 flap_count */ 13: + message.flapCount = reader.int32(); + break; + case /* int64 last_flap_ns */ 14: + message.lastFlapNs = reader.int64().toBigInt(); + break; + case /* bytes last_ping_payload */ 15: + message.lastPingPayload = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + private binaryReadMap11(map: Peer["features"], reader: IBinaryReader, options: BinaryReadOptions): void { + let len = reader.uint32(), end = reader.pos + len, key: keyof Peer["features"] | undefined, val: Peer["features"][any] | undefined; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + key = reader.uint32(); + break; + case 2: + val = Feature.internalBinaryRead(reader, reader.uint32(), options); + break; + default: throw new globalThis.Error("unknown map entry field for field lnrpc.Peer.features"); + } + } + map[key ?? 0] = val ?? Feature.create(); + } + internalBinaryWrite(message: Peer, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string pub_key = 1; */ + if (message.pubKey !== "") + writer.tag(1, WireType.LengthDelimited).string(message.pubKey); + /* string address = 3; */ + if (message.address !== "") + writer.tag(3, WireType.LengthDelimited).string(message.address); + /* uint64 bytes_sent = 4; */ + if (message.bytesSent !== 0n) + writer.tag(4, WireType.Varint).uint64(message.bytesSent); + /* uint64 bytes_recv = 5; */ + if (message.bytesRecv !== 0n) + writer.tag(5, WireType.Varint).uint64(message.bytesRecv); + /* int64 sat_sent = 6; */ + if (message.satSent !== 0n) + writer.tag(6, WireType.Varint).int64(message.satSent); + /* int64 sat_recv = 7; */ + if (message.satRecv !== 0n) + writer.tag(7, WireType.Varint).int64(message.satRecv); + /* bool inbound = 8; */ + if (message.inbound !== false) + writer.tag(8, WireType.Varint).bool(message.inbound); + /* int64 ping_time = 9; */ + if (message.pingTime !== 0n) + writer.tag(9, WireType.Varint).int64(message.pingTime); + /* lnrpc.Peer.SyncType sync_type = 10; */ + if (message.syncType !== 0) + writer.tag(10, WireType.Varint).int32(message.syncType); + /* map features = 11; */ + for (let k of Object.keys(message.features)) { + writer.tag(11, WireType.LengthDelimited).fork().tag(1, WireType.Varint).uint32(parseInt(k)); + writer.tag(2, WireType.LengthDelimited).fork(); + Feature.internalBinaryWrite(message.features[k as any], writer, options); + writer.join().join(); + } + /* repeated lnrpc.TimestampedError errors = 12; */ + for (let i = 0; i < message.errors.length; i++) + TimestampedError.internalBinaryWrite(message.errors[i], writer.tag(12, WireType.LengthDelimited).fork(), options).join(); + /* int32 flap_count = 13; */ + if (message.flapCount !== 0) + writer.tag(13, WireType.Varint).int32(message.flapCount); + /* int64 last_flap_ns = 14; */ + if (message.lastFlapNs !== 0n) + writer.tag(14, WireType.Varint).int64(message.lastFlapNs); + /* bytes last_ping_payload = 15; */ + if (message.lastPingPayload.length) + writer.tag(15, WireType.LengthDelimited).bytes(message.lastPingPayload); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.Peer + */ +export const Peer = new Peer$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class TimestampedError$Type extends MessageType { + constructor() { + super("lnrpc.TimestampedError", [ + { no: 1, name: "timestamp", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 2, name: "error", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): TimestampedError { + const message = { timestamp: 0n, error: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: TimestampedError): TimestampedError { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint64 timestamp */ 1: + message.timestamp = reader.uint64().toBigInt(); + break; + case /* string error */ 2: + message.error = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: TimestampedError, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint64 timestamp = 1; */ + if (message.timestamp !== 0n) + writer.tag(1, WireType.Varint).uint64(message.timestamp); + /* string error = 2; */ + if (message.error !== "") + writer.tag(2, WireType.LengthDelimited).string(message.error); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.TimestampedError + */ +export const TimestampedError = new TimestampedError$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ListPeersRequest$Type extends MessageType { + constructor() { + super("lnrpc.ListPeersRequest", [ + { no: 1, name: "latest_error", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): ListPeersRequest { + const message = { latestError: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ListPeersRequest): ListPeersRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bool latest_error */ 1: + message.latestError = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ListPeersRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bool latest_error = 1; */ + if (message.latestError !== false) + writer.tag(1, WireType.Varint).bool(message.latestError); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ListPeersRequest + */ +export const ListPeersRequest = new ListPeersRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ListPeersResponse$Type extends MessageType { + constructor() { + super("lnrpc.ListPeersResponse", [ + { no: 1, name: "peers", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => Peer } + ]); + } + create(value?: PartialMessage): ListPeersResponse { + const message = { peers: [] }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ListPeersResponse): ListPeersResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated lnrpc.Peer peers */ 1: + message.peers.push(Peer.internalBinaryRead(reader, reader.uint32(), options)); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ListPeersResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated lnrpc.Peer peers = 1; */ + for (let i = 0; i < message.peers.length; i++) + Peer.internalBinaryWrite(message.peers[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ListPeersResponse + */ +export const ListPeersResponse = new ListPeersResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PeerEventSubscription$Type extends MessageType { + constructor() { + super("lnrpc.PeerEventSubscription", []); + } + create(value?: PartialMessage): PeerEventSubscription { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PeerEventSubscription): PeerEventSubscription { + return target ?? this.create(); + } + internalBinaryWrite(message: PeerEventSubscription, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.PeerEventSubscription + */ +export const PeerEventSubscription = new PeerEventSubscription$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PeerEvent$Type extends MessageType { + constructor() { + super("lnrpc.PeerEvent", [ + { no: 1, name: "pub_key", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "type", kind: "enum", T: () => ["lnrpc.PeerEvent.EventType", PeerEvent_EventType] } + ]); + } + create(value?: PartialMessage): PeerEvent { + const message = { pubKey: "", type: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PeerEvent): PeerEvent { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string pub_key */ 1: + message.pubKey = reader.string(); + break; + case /* lnrpc.PeerEvent.EventType type */ 2: + message.type = reader.int32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PeerEvent, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string pub_key = 1; */ + if (message.pubKey !== "") + writer.tag(1, WireType.LengthDelimited).string(message.pubKey); + /* lnrpc.PeerEvent.EventType type = 2; */ + if (message.type !== 0) + writer.tag(2, WireType.Varint).int32(message.type); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.PeerEvent + */ +export const PeerEvent = new PeerEvent$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class GetInfoRequest$Type extends MessageType { + constructor() { + super("lnrpc.GetInfoRequest", []); + } + create(value?: PartialMessage): GetInfoRequest { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: GetInfoRequest): GetInfoRequest { + return target ?? this.create(); + } + internalBinaryWrite(message: GetInfoRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.GetInfoRequest + */ +export const GetInfoRequest = new GetInfoRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class GetInfoResponse$Type extends MessageType { + constructor() { + super("lnrpc.GetInfoResponse", [ + { no: 14, name: "version", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 20, name: "commit_hash", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 1, name: "identity_pubkey", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "alias", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 17, name: "color", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 3, name: "num_pending_channels", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 4, name: "num_active_channels", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 15, name: "num_inactive_channels", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 5, name: "num_peers", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 6, name: "block_height", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 8, name: "block_hash", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 13, name: "best_header_timestamp", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 9, name: "synced_to_chain", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 18, name: "synced_to_graph", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 10, name: "testnet", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 16, name: "chains", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => Chain }, + { no: 12, name: "uris", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/ }, + { no: 19, name: "features", kind: "map", K: 13 /*ScalarType.UINT32*/, V: { kind: "message", T: () => Feature } }, + { no: 21, name: "require_htlc_interceptor", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): GetInfoResponse { + const message = { version: "", commitHash: "", identityPubkey: "", alias: "", color: "", numPendingChannels: 0, numActiveChannels: 0, numInactiveChannels: 0, numPeers: 0, blockHeight: 0, blockHash: "", bestHeaderTimestamp: 0n, syncedToChain: false, syncedToGraph: false, testnet: false, chains: [], uris: [], features: {}, requireHtlcInterceptor: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: GetInfoResponse): GetInfoResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string version */ 14: + message.version = reader.string(); + break; + case /* string commit_hash */ 20: + message.commitHash = reader.string(); + break; + case /* string identity_pubkey */ 1: + message.identityPubkey = reader.string(); + break; + case /* string alias */ 2: + message.alias = reader.string(); + break; + case /* string color */ 17: + message.color = reader.string(); + break; + case /* uint32 num_pending_channels */ 3: + message.numPendingChannels = reader.uint32(); + break; + case /* uint32 num_active_channels */ 4: + message.numActiveChannels = reader.uint32(); + break; + case /* uint32 num_inactive_channels */ 15: + message.numInactiveChannels = reader.uint32(); + break; + case /* uint32 num_peers */ 5: + message.numPeers = reader.uint32(); + break; + case /* uint32 block_height */ 6: + message.blockHeight = reader.uint32(); + break; + case /* string block_hash */ 8: + message.blockHash = reader.string(); + break; + case /* int64 best_header_timestamp */ 13: + message.bestHeaderTimestamp = reader.int64().toBigInt(); + break; + case /* bool synced_to_chain */ 9: + message.syncedToChain = reader.bool(); + break; + case /* bool synced_to_graph */ 18: + message.syncedToGraph = reader.bool(); + break; + case /* bool testnet = 10 [deprecated = true];*/ 10: + message.testnet = reader.bool(); + break; + case /* repeated lnrpc.Chain chains */ 16: + message.chains.push(Chain.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* repeated string uris */ 12: + message.uris.push(reader.string()); + break; + case /* map features */ 19: + this.binaryReadMap19(message.features, reader, options); + break; + case /* bool require_htlc_interceptor */ 21: + message.requireHtlcInterceptor = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + private binaryReadMap19(map: GetInfoResponse["features"], reader: IBinaryReader, options: BinaryReadOptions): void { + let len = reader.uint32(), end = reader.pos + len, key: keyof GetInfoResponse["features"] | undefined, val: GetInfoResponse["features"][any] | undefined; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + key = reader.uint32(); + break; + case 2: + val = Feature.internalBinaryRead(reader, reader.uint32(), options); + break; + default: throw new globalThis.Error("unknown map entry field for field lnrpc.GetInfoResponse.features"); + } + } + map[key ?? 0] = val ?? Feature.create(); + } + internalBinaryWrite(message: GetInfoResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string version = 14; */ + if (message.version !== "") + writer.tag(14, WireType.LengthDelimited).string(message.version); + /* string commit_hash = 20; */ + if (message.commitHash !== "") + writer.tag(20, WireType.LengthDelimited).string(message.commitHash); + /* string identity_pubkey = 1; */ + if (message.identityPubkey !== "") + writer.tag(1, WireType.LengthDelimited).string(message.identityPubkey); + /* string alias = 2; */ + if (message.alias !== "") + writer.tag(2, WireType.LengthDelimited).string(message.alias); + /* string color = 17; */ + if (message.color !== "") + writer.tag(17, WireType.LengthDelimited).string(message.color); + /* uint32 num_pending_channels = 3; */ + if (message.numPendingChannels !== 0) + writer.tag(3, WireType.Varint).uint32(message.numPendingChannels); + /* uint32 num_active_channels = 4; */ + if (message.numActiveChannels !== 0) + writer.tag(4, WireType.Varint).uint32(message.numActiveChannels); + /* uint32 num_inactive_channels = 15; */ + if (message.numInactiveChannels !== 0) + writer.tag(15, WireType.Varint).uint32(message.numInactiveChannels); + /* uint32 num_peers = 5; */ + if (message.numPeers !== 0) + writer.tag(5, WireType.Varint).uint32(message.numPeers); + /* uint32 block_height = 6; */ + if (message.blockHeight !== 0) + writer.tag(6, WireType.Varint).uint32(message.blockHeight); + /* string block_hash = 8; */ + if (message.blockHash !== "") + writer.tag(8, WireType.LengthDelimited).string(message.blockHash); + /* int64 best_header_timestamp = 13; */ + if (message.bestHeaderTimestamp !== 0n) + writer.tag(13, WireType.Varint).int64(message.bestHeaderTimestamp); + /* bool synced_to_chain = 9; */ + if (message.syncedToChain !== false) + writer.tag(9, WireType.Varint).bool(message.syncedToChain); + /* bool synced_to_graph = 18; */ + if (message.syncedToGraph !== false) + writer.tag(18, WireType.Varint).bool(message.syncedToGraph); + /* bool testnet = 10 [deprecated = true]; */ + if (message.testnet !== false) + writer.tag(10, WireType.Varint).bool(message.testnet); + /* repeated lnrpc.Chain chains = 16; */ + for (let i = 0; i < message.chains.length; i++) + Chain.internalBinaryWrite(message.chains[i], writer.tag(16, WireType.LengthDelimited).fork(), options).join(); + /* repeated string uris = 12; */ + for (let i = 0; i < message.uris.length; i++) + writer.tag(12, WireType.LengthDelimited).string(message.uris[i]); + /* map features = 19; */ + for (let k of Object.keys(message.features)) { + writer.tag(19, WireType.LengthDelimited).fork().tag(1, WireType.Varint).uint32(parseInt(k)); + writer.tag(2, WireType.LengthDelimited).fork(); + Feature.internalBinaryWrite(message.features[k as any], writer, options); + writer.join().join(); + } + /* bool require_htlc_interceptor = 21; */ + if (message.requireHtlcInterceptor !== false) + writer.tag(21, WireType.Varint).bool(message.requireHtlcInterceptor); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.GetInfoResponse + */ +export const GetInfoResponse = new GetInfoResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class GetRecoveryInfoRequest$Type extends MessageType { + constructor() { + super("lnrpc.GetRecoveryInfoRequest", []); + } + create(value?: PartialMessage): GetRecoveryInfoRequest { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: GetRecoveryInfoRequest): GetRecoveryInfoRequest { + return target ?? this.create(); + } + internalBinaryWrite(message: GetRecoveryInfoRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.GetRecoveryInfoRequest + */ +export const GetRecoveryInfoRequest = new GetRecoveryInfoRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class GetRecoveryInfoResponse$Type extends MessageType { + constructor() { + super("lnrpc.GetRecoveryInfoResponse", [ + { no: 1, name: "recovery_mode", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 2, name: "recovery_finished", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 3, name: "progress", kind: "scalar", T: 1 /*ScalarType.DOUBLE*/ } + ]); + } + create(value?: PartialMessage): GetRecoveryInfoResponse { + const message = { recoveryMode: false, recoveryFinished: false, progress: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: GetRecoveryInfoResponse): GetRecoveryInfoResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bool recovery_mode */ 1: + message.recoveryMode = reader.bool(); + break; + case /* bool recovery_finished */ 2: + message.recoveryFinished = reader.bool(); + break; + case /* double progress */ 3: + message.progress = reader.double(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: GetRecoveryInfoResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bool recovery_mode = 1; */ + if (message.recoveryMode !== false) + writer.tag(1, WireType.Varint).bool(message.recoveryMode); + /* bool recovery_finished = 2; */ + if (message.recoveryFinished !== false) + writer.tag(2, WireType.Varint).bool(message.recoveryFinished); + /* double progress = 3; */ + if (message.progress !== 0) + writer.tag(3, WireType.Bit64).double(message.progress); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.GetRecoveryInfoResponse + */ +export const GetRecoveryInfoResponse = new GetRecoveryInfoResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class Chain$Type extends MessageType { + constructor() { + super("lnrpc.Chain", [ + { no: 1, name: "chain", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "network", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): Chain { + const message = { chain: "", network: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: Chain): Chain { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string chain */ 1: + message.chain = reader.string(); + break; + case /* string network */ 2: + message.network = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: Chain, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string chain = 1; */ + if (message.chain !== "") + writer.tag(1, WireType.LengthDelimited).string(message.chain); + /* string network = 2; */ + if (message.network !== "") + writer.tag(2, WireType.LengthDelimited).string(message.network); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.Chain + */ +export const Chain = new Chain$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ConfirmationUpdate$Type extends MessageType { + constructor() { + super("lnrpc.ConfirmationUpdate", [ + { no: 1, name: "block_sha", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "block_height", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 3, name: "num_confs_left", kind: "scalar", T: 13 /*ScalarType.UINT32*/ } + ]); + } + create(value?: PartialMessage): ConfirmationUpdate { + const message = { blockSha: new Uint8Array(0), blockHeight: 0, numConfsLeft: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ConfirmationUpdate): ConfirmationUpdate { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes block_sha */ 1: + message.blockSha = reader.bytes(); + break; + case /* int32 block_height */ 2: + message.blockHeight = reader.int32(); + break; + case /* uint32 num_confs_left */ 3: + message.numConfsLeft = reader.uint32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ConfirmationUpdate, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes block_sha = 1; */ + if (message.blockSha.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.blockSha); + /* int32 block_height = 2; */ + if (message.blockHeight !== 0) + writer.tag(2, WireType.Varint).int32(message.blockHeight); + /* uint32 num_confs_left = 3; */ + if (message.numConfsLeft !== 0) + writer.tag(3, WireType.Varint).uint32(message.numConfsLeft); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ConfirmationUpdate + */ +export const ConfirmationUpdate = new ConfirmationUpdate$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ChannelOpenUpdate$Type extends MessageType { + constructor() { + super("lnrpc.ChannelOpenUpdate", [ + { no: 1, name: "channel_point", kind: "message", T: () => ChannelPoint } + ]); + } + create(value?: PartialMessage): ChannelOpenUpdate { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ChannelOpenUpdate): ChannelOpenUpdate { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.ChannelPoint channel_point */ 1: + message.channelPoint = ChannelPoint.internalBinaryRead(reader, reader.uint32(), options, message.channelPoint); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ChannelOpenUpdate, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.ChannelPoint channel_point = 1; */ + if (message.channelPoint) + ChannelPoint.internalBinaryWrite(message.channelPoint, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ChannelOpenUpdate + */ +export const ChannelOpenUpdate = new ChannelOpenUpdate$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ChannelCloseUpdate$Type extends MessageType { + constructor() { + super("lnrpc.ChannelCloseUpdate", [ + { no: 1, name: "closing_txid", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "success", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): ChannelCloseUpdate { + const message = { closingTxid: new Uint8Array(0), success: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ChannelCloseUpdate): ChannelCloseUpdate { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes closing_txid */ 1: + message.closingTxid = reader.bytes(); + break; + case /* bool success */ 2: + message.success = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ChannelCloseUpdate, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes closing_txid = 1; */ + if (message.closingTxid.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.closingTxid); + /* bool success = 2; */ + if (message.success !== false) + writer.tag(2, WireType.Varint).bool(message.success); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ChannelCloseUpdate + */ +export const ChannelCloseUpdate = new ChannelCloseUpdate$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class CloseChannelRequest$Type extends MessageType { + constructor() { + super("lnrpc.CloseChannelRequest", [ + { no: 1, name: "channel_point", kind: "message", T: () => ChannelPoint }, + { no: 2, name: "force", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 3, name: "target_conf", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 4, name: "sat_per_byte", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 5, name: "delivery_address", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 6, name: "sat_per_vbyte", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 7, name: "max_fee_per_vbyte", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): CloseChannelRequest { + const message = { force: false, targetConf: 0, satPerByte: 0n, deliveryAddress: "", satPerVbyte: 0n, maxFeePerVbyte: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: CloseChannelRequest): CloseChannelRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.ChannelPoint channel_point */ 1: + message.channelPoint = ChannelPoint.internalBinaryRead(reader, reader.uint32(), options, message.channelPoint); + break; + case /* bool force */ 2: + message.force = reader.bool(); + break; + case /* int32 target_conf */ 3: + message.targetConf = reader.int32(); + break; + case /* int64 sat_per_byte = 4 [deprecated = true];*/ 4: + message.satPerByte = reader.int64().toBigInt(); + break; + case /* string delivery_address */ 5: + message.deliveryAddress = reader.string(); + break; + case /* uint64 sat_per_vbyte */ 6: + message.satPerVbyte = reader.uint64().toBigInt(); + break; + case /* uint64 max_fee_per_vbyte */ 7: + message.maxFeePerVbyte = reader.uint64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: CloseChannelRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.ChannelPoint channel_point = 1; */ + if (message.channelPoint) + ChannelPoint.internalBinaryWrite(message.channelPoint, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* bool force = 2; */ + if (message.force !== false) + writer.tag(2, WireType.Varint).bool(message.force); + /* int32 target_conf = 3; */ + if (message.targetConf !== 0) + writer.tag(3, WireType.Varint).int32(message.targetConf); + /* int64 sat_per_byte = 4 [deprecated = true]; */ + if (message.satPerByte !== 0n) + writer.tag(4, WireType.Varint).int64(message.satPerByte); + /* string delivery_address = 5; */ + if (message.deliveryAddress !== "") + writer.tag(5, WireType.LengthDelimited).string(message.deliveryAddress); + /* uint64 sat_per_vbyte = 6; */ + if (message.satPerVbyte !== 0n) + writer.tag(6, WireType.Varint).uint64(message.satPerVbyte); + /* uint64 max_fee_per_vbyte = 7; */ + if (message.maxFeePerVbyte !== 0n) + writer.tag(7, WireType.Varint).uint64(message.maxFeePerVbyte); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.CloseChannelRequest + */ +export const CloseChannelRequest = new CloseChannelRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class CloseStatusUpdate$Type extends MessageType { + constructor() { + super("lnrpc.CloseStatusUpdate", [ + { no: 1, name: "close_pending", kind: "message", oneof: "update", T: () => PendingUpdate }, + { no: 3, name: "chan_close", kind: "message", oneof: "update", T: () => ChannelCloseUpdate } + ]); + } + create(value?: PartialMessage): CloseStatusUpdate { + const message = { update: { oneofKind: undefined } }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: CloseStatusUpdate): CloseStatusUpdate { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.PendingUpdate close_pending */ 1: + message.update = { + oneofKind: "closePending", + closePending: PendingUpdate.internalBinaryRead(reader, reader.uint32(), options, (message.update as any).closePending) + }; + break; + case /* lnrpc.ChannelCloseUpdate chan_close */ 3: + message.update = { + oneofKind: "chanClose", + chanClose: ChannelCloseUpdate.internalBinaryRead(reader, reader.uint32(), options, (message.update as any).chanClose) + }; + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: CloseStatusUpdate, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.PendingUpdate close_pending = 1; */ + if (message.update.oneofKind === "closePending") + PendingUpdate.internalBinaryWrite(message.update.closePending, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.ChannelCloseUpdate chan_close = 3; */ + if (message.update.oneofKind === "chanClose") + ChannelCloseUpdate.internalBinaryWrite(message.update.chanClose, writer.tag(3, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.CloseStatusUpdate + */ +export const CloseStatusUpdate = new CloseStatusUpdate$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PendingUpdate$Type extends MessageType { + constructor() { + super("lnrpc.PendingUpdate", [ + { no: 1, name: "txid", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "output_index", kind: "scalar", T: 13 /*ScalarType.UINT32*/ } + ]); + } + create(value?: PartialMessage): PendingUpdate { + const message = { txid: new Uint8Array(0), outputIndex: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PendingUpdate): PendingUpdate { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes txid */ 1: + message.txid = reader.bytes(); + break; + case /* uint32 output_index */ 2: + message.outputIndex = reader.uint32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PendingUpdate, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes txid = 1; */ + if (message.txid.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.txid); + /* uint32 output_index = 2; */ + if (message.outputIndex !== 0) + writer.tag(2, WireType.Varint).uint32(message.outputIndex); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.PendingUpdate + */ +export const PendingUpdate = new PendingUpdate$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ReadyForPsbtFunding$Type extends MessageType { + constructor() { + super("lnrpc.ReadyForPsbtFunding", [ + { no: 1, name: "funding_address", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "funding_amount", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "psbt", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): ReadyForPsbtFunding { + const message = { fundingAddress: "", fundingAmount: 0n, psbt: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ReadyForPsbtFunding): ReadyForPsbtFunding { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string funding_address */ 1: + message.fundingAddress = reader.string(); + break; + case /* int64 funding_amount */ 2: + message.fundingAmount = reader.int64().toBigInt(); + break; + case /* bytes psbt */ 3: + message.psbt = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ReadyForPsbtFunding, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string funding_address = 1; */ + if (message.fundingAddress !== "") + writer.tag(1, WireType.LengthDelimited).string(message.fundingAddress); + /* int64 funding_amount = 2; */ + if (message.fundingAmount !== 0n) + writer.tag(2, WireType.Varint).int64(message.fundingAmount); + /* bytes psbt = 3; */ + if (message.psbt.length) + writer.tag(3, WireType.LengthDelimited).bytes(message.psbt); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ReadyForPsbtFunding + */ +export const ReadyForPsbtFunding = new ReadyForPsbtFunding$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class BatchOpenChannelRequest$Type extends MessageType { + constructor() { + super("lnrpc.BatchOpenChannelRequest", [ + { no: 1, name: "channels", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => BatchOpenChannel }, + { no: 2, name: "target_conf", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 3, name: "sat_per_vbyte", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "min_confs", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 5, name: "spend_unconfirmed", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 6, name: "label", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): BatchOpenChannelRequest { + const message = { channels: [], targetConf: 0, satPerVbyte: 0n, minConfs: 0, spendUnconfirmed: false, label: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: BatchOpenChannelRequest): BatchOpenChannelRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated lnrpc.BatchOpenChannel channels */ 1: + message.channels.push(BatchOpenChannel.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* int32 target_conf */ 2: + message.targetConf = reader.int32(); + break; + case /* int64 sat_per_vbyte */ 3: + message.satPerVbyte = reader.int64().toBigInt(); + break; + case /* int32 min_confs */ 4: + message.minConfs = reader.int32(); + break; + case /* bool spend_unconfirmed */ 5: + message.spendUnconfirmed = reader.bool(); + break; + case /* string label */ 6: + message.label = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: BatchOpenChannelRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated lnrpc.BatchOpenChannel channels = 1; */ + for (let i = 0; i < message.channels.length; i++) + BatchOpenChannel.internalBinaryWrite(message.channels[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* int32 target_conf = 2; */ + if (message.targetConf !== 0) + writer.tag(2, WireType.Varint).int32(message.targetConf); + /* int64 sat_per_vbyte = 3; */ + if (message.satPerVbyte !== 0n) + writer.tag(3, WireType.Varint).int64(message.satPerVbyte); + /* int32 min_confs = 4; */ + if (message.minConfs !== 0) + writer.tag(4, WireType.Varint).int32(message.minConfs); + /* bool spend_unconfirmed = 5; */ + if (message.spendUnconfirmed !== false) + writer.tag(5, WireType.Varint).bool(message.spendUnconfirmed); + /* string label = 6; */ + if (message.label !== "") + writer.tag(6, WireType.LengthDelimited).string(message.label); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.BatchOpenChannelRequest + */ +export const BatchOpenChannelRequest = new BatchOpenChannelRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class BatchOpenChannel$Type extends MessageType { + constructor() { + super("lnrpc.BatchOpenChannel", [ + { no: 1, name: "node_pubkey", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "local_funding_amount", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "push_sat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "private", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 5, name: "min_htlc_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 6, name: "remote_csv_delay", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 7, name: "close_address", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 8, name: "pending_chan_id", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 9, name: "commitment_type", kind: "enum", T: () => ["lnrpc.CommitmentType", CommitmentType] } + ]); + } + create(value?: PartialMessage): BatchOpenChannel { + const message = { nodePubkey: new Uint8Array(0), localFundingAmount: 0n, pushSat: 0n, private: false, minHtlcMsat: 0n, remoteCsvDelay: 0, closeAddress: "", pendingChanId: new Uint8Array(0), commitmentType: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: BatchOpenChannel): BatchOpenChannel { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes node_pubkey */ 1: + message.nodePubkey = reader.bytes(); + break; + case /* int64 local_funding_amount */ 2: + message.localFundingAmount = reader.int64().toBigInt(); + break; + case /* int64 push_sat */ 3: + message.pushSat = reader.int64().toBigInt(); + break; + case /* bool private */ 4: + message.private = reader.bool(); + break; + case /* int64 min_htlc_msat */ 5: + message.minHtlcMsat = reader.int64().toBigInt(); + break; + case /* uint32 remote_csv_delay */ 6: + message.remoteCsvDelay = reader.uint32(); + break; + case /* string close_address */ 7: + message.closeAddress = reader.string(); + break; + case /* bytes pending_chan_id */ 8: + message.pendingChanId = reader.bytes(); + break; + case /* lnrpc.CommitmentType commitment_type */ 9: + message.commitmentType = reader.int32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: BatchOpenChannel, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes node_pubkey = 1; */ + if (message.nodePubkey.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.nodePubkey); + /* int64 local_funding_amount = 2; */ + if (message.localFundingAmount !== 0n) + writer.tag(2, WireType.Varint).int64(message.localFundingAmount); + /* int64 push_sat = 3; */ + if (message.pushSat !== 0n) + writer.tag(3, WireType.Varint).int64(message.pushSat); + /* bool private = 4; */ + if (message.private !== false) + writer.tag(4, WireType.Varint).bool(message.private); + /* int64 min_htlc_msat = 5; */ + if (message.minHtlcMsat !== 0n) + writer.tag(5, WireType.Varint).int64(message.minHtlcMsat); + /* uint32 remote_csv_delay = 6; */ + if (message.remoteCsvDelay !== 0) + writer.tag(6, WireType.Varint).uint32(message.remoteCsvDelay); + /* string close_address = 7; */ + if (message.closeAddress !== "") + writer.tag(7, WireType.LengthDelimited).string(message.closeAddress); + /* bytes pending_chan_id = 8; */ + if (message.pendingChanId.length) + writer.tag(8, WireType.LengthDelimited).bytes(message.pendingChanId); + /* lnrpc.CommitmentType commitment_type = 9; */ + if (message.commitmentType !== 0) + writer.tag(9, WireType.Varint).int32(message.commitmentType); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.BatchOpenChannel + */ +export const BatchOpenChannel = new BatchOpenChannel$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class BatchOpenChannelResponse$Type extends MessageType { + constructor() { + super("lnrpc.BatchOpenChannelResponse", [ + { no: 1, name: "pending_channels", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => PendingUpdate } + ]); + } + create(value?: PartialMessage): BatchOpenChannelResponse { + const message = { pendingChannels: [] }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: BatchOpenChannelResponse): BatchOpenChannelResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated lnrpc.PendingUpdate pending_channels */ 1: + message.pendingChannels.push(PendingUpdate.internalBinaryRead(reader, reader.uint32(), options)); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: BatchOpenChannelResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated lnrpc.PendingUpdate pending_channels = 1; */ + for (let i = 0; i < message.pendingChannels.length; i++) + PendingUpdate.internalBinaryWrite(message.pendingChannels[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.BatchOpenChannelResponse + */ +export const BatchOpenChannelResponse = new BatchOpenChannelResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class OpenChannelRequest$Type extends MessageType { + constructor() { + super("lnrpc.OpenChannelRequest", [ + { no: 1, name: "sat_per_vbyte", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 2, name: "node_pubkey", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 3, name: "node_pubkey_string", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 4, name: "local_funding_amount", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 5, name: "push_sat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 6, name: "target_conf", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 7, name: "sat_per_byte", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 8, name: "private", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 9, name: "min_htlc_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 10, name: "remote_csv_delay", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 11, name: "min_confs", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 12, name: "spend_unconfirmed", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 13, name: "close_address", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 14, name: "funding_shim", kind: "message", T: () => FundingShim }, + { no: 15, name: "remote_max_value_in_flight_msat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 16, name: "remote_max_htlcs", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 17, name: "max_local_csv", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 18, name: "commitment_type", kind: "enum", T: () => ["lnrpc.CommitmentType", CommitmentType] }, + { no: 19, name: "zero_conf", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 20, name: "scid_alias", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 21, name: "base_fee", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 22, name: "fee_rate", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 23, name: "use_base_fee", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 24, name: "use_fee_rate", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 25, name: "remote_chan_reserve_sat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): OpenChannelRequest { + const message = { satPerVbyte: 0n, nodePubkey: new Uint8Array(0), nodePubkeyString: "", localFundingAmount: 0n, pushSat: 0n, targetConf: 0, satPerByte: 0n, private: false, minHtlcMsat: 0n, remoteCsvDelay: 0, minConfs: 0, spendUnconfirmed: false, closeAddress: "", remoteMaxValueInFlightMsat: 0n, remoteMaxHtlcs: 0, maxLocalCsv: 0, commitmentType: 0, zeroConf: false, scidAlias: false, baseFee: 0n, feeRate: 0n, useBaseFee: false, useFeeRate: false, remoteChanReserveSat: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: OpenChannelRequest): OpenChannelRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint64 sat_per_vbyte */ 1: + message.satPerVbyte = reader.uint64().toBigInt(); + break; + case /* bytes node_pubkey */ 2: + message.nodePubkey = reader.bytes(); + break; + case /* string node_pubkey_string = 3 [deprecated = true];*/ 3: + message.nodePubkeyString = reader.string(); + break; + case /* int64 local_funding_amount */ 4: + message.localFundingAmount = reader.int64().toBigInt(); + break; + case /* int64 push_sat */ 5: + message.pushSat = reader.int64().toBigInt(); + break; + case /* int32 target_conf */ 6: + message.targetConf = reader.int32(); + break; + case /* int64 sat_per_byte = 7 [deprecated = true];*/ 7: + message.satPerByte = reader.int64().toBigInt(); + break; + case /* bool private */ 8: + message.private = reader.bool(); + break; + case /* int64 min_htlc_msat */ 9: + message.minHtlcMsat = reader.int64().toBigInt(); + break; + case /* uint32 remote_csv_delay */ 10: + message.remoteCsvDelay = reader.uint32(); + break; + case /* int32 min_confs */ 11: + message.minConfs = reader.int32(); + break; + case /* bool spend_unconfirmed */ 12: + message.spendUnconfirmed = reader.bool(); + break; + case /* string close_address */ 13: + message.closeAddress = reader.string(); + break; + case /* lnrpc.FundingShim funding_shim */ 14: + message.fundingShim = FundingShim.internalBinaryRead(reader, reader.uint32(), options, message.fundingShim); + break; + case /* uint64 remote_max_value_in_flight_msat */ 15: + message.remoteMaxValueInFlightMsat = reader.uint64().toBigInt(); + break; + case /* uint32 remote_max_htlcs */ 16: + message.remoteMaxHtlcs = reader.uint32(); + break; + case /* uint32 max_local_csv */ 17: + message.maxLocalCsv = reader.uint32(); + break; + case /* lnrpc.CommitmentType commitment_type */ 18: + message.commitmentType = reader.int32(); + break; + case /* bool zero_conf */ 19: + message.zeroConf = reader.bool(); + break; + case /* bool scid_alias */ 20: + message.scidAlias = reader.bool(); + break; + case /* uint64 base_fee */ 21: + message.baseFee = reader.uint64().toBigInt(); + break; + case /* uint64 fee_rate */ 22: + message.feeRate = reader.uint64().toBigInt(); + break; + case /* bool use_base_fee */ 23: + message.useBaseFee = reader.bool(); + break; + case /* bool use_fee_rate */ 24: + message.useFeeRate = reader.bool(); + break; + case /* uint64 remote_chan_reserve_sat */ 25: + message.remoteChanReserveSat = reader.uint64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: OpenChannelRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint64 sat_per_vbyte = 1; */ + if (message.satPerVbyte !== 0n) + writer.tag(1, WireType.Varint).uint64(message.satPerVbyte); + /* bytes node_pubkey = 2; */ + if (message.nodePubkey.length) + writer.tag(2, WireType.LengthDelimited).bytes(message.nodePubkey); + /* string node_pubkey_string = 3 [deprecated = true]; */ + if (message.nodePubkeyString !== "") + writer.tag(3, WireType.LengthDelimited).string(message.nodePubkeyString); + /* int64 local_funding_amount = 4; */ + if (message.localFundingAmount !== 0n) + writer.tag(4, WireType.Varint).int64(message.localFundingAmount); + /* int64 push_sat = 5; */ + if (message.pushSat !== 0n) + writer.tag(5, WireType.Varint).int64(message.pushSat); + /* int32 target_conf = 6; */ + if (message.targetConf !== 0) + writer.tag(6, WireType.Varint).int32(message.targetConf); + /* int64 sat_per_byte = 7 [deprecated = true]; */ + if (message.satPerByte !== 0n) + writer.tag(7, WireType.Varint).int64(message.satPerByte); + /* bool private = 8; */ + if (message.private !== false) + writer.tag(8, WireType.Varint).bool(message.private); + /* int64 min_htlc_msat = 9; */ + if (message.minHtlcMsat !== 0n) + writer.tag(9, WireType.Varint).int64(message.minHtlcMsat); + /* uint32 remote_csv_delay = 10; */ + if (message.remoteCsvDelay !== 0) + writer.tag(10, WireType.Varint).uint32(message.remoteCsvDelay); + /* int32 min_confs = 11; */ + if (message.minConfs !== 0) + writer.tag(11, WireType.Varint).int32(message.minConfs); + /* bool spend_unconfirmed = 12; */ + if (message.spendUnconfirmed !== false) + writer.tag(12, WireType.Varint).bool(message.spendUnconfirmed); + /* string close_address = 13; */ + if (message.closeAddress !== "") + writer.tag(13, WireType.LengthDelimited).string(message.closeAddress); + /* lnrpc.FundingShim funding_shim = 14; */ + if (message.fundingShim) + FundingShim.internalBinaryWrite(message.fundingShim, writer.tag(14, WireType.LengthDelimited).fork(), options).join(); + /* uint64 remote_max_value_in_flight_msat = 15; */ + if (message.remoteMaxValueInFlightMsat !== 0n) + writer.tag(15, WireType.Varint).uint64(message.remoteMaxValueInFlightMsat); + /* uint32 remote_max_htlcs = 16; */ + if (message.remoteMaxHtlcs !== 0) + writer.tag(16, WireType.Varint).uint32(message.remoteMaxHtlcs); + /* uint32 max_local_csv = 17; */ + if (message.maxLocalCsv !== 0) + writer.tag(17, WireType.Varint).uint32(message.maxLocalCsv); + /* lnrpc.CommitmentType commitment_type = 18; */ + if (message.commitmentType !== 0) + writer.tag(18, WireType.Varint).int32(message.commitmentType); + /* bool zero_conf = 19; */ + if (message.zeroConf !== false) + writer.tag(19, WireType.Varint).bool(message.zeroConf); + /* bool scid_alias = 20; */ + if (message.scidAlias !== false) + writer.tag(20, WireType.Varint).bool(message.scidAlias); + /* uint64 base_fee = 21; */ + if (message.baseFee !== 0n) + writer.tag(21, WireType.Varint).uint64(message.baseFee); + /* uint64 fee_rate = 22; */ + if (message.feeRate !== 0n) + writer.tag(22, WireType.Varint).uint64(message.feeRate); + /* bool use_base_fee = 23; */ + if (message.useBaseFee !== false) + writer.tag(23, WireType.Varint).bool(message.useBaseFee); + /* bool use_fee_rate = 24; */ + if (message.useFeeRate !== false) + writer.tag(24, WireType.Varint).bool(message.useFeeRate); + /* uint64 remote_chan_reserve_sat = 25; */ + if (message.remoteChanReserveSat !== 0n) + writer.tag(25, WireType.Varint).uint64(message.remoteChanReserveSat); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.OpenChannelRequest + */ +export const OpenChannelRequest = new OpenChannelRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class OpenStatusUpdate$Type extends MessageType { + constructor() { + super("lnrpc.OpenStatusUpdate", [ + { no: 1, name: "chan_pending", kind: "message", oneof: "update", T: () => PendingUpdate }, + { no: 3, name: "chan_open", kind: "message", oneof: "update", T: () => ChannelOpenUpdate }, + { no: 5, name: "psbt_fund", kind: "message", oneof: "update", T: () => ReadyForPsbtFunding }, + { no: 4, name: "pending_chan_id", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): OpenStatusUpdate { + const message = { update: { oneofKind: undefined }, pendingChanId: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: OpenStatusUpdate): OpenStatusUpdate { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.PendingUpdate chan_pending */ 1: + message.update = { + oneofKind: "chanPending", + chanPending: PendingUpdate.internalBinaryRead(reader, reader.uint32(), options, (message.update as any).chanPending) + }; + break; + case /* lnrpc.ChannelOpenUpdate chan_open */ 3: + message.update = { + oneofKind: "chanOpen", + chanOpen: ChannelOpenUpdate.internalBinaryRead(reader, reader.uint32(), options, (message.update as any).chanOpen) + }; + break; + case /* lnrpc.ReadyForPsbtFunding psbt_fund */ 5: + message.update = { + oneofKind: "psbtFund", + psbtFund: ReadyForPsbtFunding.internalBinaryRead(reader, reader.uint32(), options, (message.update as any).psbtFund) + }; + break; + case /* bytes pending_chan_id */ 4: + message.pendingChanId = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: OpenStatusUpdate, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.PendingUpdate chan_pending = 1; */ + if (message.update.oneofKind === "chanPending") + PendingUpdate.internalBinaryWrite(message.update.chanPending, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.ChannelOpenUpdate chan_open = 3; */ + if (message.update.oneofKind === "chanOpen") + ChannelOpenUpdate.internalBinaryWrite(message.update.chanOpen, writer.tag(3, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.ReadyForPsbtFunding psbt_fund = 5; */ + if (message.update.oneofKind === "psbtFund") + ReadyForPsbtFunding.internalBinaryWrite(message.update.psbtFund, writer.tag(5, WireType.LengthDelimited).fork(), options).join(); + /* bytes pending_chan_id = 4; */ + if (message.pendingChanId.length) + writer.tag(4, WireType.LengthDelimited).bytes(message.pendingChanId); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.OpenStatusUpdate + */ +export const OpenStatusUpdate = new OpenStatusUpdate$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class KeyLocator$Type extends MessageType { + constructor() { + super("lnrpc.KeyLocator", [ + { no: 1, name: "key_family", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 2, name: "key_index", kind: "scalar", T: 5 /*ScalarType.INT32*/ } + ]); + } + create(value?: PartialMessage): KeyLocator { + const message = { keyFamily: 0, keyIndex: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: KeyLocator): KeyLocator { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* int32 key_family */ 1: + message.keyFamily = reader.int32(); + break; + case /* int32 key_index */ 2: + message.keyIndex = reader.int32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: KeyLocator, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* int32 key_family = 1; */ + if (message.keyFamily !== 0) + writer.tag(1, WireType.Varint).int32(message.keyFamily); + /* int32 key_index = 2; */ + if (message.keyIndex !== 0) + writer.tag(2, WireType.Varint).int32(message.keyIndex); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.KeyLocator + */ +export const KeyLocator = new KeyLocator$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class KeyDescriptor$Type extends MessageType { + constructor() { + super("lnrpc.KeyDescriptor", [ + { no: 1, name: "raw_key_bytes", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "key_loc", kind: "message", T: () => KeyLocator } + ]); + } + create(value?: PartialMessage): KeyDescriptor { + const message = { rawKeyBytes: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: KeyDescriptor): KeyDescriptor { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes raw_key_bytes */ 1: + message.rawKeyBytes = reader.bytes(); + break; + case /* lnrpc.KeyLocator key_loc */ 2: + message.keyLoc = KeyLocator.internalBinaryRead(reader, reader.uint32(), options, message.keyLoc); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: KeyDescriptor, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes raw_key_bytes = 1; */ + if (message.rawKeyBytes.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.rawKeyBytes); + /* lnrpc.KeyLocator key_loc = 2; */ + if (message.keyLoc) + KeyLocator.internalBinaryWrite(message.keyLoc, writer.tag(2, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.KeyDescriptor + */ +export const KeyDescriptor = new KeyDescriptor$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ChanPointShim$Type extends MessageType { + constructor() { + super("lnrpc.ChanPointShim", [ + { no: 1, name: "amt", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 2, name: "chan_point", kind: "message", T: () => ChannelPoint }, + { no: 3, name: "local_key", kind: "message", T: () => KeyDescriptor }, + { no: 4, name: "remote_key", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 5, name: "pending_chan_id", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 6, name: "thaw_height", kind: "scalar", T: 13 /*ScalarType.UINT32*/ } + ]); + } + create(value?: PartialMessage): ChanPointShim { + const message = { amt: 0n, remoteKey: new Uint8Array(0), pendingChanId: new Uint8Array(0), thawHeight: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ChanPointShim): ChanPointShim { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* int64 amt */ 1: + message.amt = reader.int64().toBigInt(); + break; + case /* lnrpc.ChannelPoint chan_point */ 2: + message.chanPoint = ChannelPoint.internalBinaryRead(reader, reader.uint32(), options, message.chanPoint); + break; + case /* lnrpc.KeyDescriptor local_key */ 3: + message.localKey = KeyDescriptor.internalBinaryRead(reader, reader.uint32(), options, message.localKey); + break; + case /* bytes remote_key */ 4: + message.remoteKey = reader.bytes(); + break; + case /* bytes pending_chan_id */ 5: + message.pendingChanId = reader.bytes(); + break; + case /* uint32 thaw_height */ 6: + message.thawHeight = reader.uint32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ChanPointShim, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* int64 amt = 1; */ + if (message.amt !== 0n) + writer.tag(1, WireType.Varint).int64(message.amt); + /* lnrpc.ChannelPoint chan_point = 2; */ + if (message.chanPoint) + ChannelPoint.internalBinaryWrite(message.chanPoint, writer.tag(2, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.KeyDescriptor local_key = 3; */ + if (message.localKey) + KeyDescriptor.internalBinaryWrite(message.localKey, writer.tag(3, WireType.LengthDelimited).fork(), options).join(); + /* bytes remote_key = 4; */ + if (message.remoteKey.length) + writer.tag(4, WireType.LengthDelimited).bytes(message.remoteKey); + /* bytes pending_chan_id = 5; */ + if (message.pendingChanId.length) + writer.tag(5, WireType.LengthDelimited).bytes(message.pendingChanId); + /* uint32 thaw_height = 6; */ + if (message.thawHeight !== 0) + writer.tag(6, WireType.Varint).uint32(message.thawHeight); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ChanPointShim + */ +export const ChanPointShim = new ChanPointShim$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PsbtShim$Type extends MessageType { + constructor() { + super("lnrpc.PsbtShim", [ + { no: 1, name: "pending_chan_id", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "base_psbt", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 3, name: "no_publish", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): PsbtShim { + const message = { pendingChanId: new Uint8Array(0), basePsbt: new Uint8Array(0), noPublish: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PsbtShim): PsbtShim { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes pending_chan_id */ 1: + message.pendingChanId = reader.bytes(); + break; + case /* bytes base_psbt */ 2: + message.basePsbt = reader.bytes(); + break; + case /* bool no_publish */ 3: + message.noPublish = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PsbtShim, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes pending_chan_id = 1; */ + if (message.pendingChanId.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.pendingChanId); + /* bytes base_psbt = 2; */ + if (message.basePsbt.length) + writer.tag(2, WireType.LengthDelimited).bytes(message.basePsbt); + /* bool no_publish = 3; */ + if (message.noPublish !== false) + writer.tag(3, WireType.Varint).bool(message.noPublish); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.PsbtShim + */ +export const PsbtShim = new PsbtShim$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class FundingShim$Type extends MessageType { + constructor() { + super("lnrpc.FundingShim", [ + { no: 1, name: "chan_point_shim", kind: "message", oneof: "shim", T: () => ChanPointShim }, + { no: 2, name: "psbt_shim", kind: "message", oneof: "shim", T: () => PsbtShim } + ]); + } + create(value?: PartialMessage): FundingShim { + const message = { shim: { oneofKind: undefined } }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: FundingShim): FundingShim { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.ChanPointShim chan_point_shim */ 1: + message.shim = { + oneofKind: "chanPointShim", + chanPointShim: ChanPointShim.internalBinaryRead(reader, reader.uint32(), options, (message.shim as any).chanPointShim) + }; + break; + case /* lnrpc.PsbtShim psbt_shim */ 2: + message.shim = { + oneofKind: "psbtShim", + psbtShim: PsbtShim.internalBinaryRead(reader, reader.uint32(), options, (message.shim as any).psbtShim) + }; + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: FundingShim, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.ChanPointShim chan_point_shim = 1; */ + if (message.shim.oneofKind === "chanPointShim") + ChanPointShim.internalBinaryWrite(message.shim.chanPointShim, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.PsbtShim psbt_shim = 2; */ + if (message.shim.oneofKind === "psbtShim") + PsbtShim.internalBinaryWrite(message.shim.psbtShim, writer.tag(2, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.FundingShim + */ +export const FundingShim = new FundingShim$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class FundingShimCancel$Type extends MessageType { + constructor() { + super("lnrpc.FundingShimCancel", [ + { no: 1, name: "pending_chan_id", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): FundingShimCancel { + const message = { pendingChanId: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: FundingShimCancel): FundingShimCancel { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes pending_chan_id */ 1: + message.pendingChanId = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: FundingShimCancel, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes pending_chan_id = 1; */ + if (message.pendingChanId.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.pendingChanId); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.FundingShimCancel + */ +export const FundingShimCancel = new FundingShimCancel$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class FundingPsbtVerify$Type extends MessageType { + constructor() { + super("lnrpc.FundingPsbtVerify", [ + { no: 1, name: "funded_psbt", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "pending_chan_id", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 3, name: "skip_finalize", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): FundingPsbtVerify { + const message = { fundedPsbt: new Uint8Array(0), pendingChanId: new Uint8Array(0), skipFinalize: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: FundingPsbtVerify): FundingPsbtVerify { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes funded_psbt */ 1: + message.fundedPsbt = reader.bytes(); + break; + case /* bytes pending_chan_id */ 2: + message.pendingChanId = reader.bytes(); + break; + case /* bool skip_finalize */ 3: + message.skipFinalize = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: FundingPsbtVerify, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes funded_psbt = 1; */ + if (message.fundedPsbt.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.fundedPsbt); + /* bytes pending_chan_id = 2; */ + if (message.pendingChanId.length) + writer.tag(2, WireType.LengthDelimited).bytes(message.pendingChanId); + /* bool skip_finalize = 3; */ + if (message.skipFinalize !== false) + writer.tag(3, WireType.Varint).bool(message.skipFinalize); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.FundingPsbtVerify + */ +export const FundingPsbtVerify = new FundingPsbtVerify$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class FundingPsbtFinalize$Type extends MessageType { + constructor() { + super("lnrpc.FundingPsbtFinalize", [ + { no: 1, name: "signed_psbt", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "pending_chan_id", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 3, name: "final_raw_tx", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): FundingPsbtFinalize { + const message = { signedPsbt: new Uint8Array(0), pendingChanId: new Uint8Array(0), finalRawTx: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: FundingPsbtFinalize): FundingPsbtFinalize { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes signed_psbt */ 1: + message.signedPsbt = reader.bytes(); + break; + case /* bytes pending_chan_id */ 2: + message.pendingChanId = reader.bytes(); + break; + case /* bytes final_raw_tx */ 3: + message.finalRawTx = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: FundingPsbtFinalize, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes signed_psbt = 1; */ + if (message.signedPsbt.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.signedPsbt); + /* bytes pending_chan_id = 2; */ + if (message.pendingChanId.length) + writer.tag(2, WireType.LengthDelimited).bytes(message.pendingChanId); + /* bytes final_raw_tx = 3; */ + if (message.finalRawTx.length) + writer.tag(3, WireType.LengthDelimited).bytes(message.finalRawTx); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.FundingPsbtFinalize + */ +export const FundingPsbtFinalize = new FundingPsbtFinalize$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class FundingTransitionMsg$Type extends MessageType { + constructor() { + super("lnrpc.FundingTransitionMsg", [ + { no: 1, name: "shim_register", kind: "message", oneof: "trigger", T: () => FundingShim }, + { no: 2, name: "shim_cancel", kind: "message", oneof: "trigger", T: () => FundingShimCancel }, + { no: 3, name: "psbt_verify", kind: "message", oneof: "trigger", T: () => FundingPsbtVerify }, + { no: 4, name: "psbt_finalize", kind: "message", oneof: "trigger", T: () => FundingPsbtFinalize } + ]); + } + create(value?: PartialMessage): FundingTransitionMsg { + const message = { trigger: { oneofKind: undefined } }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: FundingTransitionMsg): FundingTransitionMsg { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.FundingShim shim_register */ 1: + message.trigger = { + oneofKind: "shimRegister", + shimRegister: FundingShim.internalBinaryRead(reader, reader.uint32(), options, (message.trigger as any).shimRegister) + }; + break; + case /* lnrpc.FundingShimCancel shim_cancel */ 2: + message.trigger = { + oneofKind: "shimCancel", + shimCancel: FundingShimCancel.internalBinaryRead(reader, reader.uint32(), options, (message.trigger as any).shimCancel) + }; + break; + case /* lnrpc.FundingPsbtVerify psbt_verify */ 3: + message.trigger = { + oneofKind: "psbtVerify", + psbtVerify: FundingPsbtVerify.internalBinaryRead(reader, reader.uint32(), options, (message.trigger as any).psbtVerify) + }; + break; + case /* lnrpc.FundingPsbtFinalize psbt_finalize */ 4: + message.trigger = { + oneofKind: "psbtFinalize", + psbtFinalize: FundingPsbtFinalize.internalBinaryRead(reader, reader.uint32(), options, (message.trigger as any).psbtFinalize) + }; + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: FundingTransitionMsg, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.FundingShim shim_register = 1; */ + if (message.trigger.oneofKind === "shimRegister") + FundingShim.internalBinaryWrite(message.trigger.shimRegister, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.FundingShimCancel shim_cancel = 2; */ + if (message.trigger.oneofKind === "shimCancel") + FundingShimCancel.internalBinaryWrite(message.trigger.shimCancel, writer.tag(2, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.FundingPsbtVerify psbt_verify = 3; */ + if (message.trigger.oneofKind === "psbtVerify") + FundingPsbtVerify.internalBinaryWrite(message.trigger.psbtVerify, writer.tag(3, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.FundingPsbtFinalize psbt_finalize = 4; */ + if (message.trigger.oneofKind === "psbtFinalize") + FundingPsbtFinalize.internalBinaryWrite(message.trigger.psbtFinalize, writer.tag(4, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.FundingTransitionMsg + */ +export const FundingTransitionMsg = new FundingTransitionMsg$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class FundingStateStepResp$Type extends MessageType { + constructor() { + super("lnrpc.FundingStateStepResp", []); + } + create(value?: PartialMessage): FundingStateStepResp { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: FundingStateStepResp): FundingStateStepResp { + return target ?? this.create(); + } + internalBinaryWrite(message: FundingStateStepResp, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.FundingStateStepResp + */ +export const FundingStateStepResp = new FundingStateStepResp$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PendingHTLC$Type extends MessageType { + constructor() { + super("lnrpc.PendingHTLC", [ + { no: 1, name: "incoming", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 2, name: "amount", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "outpoint", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 4, name: "maturity_height", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 5, name: "blocks_til_maturity", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 6, name: "stage", kind: "scalar", T: 13 /*ScalarType.UINT32*/ } + ]); + } + create(value?: PartialMessage): PendingHTLC { + const message = { incoming: false, amount: 0n, outpoint: "", maturityHeight: 0, blocksTilMaturity: 0, stage: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PendingHTLC): PendingHTLC { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bool incoming */ 1: + message.incoming = reader.bool(); + break; + case /* int64 amount */ 2: + message.amount = reader.int64().toBigInt(); + break; + case /* string outpoint */ 3: + message.outpoint = reader.string(); + break; + case /* uint32 maturity_height */ 4: + message.maturityHeight = reader.uint32(); + break; + case /* int32 blocks_til_maturity */ 5: + message.blocksTilMaturity = reader.int32(); + break; + case /* uint32 stage */ 6: + message.stage = reader.uint32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PendingHTLC, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bool incoming = 1; */ + if (message.incoming !== false) + writer.tag(1, WireType.Varint).bool(message.incoming); + /* int64 amount = 2; */ + if (message.amount !== 0n) + writer.tag(2, WireType.Varint).int64(message.amount); + /* string outpoint = 3; */ + if (message.outpoint !== "") + writer.tag(3, WireType.LengthDelimited).string(message.outpoint); + /* uint32 maturity_height = 4; */ + if (message.maturityHeight !== 0) + writer.tag(4, WireType.Varint).uint32(message.maturityHeight); + /* int32 blocks_til_maturity = 5; */ + if (message.blocksTilMaturity !== 0) + writer.tag(5, WireType.Varint).int32(message.blocksTilMaturity); + /* uint32 stage = 6; */ + if (message.stage !== 0) + writer.tag(6, WireType.Varint).uint32(message.stage); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.PendingHTLC + */ +export const PendingHTLC = new PendingHTLC$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PendingChannelsRequest$Type extends MessageType { + constructor() { + super("lnrpc.PendingChannelsRequest", []); + } + create(value?: PartialMessage): PendingChannelsRequest { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PendingChannelsRequest): PendingChannelsRequest { + return target ?? this.create(); + } + internalBinaryWrite(message: PendingChannelsRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.PendingChannelsRequest + */ +export const PendingChannelsRequest = new PendingChannelsRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PendingChannelsResponse$Type extends MessageType { + constructor() { + super("lnrpc.PendingChannelsResponse", [ + { no: 1, name: "total_limbo_balance", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 2, name: "pending_open_channels", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => PendingChannelsResponse_PendingOpenChannel }, + { no: 3, name: "pending_closing_channels", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => PendingChannelsResponse_ClosedChannel }, + { no: 4, name: "pending_force_closing_channels", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => PendingChannelsResponse_ForceClosedChannel }, + { no: 5, name: "waiting_close_channels", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => PendingChannelsResponse_WaitingCloseChannel } + ]); + } + create(value?: PartialMessage): PendingChannelsResponse { + const message = { totalLimboBalance: 0n, pendingOpenChannels: [], pendingClosingChannels: [], pendingForceClosingChannels: [], waitingCloseChannels: [] }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PendingChannelsResponse): PendingChannelsResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* int64 total_limbo_balance */ 1: + message.totalLimboBalance = reader.int64().toBigInt(); + break; + case /* repeated lnrpc.PendingChannelsResponse.PendingOpenChannel pending_open_channels */ 2: + message.pendingOpenChannels.push(PendingChannelsResponse_PendingOpenChannel.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* repeated lnrpc.PendingChannelsResponse.ClosedChannel pending_closing_channels = 3 [deprecated = true];*/ 3: + message.pendingClosingChannels.push(PendingChannelsResponse_ClosedChannel.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* repeated lnrpc.PendingChannelsResponse.ForceClosedChannel pending_force_closing_channels */ 4: + message.pendingForceClosingChannels.push(PendingChannelsResponse_ForceClosedChannel.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* repeated lnrpc.PendingChannelsResponse.WaitingCloseChannel waiting_close_channels */ 5: + message.waitingCloseChannels.push(PendingChannelsResponse_WaitingCloseChannel.internalBinaryRead(reader, reader.uint32(), options)); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PendingChannelsResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* int64 total_limbo_balance = 1; */ + if (message.totalLimboBalance !== 0n) + writer.tag(1, WireType.Varint).int64(message.totalLimboBalance); + /* repeated lnrpc.PendingChannelsResponse.PendingOpenChannel pending_open_channels = 2; */ + for (let i = 0; i < message.pendingOpenChannels.length; i++) + PendingChannelsResponse_PendingOpenChannel.internalBinaryWrite(message.pendingOpenChannels[i], writer.tag(2, WireType.LengthDelimited).fork(), options).join(); + /* repeated lnrpc.PendingChannelsResponse.ClosedChannel pending_closing_channels = 3 [deprecated = true]; */ + for (let i = 0; i < message.pendingClosingChannels.length; i++) + PendingChannelsResponse_ClosedChannel.internalBinaryWrite(message.pendingClosingChannels[i], writer.tag(3, WireType.LengthDelimited).fork(), options).join(); + /* repeated lnrpc.PendingChannelsResponse.ForceClosedChannel pending_force_closing_channels = 4; */ + for (let i = 0; i < message.pendingForceClosingChannels.length; i++) + PendingChannelsResponse_ForceClosedChannel.internalBinaryWrite(message.pendingForceClosingChannels[i], writer.tag(4, WireType.LengthDelimited).fork(), options).join(); + /* repeated lnrpc.PendingChannelsResponse.WaitingCloseChannel waiting_close_channels = 5; */ + for (let i = 0; i < message.waitingCloseChannels.length; i++) + PendingChannelsResponse_WaitingCloseChannel.internalBinaryWrite(message.waitingCloseChannels[i], writer.tag(5, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.PendingChannelsResponse + */ +export const PendingChannelsResponse = new PendingChannelsResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PendingChannelsResponse_PendingChannel$Type extends MessageType { + constructor() { + super("lnrpc.PendingChannelsResponse.PendingChannel", [ + { no: 1, name: "remote_node_pub", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "channel_point", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 3, name: "capacity", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "local_balance", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 5, name: "remote_balance", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 6, name: "local_chan_reserve_sat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 7, name: "remote_chan_reserve_sat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 8, name: "initiator", kind: "enum", T: () => ["lnrpc.Initiator", Initiator, "INITIATOR_"] }, + { no: 9, name: "commitment_type", kind: "enum", T: () => ["lnrpc.CommitmentType", CommitmentType] }, + { no: 10, name: "num_forwarding_packages", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 11, name: "chan_status_flags", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 12, name: "private", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): PendingChannelsResponse_PendingChannel { + const message = { remoteNodePub: "", channelPoint: "", capacity: 0n, localBalance: 0n, remoteBalance: 0n, localChanReserveSat: 0n, remoteChanReserveSat: 0n, initiator: 0, commitmentType: 0, numForwardingPackages: 0n, chanStatusFlags: "", private: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PendingChannelsResponse_PendingChannel): PendingChannelsResponse_PendingChannel { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string remote_node_pub */ 1: + message.remoteNodePub = reader.string(); + break; + case /* string channel_point */ 2: + message.channelPoint = reader.string(); + break; + case /* int64 capacity */ 3: + message.capacity = reader.int64().toBigInt(); + break; + case /* int64 local_balance */ 4: + message.localBalance = reader.int64().toBigInt(); + break; + case /* int64 remote_balance */ 5: + message.remoteBalance = reader.int64().toBigInt(); + break; + case /* int64 local_chan_reserve_sat */ 6: + message.localChanReserveSat = reader.int64().toBigInt(); + break; + case /* int64 remote_chan_reserve_sat */ 7: + message.remoteChanReserveSat = reader.int64().toBigInt(); + break; + case /* lnrpc.Initiator initiator */ 8: + message.initiator = reader.int32(); + break; + case /* lnrpc.CommitmentType commitment_type */ 9: + message.commitmentType = reader.int32(); + break; + case /* int64 num_forwarding_packages */ 10: + message.numForwardingPackages = reader.int64().toBigInt(); + break; + case /* string chan_status_flags */ 11: + message.chanStatusFlags = reader.string(); + break; + case /* bool private */ 12: + message.private = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PendingChannelsResponse_PendingChannel, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string remote_node_pub = 1; */ + if (message.remoteNodePub !== "") + writer.tag(1, WireType.LengthDelimited).string(message.remoteNodePub); + /* string channel_point = 2; */ + if (message.channelPoint !== "") + writer.tag(2, WireType.LengthDelimited).string(message.channelPoint); + /* int64 capacity = 3; */ + if (message.capacity !== 0n) + writer.tag(3, WireType.Varint).int64(message.capacity); + /* int64 local_balance = 4; */ + if (message.localBalance !== 0n) + writer.tag(4, WireType.Varint).int64(message.localBalance); + /* int64 remote_balance = 5; */ + if (message.remoteBalance !== 0n) + writer.tag(5, WireType.Varint).int64(message.remoteBalance); + /* int64 local_chan_reserve_sat = 6; */ + if (message.localChanReserveSat !== 0n) + writer.tag(6, WireType.Varint).int64(message.localChanReserveSat); + /* int64 remote_chan_reserve_sat = 7; */ + if (message.remoteChanReserveSat !== 0n) + writer.tag(7, WireType.Varint).int64(message.remoteChanReserveSat); + /* lnrpc.Initiator initiator = 8; */ + if (message.initiator !== 0) + writer.tag(8, WireType.Varint).int32(message.initiator); + /* lnrpc.CommitmentType commitment_type = 9; */ + if (message.commitmentType !== 0) + writer.tag(9, WireType.Varint).int32(message.commitmentType); + /* int64 num_forwarding_packages = 10; */ + if (message.numForwardingPackages !== 0n) + writer.tag(10, WireType.Varint).int64(message.numForwardingPackages); + /* string chan_status_flags = 11; */ + if (message.chanStatusFlags !== "") + writer.tag(11, WireType.LengthDelimited).string(message.chanStatusFlags); + /* bool private = 12; */ + if (message.private !== false) + writer.tag(12, WireType.Varint).bool(message.private); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.PendingChannelsResponse.PendingChannel + */ +export const PendingChannelsResponse_PendingChannel = new PendingChannelsResponse_PendingChannel$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PendingChannelsResponse_PendingOpenChannel$Type extends MessageType { + constructor() { + super("lnrpc.PendingChannelsResponse.PendingOpenChannel", [ + { no: 1, name: "channel", kind: "message", T: () => PendingChannelsResponse_PendingChannel }, + { no: 4, name: "commit_fee", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 5, name: "commit_weight", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 6, name: "fee_per_kw", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): PendingChannelsResponse_PendingOpenChannel { + const message = { commitFee: 0n, commitWeight: 0n, feePerKw: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PendingChannelsResponse_PendingOpenChannel): PendingChannelsResponse_PendingOpenChannel { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.PendingChannelsResponse.PendingChannel channel */ 1: + message.channel = PendingChannelsResponse_PendingChannel.internalBinaryRead(reader, reader.uint32(), options, message.channel); + break; + case /* int64 commit_fee */ 4: + message.commitFee = reader.int64().toBigInt(); + break; + case /* int64 commit_weight */ 5: + message.commitWeight = reader.int64().toBigInt(); + break; + case /* int64 fee_per_kw */ 6: + message.feePerKw = reader.int64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PendingChannelsResponse_PendingOpenChannel, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.PendingChannelsResponse.PendingChannel channel = 1; */ + if (message.channel) + PendingChannelsResponse_PendingChannel.internalBinaryWrite(message.channel, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* int64 commit_fee = 4; */ + if (message.commitFee !== 0n) + writer.tag(4, WireType.Varint).int64(message.commitFee); + /* int64 commit_weight = 5; */ + if (message.commitWeight !== 0n) + writer.tag(5, WireType.Varint).int64(message.commitWeight); + /* int64 fee_per_kw = 6; */ + if (message.feePerKw !== 0n) + writer.tag(6, WireType.Varint).int64(message.feePerKw); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.PendingChannelsResponse.PendingOpenChannel + */ +export const PendingChannelsResponse_PendingOpenChannel = new PendingChannelsResponse_PendingOpenChannel$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PendingChannelsResponse_WaitingCloseChannel$Type extends MessageType { + constructor() { + super("lnrpc.PendingChannelsResponse.WaitingCloseChannel", [ + { no: 1, name: "channel", kind: "message", T: () => PendingChannelsResponse_PendingChannel }, + { no: 2, name: "limbo_balance", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "commitments", kind: "message", T: () => PendingChannelsResponse_Commitments }, + { no: 4, name: "closing_txid", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): PendingChannelsResponse_WaitingCloseChannel { + const message = { limboBalance: 0n, closingTxid: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PendingChannelsResponse_WaitingCloseChannel): PendingChannelsResponse_WaitingCloseChannel { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.PendingChannelsResponse.PendingChannel channel */ 1: + message.channel = PendingChannelsResponse_PendingChannel.internalBinaryRead(reader, reader.uint32(), options, message.channel); + break; + case /* int64 limbo_balance */ 2: + message.limboBalance = reader.int64().toBigInt(); + break; + case /* lnrpc.PendingChannelsResponse.Commitments commitments */ 3: + message.commitments = PendingChannelsResponse_Commitments.internalBinaryRead(reader, reader.uint32(), options, message.commitments); + break; + case /* string closing_txid */ 4: + message.closingTxid = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PendingChannelsResponse_WaitingCloseChannel, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.PendingChannelsResponse.PendingChannel channel = 1; */ + if (message.channel) + PendingChannelsResponse_PendingChannel.internalBinaryWrite(message.channel, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* int64 limbo_balance = 2; */ + if (message.limboBalance !== 0n) + writer.tag(2, WireType.Varint).int64(message.limboBalance); + /* lnrpc.PendingChannelsResponse.Commitments commitments = 3; */ + if (message.commitments) + PendingChannelsResponse_Commitments.internalBinaryWrite(message.commitments, writer.tag(3, WireType.LengthDelimited).fork(), options).join(); + /* string closing_txid = 4; */ + if (message.closingTxid !== "") + writer.tag(4, WireType.LengthDelimited).string(message.closingTxid); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.PendingChannelsResponse.WaitingCloseChannel + */ +export const PendingChannelsResponse_WaitingCloseChannel = new PendingChannelsResponse_WaitingCloseChannel$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PendingChannelsResponse_Commitments$Type extends MessageType { + constructor() { + super("lnrpc.PendingChannelsResponse.Commitments", [ + { no: 1, name: "local_txid", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "remote_txid", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 3, name: "remote_pending_txid", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 4, name: "local_commit_fee_sat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 5, name: "remote_commit_fee_sat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 6, name: "remote_pending_commit_fee_sat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): PendingChannelsResponse_Commitments { + const message = { localTxid: "", remoteTxid: "", remotePendingTxid: "", localCommitFeeSat: 0n, remoteCommitFeeSat: 0n, remotePendingCommitFeeSat: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PendingChannelsResponse_Commitments): PendingChannelsResponse_Commitments { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string local_txid */ 1: + message.localTxid = reader.string(); + break; + case /* string remote_txid */ 2: + message.remoteTxid = reader.string(); + break; + case /* string remote_pending_txid */ 3: + message.remotePendingTxid = reader.string(); + break; + case /* uint64 local_commit_fee_sat */ 4: + message.localCommitFeeSat = reader.uint64().toBigInt(); + break; + case /* uint64 remote_commit_fee_sat */ 5: + message.remoteCommitFeeSat = reader.uint64().toBigInt(); + break; + case /* uint64 remote_pending_commit_fee_sat */ 6: + message.remotePendingCommitFeeSat = reader.uint64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PendingChannelsResponse_Commitments, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string local_txid = 1; */ + if (message.localTxid !== "") + writer.tag(1, WireType.LengthDelimited).string(message.localTxid); + /* string remote_txid = 2; */ + if (message.remoteTxid !== "") + writer.tag(2, WireType.LengthDelimited).string(message.remoteTxid); + /* string remote_pending_txid = 3; */ + if (message.remotePendingTxid !== "") + writer.tag(3, WireType.LengthDelimited).string(message.remotePendingTxid); + /* uint64 local_commit_fee_sat = 4; */ + if (message.localCommitFeeSat !== 0n) + writer.tag(4, WireType.Varint).uint64(message.localCommitFeeSat); + /* uint64 remote_commit_fee_sat = 5; */ + if (message.remoteCommitFeeSat !== 0n) + writer.tag(5, WireType.Varint).uint64(message.remoteCommitFeeSat); + /* uint64 remote_pending_commit_fee_sat = 6; */ + if (message.remotePendingCommitFeeSat !== 0n) + writer.tag(6, WireType.Varint).uint64(message.remotePendingCommitFeeSat); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.PendingChannelsResponse.Commitments + */ +export const PendingChannelsResponse_Commitments = new PendingChannelsResponse_Commitments$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PendingChannelsResponse_ClosedChannel$Type extends MessageType { + constructor() { + super("lnrpc.PendingChannelsResponse.ClosedChannel", [ + { no: 1, name: "channel", kind: "message", T: () => PendingChannelsResponse_PendingChannel }, + { no: 2, name: "closing_txid", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): PendingChannelsResponse_ClosedChannel { + const message = { closingTxid: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PendingChannelsResponse_ClosedChannel): PendingChannelsResponse_ClosedChannel { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.PendingChannelsResponse.PendingChannel channel */ 1: + message.channel = PendingChannelsResponse_PendingChannel.internalBinaryRead(reader, reader.uint32(), options, message.channel); + break; + case /* string closing_txid */ 2: + message.closingTxid = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PendingChannelsResponse_ClosedChannel, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.PendingChannelsResponse.PendingChannel channel = 1; */ + if (message.channel) + PendingChannelsResponse_PendingChannel.internalBinaryWrite(message.channel, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* string closing_txid = 2; */ + if (message.closingTxid !== "") + writer.tag(2, WireType.LengthDelimited).string(message.closingTxid); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.PendingChannelsResponse.ClosedChannel + */ +export const PendingChannelsResponse_ClosedChannel = new PendingChannelsResponse_ClosedChannel$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PendingChannelsResponse_ForceClosedChannel$Type extends MessageType { + constructor() { + super("lnrpc.PendingChannelsResponse.ForceClosedChannel", [ + { no: 1, name: "channel", kind: "message", T: () => PendingChannelsResponse_PendingChannel }, + { no: 2, name: "closing_txid", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 3, name: "limbo_balance", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "maturity_height", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 5, name: "blocks_til_maturity", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 6, name: "recovered_balance", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 8, name: "pending_htlcs", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => PendingHTLC }, + { no: 9, name: "anchor", kind: "enum", T: () => ["lnrpc.PendingChannelsResponse.ForceClosedChannel.AnchorState", PendingChannelsResponse_ForceClosedChannel_AnchorState] } + ]); + } + create(value?: PartialMessage): PendingChannelsResponse_ForceClosedChannel { + const message = { closingTxid: "", limboBalance: 0n, maturityHeight: 0, blocksTilMaturity: 0, recoveredBalance: 0n, pendingHtlcs: [], anchor: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PendingChannelsResponse_ForceClosedChannel): PendingChannelsResponse_ForceClosedChannel { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.PendingChannelsResponse.PendingChannel channel */ 1: + message.channel = PendingChannelsResponse_PendingChannel.internalBinaryRead(reader, reader.uint32(), options, message.channel); + break; + case /* string closing_txid */ 2: + message.closingTxid = reader.string(); + break; + case /* int64 limbo_balance */ 3: + message.limboBalance = reader.int64().toBigInt(); + break; + case /* uint32 maturity_height */ 4: + message.maturityHeight = reader.uint32(); + break; + case /* int32 blocks_til_maturity */ 5: + message.blocksTilMaturity = reader.int32(); + break; + case /* int64 recovered_balance */ 6: + message.recoveredBalance = reader.int64().toBigInt(); + break; + case /* repeated lnrpc.PendingHTLC pending_htlcs */ 8: + message.pendingHtlcs.push(PendingHTLC.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* lnrpc.PendingChannelsResponse.ForceClosedChannel.AnchorState anchor */ 9: + message.anchor = reader.int32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PendingChannelsResponse_ForceClosedChannel, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.PendingChannelsResponse.PendingChannel channel = 1; */ + if (message.channel) + PendingChannelsResponse_PendingChannel.internalBinaryWrite(message.channel, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* string closing_txid = 2; */ + if (message.closingTxid !== "") + writer.tag(2, WireType.LengthDelimited).string(message.closingTxid); + /* int64 limbo_balance = 3; */ + if (message.limboBalance !== 0n) + writer.tag(3, WireType.Varint).int64(message.limboBalance); + /* uint32 maturity_height = 4; */ + if (message.maturityHeight !== 0) + writer.tag(4, WireType.Varint).uint32(message.maturityHeight); + /* int32 blocks_til_maturity = 5; */ + if (message.blocksTilMaturity !== 0) + writer.tag(5, WireType.Varint).int32(message.blocksTilMaturity); + /* int64 recovered_balance = 6; */ + if (message.recoveredBalance !== 0n) + writer.tag(6, WireType.Varint).int64(message.recoveredBalance); + /* repeated lnrpc.PendingHTLC pending_htlcs = 8; */ + for (let i = 0; i < message.pendingHtlcs.length; i++) + PendingHTLC.internalBinaryWrite(message.pendingHtlcs[i], writer.tag(8, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.PendingChannelsResponse.ForceClosedChannel.AnchorState anchor = 9; */ + if (message.anchor !== 0) + writer.tag(9, WireType.Varint).int32(message.anchor); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.PendingChannelsResponse.ForceClosedChannel + */ +export const PendingChannelsResponse_ForceClosedChannel = new PendingChannelsResponse_ForceClosedChannel$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ChannelEventSubscription$Type extends MessageType { + constructor() { + super("lnrpc.ChannelEventSubscription", []); + } + create(value?: PartialMessage): ChannelEventSubscription { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ChannelEventSubscription): ChannelEventSubscription { + return target ?? this.create(); + } + internalBinaryWrite(message: ChannelEventSubscription, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ChannelEventSubscription + */ +export const ChannelEventSubscription = new ChannelEventSubscription$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ChannelEventUpdate$Type extends MessageType { + constructor() { + super("lnrpc.ChannelEventUpdate", [ + { no: 1, name: "open_channel", kind: "message", oneof: "channel", T: () => Channel }, + { no: 2, name: "closed_channel", kind: "message", oneof: "channel", T: () => ChannelCloseSummary }, + { no: 3, name: "active_channel", kind: "message", oneof: "channel", T: () => ChannelPoint }, + { no: 4, name: "inactive_channel", kind: "message", oneof: "channel", T: () => ChannelPoint }, + { no: 6, name: "pending_open_channel", kind: "message", oneof: "channel", T: () => PendingUpdate }, + { no: 7, name: "fully_resolved_channel", kind: "message", oneof: "channel", T: () => ChannelPoint }, + { no: 5, name: "type", kind: "enum", T: () => ["lnrpc.ChannelEventUpdate.UpdateType", ChannelEventUpdate_UpdateType] } + ]); + } + create(value?: PartialMessage): ChannelEventUpdate { + const message = { channel: { oneofKind: undefined }, type: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ChannelEventUpdate): ChannelEventUpdate { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.Channel open_channel */ 1: + message.channel = { + oneofKind: "openChannel", + openChannel: Channel.internalBinaryRead(reader, reader.uint32(), options, (message.channel as any).openChannel) + }; + break; + case /* lnrpc.ChannelCloseSummary closed_channel */ 2: + message.channel = { + oneofKind: "closedChannel", + closedChannel: ChannelCloseSummary.internalBinaryRead(reader, reader.uint32(), options, (message.channel as any).closedChannel) + }; + break; + case /* lnrpc.ChannelPoint active_channel */ 3: + message.channel = { + oneofKind: "activeChannel", + activeChannel: ChannelPoint.internalBinaryRead(reader, reader.uint32(), options, (message.channel as any).activeChannel) + }; + break; + case /* lnrpc.ChannelPoint inactive_channel */ 4: + message.channel = { + oneofKind: "inactiveChannel", + inactiveChannel: ChannelPoint.internalBinaryRead(reader, reader.uint32(), options, (message.channel as any).inactiveChannel) + }; + break; + case /* lnrpc.PendingUpdate pending_open_channel */ 6: + message.channel = { + oneofKind: "pendingOpenChannel", + pendingOpenChannel: PendingUpdate.internalBinaryRead(reader, reader.uint32(), options, (message.channel as any).pendingOpenChannel) + }; + break; + case /* lnrpc.ChannelPoint fully_resolved_channel */ 7: + message.channel = { + oneofKind: "fullyResolvedChannel", + fullyResolvedChannel: ChannelPoint.internalBinaryRead(reader, reader.uint32(), options, (message.channel as any).fullyResolvedChannel) + }; + break; + case /* lnrpc.ChannelEventUpdate.UpdateType type */ 5: + message.type = reader.int32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ChannelEventUpdate, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.Channel open_channel = 1; */ + if (message.channel.oneofKind === "openChannel") + Channel.internalBinaryWrite(message.channel.openChannel, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.ChannelCloseSummary closed_channel = 2; */ + if (message.channel.oneofKind === "closedChannel") + ChannelCloseSummary.internalBinaryWrite(message.channel.closedChannel, writer.tag(2, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.ChannelPoint active_channel = 3; */ + if (message.channel.oneofKind === "activeChannel") + ChannelPoint.internalBinaryWrite(message.channel.activeChannel, writer.tag(3, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.ChannelPoint inactive_channel = 4; */ + if (message.channel.oneofKind === "inactiveChannel") + ChannelPoint.internalBinaryWrite(message.channel.inactiveChannel, writer.tag(4, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.PendingUpdate pending_open_channel = 6; */ + if (message.channel.oneofKind === "pendingOpenChannel") + PendingUpdate.internalBinaryWrite(message.channel.pendingOpenChannel, writer.tag(6, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.ChannelPoint fully_resolved_channel = 7; */ + if (message.channel.oneofKind === "fullyResolvedChannel") + ChannelPoint.internalBinaryWrite(message.channel.fullyResolvedChannel, writer.tag(7, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.ChannelEventUpdate.UpdateType type = 5; */ + if (message.type !== 0) + writer.tag(5, WireType.Varint).int32(message.type); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ChannelEventUpdate + */ +export const ChannelEventUpdate = new ChannelEventUpdate$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class WalletAccountBalance$Type extends MessageType { + constructor() { + super("lnrpc.WalletAccountBalance", [ + { no: 1, name: "confirmed_balance", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 2, name: "unconfirmed_balance", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): WalletAccountBalance { + const message = { confirmedBalance: 0n, unconfirmedBalance: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: WalletAccountBalance): WalletAccountBalance { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* int64 confirmed_balance */ 1: + message.confirmedBalance = reader.int64().toBigInt(); + break; + case /* int64 unconfirmed_balance */ 2: + message.unconfirmedBalance = reader.int64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: WalletAccountBalance, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* int64 confirmed_balance = 1; */ + if (message.confirmedBalance !== 0n) + writer.tag(1, WireType.Varint).int64(message.confirmedBalance); + /* int64 unconfirmed_balance = 2; */ + if (message.unconfirmedBalance !== 0n) + writer.tag(2, WireType.Varint).int64(message.unconfirmedBalance); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.WalletAccountBalance + */ +export const WalletAccountBalance = new WalletAccountBalance$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class WalletBalanceRequest$Type extends MessageType { + constructor() { + super("lnrpc.WalletBalanceRequest", []); + } + create(value?: PartialMessage): WalletBalanceRequest { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: WalletBalanceRequest): WalletBalanceRequest { + return target ?? this.create(); + } + internalBinaryWrite(message: WalletBalanceRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.WalletBalanceRequest + */ +export const WalletBalanceRequest = new WalletBalanceRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class WalletBalanceResponse$Type extends MessageType { + constructor() { + super("lnrpc.WalletBalanceResponse", [ + { no: 1, name: "total_balance", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 2, name: "confirmed_balance", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "unconfirmed_balance", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 5, name: "locked_balance", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 6, name: "reserved_balance_anchor_chan", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "account_balance", kind: "map", K: 9 /*ScalarType.STRING*/, V: { kind: "message", T: () => WalletAccountBalance } } + ]); + } + create(value?: PartialMessage): WalletBalanceResponse { + const message = { totalBalance: 0n, confirmedBalance: 0n, unconfirmedBalance: 0n, lockedBalance: 0n, reservedBalanceAnchorChan: 0n, accountBalance: {} }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: WalletBalanceResponse): WalletBalanceResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* int64 total_balance */ 1: + message.totalBalance = reader.int64().toBigInt(); + break; + case /* int64 confirmed_balance */ 2: + message.confirmedBalance = reader.int64().toBigInt(); + break; + case /* int64 unconfirmed_balance */ 3: + message.unconfirmedBalance = reader.int64().toBigInt(); + break; + case /* int64 locked_balance */ 5: + message.lockedBalance = reader.int64().toBigInt(); + break; + case /* int64 reserved_balance_anchor_chan */ 6: + message.reservedBalanceAnchorChan = reader.int64().toBigInt(); + break; + case /* map account_balance */ 4: + this.binaryReadMap4(message.accountBalance, reader, options); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + private binaryReadMap4(map: WalletBalanceResponse["accountBalance"], reader: IBinaryReader, options: BinaryReadOptions): void { + let len = reader.uint32(), end = reader.pos + len, key: keyof WalletBalanceResponse["accountBalance"] | undefined, val: WalletBalanceResponse["accountBalance"][any] | undefined; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + key = reader.string(); + break; + case 2: + val = WalletAccountBalance.internalBinaryRead(reader, reader.uint32(), options); + break; + default: throw new globalThis.Error("unknown map entry field for field lnrpc.WalletBalanceResponse.account_balance"); + } + } + map[key ?? ""] = val ?? WalletAccountBalance.create(); + } + internalBinaryWrite(message: WalletBalanceResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* int64 total_balance = 1; */ + if (message.totalBalance !== 0n) + writer.tag(1, WireType.Varint).int64(message.totalBalance); + /* int64 confirmed_balance = 2; */ + if (message.confirmedBalance !== 0n) + writer.tag(2, WireType.Varint).int64(message.confirmedBalance); + /* int64 unconfirmed_balance = 3; */ + if (message.unconfirmedBalance !== 0n) + writer.tag(3, WireType.Varint).int64(message.unconfirmedBalance); + /* int64 locked_balance = 5; */ + if (message.lockedBalance !== 0n) + writer.tag(5, WireType.Varint).int64(message.lockedBalance); + /* int64 reserved_balance_anchor_chan = 6; */ + if (message.reservedBalanceAnchorChan !== 0n) + writer.tag(6, WireType.Varint).int64(message.reservedBalanceAnchorChan); + /* map account_balance = 4; */ + for (let k of Object.keys(message.accountBalance)) { + writer.tag(4, WireType.LengthDelimited).fork().tag(1, WireType.LengthDelimited).string(k); + writer.tag(2, WireType.LengthDelimited).fork(); + WalletAccountBalance.internalBinaryWrite(message.accountBalance[k], writer, options); + writer.join().join(); + } + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.WalletBalanceResponse + */ +export const WalletBalanceResponse = new WalletBalanceResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class Amount$Type extends MessageType { + constructor() { + super("lnrpc.Amount", [ + { no: 1, name: "sat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 2, name: "msat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): Amount { + const message = { sat: 0n, msat: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: Amount): Amount { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint64 sat */ 1: + message.sat = reader.uint64().toBigInt(); + break; + case /* uint64 msat */ 2: + message.msat = reader.uint64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: Amount, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint64 sat = 1; */ + if (message.sat !== 0n) + writer.tag(1, WireType.Varint).uint64(message.sat); + /* uint64 msat = 2; */ + if (message.msat !== 0n) + writer.tag(2, WireType.Varint).uint64(message.msat); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.Amount + */ +export const Amount = new Amount$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ChannelBalanceRequest$Type extends MessageType { + constructor() { + super("lnrpc.ChannelBalanceRequest", []); + } + create(value?: PartialMessage): ChannelBalanceRequest { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ChannelBalanceRequest): ChannelBalanceRequest { + return target ?? this.create(); + } + internalBinaryWrite(message: ChannelBalanceRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ChannelBalanceRequest + */ +export const ChannelBalanceRequest = new ChannelBalanceRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ChannelBalanceResponse$Type extends MessageType { + constructor() { + super("lnrpc.ChannelBalanceResponse", [ + { no: 1, name: "balance", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 2, name: "pending_open_balance", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "local_balance", kind: "message", T: () => Amount }, + { no: 4, name: "remote_balance", kind: "message", T: () => Amount }, + { no: 5, name: "unsettled_local_balance", kind: "message", T: () => Amount }, + { no: 6, name: "unsettled_remote_balance", kind: "message", T: () => Amount }, + { no: 7, name: "pending_open_local_balance", kind: "message", T: () => Amount }, + { no: 8, name: "pending_open_remote_balance", kind: "message", T: () => Amount } + ]); + } + create(value?: PartialMessage): ChannelBalanceResponse { + const message = { balance: 0n, pendingOpenBalance: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ChannelBalanceResponse): ChannelBalanceResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* int64 balance = 1 [deprecated = true];*/ 1: + message.balance = reader.int64().toBigInt(); + break; + case /* int64 pending_open_balance = 2 [deprecated = true];*/ 2: + message.pendingOpenBalance = reader.int64().toBigInt(); + break; + case /* lnrpc.Amount local_balance */ 3: + message.localBalance = Amount.internalBinaryRead(reader, reader.uint32(), options, message.localBalance); + break; + case /* lnrpc.Amount remote_balance */ 4: + message.remoteBalance = Amount.internalBinaryRead(reader, reader.uint32(), options, message.remoteBalance); + break; + case /* lnrpc.Amount unsettled_local_balance */ 5: + message.unsettledLocalBalance = Amount.internalBinaryRead(reader, reader.uint32(), options, message.unsettledLocalBalance); + break; + case /* lnrpc.Amount unsettled_remote_balance */ 6: + message.unsettledRemoteBalance = Amount.internalBinaryRead(reader, reader.uint32(), options, message.unsettledRemoteBalance); + break; + case /* lnrpc.Amount pending_open_local_balance */ 7: + message.pendingOpenLocalBalance = Amount.internalBinaryRead(reader, reader.uint32(), options, message.pendingOpenLocalBalance); + break; + case /* lnrpc.Amount pending_open_remote_balance */ 8: + message.pendingOpenRemoteBalance = Amount.internalBinaryRead(reader, reader.uint32(), options, message.pendingOpenRemoteBalance); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ChannelBalanceResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* int64 balance = 1 [deprecated = true]; */ + if (message.balance !== 0n) + writer.tag(1, WireType.Varint).int64(message.balance); + /* int64 pending_open_balance = 2 [deprecated = true]; */ + if (message.pendingOpenBalance !== 0n) + writer.tag(2, WireType.Varint).int64(message.pendingOpenBalance); + /* lnrpc.Amount local_balance = 3; */ + if (message.localBalance) + Amount.internalBinaryWrite(message.localBalance, writer.tag(3, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.Amount remote_balance = 4; */ + if (message.remoteBalance) + Amount.internalBinaryWrite(message.remoteBalance, writer.tag(4, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.Amount unsettled_local_balance = 5; */ + if (message.unsettledLocalBalance) + Amount.internalBinaryWrite(message.unsettledLocalBalance, writer.tag(5, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.Amount unsettled_remote_balance = 6; */ + if (message.unsettledRemoteBalance) + Amount.internalBinaryWrite(message.unsettledRemoteBalance, writer.tag(6, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.Amount pending_open_local_balance = 7; */ + if (message.pendingOpenLocalBalance) + Amount.internalBinaryWrite(message.pendingOpenLocalBalance, writer.tag(7, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.Amount pending_open_remote_balance = 8; */ + if (message.pendingOpenRemoteBalance) + Amount.internalBinaryWrite(message.pendingOpenRemoteBalance, writer.tag(8, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ChannelBalanceResponse + */ +export const ChannelBalanceResponse = new ChannelBalanceResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class QueryRoutesRequest$Type extends MessageType { + constructor() { + super("lnrpc.QueryRoutesRequest", [ + { no: 1, name: "pub_key", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "amt", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 12, name: "amt_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "final_cltv_delta", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 5, name: "fee_limit", kind: "message", T: () => FeeLimit }, + { no: 6, name: "ignored_nodes", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 12 /*ScalarType.BYTES*/ }, + { no: 7, name: "ignored_edges", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => EdgeLocator }, + { no: 8, name: "source_pub_key", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 9, name: "use_mission_control", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 10, name: "ignored_pairs", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => NodePair }, + { no: 11, name: "cltv_limit", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 13, name: "dest_custom_records", kind: "map", K: 4 /*ScalarType.UINT64*/, V: { kind: "scalar", T: 12 /*ScalarType.BYTES*/ } }, + { no: 14, name: "outgoing_chan_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/ }, + { no: 15, name: "last_hop_pubkey", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 16, name: "route_hints", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => RouteHint }, + { no: 17, name: "dest_features", kind: "enum", repeat: 1 /*RepeatType.PACKED*/, T: () => ["lnrpc.FeatureBit", FeatureBit] }, + { no: 18, name: "time_pref", kind: "scalar", T: 1 /*ScalarType.DOUBLE*/ } + ]); + } + create(value?: PartialMessage): QueryRoutesRequest { + const message = { pubKey: "", amt: 0n, amtMsat: 0n, finalCltvDelta: 0, ignoredNodes: [], ignoredEdges: [], sourcePubKey: "", useMissionControl: false, ignoredPairs: [], cltvLimit: 0, destCustomRecords: {}, outgoingChanId: "0", lastHopPubkey: new Uint8Array(0), routeHints: [], destFeatures: [], timePref: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: QueryRoutesRequest): QueryRoutesRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string pub_key */ 1: + message.pubKey = reader.string(); + break; + case /* int64 amt */ 2: + message.amt = reader.int64().toBigInt(); + break; + case /* int64 amt_msat */ 12: + message.amtMsat = reader.int64().toBigInt(); + break; + case /* int32 final_cltv_delta */ 4: + message.finalCltvDelta = reader.int32(); + break; + case /* lnrpc.FeeLimit fee_limit */ 5: + message.feeLimit = FeeLimit.internalBinaryRead(reader, reader.uint32(), options, message.feeLimit); + break; + case /* repeated bytes ignored_nodes */ 6: + message.ignoredNodes.push(reader.bytes()); + break; + case /* repeated lnrpc.EdgeLocator ignored_edges = 7 [deprecated = true];*/ 7: + message.ignoredEdges.push(EdgeLocator.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* string source_pub_key */ 8: + message.sourcePubKey = reader.string(); + break; + case /* bool use_mission_control */ 9: + message.useMissionControl = reader.bool(); + break; + case /* repeated lnrpc.NodePair ignored_pairs */ 10: + message.ignoredPairs.push(NodePair.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* uint32 cltv_limit */ 11: + message.cltvLimit = reader.uint32(); + break; + case /* map dest_custom_records */ 13: + this.binaryReadMap13(message.destCustomRecords, reader, options); + break; + case /* uint64 outgoing_chan_id = 14 [jstype = JS_STRING];*/ 14: + message.outgoingChanId = reader.uint64().toString(); + break; + case /* bytes last_hop_pubkey */ 15: + message.lastHopPubkey = reader.bytes(); + break; + case /* repeated lnrpc.RouteHint route_hints */ 16: + message.routeHints.push(RouteHint.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* repeated lnrpc.FeatureBit dest_features */ 17: + if (wireType === WireType.LengthDelimited) + for (let e = reader.int32() + reader.pos; reader.pos < e;) + message.destFeatures.push(reader.int32()); + else + message.destFeatures.push(reader.int32()); + break; + case /* double time_pref */ 18: + message.timePref = reader.double(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + private binaryReadMap13(map: QueryRoutesRequest["destCustomRecords"], reader: IBinaryReader, options: BinaryReadOptions): void { + let len = reader.uint32(), end = reader.pos + len, key: keyof QueryRoutesRequest["destCustomRecords"] | undefined, val: QueryRoutesRequest["destCustomRecords"][any] | undefined; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + key = reader.uint64().toString(); + break; + case 2: + val = reader.bytes(); + break; + default: throw new globalThis.Error("unknown map entry field for field lnrpc.QueryRoutesRequest.dest_custom_records"); + } + } + map[key ?? "0"] = val ?? new Uint8Array(0); + } + internalBinaryWrite(message: QueryRoutesRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string pub_key = 1; */ + if (message.pubKey !== "") + writer.tag(1, WireType.LengthDelimited).string(message.pubKey); + /* int64 amt = 2; */ + if (message.amt !== 0n) + writer.tag(2, WireType.Varint).int64(message.amt); + /* int64 amt_msat = 12; */ + if (message.amtMsat !== 0n) + writer.tag(12, WireType.Varint).int64(message.amtMsat); + /* int32 final_cltv_delta = 4; */ + if (message.finalCltvDelta !== 0) + writer.tag(4, WireType.Varint).int32(message.finalCltvDelta); + /* lnrpc.FeeLimit fee_limit = 5; */ + if (message.feeLimit) + FeeLimit.internalBinaryWrite(message.feeLimit, writer.tag(5, WireType.LengthDelimited).fork(), options).join(); + /* repeated bytes ignored_nodes = 6; */ + for (let i = 0; i < message.ignoredNodes.length; i++) + writer.tag(6, WireType.LengthDelimited).bytes(message.ignoredNodes[i]); + /* repeated lnrpc.EdgeLocator ignored_edges = 7 [deprecated = true]; */ + for (let i = 0; i < message.ignoredEdges.length; i++) + EdgeLocator.internalBinaryWrite(message.ignoredEdges[i], writer.tag(7, WireType.LengthDelimited).fork(), options).join(); + /* string source_pub_key = 8; */ + if (message.sourcePubKey !== "") + writer.tag(8, WireType.LengthDelimited).string(message.sourcePubKey); + /* bool use_mission_control = 9; */ + if (message.useMissionControl !== false) + writer.tag(9, WireType.Varint).bool(message.useMissionControl); + /* repeated lnrpc.NodePair ignored_pairs = 10; */ + for (let i = 0; i < message.ignoredPairs.length; i++) + NodePair.internalBinaryWrite(message.ignoredPairs[i], writer.tag(10, WireType.LengthDelimited).fork(), options).join(); + /* uint32 cltv_limit = 11; */ + if (message.cltvLimit !== 0) + writer.tag(11, WireType.Varint).uint32(message.cltvLimit); + /* map dest_custom_records = 13; */ + for (let k of Object.keys(message.destCustomRecords)) + writer.tag(13, WireType.LengthDelimited).fork().tag(1, WireType.Varint).uint64(k).tag(2, WireType.LengthDelimited).bytes(message.destCustomRecords[k]).join(); + /* uint64 outgoing_chan_id = 14 [jstype = JS_STRING]; */ + if (message.outgoingChanId !== "0") + writer.tag(14, WireType.Varint).uint64(message.outgoingChanId); + /* bytes last_hop_pubkey = 15; */ + if (message.lastHopPubkey.length) + writer.tag(15, WireType.LengthDelimited).bytes(message.lastHopPubkey); + /* repeated lnrpc.RouteHint route_hints = 16; */ + for (let i = 0; i < message.routeHints.length; i++) + RouteHint.internalBinaryWrite(message.routeHints[i], writer.tag(16, WireType.LengthDelimited).fork(), options).join(); + /* repeated lnrpc.FeatureBit dest_features = 17; */ + if (message.destFeatures.length) { + writer.tag(17, WireType.LengthDelimited).fork(); + for (let i = 0; i < message.destFeatures.length; i++) + writer.int32(message.destFeatures[i]); + writer.join(); + } + /* double time_pref = 18; */ + if (message.timePref !== 0) + writer.tag(18, WireType.Bit64).double(message.timePref); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.QueryRoutesRequest + */ +export const QueryRoutesRequest = new QueryRoutesRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class NodePair$Type extends MessageType { + constructor() { + super("lnrpc.NodePair", [ + { no: 1, name: "from", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "to", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): NodePair { + const message = { from: new Uint8Array(0), to: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: NodePair): NodePair { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes from */ 1: + message.from = reader.bytes(); + break; + case /* bytes to */ 2: + message.to = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: NodePair, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes from = 1; */ + if (message.from.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.from); + /* bytes to = 2; */ + if (message.to.length) + writer.tag(2, WireType.LengthDelimited).bytes(message.to); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.NodePair + */ +export const NodePair = new NodePair$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class EdgeLocator$Type extends MessageType { + constructor() { + super("lnrpc.EdgeLocator", [ + { no: 1, name: "channel_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/ }, + { no: 2, name: "direction_reverse", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): EdgeLocator { + const message = { channelId: "0", directionReverse: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: EdgeLocator): EdgeLocator { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint64 channel_id = 1 [jstype = JS_STRING];*/ 1: + message.channelId = reader.uint64().toString(); + break; + case /* bool direction_reverse */ 2: + message.directionReverse = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: EdgeLocator, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint64 channel_id = 1 [jstype = JS_STRING]; */ + if (message.channelId !== "0") + writer.tag(1, WireType.Varint).uint64(message.channelId); + /* bool direction_reverse = 2; */ + if (message.directionReverse !== false) + writer.tag(2, WireType.Varint).bool(message.directionReverse); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.EdgeLocator + */ +export const EdgeLocator = new EdgeLocator$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class QueryRoutesResponse$Type extends MessageType { + constructor() { + super("lnrpc.QueryRoutesResponse", [ + { no: 1, name: "routes", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => Route }, + { no: 2, name: "success_prob", kind: "scalar", T: 1 /*ScalarType.DOUBLE*/ } + ]); + } + create(value?: PartialMessage): QueryRoutesResponse { + const message = { routes: [], successProb: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: QueryRoutesResponse): QueryRoutesResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated lnrpc.Route routes */ 1: + message.routes.push(Route.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* double success_prob */ 2: + message.successProb = reader.double(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: QueryRoutesResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated lnrpc.Route routes = 1; */ + for (let i = 0; i < message.routes.length; i++) + Route.internalBinaryWrite(message.routes[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* double success_prob = 2; */ + if (message.successProb !== 0) + writer.tag(2, WireType.Bit64).double(message.successProb); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.QueryRoutesResponse + */ +export const QueryRoutesResponse = new QueryRoutesResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class Hop$Type extends MessageType { + constructor() { + super("lnrpc.Hop", [ + { no: 1, name: "chan_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/ }, + { no: 2, name: "chan_capacity", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "amt_to_forward", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "fee", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 5, name: "expiry", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 6, name: "amt_to_forward_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 7, name: "fee_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 8, name: "pub_key", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 9, name: "tlv_payload", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 10, name: "mpp_record", kind: "message", T: () => MPPRecord }, + { no: 12, name: "amp_record", kind: "message", T: () => AMPRecord }, + { no: 11, name: "custom_records", kind: "map", K: 4 /*ScalarType.UINT64*/, V: { kind: "scalar", T: 12 /*ScalarType.BYTES*/ } }, + { no: 13, name: "metadata", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): Hop { + const message = { chanId: "0", chanCapacity: 0n, amtToForward: 0n, fee: 0n, expiry: 0, amtToForwardMsat: 0n, feeMsat: 0n, pubKey: "", tlvPayload: false, customRecords: {}, metadata: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: Hop): Hop { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint64 chan_id = 1 [jstype = JS_STRING];*/ 1: + message.chanId = reader.uint64().toString(); + break; + case /* int64 chan_capacity = 2 [deprecated = true];*/ 2: + message.chanCapacity = reader.int64().toBigInt(); + break; + case /* int64 amt_to_forward = 3 [deprecated = true];*/ 3: + message.amtToForward = reader.int64().toBigInt(); + break; + case /* int64 fee = 4 [deprecated = true];*/ 4: + message.fee = reader.int64().toBigInt(); + break; + case /* uint32 expiry */ 5: + message.expiry = reader.uint32(); + break; + case /* int64 amt_to_forward_msat */ 6: + message.amtToForwardMsat = reader.int64().toBigInt(); + break; + case /* int64 fee_msat */ 7: + message.feeMsat = reader.int64().toBigInt(); + break; + case /* string pub_key */ 8: + message.pubKey = reader.string(); + break; + case /* bool tlv_payload = 9 [deprecated = true];*/ 9: + message.tlvPayload = reader.bool(); + break; + case /* lnrpc.MPPRecord mpp_record */ 10: + message.mppRecord = MPPRecord.internalBinaryRead(reader, reader.uint32(), options, message.mppRecord); + break; + case /* lnrpc.AMPRecord amp_record */ 12: + message.ampRecord = AMPRecord.internalBinaryRead(reader, reader.uint32(), options, message.ampRecord); + break; + case /* map custom_records */ 11: + this.binaryReadMap11(message.customRecords, reader, options); + break; + case /* bytes metadata */ 13: + message.metadata = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + private binaryReadMap11(map: Hop["customRecords"], reader: IBinaryReader, options: BinaryReadOptions): void { + let len = reader.uint32(), end = reader.pos + len, key: keyof Hop["customRecords"] | undefined, val: Hop["customRecords"][any] | undefined; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + key = reader.uint64().toString(); + break; + case 2: + val = reader.bytes(); + break; + default: throw new globalThis.Error("unknown map entry field for field lnrpc.Hop.custom_records"); + } + } + map[key ?? "0"] = val ?? new Uint8Array(0); + } + internalBinaryWrite(message: Hop, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint64 chan_id = 1 [jstype = JS_STRING]; */ + if (message.chanId !== "0") + writer.tag(1, WireType.Varint).uint64(message.chanId); + /* int64 chan_capacity = 2 [deprecated = true]; */ + if (message.chanCapacity !== 0n) + writer.tag(2, WireType.Varint).int64(message.chanCapacity); + /* int64 amt_to_forward = 3 [deprecated = true]; */ + if (message.amtToForward !== 0n) + writer.tag(3, WireType.Varint).int64(message.amtToForward); + /* int64 fee = 4 [deprecated = true]; */ + if (message.fee !== 0n) + writer.tag(4, WireType.Varint).int64(message.fee); + /* uint32 expiry = 5; */ + if (message.expiry !== 0) + writer.tag(5, WireType.Varint).uint32(message.expiry); + /* int64 amt_to_forward_msat = 6; */ + if (message.amtToForwardMsat !== 0n) + writer.tag(6, WireType.Varint).int64(message.amtToForwardMsat); + /* int64 fee_msat = 7; */ + if (message.feeMsat !== 0n) + writer.tag(7, WireType.Varint).int64(message.feeMsat); + /* string pub_key = 8; */ + if (message.pubKey !== "") + writer.tag(8, WireType.LengthDelimited).string(message.pubKey); + /* bool tlv_payload = 9 [deprecated = true]; */ + if (message.tlvPayload !== false) + writer.tag(9, WireType.Varint).bool(message.tlvPayload); + /* lnrpc.MPPRecord mpp_record = 10; */ + if (message.mppRecord) + MPPRecord.internalBinaryWrite(message.mppRecord, writer.tag(10, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.AMPRecord amp_record = 12; */ + if (message.ampRecord) + AMPRecord.internalBinaryWrite(message.ampRecord, writer.tag(12, WireType.LengthDelimited).fork(), options).join(); + /* map custom_records = 11; */ + for (let k of Object.keys(message.customRecords)) + writer.tag(11, WireType.LengthDelimited).fork().tag(1, WireType.Varint).uint64(k).tag(2, WireType.LengthDelimited).bytes(message.customRecords[k]).join(); + /* bytes metadata = 13; */ + if (message.metadata.length) + writer.tag(13, WireType.LengthDelimited).bytes(message.metadata); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.Hop + */ +export const Hop = new Hop$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class MPPRecord$Type extends MessageType { + constructor() { + super("lnrpc.MPPRecord", [ + { no: 11, name: "payment_addr", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 10, name: "total_amt_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): MPPRecord { + const message = { paymentAddr: new Uint8Array(0), totalAmtMsat: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: MPPRecord): MPPRecord { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes payment_addr */ 11: + message.paymentAddr = reader.bytes(); + break; + case /* int64 total_amt_msat */ 10: + message.totalAmtMsat = reader.int64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: MPPRecord, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes payment_addr = 11; */ + if (message.paymentAddr.length) + writer.tag(11, WireType.LengthDelimited).bytes(message.paymentAddr); + /* int64 total_amt_msat = 10; */ + if (message.totalAmtMsat !== 0n) + writer.tag(10, WireType.Varint).int64(message.totalAmtMsat); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.MPPRecord + */ +export const MPPRecord = new MPPRecord$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class AMPRecord$Type extends MessageType { + constructor() { + super("lnrpc.AMPRecord", [ + { no: 1, name: "root_share", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "set_id", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 3, name: "child_index", kind: "scalar", T: 13 /*ScalarType.UINT32*/ } + ]); + } + create(value?: PartialMessage): AMPRecord { + const message = { rootShare: new Uint8Array(0), setId: new Uint8Array(0), childIndex: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: AMPRecord): AMPRecord { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes root_share */ 1: + message.rootShare = reader.bytes(); + break; + case /* bytes set_id */ 2: + message.setId = reader.bytes(); + break; + case /* uint32 child_index */ 3: + message.childIndex = reader.uint32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: AMPRecord, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes root_share = 1; */ + if (message.rootShare.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.rootShare); + /* bytes set_id = 2; */ + if (message.setId.length) + writer.tag(2, WireType.LengthDelimited).bytes(message.setId); + /* uint32 child_index = 3; */ + if (message.childIndex !== 0) + writer.tag(3, WireType.Varint).uint32(message.childIndex); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.AMPRecord + */ +export const AMPRecord = new AMPRecord$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class Route$Type extends MessageType { + constructor() { + super("lnrpc.Route", [ + { no: 1, name: "total_time_lock", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 2, name: "total_fees", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "total_amt", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "hops", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => Hop }, + { no: 5, name: "total_fees_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 6, name: "total_amt_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): Route { + const message = { totalTimeLock: 0, totalFees: 0n, totalAmt: 0n, hops: [], totalFeesMsat: 0n, totalAmtMsat: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: Route): Route { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint32 total_time_lock */ 1: + message.totalTimeLock = reader.uint32(); + break; + case /* int64 total_fees = 2 [deprecated = true];*/ 2: + message.totalFees = reader.int64().toBigInt(); + break; + case /* int64 total_amt = 3 [deprecated = true];*/ 3: + message.totalAmt = reader.int64().toBigInt(); + break; + case /* repeated lnrpc.Hop hops */ 4: + message.hops.push(Hop.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* int64 total_fees_msat */ 5: + message.totalFeesMsat = reader.int64().toBigInt(); + break; + case /* int64 total_amt_msat */ 6: + message.totalAmtMsat = reader.int64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: Route, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint32 total_time_lock = 1; */ + if (message.totalTimeLock !== 0) + writer.tag(1, WireType.Varint).uint32(message.totalTimeLock); + /* int64 total_fees = 2 [deprecated = true]; */ + if (message.totalFees !== 0n) + writer.tag(2, WireType.Varint).int64(message.totalFees); + /* int64 total_amt = 3 [deprecated = true]; */ + if (message.totalAmt !== 0n) + writer.tag(3, WireType.Varint).int64(message.totalAmt); + /* repeated lnrpc.Hop hops = 4; */ + for (let i = 0; i < message.hops.length; i++) + Hop.internalBinaryWrite(message.hops[i], writer.tag(4, WireType.LengthDelimited).fork(), options).join(); + /* int64 total_fees_msat = 5; */ + if (message.totalFeesMsat !== 0n) + writer.tag(5, WireType.Varint).int64(message.totalFeesMsat); + /* int64 total_amt_msat = 6; */ + if (message.totalAmtMsat !== 0n) + writer.tag(6, WireType.Varint).int64(message.totalAmtMsat); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.Route + */ +export const Route = new Route$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class NodeInfoRequest$Type extends MessageType { + constructor() { + super("lnrpc.NodeInfoRequest", [ + { no: 1, name: "pub_key", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "include_channels", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): NodeInfoRequest { + const message = { pubKey: "", includeChannels: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: NodeInfoRequest): NodeInfoRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string pub_key */ 1: + message.pubKey = reader.string(); + break; + case /* bool include_channels */ 2: + message.includeChannels = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: NodeInfoRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string pub_key = 1; */ + if (message.pubKey !== "") + writer.tag(1, WireType.LengthDelimited).string(message.pubKey); + /* bool include_channels = 2; */ + if (message.includeChannels !== false) + writer.tag(2, WireType.Varint).bool(message.includeChannels); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.NodeInfoRequest + */ +export const NodeInfoRequest = new NodeInfoRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class NodeInfo$Type extends MessageType { + constructor() { + super("lnrpc.NodeInfo", [ + { no: 1, name: "node", kind: "message", T: () => LightningNode }, + { no: 2, name: "num_channels", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 3, name: "total_capacity", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "channels", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => ChannelEdge } + ]); + } + create(value?: PartialMessage): NodeInfo { + const message = { numChannels: 0, totalCapacity: 0n, channels: [] }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: NodeInfo): NodeInfo { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.LightningNode node */ 1: + message.node = LightningNode.internalBinaryRead(reader, reader.uint32(), options, message.node); + break; + case /* uint32 num_channels */ 2: + message.numChannels = reader.uint32(); + break; + case /* int64 total_capacity */ 3: + message.totalCapacity = reader.int64().toBigInt(); + break; + case /* repeated lnrpc.ChannelEdge channels */ 4: + message.channels.push(ChannelEdge.internalBinaryRead(reader, reader.uint32(), options)); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: NodeInfo, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.LightningNode node = 1; */ + if (message.node) + LightningNode.internalBinaryWrite(message.node, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* uint32 num_channels = 2; */ + if (message.numChannels !== 0) + writer.tag(2, WireType.Varint).uint32(message.numChannels); + /* int64 total_capacity = 3; */ + if (message.totalCapacity !== 0n) + writer.tag(3, WireType.Varint).int64(message.totalCapacity); + /* repeated lnrpc.ChannelEdge channels = 4; */ + for (let i = 0; i < message.channels.length; i++) + ChannelEdge.internalBinaryWrite(message.channels[i], writer.tag(4, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.NodeInfo + */ +export const NodeInfo = new NodeInfo$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class LightningNode$Type extends MessageType { + constructor() { + super("lnrpc.LightningNode", [ + { no: 1, name: "last_update", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 2, name: "pub_key", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 3, name: "alias", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 4, name: "addresses", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => NodeAddress }, + { no: 5, name: "color", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 6, name: "features", kind: "map", K: 13 /*ScalarType.UINT32*/, V: { kind: "message", T: () => Feature } }, + { no: 7, name: "custom_records", kind: "map", K: 4 /*ScalarType.UINT64*/, V: { kind: "scalar", T: 12 /*ScalarType.BYTES*/ } } + ]); + } + create(value?: PartialMessage): LightningNode { + const message = { lastUpdate: 0, pubKey: "", alias: "", addresses: [], color: "", features: {}, customRecords: {} }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: LightningNode): LightningNode { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint32 last_update */ 1: + message.lastUpdate = reader.uint32(); + break; + case /* string pub_key */ 2: + message.pubKey = reader.string(); + break; + case /* string alias */ 3: + message.alias = reader.string(); + break; + case /* repeated lnrpc.NodeAddress addresses */ 4: + message.addresses.push(NodeAddress.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* string color */ 5: + message.color = reader.string(); + break; + case /* map features */ 6: + this.binaryReadMap6(message.features, reader, options); + break; + case /* map custom_records */ 7: + this.binaryReadMap7(message.customRecords, reader, options); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + private binaryReadMap6(map: LightningNode["features"], reader: IBinaryReader, options: BinaryReadOptions): void { + let len = reader.uint32(), end = reader.pos + len, key: keyof LightningNode["features"] | undefined, val: LightningNode["features"][any] | undefined; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + key = reader.uint32(); + break; + case 2: + val = Feature.internalBinaryRead(reader, reader.uint32(), options); + break; + default: throw new globalThis.Error("unknown map entry field for field lnrpc.LightningNode.features"); + } + } + map[key ?? 0] = val ?? Feature.create(); + } + private binaryReadMap7(map: LightningNode["customRecords"], reader: IBinaryReader, options: BinaryReadOptions): void { + let len = reader.uint32(), end = reader.pos + len, key: keyof LightningNode["customRecords"] | undefined, val: LightningNode["customRecords"][any] | undefined; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + key = reader.uint64().toString(); + break; + case 2: + val = reader.bytes(); + break; + default: throw new globalThis.Error("unknown map entry field for field lnrpc.LightningNode.custom_records"); + } + } + map[key ?? "0"] = val ?? new Uint8Array(0); + } + internalBinaryWrite(message: LightningNode, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint32 last_update = 1; */ + if (message.lastUpdate !== 0) + writer.tag(1, WireType.Varint).uint32(message.lastUpdate); + /* string pub_key = 2; */ + if (message.pubKey !== "") + writer.tag(2, WireType.LengthDelimited).string(message.pubKey); + /* string alias = 3; */ + if (message.alias !== "") + writer.tag(3, WireType.LengthDelimited).string(message.alias); + /* repeated lnrpc.NodeAddress addresses = 4; */ + for (let i = 0; i < message.addresses.length; i++) + NodeAddress.internalBinaryWrite(message.addresses[i], writer.tag(4, WireType.LengthDelimited).fork(), options).join(); + /* string color = 5; */ + if (message.color !== "") + writer.tag(5, WireType.LengthDelimited).string(message.color); + /* map features = 6; */ + for (let k of Object.keys(message.features)) { + writer.tag(6, WireType.LengthDelimited).fork().tag(1, WireType.Varint).uint32(parseInt(k)); + writer.tag(2, WireType.LengthDelimited).fork(); + Feature.internalBinaryWrite(message.features[k as any], writer, options); + writer.join().join(); + } + /* map custom_records = 7; */ + for (let k of Object.keys(message.customRecords)) + writer.tag(7, WireType.LengthDelimited).fork().tag(1, WireType.Varint).uint64(k).tag(2, WireType.LengthDelimited).bytes(message.customRecords[k]).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.LightningNode + */ +export const LightningNode = new LightningNode$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class NodeAddress$Type extends MessageType { + constructor() { + super("lnrpc.NodeAddress", [ + { no: 1, name: "network", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "addr", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): NodeAddress { + const message = { network: "", addr: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: NodeAddress): NodeAddress { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string network */ 1: + message.network = reader.string(); + break; + case /* string addr */ 2: + message.addr = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: NodeAddress, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string network = 1; */ + if (message.network !== "") + writer.tag(1, WireType.LengthDelimited).string(message.network); + /* string addr = 2; */ + if (message.addr !== "") + writer.tag(2, WireType.LengthDelimited).string(message.addr); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.NodeAddress + */ +export const NodeAddress = new NodeAddress$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class RoutingPolicy$Type extends MessageType { + constructor() { + super("lnrpc.RoutingPolicy", [ + { no: 1, name: "time_lock_delta", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 2, name: "min_htlc", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "fee_base_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "fee_rate_milli_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 5, name: "disabled", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 6, name: "max_htlc_msat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 7, name: "last_update", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 8, name: "custom_records", kind: "map", K: 4 /*ScalarType.UINT64*/, V: { kind: "scalar", T: 12 /*ScalarType.BYTES*/ } } + ]); + } + create(value?: PartialMessage): RoutingPolicy { + const message = { timeLockDelta: 0, minHtlc: 0n, feeBaseMsat: 0n, feeRateMilliMsat: 0n, disabled: false, maxHtlcMsat: 0n, lastUpdate: 0, customRecords: {} }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: RoutingPolicy): RoutingPolicy { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint32 time_lock_delta */ 1: + message.timeLockDelta = reader.uint32(); + break; + case /* int64 min_htlc */ 2: + message.minHtlc = reader.int64().toBigInt(); + break; + case /* int64 fee_base_msat */ 3: + message.feeBaseMsat = reader.int64().toBigInt(); + break; + case /* int64 fee_rate_milli_msat */ 4: + message.feeRateMilliMsat = reader.int64().toBigInt(); + break; + case /* bool disabled */ 5: + message.disabled = reader.bool(); + break; + case /* uint64 max_htlc_msat */ 6: + message.maxHtlcMsat = reader.uint64().toBigInt(); + break; + case /* uint32 last_update */ 7: + message.lastUpdate = reader.uint32(); + break; + case /* map custom_records */ 8: + this.binaryReadMap8(message.customRecords, reader, options); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + private binaryReadMap8(map: RoutingPolicy["customRecords"], reader: IBinaryReader, options: BinaryReadOptions): void { + let len = reader.uint32(), end = reader.pos + len, key: keyof RoutingPolicy["customRecords"] | undefined, val: RoutingPolicy["customRecords"][any] | undefined; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + key = reader.uint64().toString(); + break; + case 2: + val = reader.bytes(); + break; + default: throw new globalThis.Error("unknown map entry field for field lnrpc.RoutingPolicy.custom_records"); + } + } + map[key ?? "0"] = val ?? new Uint8Array(0); + } + internalBinaryWrite(message: RoutingPolicy, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint32 time_lock_delta = 1; */ + if (message.timeLockDelta !== 0) + writer.tag(1, WireType.Varint).uint32(message.timeLockDelta); + /* int64 min_htlc = 2; */ + if (message.minHtlc !== 0n) + writer.tag(2, WireType.Varint).int64(message.minHtlc); + /* int64 fee_base_msat = 3; */ + if (message.feeBaseMsat !== 0n) + writer.tag(3, WireType.Varint).int64(message.feeBaseMsat); + /* int64 fee_rate_milli_msat = 4; */ + if (message.feeRateMilliMsat !== 0n) + writer.tag(4, WireType.Varint).int64(message.feeRateMilliMsat); + /* bool disabled = 5; */ + if (message.disabled !== false) + writer.tag(5, WireType.Varint).bool(message.disabled); + /* uint64 max_htlc_msat = 6; */ + if (message.maxHtlcMsat !== 0n) + writer.tag(6, WireType.Varint).uint64(message.maxHtlcMsat); + /* uint32 last_update = 7; */ + if (message.lastUpdate !== 0) + writer.tag(7, WireType.Varint).uint32(message.lastUpdate); + /* map custom_records = 8; */ + for (let k of Object.keys(message.customRecords)) + writer.tag(8, WireType.LengthDelimited).fork().tag(1, WireType.Varint).uint64(k).tag(2, WireType.LengthDelimited).bytes(message.customRecords[k]).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.RoutingPolicy + */ +export const RoutingPolicy = new RoutingPolicy$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ChannelEdge$Type extends MessageType { + constructor() { + super("lnrpc.ChannelEdge", [ + { no: 1, name: "channel_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/ }, + { no: 2, name: "chan_point", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 3, name: "last_update", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 4, name: "node1_pub", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 5, name: "node2_pub", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 6, name: "capacity", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 7, name: "node1_policy", kind: "message", T: () => RoutingPolicy }, + { no: 8, name: "node2_policy", kind: "message", T: () => RoutingPolicy }, + { no: 9, name: "custom_records", kind: "map", K: 4 /*ScalarType.UINT64*/, V: { kind: "scalar", T: 12 /*ScalarType.BYTES*/ } } + ]); + } + create(value?: PartialMessage): ChannelEdge { + const message = { channelId: "0", chanPoint: "", lastUpdate: 0, node1Pub: "", node2Pub: "", capacity: 0n, customRecords: {} }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ChannelEdge): ChannelEdge { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint64 channel_id = 1 [jstype = JS_STRING];*/ 1: + message.channelId = reader.uint64().toString(); + break; + case /* string chan_point */ 2: + message.chanPoint = reader.string(); + break; + case /* uint32 last_update = 3 [deprecated = true];*/ 3: + message.lastUpdate = reader.uint32(); + break; + case /* string node1_pub */ 4: + message.node1Pub = reader.string(); + break; + case /* string node2_pub */ 5: + message.node2Pub = reader.string(); + break; + case /* int64 capacity */ 6: + message.capacity = reader.int64().toBigInt(); + break; + case /* lnrpc.RoutingPolicy node1_policy */ 7: + message.node1Policy = RoutingPolicy.internalBinaryRead(reader, reader.uint32(), options, message.node1Policy); + break; + case /* lnrpc.RoutingPolicy node2_policy */ 8: + message.node2Policy = RoutingPolicy.internalBinaryRead(reader, reader.uint32(), options, message.node2Policy); + break; + case /* map custom_records */ 9: + this.binaryReadMap9(message.customRecords, reader, options); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + private binaryReadMap9(map: ChannelEdge["customRecords"], reader: IBinaryReader, options: BinaryReadOptions): void { + let len = reader.uint32(), end = reader.pos + len, key: keyof ChannelEdge["customRecords"] | undefined, val: ChannelEdge["customRecords"][any] | undefined; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + key = reader.uint64().toString(); + break; + case 2: + val = reader.bytes(); + break; + default: throw new globalThis.Error("unknown map entry field for field lnrpc.ChannelEdge.custom_records"); + } + } + map[key ?? "0"] = val ?? new Uint8Array(0); + } + internalBinaryWrite(message: ChannelEdge, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint64 channel_id = 1 [jstype = JS_STRING]; */ + if (message.channelId !== "0") + writer.tag(1, WireType.Varint).uint64(message.channelId); + /* string chan_point = 2; */ + if (message.chanPoint !== "") + writer.tag(2, WireType.LengthDelimited).string(message.chanPoint); + /* uint32 last_update = 3 [deprecated = true]; */ + if (message.lastUpdate !== 0) + writer.tag(3, WireType.Varint).uint32(message.lastUpdate); + /* string node1_pub = 4; */ + if (message.node1Pub !== "") + writer.tag(4, WireType.LengthDelimited).string(message.node1Pub); + /* string node2_pub = 5; */ + if (message.node2Pub !== "") + writer.tag(5, WireType.LengthDelimited).string(message.node2Pub); + /* int64 capacity = 6; */ + if (message.capacity !== 0n) + writer.tag(6, WireType.Varint).int64(message.capacity); + /* lnrpc.RoutingPolicy node1_policy = 7; */ + if (message.node1Policy) + RoutingPolicy.internalBinaryWrite(message.node1Policy, writer.tag(7, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.RoutingPolicy node2_policy = 8; */ + if (message.node2Policy) + RoutingPolicy.internalBinaryWrite(message.node2Policy, writer.tag(8, WireType.LengthDelimited).fork(), options).join(); + /* map custom_records = 9; */ + for (let k of Object.keys(message.customRecords)) + writer.tag(9, WireType.LengthDelimited).fork().tag(1, WireType.Varint).uint64(k).tag(2, WireType.LengthDelimited).bytes(message.customRecords[k]).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ChannelEdge + */ +export const ChannelEdge = new ChannelEdge$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ChannelGraphRequest$Type extends MessageType { + constructor() { + super("lnrpc.ChannelGraphRequest", [ + { no: 1, name: "include_unannounced", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): ChannelGraphRequest { + const message = { includeUnannounced: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ChannelGraphRequest): ChannelGraphRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bool include_unannounced */ 1: + message.includeUnannounced = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ChannelGraphRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bool include_unannounced = 1; */ + if (message.includeUnannounced !== false) + writer.tag(1, WireType.Varint).bool(message.includeUnannounced); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ChannelGraphRequest + */ +export const ChannelGraphRequest = new ChannelGraphRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ChannelGraph$Type extends MessageType { + constructor() { + super("lnrpc.ChannelGraph", [ + { no: 1, name: "nodes", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => LightningNode }, + { no: 2, name: "edges", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => ChannelEdge } + ]); + } + create(value?: PartialMessage): ChannelGraph { + const message = { nodes: [], edges: [] }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ChannelGraph): ChannelGraph { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated lnrpc.LightningNode nodes */ 1: + message.nodes.push(LightningNode.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* repeated lnrpc.ChannelEdge edges */ 2: + message.edges.push(ChannelEdge.internalBinaryRead(reader, reader.uint32(), options)); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ChannelGraph, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated lnrpc.LightningNode nodes = 1; */ + for (let i = 0; i < message.nodes.length; i++) + LightningNode.internalBinaryWrite(message.nodes[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* repeated lnrpc.ChannelEdge edges = 2; */ + for (let i = 0; i < message.edges.length; i++) + ChannelEdge.internalBinaryWrite(message.edges[i], writer.tag(2, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ChannelGraph + */ +export const ChannelGraph = new ChannelGraph$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class NodeMetricsRequest$Type extends MessageType { + constructor() { + super("lnrpc.NodeMetricsRequest", [ + { no: 1, name: "types", kind: "enum", repeat: 1 /*RepeatType.PACKED*/, T: () => ["lnrpc.NodeMetricType", NodeMetricType] } + ]); + } + create(value?: PartialMessage): NodeMetricsRequest { + const message = { types: [] }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: NodeMetricsRequest): NodeMetricsRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated lnrpc.NodeMetricType types */ 1: + if (wireType === WireType.LengthDelimited) + for (let e = reader.int32() + reader.pos; reader.pos < e;) + message.types.push(reader.int32()); + else + message.types.push(reader.int32()); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: NodeMetricsRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated lnrpc.NodeMetricType types = 1; */ + if (message.types.length) { + writer.tag(1, WireType.LengthDelimited).fork(); + for (let i = 0; i < message.types.length; i++) + writer.int32(message.types[i]); + writer.join(); + } + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.NodeMetricsRequest + */ +export const NodeMetricsRequest = new NodeMetricsRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class NodeMetricsResponse$Type extends MessageType { + constructor() { + super("lnrpc.NodeMetricsResponse", [ + { no: 1, name: "betweenness_centrality", kind: "map", K: 9 /*ScalarType.STRING*/, V: { kind: "message", T: () => FloatMetric } } + ]); + } + create(value?: PartialMessage): NodeMetricsResponse { + const message = { betweennessCentrality: {} }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: NodeMetricsResponse): NodeMetricsResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* map betweenness_centrality */ 1: + this.binaryReadMap1(message.betweennessCentrality, reader, options); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + private binaryReadMap1(map: NodeMetricsResponse["betweennessCentrality"], reader: IBinaryReader, options: BinaryReadOptions): void { + let len = reader.uint32(), end = reader.pos + len, key: keyof NodeMetricsResponse["betweennessCentrality"] | undefined, val: NodeMetricsResponse["betweennessCentrality"][any] | undefined; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + key = reader.string(); + break; + case 2: + val = FloatMetric.internalBinaryRead(reader, reader.uint32(), options); + break; + default: throw new globalThis.Error("unknown map entry field for field lnrpc.NodeMetricsResponse.betweenness_centrality"); + } + } + map[key ?? ""] = val ?? FloatMetric.create(); + } + internalBinaryWrite(message: NodeMetricsResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* map betweenness_centrality = 1; */ + for (let k of Object.keys(message.betweennessCentrality)) { + writer.tag(1, WireType.LengthDelimited).fork().tag(1, WireType.LengthDelimited).string(k); + writer.tag(2, WireType.LengthDelimited).fork(); + FloatMetric.internalBinaryWrite(message.betweennessCentrality[k], writer, options); + writer.join().join(); + } + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.NodeMetricsResponse + */ +export const NodeMetricsResponse = new NodeMetricsResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class FloatMetric$Type extends MessageType { + constructor() { + super("lnrpc.FloatMetric", [ + { no: 1, name: "value", kind: "scalar", T: 1 /*ScalarType.DOUBLE*/ }, + { no: 2, name: "normalized_value", kind: "scalar", T: 1 /*ScalarType.DOUBLE*/ } + ]); + } + create(value?: PartialMessage): FloatMetric { + const message = { value: 0, normalizedValue: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: FloatMetric): FloatMetric { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* double value */ 1: + message.value = reader.double(); + break; + case /* double normalized_value */ 2: + message.normalizedValue = reader.double(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: FloatMetric, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* double value = 1; */ + if (message.value !== 0) + writer.tag(1, WireType.Bit64).double(message.value); + /* double normalized_value = 2; */ + if (message.normalizedValue !== 0) + writer.tag(2, WireType.Bit64).double(message.normalizedValue); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.FloatMetric + */ +export const FloatMetric = new FloatMetric$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ChanInfoRequest$Type extends MessageType { + constructor() { + super("lnrpc.ChanInfoRequest", [ + { no: 1, name: "chan_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/ } + ]); + } + create(value?: PartialMessage): ChanInfoRequest { + const message = { chanId: "0" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ChanInfoRequest): ChanInfoRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint64 chan_id = 1 [jstype = JS_STRING];*/ 1: + message.chanId = reader.uint64().toString(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ChanInfoRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint64 chan_id = 1 [jstype = JS_STRING]; */ + if (message.chanId !== "0") + writer.tag(1, WireType.Varint).uint64(message.chanId); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ChanInfoRequest + */ +export const ChanInfoRequest = new ChanInfoRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class NetworkInfoRequest$Type extends MessageType { + constructor() { + super("lnrpc.NetworkInfoRequest", []); + } + create(value?: PartialMessage): NetworkInfoRequest { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: NetworkInfoRequest): NetworkInfoRequest { + return target ?? this.create(); + } + internalBinaryWrite(message: NetworkInfoRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.NetworkInfoRequest + */ +export const NetworkInfoRequest = new NetworkInfoRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class NetworkInfo$Type extends MessageType { + constructor() { + super("lnrpc.NetworkInfo", [ + { no: 1, name: "graph_diameter", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 2, name: "avg_out_degree", kind: "scalar", T: 1 /*ScalarType.DOUBLE*/ }, + { no: 3, name: "max_out_degree", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 4, name: "num_nodes", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 5, name: "num_channels", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 6, name: "total_network_capacity", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 7, name: "avg_channel_size", kind: "scalar", T: 1 /*ScalarType.DOUBLE*/ }, + { no: 8, name: "min_channel_size", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 9, name: "max_channel_size", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 10, name: "median_channel_size_sat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 11, name: "num_zombie_chans", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): NetworkInfo { + const message = { graphDiameter: 0, avgOutDegree: 0, maxOutDegree: 0, numNodes: 0, numChannels: 0, totalNetworkCapacity: 0n, avgChannelSize: 0, minChannelSize: 0n, maxChannelSize: 0n, medianChannelSizeSat: 0n, numZombieChans: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: NetworkInfo): NetworkInfo { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint32 graph_diameter */ 1: + message.graphDiameter = reader.uint32(); + break; + case /* double avg_out_degree */ 2: + message.avgOutDegree = reader.double(); + break; + case /* uint32 max_out_degree */ 3: + message.maxOutDegree = reader.uint32(); + break; + case /* uint32 num_nodes */ 4: + message.numNodes = reader.uint32(); + break; + case /* uint32 num_channels */ 5: + message.numChannels = reader.uint32(); + break; + case /* int64 total_network_capacity */ 6: + message.totalNetworkCapacity = reader.int64().toBigInt(); + break; + case /* double avg_channel_size */ 7: + message.avgChannelSize = reader.double(); + break; + case /* int64 min_channel_size */ 8: + message.minChannelSize = reader.int64().toBigInt(); + break; + case /* int64 max_channel_size */ 9: + message.maxChannelSize = reader.int64().toBigInt(); + break; + case /* int64 median_channel_size_sat */ 10: + message.medianChannelSizeSat = reader.int64().toBigInt(); + break; + case /* uint64 num_zombie_chans */ 11: + message.numZombieChans = reader.uint64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: NetworkInfo, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint32 graph_diameter = 1; */ + if (message.graphDiameter !== 0) + writer.tag(1, WireType.Varint).uint32(message.graphDiameter); + /* double avg_out_degree = 2; */ + if (message.avgOutDegree !== 0) + writer.tag(2, WireType.Bit64).double(message.avgOutDegree); + /* uint32 max_out_degree = 3; */ + if (message.maxOutDegree !== 0) + writer.tag(3, WireType.Varint).uint32(message.maxOutDegree); + /* uint32 num_nodes = 4; */ + if (message.numNodes !== 0) + writer.tag(4, WireType.Varint).uint32(message.numNodes); + /* uint32 num_channels = 5; */ + if (message.numChannels !== 0) + writer.tag(5, WireType.Varint).uint32(message.numChannels); + /* int64 total_network_capacity = 6; */ + if (message.totalNetworkCapacity !== 0n) + writer.tag(6, WireType.Varint).int64(message.totalNetworkCapacity); + /* double avg_channel_size = 7; */ + if (message.avgChannelSize !== 0) + writer.tag(7, WireType.Bit64).double(message.avgChannelSize); + /* int64 min_channel_size = 8; */ + if (message.minChannelSize !== 0n) + writer.tag(8, WireType.Varint).int64(message.minChannelSize); + /* int64 max_channel_size = 9; */ + if (message.maxChannelSize !== 0n) + writer.tag(9, WireType.Varint).int64(message.maxChannelSize); + /* int64 median_channel_size_sat = 10; */ + if (message.medianChannelSizeSat !== 0n) + writer.tag(10, WireType.Varint).int64(message.medianChannelSizeSat); + /* uint64 num_zombie_chans = 11; */ + if (message.numZombieChans !== 0n) + writer.tag(11, WireType.Varint).uint64(message.numZombieChans); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.NetworkInfo + */ +export const NetworkInfo = new NetworkInfo$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class StopRequest$Type extends MessageType { + constructor() { + super("lnrpc.StopRequest", []); + } + create(value?: PartialMessage): StopRequest { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: StopRequest): StopRequest { + return target ?? this.create(); + } + internalBinaryWrite(message: StopRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.StopRequest + */ +export const StopRequest = new StopRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class StopResponse$Type extends MessageType { + constructor() { + super("lnrpc.StopResponse", []); + } + create(value?: PartialMessage): StopResponse { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: StopResponse): StopResponse { + return target ?? this.create(); + } + internalBinaryWrite(message: StopResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.StopResponse + */ +export const StopResponse = new StopResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class GraphTopologySubscription$Type extends MessageType { + constructor() { + super("lnrpc.GraphTopologySubscription", []); + } + create(value?: PartialMessage): GraphTopologySubscription { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: GraphTopologySubscription): GraphTopologySubscription { + return target ?? this.create(); + } + internalBinaryWrite(message: GraphTopologySubscription, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.GraphTopologySubscription + */ +export const GraphTopologySubscription = new GraphTopologySubscription$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class GraphTopologyUpdate$Type extends MessageType { + constructor() { + super("lnrpc.GraphTopologyUpdate", [ + { no: 1, name: "node_updates", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => NodeUpdate }, + { no: 2, name: "channel_updates", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => ChannelEdgeUpdate }, + { no: 3, name: "closed_chans", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => ClosedChannelUpdate } + ]); + } + create(value?: PartialMessage): GraphTopologyUpdate { + const message = { nodeUpdates: [], channelUpdates: [], closedChans: [] }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: GraphTopologyUpdate): GraphTopologyUpdate { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated lnrpc.NodeUpdate node_updates */ 1: + message.nodeUpdates.push(NodeUpdate.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* repeated lnrpc.ChannelEdgeUpdate channel_updates */ 2: + message.channelUpdates.push(ChannelEdgeUpdate.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* repeated lnrpc.ClosedChannelUpdate closed_chans */ 3: + message.closedChans.push(ClosedChannelUpdate.internalBinaryRead(reader, reader.uint32(), options)); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: GraphTopologyUpdate, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated lnrpc.NodeUpdate node_updates = 1; */ + for (let i = 0; i < message.nodeUpdates.length; i++) + NodeUpdate.internalBinaryWrite(message.nodeUpdates[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* repeated lnrpc.ChannelEdgeUpdate channel_updates = 2; */ + for (let i = 0; i < message.channelUpdates.length; i++) + ChannelEdgeUpdate.internalBinaryWrite(message.channelUpdates[i], writer.tag(2, WireType.LengthDelimited).fork(), options).join(); + /* repeated lnrpc.ClosedChannelUpdate closed_chans = 3; */ + for (let i = 0; i < message.closedChans.length; i++) + ClosedChannelUpdate.internalBinaryWrite(message.closedChans[i], writer.tag(3, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.GraphTopologyUpdate + */ +export const GraphTopologyUpdate = new GraphTopologyUpdate$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class NodeUpdate$Type extends MessageType { + constructor() { + super("lnrpc.NodeUpdate", [ + { no: 1, name: "addresses", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "identity_key", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 3, name: "global_features", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 4, name: "alias", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 5, name: "color", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 7, name: "node_addresses", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => NodeAddress }, + { no: 6, name: "features", kind: "map", K: 13 /*ScalarType.UINT32*/, V: { kind: "message", T: () => Feature } } + ]); + } + create(value?: PartialMessage): NodeUpdate { + const message = { addresses: [], identityKey: "", globalFeatures: new Uint8Array(0), alias: "", color: "", nodeAddresses: [], features: {} }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: NodeUpdate): NodeUpdate { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated string addresses = 1 [deprecated = true];*/ 1: + message.addresses.push(reader.string()); + break; + case /* string identity_key */ 2: + message.identityKey = reader.string(); + break; + case /* bytes global_features = 3 [deprecated = true];*/ 3: + message.globalFeatures = reader.bytes(); + break; + case /* string alias */ 4: + message.alias = reader.string(); + break; + case /* string color */ 5: + message.color = reader.string(); + break; + case /* repeated lnrpc.NodeAddress node_addresses */ 7: + message.nodeAddresses.push(NodeAddress.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* map features */ 6: + this.binaryReadMap6(message.features, reader, options); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + private binaryReadMap6(map: NodeUpdate["features"], reader: IBinaryReader, options: BinaryReadOptions): void { + let len = reader.uint32(), end = reader.pos + len, key: keyof NodeUpdate["features"] | undefined, val: NodeUpdate["features"][any] | undefined; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + key = reader.uint32(); + break; + case 2: + val = Feature.internalBinaryRead(reader, reader.uint32(), options); + break; + default: throw new globalThis.Error("unknown map entry field for field lnrpc.NodeUpdate.features"); + } + } + map[key ?? 0] = val ?? Feature.create(); + } + internalBinaryWrite(message: NodeUpdate, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated string addresses = 1 [deprecated = true]; */ + for (let i = 0; i < message.addresses.length; i++) + writer.tag(1, WireType.LengthDelimited).string(message.addresses[i]); + /* string identity_key = 2; */ + if (message.identityKey !== "") + writer.tag(2, WireType.LengthDelimited).string(message.identityKey); + /* bytes global_features = 3 [deprecated = true]; */ + if (message.globalFeatures.length) + writer.tag(3, WireType.LengthDelimited).bytes(message.globalFeatures); + /* string alias = 4; */ + if (message.alias !== "") + writer.tag(4, WireType.LengthDelimited).string(message.alias); + /* string color = 5; */ + if (message.color !== "") + writer.tag(5, WireType.LengthDelimited).string(message.color); + /* repeated lnrpc.NodeAddress node_addresses = 7; */ + for (let i = 0; i < message.nodeAddresses.length; i++) + NodeAddress.internalBinaryWrite(message.nodeAddresses[i], writer.tag(7, WireType.LengthDelimited).fork(), options).join(); + /* map features = 6; */ + for (let k of Object.keys(message.features)) { + writer.tag(6, WireType.LengthDelimited).fork().tag(1, WireType.Varint).uint32(parseInt(k)); + writer.tag(2, WireType.LengthDelimited).fork(); + Feature.internalBinaryWrite(message.features[k as any], writer, options); + writer.join().join(); + } + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.NodeUpdate + */ +export const NodeUpdate = new NodeUpdate$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ChannelEdgeUpdate$Type extends MessageType { + constructor() { + super("lnrpc.ChannelEdgeUpdate", [ + { no: 1, name: "chan_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/ }, + { no: 2, name: "chan_point", kind: "message", T: () => ChannelPoint }, + { no: 3, name: "capacity", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "routing_policy", kind: "message", T: () => RoutingPolicy }, + { no: 5, name: "advertising_node", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 6, name: "connecting_node", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): ChannelEdgeUpdate { + const message = { chanId: "0", capacity: 0n, advertisingNode: "", connectingNode: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ChannelEdgeUpdate): ChannelEdgeUpdate { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint64 chan_id = 1 [jstype = JS_STRING];*/ 1: + message.chanId = reader.uint64().toString(); + break; + case /* lnrpc.ChannelPoint chan_point */ 2: + message.chanPoint = ChannelPoint.internalBinaryRead(reader, reader.uint32(), options, message.chanPoint); + break; + case /* int64 capacity */ 3: + message.capacity = reader.int64().toBigInt(); + break; + case /* lnrpc.RoutingPolicy routing_policy */ 4: + message.routingPolicy = RoutingPolicy.internalBinaryRead(reader, reader.uint32(), options, message.routingPolicy); + break; + case /* string advertising_node */ 5: + message.advertisingNode = reader.string(); + break; + case /* string connecting_node */ 6: + message.connectingNode = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ChannelEdgeUpdate, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint64 chan_id = 1 [jstype = JS_STRING]; */ + if (message.chanId !== "0") + writer.tag(1, WireType.Varint).uint64(message.chanId); + /* lnrpc.ChannelPoint chan_point = 2; */ + if (message.chanPoint) + ChannelPoint.internalBinaryWrite(message.chanPoint, writer.tag(2, WireType.LengthDelimited).fork(), options).join(); + /* int64 capacity = 3; */ + if (message.capacity !== 0n) + writer.tag(3, WireType.Varint).int64(message.capacity); + /* lnrpc.RoutingPolicy routing_policy = 4; */ + if (message.routingPolicy) + RoutingPolicy.internalBinaryWrite(message.routingPolicy, writer.tag(4, WireType.LengthDelimited).fork(), options).join(); + /* string advertising_node = 5; */ + if (message.advertisingNode !== "") + writer.tag(5, WireType.LengthDelimited).string(message.advertisingNode); + /* string connecting_node = 6; */ + if (message.connectingNode !== "") + writer.tag(6, WireType.LengthDelimited).string(message.connectingNode); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ChannelEdgeUpdate + */ +export const ChannelEdgeUpdate = new ChannelEdgeUpdate$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ClosedChannelUpdate$Type extends MessageType { + constructor() { + super("lnrpc.ClosedChannelUpdate", [ + { no: 1, name: "chan_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/ }, + { no: 2, name: "capacity", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "closed_height", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 4, name: "chan_point", kind: "message", T: () => ChannelPoint } + ]); + } + create(value?: PartialMessage): ClosedChannelUpdate { + const message = { chanId: "0", capacity: 0n, closedHeight: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ClosedChannelUpdate): ClosedChannelUpdate { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint64 chan_id = 1 [jstype = JS_STRING];*/ 1: + message.chanId = reader.uint64().toString(); + break; + case /* int64 capacity */ 2: + message.capacity = reader.int64().toBigInt(); + break; + case /* uint32 closed_height */ 3: + message.closedHeight = reader.uint32(); + break; + case /* lnrpc.ChannelPoint chan_point */ 4: + message.chanPoint = ChannelPoint.internalBinaryRead(reader, reader.uint32(), options, message.chanPoint); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ClosedChannelUpdate, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint64 chan_id = 1 [jstype = JS_STRING]; */ + if (message.chanId !== "0") + writer.tag(1, WireType.Varint).uint64(message.chanId); + /* int64 capacity = 2; */ + if (message.capacity !== 0n) + writer.tag(2, WireType.Varint).int64(message.capacity); + /* uint32 closed_height = 3; */ + if (message.closedHeight !== 0) + writer.tag(3, WireType.Varint).uint32(message.closedHeight); + /* lnrpc.ChannelPoint chan_point = 4; */ + if (message.chanPoint) + ChannelPoint.internalBinaryWrite(message.chanPoint, writer.tag(4, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ClosedChannelUpdate + */ +export const ClosedChannelUpdate = new ClosedChannelUpdate$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class HopHint$Type extends MessageType { + constructor() { + super("lnrpc.HopHint", [ + { no: 1, name: "node_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "chan_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/ }, + { no: 3, name: "fee_base_msat", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 4, name: "fee_proportional_millionths", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 5, name: "cltv_expiry_delta", kind: "scalar", T: 13 /*ScalarType.UINT32*/ } + ]); + } + create(value?: PartialMessage): HopHint { + const message = { nodeId: "", chanId: "0", feeBaseMsat: 0, feeProportionalMillionths: 0, cltvExpiryDelta: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: HopHint): HopHint { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string node_id */ 1: + message.nodeId = reader.string(); + break; + case /* uint64 chan_id = 2 [jstype = JS_STRING];*/ 2: + message.chanId = reader.uint64().toString(); + break; + case /* uint32 fee_base_msat */ 3: + message.feeBaseMsat = reader.uint32(); + break; + case /* uint32 fee_proportional_millionths */ 4: + message.feeProportionalMillionths = reader.uint32(); + break; + case /* uint32 cltv_expiry_delta */ 5: + message.cltvExpiryDelta = reader.uint32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: HopHint, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string node_id = 1; */ + if (message.nodeId !== "") + writer.tag(1, WireType.LengthDelimited).string(message.nodeId); + /* uint64 chan_id = 2 [jstype = JS_STRING]; */ + if (message.chanId !== "0") + writer.tag(2, WireType.Varint).uint64(message.chanId); + /* uint32 fee_base_msat = 3; */ + if (message.feeBaseMsat !== 0) + writer.tag(3, WireType.Varint).uint32(message.feeBaseMsat); + /* uint32 fee_proportional_millionths = 4; */ + if (message.feeProportionalMillionths !== 0) + writer.tag(4, WireType.Varint).uint32(message.feeProportionalMillionths); + /* uint32 cltv_expiry_delta = 5; */ + if (message.cltvExpiryDelta !== 0) + writer.tag(5, WireType.Varint).uint32(message.cltvExpiryDelta); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.HopHint + */ +export const HopHint = new HopHint$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class SetID$Type extends MessageType { + constructor() { + super("lnrpc.SetID", [ + { no: 1, name: "set_id", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): SetID { + const message = { setId: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SetID): SetID { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes set_id */ 1: + message.setId = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: SetID, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes set_id = 1; */ + if (message.setId.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.setId); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.SetID + */ +export const SetID = new SetID$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class RouteHint$Type extends MessageType { + constructor() { + super("lnrpc.RouteHint", [ + { no: 1, name: "hop_hints", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => HopHint } + ]); + } + create(value?: PartialMessage): RouteHint { + const message = { hopHints: [] }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: RouteHint): RouteHint { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated lnrpc.HopHint hop_hints */ 1: + message.hopHints.push(HopHint.internalBinaryRead(reader, reader.uint32(), options)); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: RouteHint, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated lnrpc.HopHint hop_hints = 1; */ + for (let i = 0; i < message.hopHints.length; i++) + HopHint.internalBinaryWrite(message.hopHints[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.RouteHint + */ +export const RouteHint = new RouteHint$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class AMPInvoiceState$Type extends MessageType { + constructor() { + super("lnrpc.AMPInvoiceState", [ + { no: 1, name: "state", kind: "enum", T: () => ["lnrpc.InvoiceHTLCState", InvoiceHTLCState] }, + { no: 2, name: "settle_index", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "settle_time", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 5, name: "amt_paid_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): AMPInvoiceState { + const message = { state: 0, settleIndex: 0n, settleTime: 0n, amtPaidMsat: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: AMPInvoiceState): AMPInvoiceState { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.InvoiceHTLCState state */ 1: + message.state = reader.int32(); + break; + case /* uint64 settle_index */ 2: + message.settleIndex = reader.uint64().toBigInt(); + break; + case /* int64 settle_time */ 3: + message.settleTime = reader.int64().toBigInt(); + break; + case /* int64 amt_paid_msat */ 5: + message.amtPaidMsat = reader.int64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: AMPInvoiceState, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.InvoiceHTLCState state = 1; */ + if (message.state !== 0) + writer.tag(1, WireType.Varint).int32(message.state); + /* uint64 settle_index = 2; */ + if (message.settleIndex !== 0n) + writer.tag(2, WireType.Varint).uint64(message.settleIndex); + /* int64 settle_time = 3; */ + if (message.settleTime !== 0n) + writer.tag(3, WireType.Varint).int64(message.settleTime); + /* int64 amt_paid_msat = 5; */ + if (message.amtPaidMsat !== 0n) + writer.tag(5, WireType.Varint).int64(message.amtPaidMsat); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.AMPInvoiceState + */ +export const AMPInvoiceState = new AMPInvoiceState$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class Invoice$Type extends MessageType { + constructor() { + super("lnrpc.Invoice", [ + { no: 1, name: "memo", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 3, name: "r_preimage", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 4, name: "r_hash", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 5, name: "value", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 23, name: "value_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 6, name: "settled", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 7, name: "creation_date", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 8, name: "settle_date", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 9, name: "payment_request", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 10, name: "description_hash", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 11, name: "expiry", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 12, name: "fallback_addr", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 13, name: "cltv_expiry", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 14, name: "route_hints", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => RouteHint }, + { no: 15, name: "private", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 16, name: "add_index", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 17, name: "settle_index", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 18, name: "amt_paid", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 19, name: "amt_paid_sat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 20, name: "amt_paid_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 21, name: "state", kind: "enum", T: () => ["lnrpc.Invoice.InvoiceState", Invoice_InvoiceState] }, + { no: 22, name: "htlcs", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => InvoiceHTLC }, + { no: 24, name: "features", kind: "map", K: 13 /*ScalarType.UINT32*/, V: { kind: "message", T: () => Feature } }, + { no: 25, name: "is_keysend", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 26, name: "payment_addr", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 27, name: "is_amp", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 28, name: "amp_invoice_state", kind: "map", K: 9 /*ScalarType.STRING*/, V: { kind: "message", T: () => AMPInvoiceState } } + ]); + } + create(value?: PartialMessage): Invoice { + const message = { memo: "", rPreimage: new Uint8Array(0), rHash: new Uint8Array(0), value: 0n, valueMsat: 0n, settled: false, creationDate: 0n, settleDate: 0n, paymentRequest: "", descriptionHash: new Uint8Array(0), expiry: 0n, fallbackAddr: "", cltvExpiry: 0n, routeHints: [], private: false, addIndex: 0n, settleIndex: 0n, amtPaid: 0n, amtPaidSat: 0n, amtPaidMsat: 0n, state: 0, htlcs: [], features: {}, isKeysend: false, paymentAddr: new Uint8Array(0), isAmp: false, ampInvoiceState: {} }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: Invoice): Invoice { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string memo */ 1: + message.memo = reader.string(); + break; + case /* bytes r_preimage */ 3: + message.rPreimage = reader.bytes(); + break; + case /* bytes r_hash */ 4: + message.rHash = reader.bytes(); + break; + case /* int64 value */ 5: + message.value = reader.int64().toBigInt(); + break; + case /* int64 value_msat */ 23: + message.valueMsat = reader.int64().toBigInt(); + break; + case /* bool settled = 6 [deprecated = true];*/ 6: + message.settled = reader.bool(); + break; + case /* int64 creation_date */ 7: + message.creationDate = reader.int64().toBigInt(); + break; + case /* int64 settle_date */ 8: + message.settleDate = reader.int64().toBigInt(); + break; + case /* string payment_request */ 9: + message.paymentRequest = reader.string(); + break; + case /* bytes description_hash */ 10: + message.descriptionHash = reader.bytes(); + break; + case /* int64 expiry */ 11: + message.expiry = reader.int64().toBigInt(); + break; + case /* string fallback_addr */ 12: + message.fallbackAddr = reader.string(); + break; + case /* uint64 cltv_expiry */ 13: + message.cltvExpiry = reader.uint64().toBigInt(); + break; + case /* repeated lnrpc.RouteHint route_hints */ 14: + message.routeHints.push(RouteHint.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* bool private */ 15: + message.private = reader.bool(); + break; + case /* uint64 add_index */ 16: + message.addIndex = reader.uint64().toBigInt(); + break; + case /* uint64 settle_index */ 17: + message.settleIndex = reader.uint64().toBigInt(); + break; + case /* int64 amt_paid = 18 [deprecated = true];*/ 18: + message.amtPaid = reader.int64().toBigInt(); + break; + case /* int64 amt_paid_sat */ 19: + message.amtPaidSat = reader.int64().toBigInt(); + break; + case /* int64 amt_paid_msat */ 20: + message.amtPaidMsat = reader.int64().toBigInt(); + break; + case /* lnrpc.Invoice.InvoiceState state */ 21: + message.state = reader.int32(); + break; + case /* repeated lnrpc.InvoiceHTLC htlcs */ 22: + message.htlcs.push(InvoiceHTLC.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* map features */ 24: + this.binaryReadMap24(message.features, reader, options); + break; + case /* bool is_keysend */ 25: + message.isKeysend = reader.bool(); + break; + case /* bytes payment_addr */ 26: + message.paymentAddr = reader.bytes(); + break; + case /* bool is_amp */ 27: + message.isAmp = reader.bool(); + break; + case /* map amp_invoice_state */ 28: + this.binaryReadMap28(message.ampInvoiceState, reader, options); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + private binaryReadMap24(map: Invoice["features"], reader: IBinaryReader, options: BinaryReadOptions): void { + let len = reader.uint32(), end = reader.pos + len, key: keyof Invoice["features"] | undefined, val: Invoice["features"][any] | undefined; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + key = reader.uint32(); + break; + case 2: + val = Feature.internalBinaryRead(reader, reader.uint32(), options); + break; + default: throw new globalThis.Error("unknown map entry field for field lnrpc.Invoice.features"); + } + } + map[key ?? 0] = val ?? Feature.create(); + } + private binaryReadMap28(map: Invoice["ampInvoiceState"], reader: IBinaryReader, options: BinaryReadOptions): void { + let len = reader.uint32(), end = reader.pos + len, key: keyof Invoice["ampInvoiceState"] | undefined, val: Invoice["ampInvoiceState"][any] | undefined; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + key = reader.string(); + break; + case 2: + val = AMPInvoiceState.internalBinaryRead(reader, reader.uint32(), options); + break; + default: throw new globalThis.Error("unknown map entry field for field lnrpc.Invoice.amp_invoice_state"); + } + } + map[key ?? ""] = val ?? AMPInvoiceState.create(); + } + internalBinaryWrite(message: Invoice, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string memo = 1; */ + if (message.memo !== "") + writer.tag(1, WireType.LengthDelimited).string(message.memo); + /* bytes r_preimage = 3; */ + if (message.rPreimage.length) + writer.tag(3, WireType.LengthDelimited).bytes(message.rPreimage); + /* bytes r_hash = 4; */ + if (message.rHash.length) + writer.tag(4, WireType.LengthDelimited).bytes(message.rHash); + /* int64 value = 5; */ + if (message.value !== 0n) + writer.tag(5, WireType.Varint).int64(message.value); + /* int64 value_msat = 23; */ + if (message.valueMsat !== 0n) + writer.tag(23, WireType.Varint).int64(message.valueMsat); + /* bool settled = 6 [deprecated = true]; */ + if (message.settled !== false) + writer.tag(6, WireType.Varint).bool(message.settled); + /* int64 creation_date = 7; */ + if (message.creationDate !== 0n) + writer.tag(7, WireType.Varint).int64(message.creationDate); + /* int64 settle_date = 8; */ + if (message.settleDate !== 0n) + writer.tag(8, WireType.Varint).int64(message.settleDate); + /* string payment_request = 9; */ + if (message.paymentRequest !== "") + writer.tag(9, WireType.LengthDelimited).string(message.paymentRequest); + /* bytes description_hash = 10; */ + if (message.descriptionHash.length) + writer.tag(10, WireType.LengthDelimited).bytes(message.descriptionHash); + /* int64 expiry = 11; */ + if (message.expiry !== 0n) + writer.tag(11, WireType.Varint).int64(message.expiry); + /* string fallback_addr = 12; */ + if (message.fallbackAddr !== "") + writer.tag(12, WireType.LengthDelimited).string(message.fallbackAddr); + /* uint64 cltv_expiry = 13; */ + if (message.cltvExpiry !== 0n) + writer.tag(13, WireType.Varint).uint64(message.cltvExpiry); + /* repeated lnrpc.RouteHint route_hints = 14; */ + for (let i = 0; i < message.routeHints.length; i++) + RouteHint.internalBinaryWrite(message.routeHints[i], writer.tag(14, WireType.LengthDelimited).fork(), options).join(); + /* bool private = 15; */ + if (message.private !== false) + writer.tag(15, WireType.Varint).bool(message.private); + /* uint64 add_index = 16; */ + if (message.addIndex !== 0n) + writer.tag(16, WireType.Varint).uint64(message.addIndex); + /* uint64 settle_index = 17; */ + if (message.settleIndex !== 0n) + writer.tag(17, WireType.Varint).uint64(message.settleIndex); + /* int64 amt_paid = 18 [deprecated = true]; */ + if (message.amtPaid !== 0n) + writer.tag(18, WireType.Varint).int64(message.amtPaid); + /* int64 amt_paid_sat = 19; */ + if (message.amtPaidSat !== 0n) + writer.tag(19, WireType.Varint).int64(message.amtPaidSat); + /* int64 amt_paid_msat = 20; */ + if (message.amtPaidMsat !== 0n) + writer.tag(20, WireType.Varint).int64(message.amtPaidMsat); + /* lnrpc.Invoice.InvoiceState state = 21; */ + if (message.state !== 0) + writer.tag(21, WireType.Varint).int32(message.state); + /* repeated lnrpc.InvoiceHTLC htlcs = 22; */ + for (let i = 0; i < message.htlcs.length; i++) + InvoiceHTLC.internalBinaryWrite(message.htlcs[i], writer.tag(22, WireType.LengthDelimited).fork(), options).join(); + /* map features = 24; */ + for (let k of Object.keys(message.features)) { + writer.tag(24, WireType.LengthDelimited).fork().tag(1, WireType.Varint).uint32(parseInt(k)); + writer.tag(2, WireType.LengthDelimited).fork(); + Feature.internalBinaryWrite(message.features[k as any], writer, options); + writer.join().join(); + } + /* bool is_keysend = 25; */ + if (message.isKeysend !== false) + writer.tag(25, WireType.Varint).bool(message.isKeysend); + /* bytes payment_addr = 26; */ + if (message.paymentAddr.length) + writer.tag(26, WireType.LengthDelimited).bytes(message.paymentAddr); + /* bool is_amp = 27; */ + if (message.isAmp !== false) + writer.tag(27, WireType.Varint).bool(message.isAmp); + /* map amp_invoice_state = 28; */ + for (let k of Object.keys(message.ampInvoiceState)) { + writer.tag(28, WireType.LengthDelimited).fork().tag(1, WireType.LengthDelimited).string(k); + writer.tag(2, WireType.LengthDelimited).fork(); + AMPInvoiceState.internalBinaryWrite(message.ampInvoiceState[k], writer, options); + writer.join().join(); + } + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.Invoice + */ +export const Invoice = new Invoice$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class InvoiceHTLC$Type extends MessageType { + constructor() { + super("lnrpc.InvoiceHTLC", [ + { no: 1, name: "chan_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/ }, + { no: 2, name: "htlc_index", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "amt_msat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "accept_height", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 5, name: "accept_time", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 6, name: "resolve_time", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 7, name: "expiry_height", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 8, name: "state", kind: "enum", T: () => ["lnrpc.InvoiceHTLCState", InvoiceHTLCState] }, + { no: 9, name: "custom_records", kind: "map", K: 4 /*ScalarType.UINT64*/, V: { kind: "scalar", T: 12 /*ScalarType.BYTES*/ } }, + { no: 10, name: "mpp_total_amt_msat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 11, name: "amp", kind: "message", T: () => AMP } + ]); + } + create(value?: PartialMessage): InvoiceHTLC { + const message = { chanId: "0", htlcIndex: 0n, amtMsat: 0n, acceptHeight: 0, acceptTime: 0n, resolveTime: 0n, expiryHeight: 0, state: 0, customRecords: {}, mppTotalAmtMsat: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: InvoiceHTLC): InvoiceHTLC { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint64 chan_id = 1 [jstype = JS_STRING];*/ 1: + message.chanId = reader.uint64().toString(); + break; + case /* uint64 htlc_index */ 2: + message.htlcIndex = reader.uint64().toBigInt(); + break; + case /* uint64 amt_msat */ 3: + message.amtMsat = reader.uint64().toBigInt(); + break; + case /* int32 accept_height */ 4: + message.acceptHeight = reader.int32(); + break; + case /* int64 accept_time */ 5: + message.acceptTime = reader.int64().toBigInt(); + break; + case /* int64 resolve_time */ 6: + message.resolveTime = reader.int64().toBigInt(); + break; + case /* int32 expiry_height */ 7: + message.expiryHeight = reader.int32(); + break; + case /* lnrpc.InvoiceHTLCState state */ 8: + message.state = reader.int32(); + break; + case /* map custom_records */ 9: + this.binaryReadMap9(message.customRecords, reader, options); + break; + case /* uint64 mpp_total_amt_msat */ 10: + message.mppTotalAmtMsat = reader.uint64().toBigInt(); + break; + case /* lnrpc.AMP amp */ 11: + message.amp = AMP.internalBinaryRead(reader, reader.uint32(), options, message.amp); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + private binaryReadMap9(map: InvoiceHTLC["customRecords"], reader: IBinaryReader, options: BinaryReadOptions): void { + let len = reader.uint32(), end = reader.pos + len, key: keyof InvoiceHTLC["customRecords"] | undefined, val: InvoiceHTLC["customRecords"][any] | undefined; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + key = reader.uint64().toString(); + break; + case 2: + val = reader.bytes(); + break; + default: throw new globalThis.Error("unknown map entry field for field lnrpc.InvoiceHTLC.custom_records"); + } + } + map[key ?? "0"] = val ?? new Uint8Array(0); + } + internalBinaryWrite(message: InvoiceHTLC, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint64 chan_id = 1 [jstype = JS_STRING]; */ + if (message.chanId !== "0") + writer.tag(1, WireType.Varint).uint64(message.chanId); + /* uint64 htlc_index = 2; */ + if (message.htlcIndex !== 0n) + writer.tag(2, WireType.Varint).uint64(message.htlcIndex); + /* uint64 amt_msat = 3; */ + if (message.amtMsat !== 0n) + writer.tag(3, WireType.Varint).uint64(message.amtMsat); + /* int32 accept_height = 4; */ + if (message.acceptHeight !== 0) + writer.tag(4, WireType.Varint).int32(message.acceptHeight); + /* int64 accept_time = 5; */ + if (message.acceptTime !== 0n) + writer.tag(5, WireType.Varint).int64(message.acceptTime); + /* int64 resolve_time = 6; */ + if (message.resolveTime !== 0n) + writer.tag(6, WireType.Varint).int64(message.resolveTime); + /* int32 expiry_height = 7; */ + if (message.expiryHeight !== 0) + writer.tag(7, WireType.Varint).int32(message.expiryHeight); + /* lnrpc.InvoiceHTLCState state = 8; */ + if (message.state !== 0) + writer.tag(8, WireType.Varint).int32(message.state); + /* map custom_records = 9; */ + for (let k of Object.keys(message.customRecords)) + writer.tag(9, WireType.LengthDelimited).fork().tag(1, WireType.Varint).uint64(k).tag(2, WireType.LengthDelimited).bytes(message.customRecords[k]).join(); + /* uint64 mpp_total_amt_msat = 10; */ + if (message.mppTotalAmtMsat !== 0n) + writer.tag(10, WireType.Varint).uint64(message.mppTotalAmtMsat); + /* lnrpc.AMP amp = 11; */ + if (message.amp) + AMP.internalBinaryWrite(message.amp, writer.tag(11, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.InvoiceHTLC + */ +export const InvoiceHTLC = new InvoiceHTLC$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class AMP$Type extends MessageType { + constructor() { + super("lnrpc.AMP", [ + { no: 1, name: "root_share", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "set_id", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 3, name: "child_index", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 4, name: "hash", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 5, name: "preimage", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): AMP { + const message = { rootShare: new Uint8Array(0), setId: new Uint8Array(0), childIndex: 0, hash: new Uint8Array(0), preimage: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: AMP): AMP { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes root_share */ 1: + message.rootShare = reader.bytes(); + break; + case /* bytes set_id */ 2: + message.setId = reader.bytes(); + break; + case /* uint32 child_index */ 3: + message.childIndex = reader.uint32(); + break; + case /* bytes hash */ 4: + message.hash = reader.bytes(); + break; + case /* bytes preimage */ 5: + message.preimage = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: AMP, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes root_share = 1; */ + if (message.rootShare.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.rootShare); + /* bytes set_id = 2; */ + if (message.setId.length) + writer.tag(2, WireType.LengthDelimited).bytes(message.setId); + /* uint32 child_index = 3; */ + if (message.childIndex !== 0) + writer.tag(3, WireType.Varint).uint32(message.childIndex); + /* bytes hash = 4; */ + if (message.hash.length) + writer.tag(4, WireType.LengthDelimited).bytes(message.hash); + /* bytes preimage = 5; */ + if (message.preimage.length) + writer.tag(5, WireType.LengthDelimited).bytes(message.preimage); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.AMP + */ +export const AMP = new AMP$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class AddInvoiceResponse$Type extends MessageType { + constructor() { + super("lnrpc.AddInvoiceResponse", [ + { no: 1, name: "r_hash", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "payment_request", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 16, name: "add_index", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 17, name: "payment_addr", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): AddInvoiceResponse { + const message = { rHash: new Uint8Array(0), paymentRequest: "", addIndex: 0n, paymentAddr: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: AddInvoiceResponse): AddInvoiceResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes r_hash */ 1: + message.rHash = reader.bytes(); + break; + case /* string payment_request */ 2: + message.paymentRequest = reader.string(); + break; + case /* uint64 add_index */ 16: + message.addIndex = reader.uint64().toBigInt(); + break; + case /* bytes payment_addr */ 17: + message.paymentAddr = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: AddInvoiceResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes r_hash = 1; */ + if (message.rHash.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.rHash); + /* string payment_request = 2; */ + if (message.paymentRequest !== "") + writer.tag(2, WireType.LengthDelimited).string(message.paymentRequest); + /* uint64 add_index = 16; */ + if (message.addIndex !== 0n) + writer.tag(16, WireType.Varint).uint64(message.addIndex); + /* bytes payment_addr = 17; */ + if (message.paymentAddr.length) + writer.tag(17, WireType.LengthDelimited).bytes(message.paymentAddr); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.AddInvoiceResponse + */ +export const AddInvoiceResponse = new AddInvoiceResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PaymentHash$Type extends MessageType { + constructor() { + super("lnrpc.PaymentHash", [ + { no: 1, name: "r_hash_str", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "r_hash", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): PaymentHash { + const message = { rHashStr: "", rHash: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PaymentHash): PaymentHash { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string r_hash_str = 1 [deprecated = true];*/ 1: + message.rHashStr = reader.string(); + break; + case /* bytes r_hash */ 2: + message.rHash = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PaymentHash, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string r_hash_str = 1 [deprecated = true]; */ + if (message.rHashStr !== "") + writer.tag(1, WireType.LengthDelimited).string(message.rHashStr); + /* bytes r_hash = 2; */ + if (message.rHash.length) + writer.tag(2, WireType.LengthDelimited).bytes(message.rHash); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.PaymentHash + */ +export const PaymentHash = new PaymentHash$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ListInvoiceRequest$Type extends MessageType { + constructor() { + super("lnrpc.ListInvoiceRequest", [ + { no: 1, name: "pending_only", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 4, name: "index_offset", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 5, name: "num_max_invoices", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 6, name: "reversed", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): ListInvoiceRequest { + const message = { pendingOnly: false, indexOffset: 0n, numMaxInvoices: 0n, reversed: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ListInvoiceRequest): ListInvoiceRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bool pending_only */ 1: + message.pendingOnly = reader.bool(); + break; + case /* uint64 index_offset */ 4: + message.indexOffset = reader.uint64().toBigInt(); + break; + case /* uint64 num_max_invoices */ 5: + message.numMaxInvoices = reader.uint64().toBigInt(); + break; + case /* bool reversed */ 6: + message.reversed = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ListInvoiceRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bool pending_only = 1; */ + if (message.pendingOnly !== false) + writer.tag(1, WireType.Varint).bool(message.pendingOnly); + /* uint64 index_offset = 4; */ + if (message.indexOffset !== 0n) + writer.tag(4, WireType.Varint).uint64(message.indexOffset); + /* uint64 num_max_invoices = 5; */ + if (message.numMaxInvoices !== 0n) + writer.tag(5, WireType.Varint).uint64(message.numMaxInvoices); + /* bool reversed = 6; */ + if (message.reversed !== false) + writer.tag(6, WireType.Varint).bool(message.reversed); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ListInvoiceRequest + */ +export const ListInvoiceRequest = new ListInvoiceRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ListInvoiceResponse$Type extends MessageType { + constructor() { + super("lnrpc.ListInvoiceResponse", [ + { no: 1, name: "invoices", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => Invoice }, + { no: 2, name: "last_index_offset", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "first_index_offset", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): ListInvoiceResponse { + const message = { invoices: [], lastIndexOffset: 0n, firstIndexOffset: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ListInvoiceResponse): ListInvoiceResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated lnrpc.Invoice invoices */ 1: + message.invoices.push(Invoice.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* uint64 last_index_offset */ 2: + message.lastIndexOffset = reader.uint64().toBigInt(); + break; + case /* uint64 first_index_offset */ 3: + message.firstIndexOffset = reader.uint64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ListInvoiceResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated lnrpc.Invoice invoices = 1; */ + for (let i = 0; i < message.invoices.length; i++) + Invoice.internalBinaryWrite(message.invoices[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* uint64 last_index_offset = 2; */ + if (message.lastIndexOffset !== 0n) + writer.tag(2, WireType.Varint).uint64(message.lastIndexOffset); + /* uint64 first_index_offset = 3; */ + if (message.firstIndexOffset !== 0n) + writer.tag(3, WireType.Varint).uint64(message.firstIndexOffset); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ListInvoiceResponse + */ +export const ListInvoiceResponse = new ListInvoiceResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class InvoiceSubscription$Type extends MessageType { + constructor() { + super("lnrpc.InvoiceSubscription", [ + { no: 1, name: "add_index", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 2, name: "settle_index", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): InvoiceSubscription { + const message = { addIndex: 0n, settleIndex: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: InvoiceSubscription): InvoiceSubscription { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint64 add_index */ 1: + message.addIndex = reader.uint64().toBigInt(); + break; + case /* uint64 settle_index */ 2: + message.settleIndex = reader.uint64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: InvoiceSubscription, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint64 add_index = 1; */ + if (message.addIndex !== 0n) + writer.tag(1, WireType.Varint).uint64(message.addIndex); + /* uint64 settle_index = 2; */ + if (message.settleIndex !== 0n) + writer.tag(2, WireType.Varint).uint64(message.settleIndex); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.InvoiceSubscription + */ +export const InvoiceSubscription = new InvoiceSubscription$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class Payment$Type extends MessageType { + constructor() { + super("lnrpc.Payment", [ + { no: 1, name: "payment_hash", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "value", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "creation_date", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 5, name: "fee", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 6, name: "payment_preimage", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 7, name: "value_sat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 8, name: "value_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 9, name: "payment_request", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 10, name: "status", kind: "enum", T: () => ["lnrpc.Payment.PaymentStatus", Payment_PaymentStatus] }, + { no: 11, name: "fee_sat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 12, name: "fee_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 13, name: "creation_time_ns", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 14, name: "htlcs", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => HTLCAttempt }, + { no: 15, name: "payment_index", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 16, name: "failure_reason", kind: "enum", T: () => ["lnrpc.PaymentFailureReason", PaymentFailureReason] } + ]); + } + create(value?: PartialMessage): Payment { + const message = { paymentHash: "", value: 0n, creationDate: 0n, fee: 0n, paymentPreimage: "", valueSat: 0n, valueMsat: 0n, paymentRequest: "", status: 0, feeSat: 0n, feeMsat: 0n, creationTimeNs: 0n, htlcs: [], paymentIndex: 0n, failureReason: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: Payment): Payment { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string payment_hash */ 1: + message.paymentHash = reader.string(); + break; + case /* int64 value = 2 [deprecated = true];*/ 2: + message.value = reader.int64().toBigInt(); + break; + case /* int64 creation_date = 3 [deprecated = true];*/ 3: + message.creationDate = reader.int64().toBigInt(); + break; + case /* int64 fee = 5 [deprecated = true];*/ 5: + message.fee = reader.int64().toBigInt(); + break; + case /* string payment_preimage */ 6: + message.paymentPreimage = reader.string(); + break; + case /* int64 value_sat */ 7: + message.valueSat = reader.int64().toBigInt(); + break; + case /* int64 value_msat */ 8: + message.valueMsat = reader.int64().toBigInt(); + break; + case /* string payment_request */ 9: + message.paymentRequest = reader.string(); + break; + case /* lnrpc.Payment.PaymentStatus status */ 10: + message.status = reader.int32(); + break; + case /* int64 fee_sat */ 11: + message.feeSat = reader.int64().toBigInt(); + break; + case /* int64 fee_msat */ 12: + message.feeMsat = reader.int64().toBigInt(); + break; + case /* int64 creation_time_ns */ 13: + message.creationTimeNs = reader.int64().toBigInt(); + break; + case /* repeated lnrpc.HTLCAttempt htlcs */ 14: + message.htlcs.push(HTLCAttempt.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* uint64 payment_index */ 15: + message.paymentIndex = reader.uint64().toBigInt(); + break; + case /* lnrpc.PaymentFailureReason failure_reason */ 16: + message.failureReason = reader.int32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: Payment, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string payment_hash = 1; */ + if (message.paymentHash !== "") + writer.tag(1, WireType.LengthDelimited).string(message.paymentHash); + /* int64 value = 2 [deprecated = true]; */ + if (message.value !== 0n) + writer.tag(2, WireType.Varint).int64(message.value); + /* int64 creation_date = 3 [deprecated = true]; */ + if (message.creationDate !== 0n) + writer.tag(3, WireType.Varint).int64(message.creationDate); + /* int64 fee = 5 [deprecated = true]; */ + if (message.fee !== 0n) + writer.tag(5, WireType.Varint).int64(message.fee); + /* string payment_preimage = 6; */ + if (message.paymentPreimage !== "") + writer.tag(6, WireType.LengthDelimited).string(message.paymentPreimage); + /* int64 value_sat = 7; */ + if (message.valueSat !== 0n) + writer.tag(7, WireType.Varint).int64(message.valueSat); + /* int64 value_msat = 8; */ + if (message.valueMsat !== 0n) + writer.tag(8, WireType.Varint).int64(message.valueMsat); + /* string payment_request = 9; */ + if (message.paymentRequest !== "") + writer.tag(9, WireType.LengthDelimited).string(message.paymentRequest); + /* lnrpc.Payment.PaymentStatus status = 10; */ + if (message.status !== 0) + writer.tag(10, WireType.Varint).int32(message.status); + /* int64 fee_sat = 11; */ + if (message.feeSat !== 0n) + writer.tag(11, WireType.Varint).int64(message.feeSat); + /* int64 fee_msat = 12; */ + if (message.feeMsat !== 0n) + writer.tag(12, WireType.Varint).int64(message.feeMsat); + /* int64 creation_time_ns = 13; */ + if (message.creationTimeNs !== 0n) + writer.tag(13, WireType.Varint).int64(message.creationTimeNs); + /* repeated lnrpc.HTLCAttempt htlcs = 14; */ + for (let i = 0; i < message.htlcs.length; i++) + HTLCAttempt.internalBinaryWrite(message.htlcs[i], writer.tag(14, WireType.LengthDelimited).fork(), options).join(); + /* uint64 payment_index = 15; */ + if (message.paymentIndex !== 0n) + writer.tag(15, WireType.Varint).uint64(message.paymentIndex); + /* lnrpc.PaymentFailureReason failure_reason = 16; */ + if (message.failureReason !== 0) + writer.tag(16, WireType.Varint).int32(message.failureReason); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.Payment + */ +export const Payment = new Payment$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class HTLCAttempt$Type extends MessageType { + constructor() { + super("lnrpc.HTLCAttempt", [ + { no: 7, name: "attempt_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 1, name: "status", kind: "enum", T: () => ["lnrpc.HTLCAttempt.HTLCStatus", HTLCAttempt_HTLCStatus] }, + { no: 2, name: "route", kind: "message", T: () => Route }, + { no: 3, name: "attempt_time_ns", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "resolve_time_ns", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 5, name: "failure", kind: "message", T: () => Failure }, + { no: 6, name: "preimage", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): HTLCAttempt { + const message = { attemptId: 0n, status: 0, attemptTimeNs: 0n, resolveTimeNs: 0n, preimage: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: HTLCAttempt): HTLCAttempt { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint64 attempt_id */ 7: + message.attemptId = reader.uint64().toBigInt(); + break; + case /* lnrpc.HTLCAttempt.HTLCStatus status */ 1: + message.status = reader.int32(); + break; + case /* lnrpc.Route route */ 2: + message.route = Route.internalBinaryRead(reader, reader.uint32(), options, message.route); + break; + case /* int64 attempt_time_ns */ 3: + message.attemptTimeNs = reader.int64().toBigInt(); + break; + case /* int64 resolve_time_ns */ 4: + message.resolveTimeNs = reader.int64().toBigInt(); + break; + case /* lnrpc.Failure failure */ 5: + message.failure = Failure.internalBinaryRead(reader, reader.uint32(), options, message.failure); + break; + case /* bytes preimage */ 6: + message.preimage = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: HTLCAttempt, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint64 attempt_id = 7; */ + if (message.attemptId !== 0n) + writer.tag(7, WireType.Varint).uint64(message.attemptId); + /* lnrpc.HTLCAttempt.HTLCStatus status = 1; */ + if (message.status !== 0) + writer.tag(1, WireType.Varint).int32(message.status); + /* lnrpc.Route route = 2; */ + if (message.route) + Route.internalBinaryWrite(message.route, writer.tag(2, WireType.LengthDelimited).fork(), options).join(); + /* int64 attempt_time_ns = 3; */ + if (message.attemptTimeNs !== 0n) + writer.tag(3, WireType.Varint).int64(message.attemptTimeNs); + /* int64 resolve_time_ns = 4; */ + if (message.resolveTimeNs !== 0n) + writer.tag(4, WireType.Varint).int64(message.resolveTimeNs); + /* lnrpc.Failure failure = 5; */ + if (message.failure) + Failure.internalBinaryWrite(message.failure, writer.tag(5, WireType.LengthDelimited).fork(), options).join(); + /* bytes preimage = 6; */ + if (message.preimage.length) + writer.tag(6, WireType.LengthDelimited).bytes(message.preimage); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.HTLCAttempt + */ +export const HTLCAttempt = new HTLCAttempt$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ListPaymentsRequest$Type extends MessageType { + constructor() { + super("lnrpc.ListPaymentsRequest", [ + { no: 1, name: "include_incomplete", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 2, name: "index_offset", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "max_payments", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "reversed", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 5, name: "count_total_payments", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): ListPaymentsRequest { + const message = { includeIncomplete: false, indexOffset: 0n, maxPayments: 0n, reversed: false, countTotalPayments: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ListPaymentsRequest): ListPaymentsRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bool include_incomplete */ 1: + message.includeIncomplete = reader.bool(); + break; + case /* uint64 index_offset */ 2: + message.indexOffset = reader.uint64().toBigInt(); + break; + case /* uint64 max_payments */ 3: + message.maxPayments = reader.uint64().toBigInt(); + break; + case /* bool reversed */ 4: + message.reversed = reader.bool(); + break; + case /* bool count_total_payments */ 5: + message.countTotalPayments = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ListPaymentsRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bool include_incomplete = 1; */ + if (message.includeIncomplete !== false) + writer.tag(1, WireType.Varint).bool(message.includeIncomplete); + /* uint64 index_offset = 2; */ + if (message.indexOffset !== 0n) + writer.tag(2, WireType.Varint).uint64(message.indexOffset); + /* uint64 max_payments = 3; */ + if (message.maxPayments !== 0n) + writer.tag(3, WireType.Varint).uint64(message.maxPayments); + /* bool reversed = 4; */ + if (message.reversed !== false) + writer.tag(4, WireType.Varint).bool(message.reversed); + /* bool count_total_payments = 5; */ + if (message.countTotalPayments !== false) + writer.tag(5, WireType.Varint).bool(message.countTotalPayments); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ListPaymentsRequest + */ +export const ListPaymentsRequest = new ListPaymentsRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ListPaymentsResponse$Type extends MessageType { + constructor() { + super("lnrpc.ListPaymentsResponse", [ + { no: 1, name: "payments", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => Payment }, + { no: 2, name: "first_index_offset", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "last_index_offset", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "total_num_payments", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): ListPaymentsResponse { + const message = { payments: [], firstIndexOffset: 0n, lastIndexOffset: 0n, totalNumPayments: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ListPaymentsResponse): ListPaymentsResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated lnrpc.Payment payments */ 1: + message.payments.push(Payment.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* uint64 first_index_offset */ 2: + message.firstIndexOffset = reader.uint64().toBigInt(); + break; + case /* uint64 last_index_offset */ 3: + message.lastIndexOffset = reader.uint64().toBigInt(); + break; + case /* uint64 total_num_payments */ 4: + message.totalNumPayments = reader.uint64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ListPaymentsResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated lnrpc.Payment payments = 1; */ + for (let i = 0; i < message.payments.length; i++) + Payment.internalBinaryWrite(message.payments[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* uint64 first_index_offset = 2; */ + if (message.firstIndexOffset !== 0n) + writer.tag(2, WireType.Varint).uint64(message.firstIndexOffset); + /* uint64 last_index_offset = 3; */ + if (message.lastIndexOffset !== 0n) + writer.tag(3, WireType.Varint).uint64(message.lastIndexOffset); + /* uint64 total_num_payments = 4; */ + if (message.totalNumPayments !== 0n) + writer.tag(4, WireType.Varint).uint64(message.totalNumPayments); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ListPaymentsResponse + */ +export const ListPaymentsResponse = new ListPaymentsResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class DeletePaymentRequest$Type extends MessageType { + constructor() { + super("lnrpc.DeletePaymentRequest", [ + { no: 1, name: "payment_hash", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "failed_htlcs_only", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): DeletePaymentRequest { + const message = { paymentHash: new Uint8Array(0), failedHtlcsOnly: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: DeletePaymentRequest): DeletePaymentRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes payment_hash */ 1: + message.paymentHash = reader.bytes(); + break; + case /* bool failed_htlcs_only */ 2: + message.failedHtlcsOnly = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: DeletePaymentRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes payment_hash = 1; */ + if (message.paymentHash.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.paymentHash); + /* bool failed_htlcs_only = 2; */ + if (message.failedHtlcsOnly !== false) + writer.tag(2, WireType.Varint).bool(message.failedHtlcsOnly); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.DeletePaymentRequest + */ +export const DeletePaymentRequest = new DeletePaymentRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class DeleteAllPaymentsRequest$Type extends MessageType { + constructor() { + super("lnrpc.DeleteAllPaymentsRequest", [ + { no: 1, name: "failed_payments_only", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 2, name: "failed_htlcs_only", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): DeleteAllPaymentsRequest { + const message = { failedPaymentsOnly: false, failedHtlcsOnly: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: DeleteAllPaymentsRequest): DeleteAllPaymentsRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bool failed_payments_only */ 1: + message.failedPaymentsOnly = reader.bool(); + break; + case /* bool failed_htlcs_only */ 2: + message.failedHtlcsOnly = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: DeleteAllPaymentsRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bool failed_payments_only = 1; */ + if (message.failedPaymentsOnly !== false) + writer.tag(1, WireType.Varint).bool(message.failedPaymentsOnly); + /* bool failed_htlcs_only = 2; */ + if (message.failedHtlcsOnly !== false) + writer.tag(2, WireType.Varint).bool(message.failedHtlcsOnly); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.DeleteAllPaymentsRequest + */ +export const DeleteAllPaymentsRequest = new DeleteAllPaymentsRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class DeletePaymentResponse$Type extends MessageType { + constructor() { + super("lnrpc.DeletePaymentResponse", []); + } + create(value?: PartialMessage): DeletePaymentResponse { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: DeletePaymentResponse): DeletePaymentResponse { + return target ?? this.create(); + } + internalBinaryWrite(message: DeletePaymentResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.DeletePaymentResponse + */ +export const DeletePaymentResponse = new DeletePaymentResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class DeleteAllPaymentsResponse$Type extends MessageType { + constructor() { + super("lnrpc.DeleteAllPaymentsResponse", []); + } + create(value?: PartialMessage): DeleteAllPaymentsResponse { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: DeleteAllPaymentsResponse): DeleteAllPaymentsResponse { + return target ?? this.create(); + } + internalBinaryWrite(message: DeleteAllPaymentsResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.DeleteAllPaymentsResponse + */ +export const DeleteAllPaymentsResponse = new DeleteAllPaymentsResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class AbandonChannelRequest$Type extends MessageType { + constructor() { + super("lnrpc.AbandonChannelRequest", [ + { no: 1, name: "channel_point", kind: "message", T: () => ChannelPoint }, + { no: 2, name: "pending_funding_shim_only", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 3, name: "i_know_what_i_am_doing", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): AbandonChannelRequest { + const message = { pendingFundingShimOnly: false, iKnowWhatIAmDoing: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: AbandonChannelRequest): AbandonChannelRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.ChannelPoint channel_point */ 1: + message.channelPoint = ChannelPoint.internalBinaryRead(reader, reader.uint32(), options, message.channelPoint); + break; + case /* bool pending_funding_shim_only */ 2: + message.pendingFundingShimOnly = reader.bool(); + break; + case /* bool i_know_what_i_am_doing */ 3: + message.iKnowWhatIAmDoing = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: AbandonChannelRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.ChannelPoint channel_point = 1; */ + if (message.channelPoint) + ChannelPoint.internalBinaryWrite(message.channelPoint, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* bool pending_funding_shim_only = 2; */ + if (message.pendingFundingShimOnly !== false) + writer.tag(2, WireType.Varint).bool(message.pendingFundingShimOnly); + /* bool i_know_what_i_am_doing = 3; */ + if (message.iKnowWhatIAmDoing !== false) + writer.tag(3, WireType.Varint).bool(message.iKnowWhatIAmDoing); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.AbandonChannelRequest + */ +export const AbandonChannelRequest = new AbandonChannelRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class AbandonChannelResponse$Type extends MessageType { + constructor() { + super("lnrpc.AbandonChannelResponse", []); + } + create(value?: PartialMessage): AbandonChannelResponse { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: AbandonChannelResponse): AbandonChannelResponse { + return target ?? this.create(); + } + internalBinaryWrite(message: AbandonChannelResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.AbandonChannelResponse + */ +export const AbandonChannelResponse = new AbandonChannelResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class DebugLevelRequest$Type extends MessageType { + constructor() { + super("lnrpc.DebugLevelRequest", [ + { no: 1, name: "show", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 2, name: "level_spec", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): DebugLevelRequest { + const message = { show: false, levelSpec: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: DebugLevelRequest): DebugLevelRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bool show */ 1: + message.show = reader.bool(); + break; + case /* string level_spec */ 2: + message.levelSpec = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: DebugLevelRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bool show = 1; */ + if (message.show !== false) + writer.tag(1, WireType.Varint).bool(message.show); + /* string level_spec = 2; */ + if (message.levelSpec !== "") + writer.tag(2, WireType.LengthDelimited).string(message.levelSpec); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.DebugLevelRequest + */ +export const DebugLevelRequest = new DebugLevelRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class DebugLevelResponse$Type extends MessageType { + constructor() { + super("lnrpc.DebugLevelResponse", [ + { no: 1, name: "sub_systems", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): DebugLevelResponse { + const message = { subSystems: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: DebugLevelResponse): DebugLevelResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string sub_systems */ 1: + message.subSystems = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: DebugLevelResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string sub_systems = 1; */ + if (message.subSystems !== "") + writer.tag(1, WireType.LengthDelimited).string(message.subSystems); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.DebugLevelResponse + */ +export const DebugLevelResponse = new DebugLevelResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PayReqString$Type extends MessageType { + constructor() { + super("lnrpc.PayReqString", [ + { no: 1, name: "pay_req", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): PayReqString { + const message = { payReq: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PayReqString): PayReqString { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string pay_req */ 1: + message.payReq = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PayReqString, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string pay_req = 1; */ + if (message.payReq !== "") + writer.tag(1, WireType.LengthDelimited).string(message.payReq); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.PayReqString + */ +export const PayReqString = new PayReqString$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PayReq$Type extends MessageType { + constructor() { + super("lnrpc.PayReq", [ + { no: 1, name: "destination", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "payment_hash", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 3, name: "num_satoshis", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "timestamp", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 5, name: "expiry", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 6, name: "description", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 7, name: "description_hash", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 8, name: "fallback_addr", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 9, name: "cltv_expiry", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 10, name: "route_hints", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => RouteHint }, + { no: 11, name: "payment_addr", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 12, name: "num_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 13, name: "features", kind: "map", K: 13 /*ScalarType.UINT32*/, V: { kind: "message", T: () => Feature } } + ]); + } + create(value?: PartialMessage): PayReq { + const message = { destination: "", paymentHash: "", numSatoshis: 0n, timestamp: 0n, expiry: 0n, description: "", descriptionHash: "", fallbackAddr: "", cltvExpiry: 0n, routeHints: [], paymentAddr: new Uint8Array(0), numMsat: 0n, features: {} }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PayReq): PayReq { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string destination */ 1: + message.destination = reader.string(); + break; + case /* string payment_hash */ 2: + message.paymentHash = reader.string(); + break; + case /* int64 num_satoshis */ 3: + message.numSatoshis = reader.int64().toBigInt(); + break; + case /* int64 timestamp */ 4: + message.timestamp = reader.int64().toBigInt(); + break; + case /* int64 expiry */ 5: + message.expiry = reader.int64().toBigInt(); + break; + case /* string description */ 6: + message.description = reader.string(); + break; + case /* string description_hash */ 7: + message.descriptionHash = reader.string(); + break; + case /* string fallback_addr */ 8: + message.fallbackAddr = reader.string(); + break; + case /* int64 cltv_expiry */ 9: + message.cltvExpiry = reader.int64().toBigInt(); + break; + case /* repeated lnrpc.RouteHint route_hints */ 10: + message.routeHints.push(RouteHint.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* bytes payment_addr */ 11: + message.paymentAddr = reader.bytes(); + break; + case /* int64 num_msat */ 12: + message.numMsat = reader.int64().toBigInt(); + break; + case /* map features */ 13: + this.binaryReadMap13(message.features, reader, options); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + private binaryReadMap13(map: PayReq["features"], reader: IBinaryReader, options: BinaryReadOptions): void { + let len = reader.uint32(), end = reader.pos + len, key: keyof PayReq["features"] | undefined, val: PayReq["features"][any] | undefined; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + key = reader.uint32(); + break; + case 2: + val = Feature.internalBinaryRead(reader, reader.uint32(), options); + break; + default: throw new globalThis.Error("unknown map entry field for field lnrpc.PayReq.features"); + } + } + map[key ?? 0] = val ?? Feature.create(); + } + internalBinaryWrite(message: PayReq, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string destination = 1; */ + if (message.destination !== "") + writer.tag(1, WireType.LengthDelimited).string(message.destination); + /* string payment_hash = 2; */ + if (message.paymentHash !== "") + writer.tag(2, WireType.LengthDelimited).string(message.paymentHash); + /* int64 num_satoshis = 3; */ + if (message.numSatoshis !== 0n) + writer.tag(3, WireType.Varint).int64(message.numSatoshis); + /* int64 timestamp = 4; */ + if (message.timestamp !== 0n) + writer.tag(4, WireType.Varint).int64(message.timestamp); + /* int64 expiry = 5; */ + if (message.expiry !== 0n) + writer.tag(5, WireType.Varint).int64(message.expiry); + /* string description = 6; */ + if (message.description !== "") + writer.tag(6, WireType.LengthDelimited).string(message.description); + /* string description_hash = 7; */ + if (message.descriptionHash !== "") + writer.tag(7, WireType.LengthDelimited).string(message.descriptionHash); + /* string fallback_addr = 8; */ + if (message.fallbackAddr !== "") + writer.tag(8, WireType.LengthDelimited).string(message.fallbackAddr); + /* int64 cltv_expiry = 9; */ + if (message.cltvExpiry !== 0n) + writer.tag(9, WireType.Varint).int64(message.cltvExpiry); + /* repeated lnrpc.RouteHint route_hints = 10; */ + for (let i = 0; i < message.routeHints.length; i++) + RouteHint.internalBinaryWrite(message.routeHints[i], writer.tag(10, WireType.LengthDelimited).fork(), options).join(); + /* bytes payment_addr = 11; */ + if (message.paymentAddr.length) + writer.tag(11, WireType.LengthDelimited).bytes(message.paymentAddr); + /* int64 num_msat = 12; */ + if (message.numMsat !== 0n) + writer.tag(12, WireType.Varint).int64(message.numMsat); + /* map features = 13; */ + for (let k of Object.keys(message.features)) { + writer.tag(13, WireType.LengthDelimited).fork().tag(1, WireType.Varint).uint32(parseInt(k)); + writer.tag(2, WireType.LengthDelimited).fork(); + Feature.internalBinaryWrite(message.features[k as any], writer, options); + writer.join().join(); + } + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.PayReq + */ +export const PayReq = new PayReq$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class Feature$Type extends MessageType { + constructor() { + super("lnrpc.Feature", [ + { no: 2, name: "name", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 3, name: "is_required", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 4, name: "is_known", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): Feature { + const message = { name: "", isRequired: false, isKnown: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: Feature): Feature { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string name */ 2: + message.name = reader.string(); + break; + case /* bool is_required */ 3: + message.isRequired = reader.bool(); + break; + case /* bool is_known */ 4: + message.isKnown = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: Feature, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string name = 2; */ + if (message.name !== "") + writer.tag(2, WireType.LengthDelimited).string(message.name); + /* bool is_required = 3; */ + if (message.isRequired !== false) + writer.tag(3, WireType.Varint).bool(message.isRequired); + /* bool is_known = 4; */ + if (message.isKnown !== false) + writer.tag(4, WireType.Varint).bool(message.isKnown); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.Feature + */ +export const Feature = new Feature$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class FeeReportRequest$Type extends MessageType { + constructor() { + super("lnrpc.FeeReportRequest", []); + } + create(value?: PartialMessage): FeeReportRequest { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: FeeReportRequest): FeeReportRequest { + return target ?? this.create(); + } + internalBinaryWrite(message: FeeReportRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.FeeReportRequest + */ +export const FeeReportRequest = new FeeReportRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ChannelFeeReport$Type extends MessageType { + constructor() { + super("lnrpc.ChannelFeeReport", [ + { no: 5, name: "chan_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/ }, + { no: 1, name: "channel_point", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "base_fee_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "fee_per_mil", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "fee_rate", kind: "scalar", T: 1 /*ScalarType.DOUBLE*/ } + ]); + } + create(value?: PartialMessage): ChannelFeeReport { + const message = { chanId: "0", channelPoint: "", baseFeeMsat: 0n, feePerMil: 0n, feeRate: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ChannelFeeReport): ChannelFeeReport { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint64 chan_id = 5 [jstype = JS_STRING];*/ 5: + message.chanId = reader.uint64().toString(); + break; + case /* string channel_point */ 1: + message.channelPoint = reader.string(); + break; + case /* int64 base_fee_msat */ 2: + message.baseFeeMsat = reader.int64().toBigInt(); + break; + case /* int64 fee_per_mil */ 3: + message.feePerMil = reader.int64().toBigInt(); + break; + case /* double fee_rate */ 4: + message.feeRate = reader.double(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ChannelFeeReport, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint64 chan_id = 5 [jstype = JS_STRING]; */ + if (message.chanId !== "0") + writer.tag(5, WireType.Varint).uint64(message.chanId); + /* string channel_point = 1; */ + if (message.channelPoint !== "") + writer.tag(1, WireType.LengthDelimited).string(message.channelPoint); + /* int64 base_fee_msat = 2; */ + if (message.baseFeeMsat !== 0n) + writer.tag(2, WireType.Varint).int64(message.baseFeeMsat); + /* int64 fee_per_mil = 3; */ + if (message.feePerMil !== 0n) + writer.tag(3, WireType.Varint).int64(message.feePerMil); + /* double fee_rate = 4; */ + if (message.feeRate !== 0) + writer.tag(4, WireType.Bit64).double(message.feeRate); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ChannelFeeReport + */ +export const ChannelFeeReport = new ChannelFeeReport$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class FeeReportResponse$Type extends MessageType { + constructor() { + super("lnrpc.FeeReportResponse", [ + { no: 1, name: "channel_fees", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => ChannelFeeReport }, + { no: 2, name: "day_fee_sum", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "week_fee_sum", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "month_fee_sum", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): FeeReportResponse { + const message = { channelFees: [], dayFeeSum: 0n, weekFeeSum: 0n, monthFeeSum: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: FeeReportResponse): FeeReportResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated lnrpc.ChannelFeeReport channel_fees */ 1: + message.channelFees.push(ChannelFeeReport.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* uint64 day_fee_sum */ 2: + message.dayFeeSum = reader.uint64().toBigInt(); + break; + case /* uint64 week_fee_sum */ 3: + message.weekFeeSum = reader.uint64().toBigInt(); + break; + case /* uint64 month_fee_sum */ 4: + message.monthFeeSum = reader.uint64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: FeeReportResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated lnrpc.ChannelFeeReport channel_fees = 1; */ + for (let i = 0; i < message.channelFees.length; i++) + ChannelFeeReport.internalBinaryWrite(message.channelFees[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* uint64 day_fee_sum = 2; */ + if (message.dayFeeSum !== 0n) + writer.tag(2, WireType.Varint).uint64(message.dayFeeSum); + /* uint64 week_fee_sum = 3; */ + if (message.weekFeeSum !== 0n) + writer.tag(3, WireType.Varint).uint64(message.weekFeeSum); + /* uint64 month_fee_sum = 4; */ + if (message.monthFeeSum !== 0n) + writer.tag(4, WireType.Varint).uint64(message.monthFeeSum); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.FeeReportResponse + */ +export const FeeReportResponse = new FeeReportResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PolicyUpdateRequest$Type extends MessageType { + constructor() { + super("lnrpc.PolicyUpdateRequest", [ + { no: 1, name: "global", kind: "scalar", oneof: "scope", T: 8 /*ScalarType.BOOL*/ }, + { no: 2, name: "chan_point", kind: "message", oneof: "scope", T: () => ChannelPoint }, + { no: 3, name: "base_fee_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "fee_rate", kind: "scalar", T: 1 /*ScalarType.DOUBLE*/ }, + { no: 9, name: "fee_rate_ppm", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 5, name: "time_lock_delta", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 6, name: "max_htlc_msat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 7, name: "min_htlc_msat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 8, name: "min_htlc_msat_specified", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): PolicyUpdateRequest { + const message = { scope: { oneofKind: undefined }, baseFeeMsat: 0n, feeRate: 0, feeRatePpm: 0, timeLockDelta: 0, maxHtlcMsat: 0n, minHtlcMsat: 0n, minHtlcMsatSpecified: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PolicyUpdateRequest): PolicyUpdateRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bool global */ 1: + message.scope = { + oneofKind: "global", + global: reader.bool() + }; + break; + case /* lnrpc.ChannelPoint chan_point */ 2: + message.scope = { + oneofKind: "chanPoint", + chanPoint: ChannelPoint.internalBinaryRead(reader, reader.uint32(), options, (message.scope as any).chanPoint) + }; + break; + case /* int64 base_fee_msat */ 3: + message.baseFeeMsat = reader.int64().toBigInt(); + break; + case /* double fee_rate */ 4: + message.feeRate = reader.double(); + break; + case /* uint32 fee_rate_ppm */ 9: + message.feeRatePpm = reader.uint32(); + break; + case /* uint32 time_lock_delta */ 5: + message.timeLockDelta = reader.uint32(); + break; + case /* uint64 max_htlc_msat */ 6: + message.maxHtlcMsat = reader.uint64().toBigInt(); + break; + case /* uint64 min_htlc_msat */ 7: + message.minHtlcMsat = reader.uint64().toBigInt(); + break; + case /* bool min_htlc_msat_specified */ 8: + message.minHtlcMsatSpecified = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PolicyUpdateRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bool global = 1; */ + if (message.scope.oneofKind === "global") + writer.tag(1, WireType.Varint).bool(message.scope.global); + /* lnrpc.ChannelPoint chan_point = 2; */ + if (message.scope.oneofKind === "chanPoint") + ChannelPoint.internalBinaryWrite(message.scope.chanPoint, writer.tag(2, WireType.LengthDelimited).fork(), options).join(); + /* int64 base_fee_msat = 3; */ + if (message.baseFeeMsat !== 0n) + writer.tag(3, WireType.Varint).int64(message.baseFeeMsat); + /* double fee_rate = 4; */ + if (message.feeRate !== 0) + writer.tag(4, WireType.Bit64).double(message.feeRate); + /* uint32 fee_rate_ppm = 9; */ + if (message.feeRatePpm !== 0) + writer.tag(9, WireType.Varint).uint32(message.feeRatePpm); + /* uint32 time_lock_delta = 5; */ + if (message.timeLockDelta !== 0) + writer.tag(5, WireType.Varint).uint32(message.timeLockDelta); + /* uint64 max_htlc_msat = 6; */ + if (message.maxHtlcMsat !== 0n) + writer.tag(6, WireType.Varint).uint64(message.maxHtlcMsat); + /* uint64 min_htlc_msat = 7; */ + if (message.minHtlcMsat !== 0n) + writer.tag(7, WireType.Varint).uint64(message.minHtlcMsat); + /* bool min_htlc_msat_specified = 8; */ + if (message.minHtlcMsatSpecified !== false) + writer.tag(8, WireType.Varint).bool(message.minHtlcMsatSpecified); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.PolicyUpdateRequest + */ +export const PolicyUpdateRequest = new PolicyUpdateRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class FailedUpdate$Type extends MessageType { + constructor() { + super("lnrpc.FailedUpdate", [ + { no: 1, name: "outpoint", kind: "message", T: () => OutPoint }, + { no: 2, name: "reason", kind: "enum", T: () => ["lnrpc.UpdateFailure", UpdateFailure, "UPDATE_FAILURE_"] }, + { no: 3, name: "update_error", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): FailedUpdate { + const message = { reason: 0, updateError: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: FailedUpdate): FailedUpdate { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.OutPoint outpoint */ 1: + message.outpoint = OutPoint.internalBinaryRead(reader, reader.uint32(), options, message.outpoint); + break; + case /* lnrpc.UpdateFailure reason */ 2: + message.reason = reader.int32(); + break; + case /* string update_error */ 3: + message.updateError = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: FailedUpdate, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.OutPoint outpoint = 1; */ + if (message.outpoint) + OutPoint.internalBinaryWrite(message.outpoint, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.UpdateFailure reason = 2; */ + if (message.reason !== 0) + writer.tag(2, WireType.Varint).int32(message.reason); + /* string update_error = 3; */ + if (message.updateError !== "") + writer.tag(3, WireType.LengthDelimited).string(message.updateError); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.FailedUpdate + */ +export const FailedUpdate = new FailedUpdate$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PolicyUpdateResponse$Type extends MessageType { + constructor() { + super("lnrpc.PolicyUpdateResponse", [ + { no: 1, name: "failed_updates", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => FailedUpdate } + ]); + } + create(value?: PartialMessage): PolicyUpdateResponse { + const message = { failedUpdates: [] }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PolicyUpdateResponse): PolicyUpdateResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated lnrpc.FailedUpdate failed_updates */ 1: + message.failedUpdates.push(FailedUpdate.internalBinaryRead(reader, reader.uint32(), options)); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PolicyUpdateResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated lnrpc.FailedUpdate failed_updates = 1; */ + for (let i = 0; i < message.failedUpdates.length; i++) + FailedUpdate.internalBinaryWrite(message.failedUpdates[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.PolicyUpdateResponse + */ +export const PolicyUpdateResponse = new PolicyUpdateResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ForwardingHistoryRequest$Type extends MessageType { + constructor() { + super("lnrpc.ForwardingHistoryRequest", [ + { no: 1, name: "start_time", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 2, name: "end_time", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "index_offset", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 4, name: "num_max_events", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 5, name: "peer_alias_lookup", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): ForwardingHistoryRequest { + const message = { startTime: 0n, endTime: 0n, indexOffset: 0, numMaxEvents: 0, peerAliasLookup: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ForwardingHistoryRequest): ForwardingHistoryRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint64 start_time */ 1: + message.startTime = reader.uint64().toBigInt(); + break; + case /* uint64 end_time */ 2: + message.endTime = reader.uint64().toBigInt(); + break; + case /* uint32 index_offset */ 3: + message.indexOffset = reader.uint32(); + break; + case /* uint32 num_max_events */ 4: + message.numMaxEvents = reader.uint32(); + break; + case /* bool peer_alias_lookup */ 5: + message.peerAliasLookup = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ForwardingHistoryRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint64 start_time = 1; */ + if (message.startTime !== 0n) + writer.tag(1, WireType.Varint).uint64(message.startTime); + /* uint64 end_time = 2; */ + if (message.endTime !== 0n) + writer.tag(2, WireType.Varint).uint64(message.endTime); + /* uint32 index_offset = 3; */ + if (message.indexOffset !== 0) + writer.tag(3, WireType.Varint).uint32(message.indexOffset); + /* uint32 num_max_events = 4; */ + if (message.numMaxEvents !== 0) + writer.tag(4, WireType.Varint).uint32(message.numMaxEvents); + /* bool peer_alias_lookup = 5; */ + if (message.peerAliasLookup !== false) + writer.tag(5, WireType.Varint).bool(message.peerAliasLookup); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ForwardingHistoryRequest + */ +export const ForwardingHistoryRequest = new ForwardingHistoryRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ForwardingEvent$Type extends MessageType { + constructor() { + super("lnrpc.ForwardingEvent", [ + { no: 1, name: "timestamp", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 2, name: "chan_id_in", kind: "scalar", T: 4 /*ScalarType.UINT64*/ }, + { no: 4, name: "chan_id_out", kind: "scalar", T: 4 /*ScalarType.UINT64*/ }, + { no: 5, name: "amt_in", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 6, name: "amt_out", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 7, name: "fee", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 8, name: "fee_msat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 9, name: "amt_in_msat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 10, name: "amt_out_msat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 11, name: "timestamp_ns", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 12, name: "peer_alias_in", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 13, name: "peer_alias_out", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): ForwardingEvent { + const message = { timestamp: 0n, chanIdIn: "0", chanIdOut: "0", amtIn: 0n, amtOut: 0n, fee: 0n, feeMsat: 0n, amtInMsat: 0n, amtOutMsat: 0n, timestampNs: 0n, peerAliasIn: "", peerAliasOut: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ForwardingEvent): ForwardingEvent { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint64 timestamp = 1 [deprecated = true];*/ 1: + message.timestamp = reader.uint64().toBigInt(); + break; + case /* uint64 chan_id_in = 2 [jstype = JS_STRING];*/ 2: + message.chanIdIn = reader.uint64().toString(); + break; + case /* uint64 chan_id_out = 4 [jstype = JS_STRING];*/ 4: + message.chanIdOut = reader.uint64().toString(); + break; + case /* uint64 amt_in */ 5: + message.amtIn = reader.uint64().toBigInt(); + break; + case /* uint64 amt_out */ 6: + message.amtOut = reader.uint64().toBigInt(); + break; + case /* uint64 fee */ 7: + message.fee = reader.uint64().toBigInt(); + break; + case /* uint64 fee_msat */ 8: + message.feeMsat = reader.uint64().toBigInt(); + break; + case /* uint64 amt_in_msat */ 9: + message.amtInMsat = reader.uint64().toBigInt(); + break; + case /* uint64 amt_out_msat */ 10: + message.amtOutMsat = reader.uint64().toBigInt(); + break; + case /* uint64 timestamp_ns */ 11: + message.timestampNs = reader.uint64().toBigInt(); + break; + case /* string peer_alias_in */ 12: + message.peerAliasIn = reader.string(); + break; + case /* string peer_alias_out */ 13: + message.peerAliasOut = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ForwardingEvent, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint64 timestamp = 1 [deprecated = true]; */ + if (message.timestamp !== 0n) + writer.tag(1, WireType.Varint).uint64(message.timestamp); + /* uint64 chan_id_in = 2 [jstype = JS_STRING]; */ + if (message.chanIdIn !== "0") + writer.tag(2, WireType.Varint).uint64(message.chanIdIn); + /* uint64 chan_id_out = 4 [jstype = JS_STRING]; */ + if (message.chanIdOut !== "0") + writer.tag(4, WireType.Varint).uint64(message.chanIdOut); + /* uint64 amt_in = 5; */ + if (message.amtIn !== 0n) + writer.tag(5, WireType.Varint).uint64(message.amtIn); + /* uint64 amt_out = 6; */ + if (message.amtOut !== 0n) + writer.tag(6, WireType.Varint).uint64(message.amtOut); + /* uint64 fee = 7; */ + if (message.fee !== 0n) + writer.tag(7, WireType.Varint).uint64(message.fee); + /* uint64 fee_msat = 8; */ + if (message.feeMsat !== 0n) + writer.tag(8, WireType.Varint).uint64(message.feeMsat); + /* uint64 amt_in_msat = 9; */ + if (message.amtInMsat !== 0n) + writer.tag(9, WireType.Varint).uint64(message.amtInMsat); + /* uint64 amt_out_msat = 10; */ + if (message.amtOutMsat !== 0n) + writer.tag(10, WireType.Varint).uint64(message.amtOutMsat); + /* uint64 timestamp_ns = 11; */ + if (message.timestampNs !== 0n) + writer.tag(11, WireType.Varint).uint64(message.timestampNs); + /* string peer_alias_in = 12; */ + if (message.peerAliasIn !== "") + writer.tag(12, WireType.LengthDelimited).string(message.peerAliasIn); + /* string peer_alias_out = 13; */ + if (message.peerAliasOut !== "") + writer.tag(13, WireType.LengthDelimited).string(message.peerAliasOut); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ForwardingEvent + */ +export const ForwardingEvent = new ForwardingEvent$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ForwardingHistoryResponse$Type extends MessageType { + constructor() { + super("lnrpc.ForwardingHistoryResponse", [ + { no: 1, name: "forwarding_events", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => ForwardingEvent }, + { no: 2, name: "last_offset_index", kind: "scalar", T: 13 /*ScalarType.UINT32*/ } + ]); + } + create(value?: PartialMessage): ForwardingHistoryResponse { + const message = { forwardingEvents: [], lastOffsetIndex: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ForwardingHistoryResponse): ForwardingHistoryResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated lnrpc.ForwardingEvent forwarding_events */ 1: + message.forwardingEvents.push(ForwardingEvent.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* uint32 last_offset_index */ 2: + message.lastOffsetIndex = reader.uint32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ForwardingHistoryResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated lnrpc.ForwardingEvent forwarding_events = 1; */ + for (let i = 0; i < message.forwardingEvents.length; i++) + ForwardingEvent.internalBinaryWrite(message.forwardingEvents[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* uint32 last_offset_index = 2; */ + if (message.lastOffsetIndex !== 0) + writer.tag(2, WireType.Varint).uint32(message.lastOffsetIndex); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ForwardingHistoryResponse + */ +export const ForwardingHistoryResponse = new ForwardingHistoryResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ExportChannelBackupRequest$Type extends MessageType { + constructor() { + super("lnrpc.ExportChannelBackupRequest", [ + { no: 1, name: "chan_point", kind: "message", T: () => ChannelPoint } + ]); + } + create(value?: PartialMessage): ExportChannelBackupRequest { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ExportChannelBackupRequest): ExportChannelBackupRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.ChannelPoint chan_point */ 1: + message.chanPoint = ChannelPoint.internalBinaryRead(reader, reader.uint32(), options, message.chanPoint); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ExportChannelBackupRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.ChannelPoint chan_point = 1; */ + if (message.chanPoint) + ChannelPoint.internalBinaryWrite(message.chanPoint, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ExportChannelBackupRequest + */ +export const ExportChannelBackupRequest = new ExportChannelBackupRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ChannelBackup$Type extends MessageType { + constructor() { + super("lnrpc.ChannelBackup", [ + { no: 1, name: "chan_point", kind: "message", T: () => ChannelPoint }, + { no: 2, name: "chan_backup", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): ChannelBackup { + const message = { chanBackup: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ChannelBackup): ChannelBackup { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.ChannelPoint chan_point */ 1: + message.chanPoint = ChannelPoint.internalBinaryRead(reader, reader.uint32(), options, message.chanPoint); + break; + case /* bytes chan_backup */ 2: + message.chanBackup = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ChannelBackup, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.ChannelPoint chan_point = 1; */ + if (message.chanPoint) + ChannelPoint.internalBinaryWrite(message.chanPoint, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* bytes chan_backup = 2; */ + if (message.chanBackup.length) + writer.tag(2, WireType.LengthDelimited).bytes(message.chanBackup); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ChannelBackup + */ +export const ChannelBackup = new ChannelBackup$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class MultiChanBackup$Type extends MessageType { + constructor() { + super("lnrpc.MultiChanBackup", [ + { no: 1, name: "chan_points", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => ChannelPoint }, + { no: 2, name: "multi_chan_backup", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): MultiChanBackup { + const message = { chanPoints: [], multiChanBackup: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: MultiChanBackup): MultiChanBackup { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated lnrpc.ChannelPoint chan_points */ 1: + message.chanPoints.push(ChannelPoint.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* bytes multi_chan_backup */ 2: + message.multiChanBackup = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: MultiChanBackup, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated lnrpc.ChannelPoint chan_points = 1; */ + for (let i = 0; i < message.chanPoints.length; i++) + ChannelPoint.internalBinaryWrite(message.chanPoints[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* bytes multi_chan_backup = 2; */ + if (message.multiChanBackup.length) + writer.tag(2, WireType.LengthDelimited).bytes(message.multiChanBackup); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.MultiChanBackup + */ +export const MultiChanBackup = new MultiChanBackup$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ChanBackupExportRequest$Type extends MessageType { + constructor() { + super("lnrpc.ChanBackupExportRequest", []); + } + create(value?: PartialMessage): ChanBackupExportRequest { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ChanBackupExportRequest): ChanBackupExportRequest { + return target ?? this.create(); + } + internalBinaryWrite(message: ChanBackupExportRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ChanBackupExportRequest + */ +export const ChanBackupExportRequest = new ChanBackupExportRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ChanBackupSnapshot$Type extends MessageType { + constructor() { + super("lnrpc.ChanBackupSnapshot", [ + { no: 1, name: "single_chan_backups", kind: "message", T: () => ChannelBackups }, + { no: 2, name: "multi_chan_backup", kind: "message", T: () => MultiChanBackup } + ]); + } + create(value?: PartialMessage): ChanBackupSnapshot { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ChanBackupSnapshot): ChanBackupSnapshot { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.ChannelBackups single_chan_backups */ 1: + message.singleChanBackups = ChannelBackups.internalBinaryRead(reader, reader.uint32(), options, message.singleChanBackups); + break; + case /* lnrpc.MultiChanBackup multi_chan_backup */ 2: + message.multiChanBackup = MultiChanBackup.internalBinaryRead(reader, reader.uint32(), options, message.multiChanBackup); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ChanBackupSnapshot, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.ChannelBackups single_chan_backups = 1; */ + if (message.singleChanBackups) + ChannelBackups.internalBinaryWrite(message.singleChanBackups, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.MultiChanBackup multi_chan_backup = 2; */ + if (message.multiChanBackup) + MultiChanBackup.internalBinaryWrite(message.multiChanBackup, writer.tag(2, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ChanBackupSnapshot + */ +export const ChanBackupSnapshot = new ChanBackupSnapshot$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ChannelBackups$Type extends MessageType { + constructor() { + super("lnrpc.ChannelBackups", [ + { no: 1, name: "chan_backups", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => ChannelBackup } + ]); + } + create(value?: PartialMessage): ChannelBackups { + const message = { chanBackups: [] }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ChannelBackups): ChannelBackups { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated lnrpc.ChannelBackup chan_backups */ 1: + message.chanBackups.push(ChannelBackup.internalBinaryRead(reader, reader.uint32(), options)); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ChannelBackups, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated lnrpc.ChannelBackup chan_backups = 1; */ + for (let i = 0; i < message.chanBackups.length; i++) + ChannelBackup.internalBinaryWrite(message.chanBackups[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ChannelBackups + */ +export const ChannelBackups = new ChannelBackups$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class RestoreChanBackupRequest$Type extends MessageType { + constructor() { + super("lnrpc.RestoreChanBackupRequest", [ + { no: 1, name: "chan_backups", kind: "message", oneof: "backup", T: () => ChannelBackups }, + { no: 2, name: "multi_chan_backup", kind: "scalar", oneof: "backup", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): RestoreChanBackupRequest { + const message = { backup: { oneofKind: undefined } }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: RestoreChanBackupRequest): RestoreChanBackupRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.ChannelBackups chan_backups */ 1: + message.backup = { + oneofKind: "chanBackups", + chanBackups: ChannelBackups.internalBinaryRead(reader, reader.uint32(), options, (message.backup as any).chanBackups) + }; + break; + case /* bytes multi_chan_backup */ 2: + message.backup = { + oneofKind: "multiChanBackup", + multiChanBackup: reader.bytes() + }; + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: RestoreChanBackupRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.ChannelBackups chan_backups = 1; */ + if (message.backup.oneofKind === "chanBackups") + ChannelBackups.internalBinaryWrite(message.backup.chanBackups, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* bytes multi_chan_backup = 2; */ + if (message.backup.oneofKind === "multiChanBackup") + writer.tag(2, WireType.LengthDelimited).bytes(message.backup.multiChanBackup); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.RestoreChanBackupRequest + */ +export const RestoreChanBackupRequest = new RestoreChanBackupRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class RestoreBackupResponse$Type extends MessageType { + constructor() { + super("lnrpc.RestoreBackupResponse", []); + } + create(value?: PartialMessage): RestoreBackupResponse { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: RestoreBackupResponse): RestoreBackupResponse { + return target ?? this.create(); + } + internalBinaryWrite(message: RestoreBackupResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.RestoreBackupResponse + */ +export const RestoreBackupResponse = new RestoreBackupResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ChannelBackupSubscription$Type extends MessageType { + constructor() { + super("lnrpc.ChannelBackupSubscription", []); + } + create(value?: PartialMessage): ChannelBackupSubscription { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ChannelBackupSubscription): ChannelBackupSubscription { + return target ?? this.create(); + } + internalBinaryWrite(message: ChannelBackupSubscription, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ChannelBackupSubscription + */ +export const ChannelBackupSubscription = new ChannelBackupSubscription$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class VerifyChanBackupResponse$Type extends MessageType { + constructor() { + super("lnrpc.VerifyChanBackupResponse", []); + } + create(value?: PartialMessage): VerifyChanBackupResponse { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: VerifyChanBackupResponse): VerifyChanBackupResponse { + return target ?? this.create(); + } + internalBinaryWrite(message: VerifyChanBackupResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.VerifyChanBackupResponse + */ +export const VerifyChanBackupResponse = new VerifyChanBackupResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class MacaroonPermission$Type extends MessageType { + constructor() { + super("lnrpc.MacaroonPermission", [ + { no: 1, name: "entity", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "action", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): MacaroonPermission { + const message = { entity: "", action: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: MacaroonPermission): MacaroonPermission { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string entity */ 1: + message.entity = reader.string(); + break; + case /* string action */ 2: + message.action = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: MacaroonPermission, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string entity = 1; */ + if (message.entity !== "") + writer.tag(1, WireType.LengthDelimited).string(message.entity); + /* string action = 2; */ + if (message.action !== "") + writer.tag(2, WireType.LengthDelimited).string(message.action); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.MacaroonPermission + */ +export const MacaroonPermission = new MacaroonPermission$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class BakeMacaroonRequest$Type extends MessageType { + constructor() { + super("lnrpc.BakeMacaroonRequest", [ + { no: 1, name: "permissions", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => MacaroonPermission }, + { no: 2, name: "root_key_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "allow_external_permissions", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): BakeMacaroonRequest { + const message = { permissions: [], rootKeyId: 0n, allowExternalPermissions: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: BakeMacaroonRequest): BakeMacaroonRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated lnrpc.MacaroonPermission permissions */ 1: + message.permissions.push(MacaroonPermission.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* uint64 root_key_id */ 2: + message.rootKeyId = reader.uint64().toBigInt(); + break; + case /* bool allow_external_permissions */ 3: + message.allowExternalPermissions = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: BakeMacaroonRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated lnrpc.MacaroonPermission permissions = 1; */ + for (let i = 0; i < message.permissions.length; i++) + MacaroonPermission.internalBinaryWrite(message.permissions[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* uint64 root_key_id = 2; */ + if (message.rootKeyId !== 0n) + writer.tag(2, WireType.Varint).uint64(message.rootKeyId); + /* bool allow_external_permissions = 3; */ + if (message.allowExternalPermissions !== false) + writer.tag(3, WireType.Varint).bool(message.allowExternalPermissions); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.BakeMacaroonRequest + */ +export const BakeMacaroonRequest = new BakeMacaroonRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class BakeMacaroonResponse$Type extends MessageType { + constructor() { + super("lnrpc.BakeMacaroonResponse", [ + { no: 1, name: "macaroon", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): BakeMacaroonResponse { + const message = { macaroon: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: BakeMacaroonResponse): BakeMacaroonResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string macaroon */ 1: + message.macaroon = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: BakeMacaroonResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string macaroon = 1; */ + if (message.macaroon !== "") + writer.tag(1, WireType.LengthDelimited).string(message.macaroon); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.BakeMacaroonResponse + */ +export const BakeMacaroonResponse = new BakeMacaroonResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ListMacaroonIDsRequest$Type extends MessageType { + constructor() { + super("lnrpc.ListMacaroonIDsRequest", []); + } + create(value?: PartialMessage): ListMacaroonIDsRequest { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ListMacaroonIDsRequest): ListMacaroonIDsRequest { + return target ?? this.create(); + } + internalBinaryWrite(message: ListMacaroonIDsRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ListMacaroonIDsRequest + */ +export const ListMacaroonIDsRequest = new ListMacaroonIDsRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ListMacaroonIDsResponse$Type extends MessageType { + constructor() { + super("lnrpc.ListMacaroonIDsResponse", [ + { no: 1, name: "root_key_ids", kind: "scalar", repeat: 1 /*RepeatType.PACKED*/, T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): ListMacaroonIDsResponse { + const message = { rootKeyIds: [] }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ListMacaroonIDsResponse): ListMacaroonIDsResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated uint64 root_key_ids */ 1: + if (wireType === WireType.LengthDelimited) + for (let e = reader.int32() + reader.pos; reader.pos < e;) + message.rootKeyIds.push(reader.uint64().toBigInt()); + else + message.rootKeyIds.push(reader.uint64().toBigInt()); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ListMacaroonIDsResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated uint64 root_key_ids = 1; */ + if (message.rootKeyIds.length) { + writer.tag(1, WireType.LengthDelimited).fork(); + for (let i = 0; i < message.rootKeyIds.length; i++) + writer.uint64(message.rootKeyIds[i]); + writer.join(); + } + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ListMacaroonIDsResponse + */ +export const ListMacaroonIDsResponse = new ListMacaroonIDsResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class DeleteMacaroonIDRequest$Type extends MessageType { + constructor() { + super("lnrpc.DeleteMacaroonIDRequest", [ + { no: 1, name: "root_key_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): DeleteMacaroonIDRequest { + const message = { rootKeyId: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: DeleteMacaroonIDRequest): DeleteMacaroonIDRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint64 root_key_id */ 1: + message.rootKeyId = reader.uint64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: DeleteMacaroonIDRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint64 root_key_id = 1; */ + if (message.rootKeyId !== 0n) + writer.tag(1, WireType.Varint).uint64(message.rootKeyId); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.DeleteMacaroonIDRequest + */ +export const DeleteMacaroonIDRequest = new DeleteMacaroonIDRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class DeleteMacaroonIDResponse$Type extends MessageType { + constructor() { + super("lnrpc.DeleteMacaroonIDResponse", [ + { no: 1, name: "deleted", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): DeleteMacaroonIDResponse { + const message = { deleted: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: DeleteMacaroonIDResponse): DeleteMacaroonIDResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bool deleted */ 1: + message.deleted = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: DeleteMacaroonIDResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bool deleted = 1; */ + if (message.deleted !== false) + writer.tag(1, WireType.Varint).bool(message.deleted); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.DeleteMacaroonIDResponse + */ +export const DeleteMacaroonIDResponse = new DeleteMacaroonIDResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class MacaroonPermissionList$Type extends MessageType { + constructor() { + super("lnrpc.MacaroonPermissionList", [ + { no: 1, name: "permissions", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => MacaroonPermission } + ]); + } + create(value?: PartialMessage): MacaroonPermissionList { + const message = { permissions: [] }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: MacaroonPermissionList): MacaroonPermissionList { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated lnrpc.MacaroonPermission permissions */ 1: + message.permissions.push(MacaroonPermission.internalBinaryRead(reader, reader.uint32(), options)); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: MacaroonPermissionList, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated lnrpc.MacaroonPermission permissions = 1; */ + for (let i = 0; i < message.permissions.length; i++) + MacaroonPermission.internalBinaryWrite(message.permissions[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.MacaroonPermissionList + */ +export const MacaroonPermissionList = new MacaroonPermissionList$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ListPermissionsRequest$Type extends MessageType { + constructor() { + super("lnrpc.ListPermissionsRequest", []); + } + create(value?: PartialMessage): ListPermissionsRequest { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ListPermissionsRequest): ListPermissionsRequest { + return target ?? this.create(); + } + internalBinaryWrite(message: ListPermissionsRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ListPermissionsRequest + */ +export const ListPermissionsRequest = new ListPermissionsRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ListPermissionsResponse$Type extends MessageType { + constructor() { + super("lnrpc.ListPermissionsResponse", [ + { no: 1, name: "method_permissions", kind: "map", K: 9 /*ScalarType.STRING*/, V: { kind: "message", T: () => MacaroonPermissionList } } + ]); + } + create(value?: PartialMessage): ListPermissionsResponse { + const message = { methodPermissions: {} }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ListPermissionsResponse): ListPermissionsResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* map method_permissions */ 1: + this.binaryReadMap1(message.methodPermissions, reader, options); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + private binaryReadMap1(map: ListPermissionsResponse["methodPermissions"], reader: IBinaryReader, options: BinaryReadOptions): void { + let len = reader.uint32(), end = reader.pos + len, key: keyof ListPermissionsResponse["methodPermissions"] | undefined, val: ListPermissionsResponse["methodPermissions"][any] | undefined; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + key = reader.string(); + break; + case 2: + val = MacaroonPermissionList.internalBinaryRead(reader, reader.uint32(), options); + break; + default: throw new globalThis.Error("unknown map entry field for field lnrpc.ListPermissionsResponse.method_permissions"); + } + } + map[key ?? ""] = val ?? MacaroonPermissionList.create(); + } + internalBinaryWrite(message: ListPermissionsResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* map method_permissions = 1; */ + for (let k of Object.keys(message.methodPermissions)) { + writer.tag(1, WireType.LengthDelimited).fork().tag(1, WireType.LengthDelimited).string(k); + writer.tag(2, WireType.LengthDelimited).fork(); + MacaroonPermissionList.internalBinaryWrite(message.methodPermissions[k], writer, options); + writer.join().join(); + } + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ListPermissionsResponse + */ +export const ListPermissionsResponse = new ListPermissionsResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class Failure$Type extends MessageType { + constructor() { + super("lnrpc.Failure", [ + { no: 1, name: "code", kind: "enum", T: () => ["lnrpc.Failure.FailureCode", Failure_FailureCode] }, + { no: 3, name: "channel_update", kind: "message", T: () => ChannelUpdate }, + { no: 4, name: "htlc_msat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 5, name: "onion_sha_256", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 6, name: "cltv_expiry", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 7, name: "flags", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 8, name: "failure_source_index", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 9, name: "height", kind: "scalar", T: 13 /*ScalarType.UINT32*/ } + ]); + } + create(value?: PartialMessage): Failure { + const message = { code: 0, htlcMsat: 0n, onionSha256: new Uint8Array(0), cltvExpiry: 0, flags: 0, failureSourceIndex: 0, height: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: Failure): Failure { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.Failure.FailureCode code */ 1: + message.code = reader.int32(); + break; + case /* lnrpc.ChannelUpdate channel_update */ 3: + message.channelUpdate = ChannelUpdate.internalBinaryRead(reader, reader.uint32(), options, message.channelUpdate); + break; + case /* uint64 htlc_msat */ 4: + message.htlcMsat = reader.uint64().toBigInt(); + break; + case /* bytes onion_sha_256 */ 5: + message.onionSha256 = reader.bytes(); + break; + case /* uint32 cltv_expiry */ 6: + message.cltvExpiry = reader.uint32(); + break; + case /* uint32 flags */ 7: + message.flags = reader.uint32(); + break; + case /* uint32 failure_source_index */ 8: + message.failureSourceIndex = reader.uint32(); + break; + case /* uint32 height */ 9: + message.height = reader.uint32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: Failure, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.Failure.FailureCode code = 1; */ + if (message.code !== 0) + writer.tag(1, WireType.Varint).int32(message.code); + /* lnrpc.ChannelUpdate channel_update = 3; */ + if (message.channelUpdate) + ChannelUpdate.internalBinaryWrite(message.channelUpdate, writer.tag(3, WireType.LengthDelimited).fork(), options).join(); + /* uint64 htlc_msat = 4; */ + if (message.htlcMsat !== 0n) + writer.tag(4, WireType.Varint).uint64(message.htlcMsat); + /* bytes onion_sha_256 = 5; */ + if (message.onionSha256.length) + writer.tag(5, WireType.LengthDelimited).bytes(message.onionSha256); + /* uint32 cltv_expiry = 6; */ + if (message.cltvExpiry !== 0) + writer.tag(6, WireType.Varint).uint32(message.cltvExpiry); + /* uint32 flags = 7; */ + if (message.flags !== 0) + writer.tag(7, WireType.Varint).uint32(message.flags); + /* uint32 failure_source_index = 8; */ + if (message.failureSourceIndex !== 0) + writer.tag(8, WireType.Varint).uint32(message.failureSourceIndex); + /* uint32 height = 9; */ + if (message.height !== 0) + writer.tag(9, WireType.Varint).uint32(message.height); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.Failure + */ +export const Failure = new Failure$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ChannelUpdate$Type extends MessageType { + constructor() { + super("lnrpc.ChannelUpdate", [ + { no: 1, name: "signature", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "chain_hash", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 3, name: "chan_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/ }, + { no: 4, name: "timestamp", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 10, name: "message_flags", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 5, name: "channel_flags", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 6, name: "time_lock_delta", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 7, name: "htlc_minimum_msat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 8, name: "base_fee", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 9, name: "fee_rate", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 11, name: "htlc_maximum_msat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 12, name: "extra_opaque_data", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): ChannelUpdate { + const message = { signature: new Uint8Array(0), chainHash: new Uint8Array(0), chanId: "0", timestamp: 0, messageFlags: 0, channelFlags: 0, timeLockDelta: 0, htlcMinimumMsat: 0n, baseFee: 0, feeRate: 0, htlcMaximumMsat: 0n, extraOpaqueData: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ChannelUpdate): ChannelUpdate { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes signature */ 1: + message.signature = reader.bytes(); + break; + case /* bytes chain_hash */ 2: + message.chainHash = reader.bytes(); + break; + case /* uint64 chan_id = 3 [jstype = JS_STRING];*/ 3: + message.chanId = reader.uint64().toString(); + break; + case /* uint32 timestamp */ 4: + message.timestamp = reader.uint32(); + break; + case /* uint32 message_flags */ 10: + message.messageFlags = reader.uint32(); + break; + case /* uint32 channel_flags */ 5: + message.channelFlags = reader.uint32(); + break; + case /* uint32 time_lock_delta */ 6: + message.timeLockDelta = reader.uint32(); + break; + case /* uint64 htlc_minimum_msat */ 7: + message.htlcMinimumMsat = reader.uint64().toBigInt(); + break; + case /* uint32 base_fee */ 8: + message.baseFee = reader.uint32(); + break; + case /* uint32 fee_rate */ 9: + message.feeRate = reader.uint32(); + break; + case /* uint64 htlc_maximum_msat */ 11: + message.htlcMaximumMsat = reader.uint64().toBigInt(); + break; + case /* bytes extra_opaque_data */ 12: + message.extraOpaqueData = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ChannelUpdate, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes signature = 1; */ + if (message.signature.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.signature); + /* bytes chain_hash = 2; */ + if (message.chainHash.length) + writer.tag(2, WireType.LengthDelimited).bytes(message.chainHash); + /* uint64 chan_id = 3 [jstype = JS_STRING]; */ + if (message.chanId !== "0") + writer.tag(3, WireType.Varint).uint64(message.chanId); + /* uint32 timestamp = 4; */ + if (message.timestamp !== 0) + writer.tag(4, WireType.Varint).uint32(message.timestamp); + /* uint32 message_flags = 10; */ + if (message.messageFlags !== 0) + writer.tag(10, WireType.Varint).uint32(message.messageFlags); + /* uint32 channel_flags = 5; */ + if (message.channelFlags !== 0) + writer.tag(5, WireType.Varint).uint32(message.channelFlags); + /* uint32 time_lock_delta = 6; */ + if (message.timeLockDelta !== 0) + writer.tag(6, WireType.Varint).uint32(message.timeLockDelta); + /* uint64 htlc_minimum_msat = 7; */ + if (message.htlcMinimumMsat !== 0n) + writer.tag(7, WireType.Varint).uint64(message.htlcMinimumMsat); + /* uint32 base_fee = 8; */ + if (message.baseFee !== 0) + writer.tag(8, WireType.Varint).uint32(message.baseFee); + /* uint32 fee_rate = 9; */ + if (message.feeRate !== 0) + writer.tag(9, WireType.Varint).uint32(message.feeRate); + /* uint64 htlc_maximum_msat = 11; */ + if (message.htlcMaximumMsat !== 0n) + writer.tag(11, WireType.Varint).uint64(message.htlcMaximumMsat); + /* bytes extra_opaque_data = 12; */ + if (message.extraOpaqueData.length) + writer.tag(12, WireType.LengthDelimited).bytes(message.extraOpaqueData); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.ChannelUpdate + */ +export const ChannelUpdate = new ChannelUpdate$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class MacaroonId$Type extends MessageType { + constructor() { + super("lnrpc.MacaroonId", [ + { no: 1, name: "nonce", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "storageId", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 3, name: "ops", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => Op } + ]); + } + create(value?: PartialMessage): MacaroonId { + const message = { nonce: new Uint8Array(0), storageId: new Uint8Array(0), ops: [] }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: MacaroonId): MacaroonId { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes nonce */ 1: + message.nonce = reader.bytes(); + break; + case /* bytes storageId */ 2: + message.storageId = reader.bytes(); + break; + case /* repeated lnrpc.Op ops */ 3: + message.ops.push(Op.internalBinaryRead(reader, reader.uint32(), options)); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: MacaroonId, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes nonce = 1; */ + if (message.nonce.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.nonce); + /* bytes storageId = 2; */ + if (message.storageId.length) + writer.tag(2, WireType.LengthDelimited).bytes(message.storageId); + /* repeated lnrpc.Op ops = 3; */ + for (let i = 0; i < message.ops.length; i++) + Op.internalBinaryWrite(message.ops[i], writer.tag(3, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.MacaroonId + */ +export const MacaroonId = new MacaroonId$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class Op$Type extends MessageType { + constructor() { + super("lnrpc.Op", [ + { no: 1, name: "entity", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "actions", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): Op { + const message = { entity: "", actions: [] }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: Op): Op { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string entity */ 1: + message.entity = reader.string(); + break; + case /* repeated string actions */ 2: + message.actions.push(reader.string()); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: Op, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string entity = 1; */ + if (message.entity !== "") + writer.tag(1, WireType.LengthDelimited).string(message.entity); + /* repeated string actions = 2; */ + for (let i = 0; i < message.actions.length; i++) + writer.tag(2, WireType.LengthDelimited).string(message.actions[i]); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.Op + */ +export const Op = new Op$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class CheckMacPermRequest$Type extends MessageType { + constructor() { + super("lnrpc.CheckMacPermRequest", [ + { no: 1, name: "macaroon", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "permissions", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => MacaroonPermission }, + { no: 3, name: "fullMethod", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): CheckMacPermRequest { + const message = { macaroon: new Uint8Array(0), permissions: [], fullMethod: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: CheckMacPermRequest): CheckMacPermRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes macaroon */ 1: + message.macaroon = reader.bytes(); + break; + case /* repeated lnrpc.MacaroonPermission permissions */ 2: + message.permissions.push(MacaroonPermission.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* string fullMethod */ 3: + message.fullMethod = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: CheckMacPermRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes macaroon = 1; */ + if (message.macaroon.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.macaroon); + /* repeated lnrpc.MacaroonPermission permissions = 2; */ + for (let i = 0; i < message.permissions.length; i++) + MacaroonPermission.internalBinaryWrite(message.permissions[i], writer.tag(2, WireType.LengthDelimited).fork(), options).join(); + /* string fullMethod = 3; */ + if (message.fullMethod !== "") + writer.tag(3, WireType.LengthDelimited).string(message.fullMethod); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.CheckMacPermRequest + */ +export const CheckMacPermRequest = new CheckMacPermRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class CheckMacPermResponse$Type extends MessageType { + constructor() { + super("lnrpc.CheckMacPermResponse", [ + { no: 1, name: "valid", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): CheckMacPermResponse { + const message = { valid: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: CheckMacPermResponse): CheckMacPermResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bool valid */ 1: + message.valid = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: CheckMacPermResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bool valid = 1; */ + if (message.valid !== false) + writer.tag(1, WireType.Varint).bool(message.valid); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.CheckMacPermResponse + */ +export const CheckMacPermResponse = new CheckMacPermResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class RPCMiddlewareRequest$Type extends MessageType { + constructor() { + super("lnrpc.RPCMiddlewareRequest", [ + { no: 1, name: "request_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 2, name: "raw_macaroon", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 3, name: "custom_caveat_condition", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 4, name: "stream_auth", kind: "message", oneof: "interceptType", T: () => StreamAuth }, + { no: 5, name: "request", kind: "message", oneof: "interceptType", T: () => RPCMessage }, + { no: 6, name: "response", kind: "message", oneof: "interceptType", T: () => RPCMessage }, + { no: 8, name: "reg_complete", kind: "scalar", oneof: "interceptType", T: 8 /*ScalarType.BOOL*/ }, + { no: 7, name: "msg_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): RPCMiddlewareRequest { + const message = { requestId: 0n, rawMacaroon: new Uint8Array(0), customCaveatCondition: "", interceptType: { oneofKind: undefined }, msgId: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: RPCMiddlewareRequest): RPCMiddlewareRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint64 request_id */ 1: + message.requestId = reader.uint64().toBigInt(); + break; + case /* bytes raw_macaroon */ 2: + message.rawMacaroon = reader.bytes(); + break; + case /* string custom_caveat_condition */ 3: + message.customCaveatCondition = reader.string(); + break; + case /* lnrpc.StreamAuth stream_auth */ 4: + message.interceptType = { + oneofKind: "streamAuth", + streamAuth: StreamAuth.internalBinaryRead(reader, reader.uint32(), options, (message.interceptType as any).streamAuth) + }; + break; + case /* lnrpc.RPCMessage request */ 5: + message.interceptType = { + oneofKind: "request", + request: RPCMessage.internalBinaryRead(reader, reader.uint32(), options, (message.interceptType as any).request) + }; + break; + case /* lnrpc.RPCMessage response */ 6: + message.interceptType = { + oneofKind: "response", + response: RPCMessage.internalBinaryRead(reader, reader.uint32(), options, (message.interceptType as any).response) + }; + break; + case /* bool reg_complete */ 8: + message.interceptType = { + oneofKind: "regComplete", + regComplete: reader.bool() + }; + break; + case /* uint64 msg_id */ 7: + message.msgId = reader.uint64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: RPCMiddlewareRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint64 request_id = 1; */ + if (message.requestId !== 0n) + writer.tag(1, WireType.Varint).uint64(message.requestId); + /* bytes raw_macaroon = 2; */ + if (message.rawMacaroon.length) + writer.tag(2, WireType.LengthDelimited).bytes(message.rawMacaroon); + /* string custom_caveat_condition = 3; */ + if (message.customCaveatCondition !== "") + writer.tag(3, WireType.LengthDelimited).string(message.customCaveatCondition); + /* lnrpc.StreamAuth stream_auth = 4; */ + if (message.interceptType.oneofKind === "streamAuth") + StreamAuth.internalBinaryWrite(message.interceptType.streamAuth, writer.tag(4, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.RPCMessage request = 5; */ + if (message.interceptType.oneofKind === "request") + RPCMessage.internalBinaryWrite(message.interceptType.request, writer.tag(5, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.RPCMessage response = 6; */ + if (message.interceptType.oneofKind === "response") + RPCMessage.internalBinaryWrite(message.interceptType.response, writer.tag(6, WireType.LengthDelimited).fork(), options).join(); + /* bool reg_complete = 8; */ + if (message.interceptType.oneofKind === "regComplete") + writer.tag(8, WireType.Varint).bool(message.interceptType.regComplete); + /* uint64 msg_id = 7; */ + if (message.msgId !== 0n) + writer.tag(7, WireType.Varint).uint64(message.msgId); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.RPCMiddlewareRequest + */ +export const RPCMiddlewareRequest = new RPCMiddlewareRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class StreamAuth$Type extends MessageType { + constructor() { + super("lnrpc.StreamAuth", [ + { no: 1, name: "method_full_uri", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): StreamAuth { + const message = { methodFullUri: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: StreamAuth): StreamAuth { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string method_full_uri */ 1: + message.methodFullUri = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: StreamAuth, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string method_full_uri = 1; */ + if (message.methodFullUri !== "") + writer.tag(1, WireType.LengthDelimited).string(message.methodFullUri); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.StreamAuth + */ +export const StreamAuth = new StreamAuth$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class RPCMessage$Type extends MessageType { + constructor() { + super("lnrpc.RPCMessage", [ + { no: 1, name: "method_full_uri", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "stream_rpc", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 3, name: "type_name", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 4, name: "serialized", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 5, name: "is_error", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): RPCMessage { + const message = { methodFullUri: "", streamRpc: false, typeName: "", serialized: new Uint8Array(0), isError: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: RPCMessage): RPCMessage { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string method_full_uri */ 1: + message.methodFullUri = reader.string(); + break; + case /* bool stream_rpc */ 2: + message.streamRpc = reader.bool(); + break; + case /* string type_name */ 3: + message.typeName = reader.string(); + break; + case /* bytes serialized */ 4: + message.serialized = reader.bytes(); + break; + case /* bool is_error */ 5: + message.isError = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: RPCMessage, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string method_full_uri = 1; */ + if (message.methodFullUri !== "") + writer.tag(1, WireType.LengthDelimited).string(message.methodFullUri); + /* bool stream_rpc = 2; */ + if (message.streamRpc !== false) + writer.tag(2, WireType.Varint).bool(message.streamRpc); + /* string type_name = 3; */ + if (message.typeName !== "") + writer.tag(3, WireType.LengthDelimited).string(message.typeName); + /* bytes serialized = 4; */ + if (message.serialized.length) + writer.tag(4, WireType.LengthDelimited).bytes(message.serialized); + /* bool is_error = 5; */ + if (message.isError !== false) + writer.tag(5, WireType.Varint).bool(message.isError); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.RPCMessage + */ +export const RPCMessage = new RPCMessage$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class RPCMiddlewareResponse$Type extends MessageType { + constructor() { + super("lnrpc.RPCMiddlewareResponse", [ + { no: 1, name: "ref_msg_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 2, name: "register", kind: "message", oneof: "middlewareMessage", T: () => MiddlewareRegistration }, + { no: 3, name: "feedback", kind: "message", oneof: "middlewareMessage", T: () => InterceptFeedback } + ]); + } + create(value?: PartialMessage): RPCMiddlewareResponse { + const message = { refMsgId: 0n, middlewareMessage: { oneofKind: undefined } }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: RPCMiddlewareResponse): RPCMiddlewareResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint64 ref_msg_id */ 1: + message.refMsgId = reader.uint64().toBigInt(); + break; + case /* lnrpc.MiddlewareRegistration register */ 2: + message.middlewareMessage = { + oneofKind: "register", + register: MiddlewareRegistration.internalBinaryRead(reader, reader.uint32(), options, (message.middlewareMessage as any).register) + }; + break; + case /* lnrpc.InterceptFeedback feedback */ 3: + message.middlewareMessage = { + oneofKind: "feedback", + feedback: InterceptFeedback.internalBinaryRead(reader, reader.uint32(), options, (message.middlewareMessage as any).feedback) + }; + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: RPCMiddlewareResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint64 ref_msg_id = 1; */ + if (message.refMsgId !== 0n) + writer.tag(1, WireType.Varint).uint64(message.refMsgId); + /* lnrpc.MiddlewareRegistration register = 2; */ + if (message.middlewareMessage.oneofKind === "register") + MiddlewareRegistration.internalBinaryWrite(message.middlewareMessage.register, writer.tag(2, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.InterceptFeedback feedback = 3; */ + if (message.middlewareMessage.oneofKind === "feedback") + InterceptFeedback.internalBinaryWrite(message.middlewareMessage.feedback, writer.tag(3, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.RPCMiddlewareResponse + */ +export const RPCMiddlewareResponse = new RPCMiddlewareResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class MiddlewareRegistration$Type extends MessageType { + constructor() { + super("lnrpc.MiddlewareRegistration", [ + { no: 1, name: "middleware_name", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "custom_macaroon_caveat_name", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 3, name: "read_only_mode", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): MiddlewareRegistration { + const message = { middlewareName: "", customMacaroonCaveatName: "", readOnlyMode: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: MiddlewareRegistration): MiddlewareRegistration { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string middleware_name */ 1: + message.middlewareName = reader.string(); + break; + case /* string custom_macaroon_caveat_name */ 2: + message.customMacaroonCaveatName = reader.string(); + break; + case /* bool read_only_mode */ 3: + message.readOnlyMode = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: MiddlewareRegistration, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string middleware_name = 1; */ + if (message.middlewareName !== "") + writer.tag(1, WireType.LengthDelimited).string(message.middlewareName); + /* string custom_macaroon_caveat_name = 2; */ + if (message.customMacaroonCaveatName !== "") + writer.tag(2, WireType.LengthDelimited).string(message.customMacaroonCaveatName); + /* bool read_only_mode = 3; */ + if (message.readOnlyMode !== false) + writer.tag(3, WireType.Varint).bool(message.readOnlyMode); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.MiddlewareRegistration + */ +export const MiddlewareRegistration = new MiddlewareRegistration$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class InterceptFeedback$Type extends MessageType { + constructor() { + super("lnrpc.InterceptFeedback", [ + { no: 1, name: "error", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "replace_response", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 3, name: "replacement_serialized", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): InterceptFeedback { + const message = { error: "", replaceResponse: false, replacementSerialized: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: InterceptFeedback): InterceptFeedback { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string error */ 1: + message.error = reader.string(); + break; + case /* bool replace_response */ 2: + message.replaceResponse = reader.bool(); + break; + case /* bytes replacement_serialized */ 3: + message.replacementSerialized = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: InterceptFeedback, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string error = 1; */ + if (message.error !== "") + writer.tag(1, WireType.LengthDelimited).string(message.error); + /* bool replace_response = 2; */ + if (message.replaceResponse !== false) + writer.tag(2, WireType.Varint).bool(message.replaceResponse); + /* bytes replacement_serialized = 3; */ + if (message.replacementSerialized.length) + writer.tag(3, WireType.LengthDelimited).bytes(message.replacementSerialized); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message lnrpc.InterceptFeedback + */ +export const InterceptFeedback = new InterceptFeedback$Type(); +/** + * @generated ServiceType for protobuf service lnrpc.Lightning + */ +export const Lightning = new ServiceType("lnrpc.Lightning", [ + { name: "WalletBalance", options: {}, I: WalletBalanceRequest, O: WalletBalanceResponse }, + { name: "ChannelBalance", options: {}, I: ChannelBalanceRequest, O: ChannelBalanceResponse }, + { name: "GetTransactions", options: {}, I: GetTransactionsRequest, O: TransactionDetails }, + { name: "EstimateFee", options: {}, I: EstimateFeeRequest, O: EstimateFeeResponse }, + { name: "SendCoins", options: {}, I: SendCoinsRequest, O: SendCoinsResponse }, + { name: "ListUnspent", options: {}, I: ListUnspentRequest, O: ListUnspentResponse }, + { name: "SubscribeTransactions", serverStreaming: true, options: {}, I: GetTransactionsRequest, O: Transaction }, + { name: "SendMany", options: {}, I: SendManyRequest, O: SendManyResponse }, + { name: "NewAddress", options: {}, I: NewAddressRequest, O: NewAddressResponse }, + { name: "SignMessage", options: {}, I: SignMessageRequest, O: SignMessageResponse }, + { name: "VerifyMessage", options: {}, I: VerifyMessageRequest, O: VerifyMessageResponse }, + { name: "ConnectPeer", options: {}, I: ConnectPeerRequest, O: ConnectPeerResponse }, + { name: "DisconnectPeer", options: {}, I: DisconnectPeerRequest, O: DisconnectPeerResponse }, + { name: "ListPeers", options: {}, I: ListPeersRequest, O: ListPeersResponse }, + { name: "SubscribePeerEvents", serverStreaming: true, options: {}, I: PeerEventSubscription, O: PeerEvent }, + { name: "GetInfo", options: {}, I: GetInfoRequest, O: GetInfoResponse }, + { name: "GetRecoveryInfo", options: {}, I: GetRecoveryInfoRequest, O: GetRecoveryInfoResponse }, + { name: "PendingChannels", options: {}, I: PendingChannelsRequest, O: PendingChannelsResponse }, + { name: "ListChannels", options: {}, I: ListChannelsRequest, O: ListChannelsResponse }, + { name: "SubscribeChannelEvents", serverStreaming: true, options: {}, I: ChannelEventSubscription, O: ChannelEventUpdate }, + { name: "ClosedChannels", options: {}, I: ClosedChannelsRequest, O: ClosedChannelsResponse }, + { name: "OpenChannelSync", options: {}, I: OpenChannelRequest, O: ChannelPoint }, + { name: "OpenChannel", serverStreaming: true, options: {}, I: OpenChannelRequest, O: OpenStatusUpdate }, + { name: "BatchOpenChannel", options: {}, I: BatchOpenChannelRequest, O: BatchOpenChannelResponse }, + { name: "FundingStateStep", options: {}, I: FundingTransitionMsg, O: FundingStateStepResp }, + { name: "ChannelAcceptor", serverStreaming: true, clientStreaming: true, options: {}, I: ChannelAcceptResponse, O: ChannelAcceptRequest }, + { name: "CloseChannel", serverStreaming: true, options: {}, I: CloseChannelRequest, O: CloseStatusUpdate }, + { name: "AbandonChannel", options: {}, I: AbandonChannelRequest, O: AbandonChannelResponse }, + { name: "SendPayment", serverStreaming: true, clientStreaming: true, options: {}, I: SendRequest, O: SendResponse }, + { name: "SendPaymentSync", options: {}, I: SendRequest, O: SendResponse }, + { name: "SendToRoute", serverStreaming: true, clientStreaming: true, options: {}, I: SendToRouteRequest, O: SendResponse }, + { name: "SendToRouteSync", options: {}, I: SendToRouteRequest, O: SendResponse }, + { name: "AddInvoice", options: {}, I: Invoice, O: AddInvoiceResponse }, + { name: "ListInvoices", options: {}, I: ListInvoiceRequest, O: ListInvoiceResponse }, + { name: "LookupInvoice", options: {}, I: PaymentHash, O: Invoice }, + { name: "SubscribeInvoices", serverStreaming: true, options: {}, I: InvoiceSubscription, O: Invoice }, + { name: "DecodePayReq", options: {}, I: PayReqString, O: PayReq }, + { name: "ListPayments", options: {}, I: ListPaymentsRequest, O: ListPaymentsResponse }, + { name: "DeletePayment", options: {}, I: DeletePaymentRequest, O: DeletePaymentResponse }, + { name: "DeleteAllPayments", options: {}, I: DeleteAllPaymentsRequest, O: DeleteAllPaymentsResponse }, + { name: "DescribeGraph", options: {}, I: ChannelGraphRequest, O: ChannelGraph }, + { name: "GetNodeMetrics", options: {}, I: NodeMetricsRequest, O: NodeMetricsResponse }, + { name: "GetChanInfo", options: {}, I: ChanInfoRequest, O: ChannelEdge }, + { name: "GetNodeInfo", options: {}, I: NodeInfoRequest, O: NodeInfo }, + { name: "QueryRoutes", options: {}, I: QueryRoutesRequest, O: QueryRoutesResponse }, + { name: "GetNetworkInfo", options: {}, I: NetworkInfoRequest, O: NetworkInfo }, + { name: "StopDaemon", options: {}, I: StopRequest, O: StopResponse }, + { name: "SubscribeChannelGraph", serverStreaming: true, options: {}, I: GraphTopologySubscription, O: GraphTopologyUpdate }, + { name: "DebugLevel", options: {}, I: DebugLevelRequest, O: DebugLevelResponse }, + { name: "FeeReport", options: {}, I: FeeReportRequest, O: FeeReportResponse }, + { name: "UpdateChannelPolicy", options: {}, I: PolicyUpdateRequest, O: PolicyUpdateResponse }, + { name: "ForwardingHistory", options: {}, I: ForwardingHistoryRequest, O: ForwardingHistoryResponse }, + { name: "ExportChannelBackup", options: {}, I: ExportChannelBackupRequest, O: ChannelBackup }, + { name: "ExportAllChannelBackups", options: {}, I: ChanBackupExportRequest, O: ChanBackupSnapshot }, + { name: "VerifyChanBackup", options: {}, I: ChanBackupSnapshot, O: VerifyChanBackupResponse }, + { name: "RestoreChannelBackups", options: {}, I: RestoreChanBackupRequest, O: RestoreBackupResponse }, + { name: "SubscribeChannelBackups", serverStreaming: true, options: {}, I: ChannelBackupSubscription, O: ChanBackupSnapshot }, + { name: "BakeMacaroon", options: {}, I: BakeMacaroonRequest, O: BakeMacaroonResponse }, + { name: "ListMacaroonIDs", options: {}, I: ListMacaroonIDsRequest, O: ListMacaroonIDsResponse }, + { name: "DeleteMacaroonID", options: {}, I: DeleteMacaroonIDRequest, O: DeleteMacaroonIDResponse }, + { name: "ListPermissions", options: {}, I: ListPermissionsRequest, O: ListPermissionsResponse }, + { name: "CheckMacaroonPermissions", options: {}, I: CheckMacPermRequest, O: CheckMacPermResponse }, + { name: "RegisterRPCMiddleware", serverStreaming: true, clientStreaming: true, options: {}, I: RPCMiddlewareResponse, O: RPCMiddlewareRequest }, + { name: "SendCustomMessage", options: {}, I: SendCustomMessageRequest, O: SendCustomMessageResponse }, + { name: "SubscribeCustomMessages", serverStreaming: true, options: {}, I: SubscribeCustomMessagesRequest, O: CustomMessage }, + { name: "ListAliases", options: {}, I: ListAliasesRequest, O: ListAliasesResponse }, + { name: "LookupHtlc", options: {}, I: LookupHtlcRequest, O: LookupHtlcResponse } +]); diff --git a/proto/lnd/router.client.ts b/proto/lnd/router.client.ts new file mode 100644 index 00000000..6502d78b --- /dev/null +++ b/proto/lnd/router.client.ts @@ -0,0 +1,446 @@ +// @generated by protobuf-ts 2.5.0 +// @generated from protobuf file "router.proto" (package "routerrpc", syntax proto3) +// tslint:disable +import type { RpcTransport } from "@protobuf-ts/runtime-rpc"; +import type { ServiceInfo } from "@protobuf-ts/runtime-rpc"; +import { Router } from "./router"; +import type { UpdateChanStatusResponse } from "./router"; +import type { UpdateChanStatusRequest } from "./router"; +import type { ForwardHtlcInterceptRequest } from "./router"; +import type { ForwardHtlcInterceptResponse } from "./router"; +import type { DuplexStreamingCall } from "@protobuf-ts/runtime-rpc"; +import type { PaymentStatus } from "./router"; +import type { HtlcEvent } from "./router"; +import type { SubscribeHtlcEventsRequest } from "./router"; +import type { BuildRouteResponse } from "./router"; +import type { BuildRouteRequest } from "./router"; +import type { QueryProbabilityResponse } from "./router"; +import type { QueryProbabilityRequest } from "./router"; +import type { SetMissionControlConfigResponse } from "./router"; +import type { SetMissionControlConfigRequest } from "./router"; +import type { GetMissionControlConfigResponse } from "./router"; +import type { GetMissionControlConfigRequest } from "./router"; +import type { XImportMissionControlResponse } from "./router"; +import type { XImportMissionControlRequest } from "./router"; +import type { QueryMissionControlResponse } from "./router"; +import type { QueryMissionControlRequest } from "./router"; +import type { ResetMissionControlResponse } from "./router"; +import type { ResetMissionControlRequest } from "./router"; +import type { HTLCAttempt } from "./lightning"; +import type { SendToRouteResponse } from "./router"; +import type { SendToRouteRequest } from "./router"; +import type { RouteFeeResponse } from "./router"; +import type { RouteFeeRequest } from "./router"; +import type { UnaryCall } from "@protobuf-ts/runtime-rpc"; +import type { TrackPaymentsRequest } from "./router"; +import type { TrackPaymentRequest } from "./router"; +import { stackIntercept } from "@protobuf-ts/runtime-rpc"; +import type { Payment } from "./lightning"; +import type { SendPaymentRequest } from "./router"; +import type { ServerStreamingCall } from "@protobuf-ts/runtime-rpc"; +import type { RpcOptions } from "@protobuf-ts/runtime-rpc"; +/** + * Router is a service that offers advanced interaction with the router + * subsystem of the daemon. + * + * @generated from protobuf service routerrpc.Router + */ +export interface IRouterClient { + /** + * + * SendPaymentV2 attempts to route a payment described by the passed + * PaymentRequest to the final destination. The call returns a stream of + * payment updates. + * + * @generated from protobuf rpc: SendPaymentV2(routerrpc.SendPaymentRequest) returns (stream lnrpc.Payment); + */ + sendPaymentV2(input: SendPaymentRequest, options?: RpcOptions): ServerStreamingCall; + /** + * + * TrackPaymentV2 returns an update stream for the payment identified by the + * payment hash. + * + * @generated from protobuf rpc: TrackPaymentV2(routerrpc.TrackPaymentRequest) returns (stream lnrpc.Payment); + */ + trackPaymentV2(input: TrackPaymentRequest, options?: RpcOptions): ServerStreamingCall; + /** + * + * TrackPayments returns an update stream for every payment that is not in a + * terminal state. Note that if payments are in-flight while starting a new + * subscription, the start of the payment stream could produce out-of-order + * and/or duplicate events. In order to get updates for every in-flight + * payment attempt make sure to subscribe to this method before initiating any + * payments. + * + * @generated from protobuf rpc: TrackPayments(routerrpc.TrackPaymentsRequest) returns (stream lnrpc.Payment); + */ + trackPayments(input: TrackPaymentsRequest, options?: RpcOptions): ServerStreamingCall; + /** + * + * EstimateRouteFee allows callers to obtain a lower bound w.r.t how much it + * may cost to send an HTLC to the target end destination. + * + * @generated from protobuf rpc: EstimateRouteFee(routerrpc.RouteFeeRequest) returns (routerrpc.RouteFeeResponse); + */ + estimateRouteFee(input: RouteFeeRequest, options?: RpcOptions): UnaryCall; + /** + * + * Deprecated, use SendToRouteV2. SendToRoute attempts to make a payment via + * the specified route. This method differs from SendPayment in that it + * allows users to specify a full route manually. This can be used for + * things like rebalancing, and atomic swaps. It differs from the newer + * SendToRouteV2 in that it doesn't return the full HTLC information. + * + * @deprecated + * @generated from protobuf rpc: SendToRoute(routerrpc.SendToRouteRequest) returns (routerrpc.SendToRouteResponse); + */ + sendToRoute(input: SendToRouteRequest, options?: RpcOptions): UnaryCall; + /** + * + * SendToRouteV2 attempts to make a payment via the specified route. This + * method differs from SendPayment in that it allows users to specify a full + * route manually. This can be used for things like rebalancing, and atomic + * swaps. + * + * @generated from protobuf rpc: SendToRouteV2(routerrpc.SendToRouteRequest) returns (lnrpc.HTLCAttempt); + */ + sendToRouteV2(input: SendToRouteRequest, options?: RpcOptions): UnaryCall; + /** + * + * ResetMissionControl clears all mission control state and starts with a clean + * slate. + * + * @generated from protobuf rpc: ResetMissionControl(routerrpc.ResetMissionControlRequest) returns (routerrpc.ResetMissionControlResponse); + */ + resetMissionControl(input: ResetMissionControlRequest, options?: RpcOptions): UnaryCall; + /** + * + * QueryMissionControl exposes the internal mission control state to callers. + * It is a development feature. + * + * @generated from protobuf rpc: QueryMissionControl(routerrpc.QueryMissionControlRequest) returns (routerrpc.QueryMissionControlResponse); + */ + queryMissionControl(input: QueryMissionControlRequest, options?: RpcOptions): UnaryCall; + /** + * + * XImportMissionControl is an experimental API that imports the state provided + * to the internal mission control's state, using all results which are more + * recent than our existing values. These values will only be imported + * in-memory, and will not be persisted across restarts. + * + * @generated from protobuf rpc: XImportMissionControl(routerrpc.XImportMissionControlRequest) returns (routerrpc.XImportMissionControlResponse); + */ + xImportMissionControl(input: XImportMissionControlRequest, options?: RpcOptions): UnaryCall; + /** + * + * GetMissionControlConfig returns mission control's current config. + * + * @generated from protobuf rpc: GetMissionControlConfig(routerrpc.GetMissionControlConfigRequest) returns (routerrpc.GetMissionControlConfigResponse); + */ + getMissionControlConfig(input: GetMissionControlConfigRequest, options?: RpcOptions): UnaryCall; + /** + * + * SetMissionControlConfig will set mission control's config, if the config + * provided is valid. + * + * @generated from protobuf rpc: SetMissionControlConfig(routerrpc.SetMissionControlConfigRequest) returns (routerrpc.SetMissionControlConfigResponse); + */ + setMissionControlConfig(input: SetMissionControlConfigRequest, options?: RpcOptions): UnaryCall; + /** + * + * QueryProbability returns the current success probability estimate for a + * given node pair and amount. + * + * @generated from protobuf rpc: QueryProbability(routerrpc.QueryProbabilityRequest) returns (routerrpc.QueryProbabilityResponse); + */ + queryProbability(input: QueryProbabilityRequest, options?: RpcOptions): UnaryCall; + /** + * + * BuildRoute builds a fully specified route based on a list of hop public + * keys. It retrieves the relevant channel policies from the graph in order to + * calculate the correct fees and time locks. + * + * @generated from protobuf rpc: BuildRoute(routerrpc.BuildRouteRequest) returns (routerrpc.BuildRouteResponse); + */ + buildRoute(input: BuildRouteRequest, options?: RpcOptions): UnaryCall; + /** + * + * SubscribeHtlcEvents creates a uni-directional stream from the server to + * the client which delivers a stream of htlc events. + * + * @generated from protobuf rpc: SubscribeHtlcEvents(routerrpc.SubscribeHtlcEventsRequest) returns (stream routerrpc.HtlcEvent); + */ + subscribeHtlcEvents(input: SubscribeHtlcEventsRequest, options?: RpcOptions): ServerStreamingCall; + /** + * + * Deprecated, use SendPaymentV2. SendPayment attempts to route a payment + * described by the passed PaymentRequest to the final destination. The call + * returns a stream of payment status updates. + * + * @deprecated + * @generated from protobuf rpc: SendPayment(routerrpc.SendPaymentRequest) returns (stream routerrpc.PaymentStatus); + */ + sendPayment(input: SendPaymentRequest, options?: RpcOptions): ServerStreamingCall; + /** + * + * Deprecated, use TrackPaymentV2. TrackPayment returns an update stream for + * the payment identified by the payment hash. + * + * @deprecated + * @generated from protobuf rpc: TrackPayment(routerrpc.TrackPaymentRequest) returns (stream routerrpc.PaymentStatus); + */ + trackPayment(input: TrackPaymentRequest, options?: RpcOptions): ServerStreamingCall; + /** + * * + * HtlcInterceptor dispatches a bi-directional streaming RPC in which + * Forwarded HTLC requests are sent to the client and the client responds with + * a boolean that tells LND if this htlc should be intercepted. + * In case of interception, the htlc can be either settled, cancelled or + * resumed later by using the ResolveHoldForward endpoint. + * + * @generated from protobuf rpc: HtlcInterceptor(stream routerrpc.ForwardHtlcInterceptResponse) returns (stream routerrpc.ForwardHtlcInterceptRequest); + */ + htlcInterceptor(options?: RpcOptions): DuplexStreamingCall; + /** + * + * UpdateChanStatus attempts to manually set the state of a channel + * (enabled, disabled, or auto). A manual "disable" request will cause the + * channel to stay disabled until a subsequent manual request of either + * "enable" or "auto". + * + * @generated from protobuf rpc: UpdateChanStatus(routerrpc.UpdateChanStatusRequest) returns (routerrpc.UpdateChanStatusResponse); + */ + updateChanStatus(input: UpdateChanStatusRequest, options?: RpcOptions): UnaryCall; +} +/** + * Router is a service that offers advanced interaction with the router + * subsystem of the daemon. + * + * @generated from protobuf service routerrpc.Router + */ +export class RouterClient implements IRouterClient, ServiceInfo { + typeName = Router.typeName; + methods = Router.methods; + options = Router.options; + constructor(private readonly _transport: RpcTransport) { + } + /** + * + * SendPaymentV2 attempts to route a payment described by the passed + * PaymentRequest to the final destination. The call returns a stream of + * payment updates. + * + * @generated from protobuf rpc: SendPaymentV2(routerrpc.SendPaymentRequest) returns (stream lnrpc.Payment); + */ + sendPaymentV2(input: SendPaymentRequest, options?: RpcOptions): ServerStreamingCall { + const method = this.methods[0], opt = this._transport.mergeOptions(options); + return stackIntercept("serverStreaming", this._transport, method, opt, input); + } + /** + * + * TrackPaymentV2 returns an update stream for the payment identified by the + * payment hash. + * + * @generated from protobuf rpc: TrackPaymentV2(routerrpc.TrackPaymentRequest) returns (stream lnrpc.Payment); + */ + trackPaymentV2(input: TrackPaymentRequest, options?: RpcOptions): ServerStreamingCall { + const method = this.methods[1], opt = this._transport.mergeOptions(options); + return stackIntercept("serverStreaming", this._transport, method, opt, input); + } + /** + * + * TrackPayments returns an update stream for every payment that is not in a + * terminal state. Note that if payments are in-flight while starting a new + * subscription, the start of the payment stream could produce out-of-order + * and/or duplicate events. In order to get updates for every in-flight + * payment attempt make sure to subscribe to this method before initiating any + * payments. + * + * @generated from protobuf rpc: TrackPayments(routerrpc.TrackPaymentsRequest) returns (stream lnrpc.Payment); + */ + trackPayments(input: TrackPaymentsRequest, options?: RpcOptions): ServerStreamingCall { + const method = this.methods[2], opt = this._transport.mergeOptions(options); + return stackIntercept("serverStreaming", this._transport, method, opt, input); + } + /** + * + * EstimateRouteFee allows callers to obtain a lower bound w.r.t how much it + * may cost to send an HTLC to the target end destination. + * + * @generated from protobuf rpc: EstimateRouteFee(routerrpc.RouteFeeRequest) returns (routerrpc.RouteFeeResponse); + */ + estimateRouteFee(input: RouteFeeRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[3], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * Deprecated, use SendToRouteV2. SendToRoute attempts to make a payment via + * the specified route. This method differs from SendPayment in that it + * allows users to specify a full route manually. This can be used for + * things like rebalancing, and atomic swaps. It differs from the newer + * SendToRouteV2 in that it doesn't return the full HTLC information. + * + * @deprecated + * @generated from protobuf rpc: SendToRoute(routerrpc.SendToRouteRequest) returns (routerrpc.SendToRouteResponse); + */ + sendToRoute(input: SendToRouteRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[4], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * SendToRouteV2 attempts to make a payment via the specified route. This + * method differs from SendPayment in that it allows users to specify a full + * route manually. This can be used for things like rebalancing, and atomic + * swaps. + * + * @generated from protobuf rpc: SendToRouteV2(routerrpc.SendToRouteRequest) returns (lnrpc.HTLCAttempt); + */ + sendToRouteV2(input: SendToRouteRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[5], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * ResetMissionControl clears all mission control state and starts with a clean + * slate. + * + * @generated from protobuf rpc: ResetMissionControl(routerrpc.ResetMissionControlRequest) returns (routerrpc.ResetMissionControlResponse); + */ + resetMissionControl(input: ResetMissionControlRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[6], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * QueryMissionControl exposes the internal mission control state to callers. + * It is a development feature. + * + * @generated from protobuf rpc: QueryMissionControl(routerrpc.QueryMissionControlRequest) returns (routerrpc.QueryMissionControlResponse); + */ + queryMissionControl(input: QueryMissionControlRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[7], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * XImportMissionControl is an experimental API that imports the state provided + * to the internal mission control's state, using all results which are more + * recent than our existing values. These values will only be imported + * in-memory, and will not be persisted across restarts. + * + * @generated from protobuf rpc: XImportMissionControl(routerrpc.XImportMissionControlRequest) returns (routerrpc.XImportMissionControlResponse); + */ + xImportMissionControl(input: XImportMissionControlRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[8], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * GetMissionControlConfig returns mission control's current config. + * + * @generated from protobuf rpc: GetMissionControlConfig(routerrpc.GetMissionControlConfigRequest) returns (routerrpc.GetMissionControlConfigResponse); + */ + getMissionControlConfig(input: GetMissionControlConfigRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[9], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * SetMissionControlConfig will set mission control's config, if the config + * provided is valid. + * + * @generated from protobuf rpc: SetMissionControlConfig(routerrpc.SetMissionControlConfigRequest) returns (routerrpc.SetMissionControlConfigResponse); + */ + setMissionControlConfig(input: SetMissionControlConfigRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[10], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * QueryProbability returns the current success probability estimate for a + * given node pair and amount. + * + * @generated from protobuf rpc: QueryProbability(routerrpc.QueryProbabilityRequest) returns (routerrpc.QueryProbabilityResponse); + */ + queryProbability(input: QueryProbabilityRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[11], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * BuildRoute builds a fully specified route based on a list of hop public + * keys. It retrieves the relevant channel policies from the graph in order to + * calculate the correct fees and time locks. + * + * @generated from protobuf rpc: BuildRoute(routerrpc.BuildRouteRequest) returns (routerrpc.BuildRouteResponse); + */ + buildRoute(input: BuildRouteRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[12], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * + * SubscribeHtlcEvents creates a uni-directional stream from the server to + * the client which delivers a stream of htlc events. + * + * @generated from protobuf rpc: SubscribeHtlcEvents(routerrpc.SubscribeHtlcEventsRequest) returns (stream routerrpc.HtlcEvent); + */ + subscribeHtlcEvents(input: SubscribeHtlcEventsRequest, options?: RpcOptions): ServerStreamingCall { + const method = this.methods[13], opt = this._transport.mergeOptions(options); + return stackIntercept("serverStreaming", this._transport, method, opt, input); + } + /** + * + * Deprecated, use SendPaymentV2. SendPayment attempts to route a payment + * described by the passed PaymentRequest to the final destination. The call + * returns a stream of payment status updates. + * + * @deprecated + * @generated from protobuf rpc: SendPayment(routerrpc.SendPaymentRequest) returns (stream routerrpc.PaymentStatus); + */ + sendPayment(input: SendPaymentRequest, options?: RpcOptions): ServerStreamingCall { + const method = this.methods[14], opt = this._transport.mergeOptions(options); + return stackIntercept("serverStreaming", this._transport, method, opt, input); + } + /** + * + * Deprecated, use TrackPaymentV2. TrackPayment returns an update stream for + * the payment identified by the payment hash. + * + * @deprecated + * @generated from protobuf rpc: TrackPayment(routerrpc.TrackPaymentRequest) returns (stream routerrpc.PaymentStatus); + */ + trackPayment(input: TrackPaymentRequest, options?: RpcOptions): ServerStreamingCall { + const method = this.methods[15], opt = this._transport.mergeOptions(options); + return stackIntercept("serverStreaming", this._transport, method, opt, input); + } + /** + * * + * HtlcInterceptor dispatches a bi-directional streaming RPC in which + * Forwarded HTLC requests are sent to the client and the client responds with + * a boolean that tells LND if this htlc should be intercepted. + * In case of interception, the htlc can be either settled, cancelled or + * resumed later by using the ResolveHoldForward endpoint. + * + * @generated from protobuf rpc: HtlcInterceptor(stream routerrpc.ForwardHtlcInterceptResponse) returns (stream routerrpc.ForwardHtlcInterceptRequest); + */ + htlcInterceptor(options?: RpcOptions): DuplexStreamingCall { + const method = this.methods[16], opt = this._transport.mergeOptions(options); + return stackIntercept("duplex", this._transport, method, opt); + } + /** + * + * UpdateChanStatus attempts to manually set the state of a channel + * (enabled, disabled, or auto). A manual "disable" request will cause the + * channel to stay disabled until a subsequent manual request of either + * "enable" or "auto". + * + * @generated from protobuf rpc: UpdateChanStatus(routerrpc.UpdateChanStatusRequest) returns (routerrpc.UpdateChanStatusResponse); + */ + updateChanStatus(input: UpdateChanStatusRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[17], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } +} diff --git a/proto/lnd/router.ts b/proto/lnd/router.ts new file mode 100644 index 00000000..ae4eba46 --- /dev/null +++ b/proto/lnd/router.ts @@ -0,0 +1,3544 @@ +// @generated by protobuf-ts 2.5.0 +// @generated from protobuf file "router.proto" (package "routerrpc", syntax proto3) +// tslint:disable +import { Payment } from "./lightning"; +import { ServiceType } from "@protobuf-ts/runtime-rpc"; +import type { BinaryWriteOptions } from "@protobuf-ts/runtime"; +import type { IBinaryWriter } from "@protobuf-ts/runtime"; +import type { BinaryReadOptions } from "@protobuf-ts/runtime"; +import type { IBinaryReader } from "@protobuf-ts/runtime"; +import { UnknownFieldHandler } from "@protobuf-ts/runtime"; +import { WireType } from "@protobuf-ts/runtime"; +import type { PartialMessage } from "@protobuf-ts/runtime"; +import { reflectionMergePartial } from "@protobuf-ts/runtime"; +import { MESSAGE_TYPE } from "@protobuf-ts/runtime"; +import { MessageType } from "@protobuf-ts/runtime"; +import { ChannelPoint } from "./lightning"; +import { HTLCAttempt } from "./lightning"; +import { Failure_FailureCode } from "./lightning"; +import { Failure } from "./lightning"; +import { Route } from "./lightning"; +import { FeatureBit } from "./lightning"; +import { RouteHint } from "./lightning"; +/** + * @generated from protobuf message routerrpc.SendPaymentRequest + */ +export interface SendPaymentRequest { + /** + * The identity pubkey of the payment recipient + * + * @generated from protobuf field: bytes dest = 1; + */ + dest: Uint8Array; + /** + * + * Number of satoshis to send. + * + * The fields amt and amt_msat are mutually exclusive. + * + * @generated from protobuf field: int64 amt = 2; + */ + amt: bigint; + /** + * + * Number of millisatoshis to send. + * + * The fields amt and amt_msat are mutually exclusive. + * + * @generated from protobuf field: int64 amt_msat = 12; + */ + amtMsat: bigint; + /** + * The hash to use within the payment's HTLC + * + * @generated from protobuf field: bytes payment_hash = 3; + */ + paymentHash: Uint8Array; + /** + * + * The CLTV delta from the current height that should be used to set the + * timelock for the final hop. + * + * @generated from protobuf field: int32 final_cltv_delta = 4; + */ + finalCltvDelta: number; + /** + * An optional payment addr to be included within the last hop of the route. + * + * @generated from protobuf field: bytes payment_addr = 20; + */ + paymentAddr: Uint8Array; + /** + * + * A bare-bones invoice for a payment within the Lightning Network. With the + * details of the invoice, the sender has all the data necessary to send a + * payment to the recipient. The amount in the payment request may be zero. In + * that case it is required to set the amt field as well. If no payment request + * is specified, the following fields are required: dest, amt and payment_hash. + * + * @generated from protobuf field: string payment_request = 5; + */ + paymentRequest: string; + /** + * + * An upper limit on the amount of time we should spend when attempting to + * fulfill the payment. This is expressed in seconds. If we cannot make a + * successful payment within this time frame, an error will be returned. + * This field must be non-zero. + * + * @generated from protobuf field: int32 timeout_seconds = 6; + */ + timeoutSeconds: number; + /** + * + * The maximum number of satoshis that will be paid as a fee of the payment. + * If this field is left to the default value of 0, only zero-fee routes will + * be considered. This usually means single hop routes connecting directly to + * the destination. To send the payment without a fee limit, use max int here. + * + * The fields fee_limit_sat and fee_limit_msat are mutually exclusive. + * + * @generated from protobuf field: int64 fee_limit_sat = 7; + */ + feeLimitSat: bigint; + /** + * + * The maximum number of millisatoshis that will be paid as a fee of the + * payment. If this field is left to the default value of 0, only zero-fee + * routes will be considered. This usually means single hop routes connecting + * directly to the destination. To send the payment without a fee limit, use + * max int here. + * + * The fields fee_limit_sat and fee_limit_msat are mutually exclusive. + * + * @generated from protobuf field: int64 fee_limit_msat = 13; + */ + feeLimitMsat: bigint; + /** + * + * Deprecated, use outgoing_chan_ids. The channel id of the channel that must + * be taken to the first hop. If zero, any channel may be used (unless + * outgoing_chan_ids are set). + * + * @deprecated + * @generated from protobuf field: uint64 outgoing_chan_id = 8 [deprecated = true, jstype = JS_STRING]; + */ + outgoingChanId: string; + /** + * + * The channel ids of the channels are allowed for the first hop. If empty, + * any channel may be used. + * + * @generated from protobuf field: repeated uint64 outgoing_chan_ids = 19; + */ + outgoingChanIds: bigint[]; + /** + * + * The pubkey of the last hop of the route. If empty, any hop may be used. + * + * @generated from protobuf field: bytes last_hop_pubkey = 14; + */ + lastHopPubkey: Uint8Array; + /** + * + * An optional maximum total time lock for the route. This should not exceed + * lnd's `--max-cltv-expiry` setting. If zero, then the value of + * `--max-cltv-expiry` is enforced. + * + * @generated from protobuf field: int32 cltv_limit = 9; + */ + cltvLimit: number; + /** + * + * Optional route hints to reach the destination through private channels. + * + * @generated from protobuf field: repeated lnrpc.RouteHint route_hints = 10; + */ + routeHints: RouteHint[]; + /** + * + * An optional field that can be used to pass an arbitrary set of TLV records + * to a peer which understands the new records. This can be used to pass + * application specific data during the payment attempt. Record types are + * required to be in the custom range >= 65536. When using REST, the values + * must be encoded as base64. + * + * @generated from protobuf field: map dest_custom_records = 11; + */ + destCustomRecords: { + [key: string]: Uint8Array; + }; + /** + * If set, circular payments to self are permitted. + * + * @generated from protobuf field: bool allow_self_payment = 15; + */ + allowSelfPayment: boolean; + /** + * + * Features assumed to be supported by the final node. All transitive feature + * dependencies must also be set properly. For a given feature bit pair, either + * optional or remote may be set, but not both. If this field is nil or empty, + * the router will try to load destination features from the graph as a + * fallback. + * + * @generated from protobuf field: repeated lnrpc.FeatureBit dest_features = 16; + */ + destFeatures: FeatureBit[]; + /** + * + * The maximum number of partial payments that may be use to complete the full + * amount. + * + * @generated from protobuf field: uint32 max_parts = 17; + */ + maxParts: number; + /** + * + * If set, only the final payment update is streamed back. Intermediate updates + * that show which htlcs are still in flight are suppressed. + * + * @generated from protobuf field: bool no_inflight_updates = 18; + */ + noInflightUpdates: boolean; + /** + * + * The largest payment split that should be attempted when making a payment if + * splitting is necessary. Setting this value will effectively cause lnd to + * split more aggressively, vs only when it thinks it needs to. Note that this + * value is in milli-satoshis. + * + * @generated from protobuf field: uint64 max_shard_size_msat = 21; + */ + maxShardSizeMsat: bigint; + /** + * + * If set, an AMP-payment will be attempted. + * + * @generated from protobuf field: bool amp = 22; + */ + amp: boolean; + /** + * + * The time preference for this payment. Set to -1 to optimize for fees + * only, to 1 to optimize for reliability only or a value inbetween for a mix. + * + * @generated from protobuf field: double time_pref = 23; + */ + timePref: number; +} +/** + * @generated from protobuf message routerrpc.TrackPaymentRequest + */ +export interface TrackPaymentRequest { + /** + * The hash of the payment to look up. + * + * @generated from protobuf field: bytes payment_hash = 1; + */ + paymentHash: Uint8Array; + /** + * + * If set, only the final payment update is streamed back. Intermediate updates + * that show which htlcs are still in flight are suppressed. + * + * @generated from protobuf field: bool no_inflight_updates = 2; + */ + noInflightUpdates: boolean; +} +/** + * @generated from protobuf message routerrpc.TrackPaymentsRequest + */ +export interface TrackPaymentsRequest { + /** + * + * If set, only the final payment updates are streamed back. Intermediate + * updates that show which htlcs are still in flight are suppressed. + * + * @generated from protobuf field: bool no_inflight_updates = 1; + */ + noInflightUpdates: boolean; +} +/** + * @generated from protobuf message routerrpc.RouteFeeRequest + */ +export interface RouteFeeRequest { + /** + * + * The destination once wishes to obtain a routing fee quote to. + * + * @generated from protobuf field: bytes dest = 1; + */ + dest: Uint8Array; + /** + * + * The amount one wishes to send to the target destination. + * + * @generated from protobuf field: int64 amt_sat = 2; + */ + amtSat: bigint; +} +/** + * @generated from protobuf message routerrpc.RouteFeeResponse + */ +export interface RouteFeeResponse { + /** + * + * A lower bound of the estimated fee to the target destination within the + * network, expressed in milli-satoshis. + * + * @generated from protobuf field: int64 routing_fee_msat = 1; + */ + routingFeeMsat: bigint; + /** + * + * An estimate of the worst case time delay that can occur. Note that callers + * will still need to factor in the final CLTV delta of the last hop into this + * value. + * + * @generated from protobuf field: int64 time_lock_delay = 2; + */ + timeLockDelay: bigint; +} +/** + * @generated from protobuf message routerrpc.SendToRouteRequest + */ +export interface SendToRouteRequest { + /** + * The payment hash to use for the HTLC. + * + * @generated from protobuf field: bytes payment_hash = 1; + */ + paymentHash: Uint8Array; + /** + * Route that should be used to attempt to complete the payment. + * + * @generated from protobuf field: lnrpc.Route route = 2; + */ + route?: Route; + /** + * + * Whether the payment should be marked as failed when a temporary error is + * returned from the given route. Set it to true so the payment won't be + * failed unless a terminal error is occurred, such as payment timeout, no + * routes, incorrect payment details, or insufficient funds. + * + * @generated from protobuf field: bool skip_temp_err = 3; + */ + skipTempErr: boolean; +} +/** + * @generated from protobuf message routerrpc.SendToRouteResponse + */ +export interface SendToRouteResponse { + /** + * The preimage obtained by making the payment. + * + * @generated from protobuf field: bytes preimage = 1; + */ + preimage: Uint8Array; + /** + * The failure message in case the payment failed. + * + * @generated from protobuf field: lnrpc.Failure failure = 2; + */ + failure?: Failure; +} +/** + * @generated from protobuf message routerrpc.ResetMissionControlRequest + */ +export interface ResetMissionControlRequest { +} +/** + * @generated from protobuf message routerrpc.ResetMissionControlResponse + */ +export interface ResetMissionControlResponse { +} +/** + * @generated from protobuf message routerrpc.QueryMissionControlRequest + */ +export interface QueryMissionControlRequest { +} +/** + * QueryMissionControlResponse contains mission control state. + * + * @generated from protobuf message routerrpc.QueryMissionControlResponse + */ +export interface QueryMissionControlResponse { + /** + * Node pair-level mission control state. + * + * @generated from protobuf field: repeated routerrpc.PairHistory pairs = 2; + */ + pairs: PairHistory[]; +} +/** + * @generated from protobuf message routerrpc.XImportMissionControlRequest + */ +export interface XImportMissionControlRequest { + /** + * Node pair-level mission control state to be imported. + * + * @generated from protobuf field: repeated routerrpc.PairHistory pairs = 1; + */ + pairs: PairHistory[]; + /** + * Whether to force override MC pair history. Note that even with force + * override the failure pair is imported before the success pair and both + * still clamp existing failure/success amounts. + * + * @generated from protobuf field: bool force = 2; + */ + force: boolean; +} +/** + * @generated from protobuf message routerrpc.XImportMissionControlResponse + */ +export interface XImportMissionControlResponse { +} +/** + * PairHistory contains the mission control state for a particular node pair. + * + * @generated from protobuf message routerrpc.PairHistory + */ +export interface PairHistory { + /** + * The source node pubkey of the pair. + * + * @generated from protobuf field: bytes node_from = 1; + */ + nodeFrom: Uint8Array; + /** + * The destination node pubkey of the pair. + * + * @generated from protobuf field: bytes node_to = 2; + */ + nodeTo: Uint8Array; + /** + * @generated from protobuf field: routerrpc.PairData history = 7; + */ + history?: PairData; +} +/** + * @generated from protobuf message routerrpc.PairData + */ +export interface PairData { + /** + * Time of last failure. + * + * @generated from protobuf field: int64 fail_time = 1; + */ + failTime: bigint; + /** + * + * Lowest amount that failed to forward rounded to whole sats. This may be + * set to zero if the failure is independent of amount. + * + * @generated from protobuf field: int64 fail_amt_sat = 2; + */ + failAmtSat: bigint; + /** + * + * Lowest amount that failed to forward in millisats. This may be + * set to zero if the failure is independent of amount. + * + * @generated from protobuf field: int64 fail_amt_msat = 4; + */ + failAmtMsat: bigint; + /** + * Time of last success. + * + * @generated from protobuf field: int64 success_time = 5; + */ + successTime: bigint; + /** + * Highest amount that we could successfully forward rounded to whole sats. + * + * @generated from protobuf field: int64 success_amt_sat = 6; + */ + successAmtSat: bigint; + /** + * Highest amount that we could successfully forward in millisats. + * + * @generated from protobuf field: int64 success_amt_msat = 7; + */ + successAmtMsat: bigint; +} +/** + * @generated from protobuf message routerrpc.GetMissionControlConfigRequest + */ +export interface GetMissionControlConfigRequest { +} +/** + * @generated from protobuf message routerrpc.GetMissionControlConfigResponse + */ +export interface GetMissionControlConfigResponse { + /** + * + * Mission control's currently active config. + * + * @generated from protobuf field: routerrpc.MissionControlConfig config = 1; + */ + config?: MissionControlConfig; +} +/** + * @generated from protobuf message routerrpc.SetMissionControlConfigRequest + */ +export interface SetMissionControlConfigRequest { + /** + * + * The config to set for mission control. Note that all values *must* be set, + * because the full config will be applied. + * + * @generated from protobuf field: routerrpc.MissionControlConfig config = 1; + */ + config?: MissionControlConfig; +} +/** + * @generated from protobuf message routerrpc.SetMissionControlConfigResponse + */ +export interface SetMissionControlConfigResponse { +} +/** + * @generated from protobuf message routerrpc.MissionControlConfig + */ +export interface MissionControlConfig { + /** + * + * The amount of time mission control will take to restore a penalized node + * or channel back to 50% success probability, expressed in seconds. Setting + * this value to a higher value will penalize failures for longer, making + * mission control less likely to route through nodes and channels that we + * have previously recorded failures for. + * + * @generated from protobuf field: uint64 half_life_seconds = 1; + */ + halfLifeSeconds: bigint; + /** + * + * The probability of success mission control should assign to hop in a route + * where it has no other information available. Higher values will make mission + * control more willing to try hops that we have no information about, lower + * values will discourage trying these hops. + * + * @generated from protobuf field: float hop_probability = 2; + */ + hopProbability: number; + /** + * + * The importance that mission control should place on historical results, + * expressed as a value in [0;1]. Setting this value to 1 will ignore all + * historical payments and just use the hop probability to assess the + * probability of success for each hop. A zero value ignores hop probability + * completely and relies entirely on historical results, unless none are + * available. + * + * @generated from protobuf field: float weight = 3; + */ + weight: number; + /** + * + * The maximum number of payment results that mission control will store. + * + * @generated from protobuf field: uint32 maximum_payment_results = 4; + */ + maximumPaymentResults: number; + /** + * + * The minimum time that must have passed since the previously recorded failure + * before we raise the failure amount. + * + * @generated from protobuf field: uint64 minimum_failure_relax_interval = 5; + */ + minimumFailureRelaxInterval: bigint; +} +/** + * @generated from protobuf message routerrpc.QueryProbabilityRequest + */ +export interface QueryProbabilityRequest { + /** + * The source node pubkey of the pair. + * + * @generated from protobuf field: bytes from_node = 1; + */ + fromNode: Uint8Array; + /** + * The destination node pubkey of the pair. + * + * @generated from protobuf field: bytes to_node = 2; + */ + toNode: Uint8Array; + /** + * The amount for which to calculate a probability. + * + * @generated from protobuf field: int64 amt_msat = 3; + */ + amtMsat: bigint; +} +/** + * @generated from protobuf message routerrpc.QueryProbabilityResponse + */ +export interface QueryProbabilityResponse { + /** + * The success probability for the requested pair. + * + * @generated from protobuf field: double probability = 1; + */ + probability: number; + /** + * The historical data for the requested pair. + * + * @generated from protobuf field: routerrpc.PairData history = 2; + */ + history?: PairData; +} +/** + * @generated from protobuf message routerrpc.BuildRouteRequest + */ +export interface BuildRouteRequest { + /** + * + * The amount to send expressed in msat. If set to zero, the minimum routable + * amount is used. + * + * @generated from protobuf field: int64 amt_msat = 1; + */ + amtMsat: bigint; + /** + * + * CLTV delta from the current height that should be used for the timelock + * of the final hop + * + * @generated from protobuf field: int32 final_cltv_delta = 2; + */ + finalCltvDelta: number; + /** + * + * The channel id of the channel that must be taken to the first hop. If zero, + * any channel may be used. + * + * @generated from protobuf field: uint64 outgoing_chan_id = 3 [jstype = JS_STRING]; + */ + outgoingChanId: string; + /** + * + * A list of hops that defines the route. This does not include the source hop + * pubkey. + * + * @generated from protobuf field: repeated bytes hop_pubkeys = 4; + */ + hopPubkeys: Uint8Array[]; + /** + * An optional payment addr to be included within the last hop of the route. + * + * @generated from protobuf field: bytes payment_addr = 5; + */ + paymentAddr: Uint8Array; +} +/** + * @generated from protobuf message routerrpc.BuildRouteResponse + */ +export interface BuildRouteResponse { + /** + * + * Fully specified route that can be used to execute the payment. + * + * @generated from protobuf field: lnrpc.Route route = 1; + */ + route?: Route; +} +/** + * @generated from protobuf message routerrpc.SubscribeHtlcEventsRequest + */ +export interface SubscribeHtlcEventsRequest { +} +/** + * + * HtlcEvent contains the htlc event that was processed. These are served on a + * best-effort basis; events are not persisted, delivery is not guaranteed + * (in the event of a crash in the switch, forward events may be lost) and + * some events may be replayed upon restart. Events consumed from this package + * should be de-duplicated by the htlc's unique combination of incoming and + * outgoing channel id and htlc id. [EXPERIMENTAL] + * + * @generated from protobuf message routerrpc.HtlcEvent + */ +export interface HtlcEvent { + /** + * + * The short channel id that the incoming htlc arrived at our node on. This + * value is zero for sends. + * + * @generated from protobuf field: uint64 incoming_channel_id = 1; + */ + incomingChannelId: bigint; + /** + * + * The short channel id that the outgoing htlc left our node on. This value + * is zero for receives. + * + * @generated from protobuf field: uint64 outgoing_channel_id = 2; + */ + outgoingChannelId: bigint; + /** + * + * Incoming id is the index of the incoming htlc in the incoming channel. + * This value is zero for sends. + * + * @generated from protobuf field: uint64 incoming_htlc_id = 3; + */ + incomingHtlcId: bigint; + /** + * + * Outgoing id is the index of the outgoing htlc in the outgoing channel. + * This value is zero for receives. + * + * @generated from protobuf field: uint64 outgoing_htlc_id = 4; + */ + outgoingHtlcId: bigint; + /** + * + * The time in unix nanoseconds that the event occurred. + * + * @generated from protobuf field: uint64 timestamp_ns = 5; + */ + timestampNs: bigint; + /** + * + * The event type indicates whether the htlc was part of a send, receive or + * forward. + * + * @generated from protobuf field: routerrpc.HtlcEvent.EventType event_type = 6; + */ + eventType: HtlcEvent_EventType; + /** + * @generated from protobuf oneof: event + */ + event: { + oneofKind: "forwardEvent"; + /** + * @generated from protobuf field: routerrpc.ForwardEvent forward_event = 7; + */ + forwardEvent: ForwardEvent; + } | { + oneofKind: "forwardFailEvent"; + /** + * @generated from protobuf field: routerrpc.ForwardFailEvent forward_fail_event = 8; + */ + forwardFailEvent: ForwardFailEvent; + } | { + oneofKind: "settleEvent"; + /** + * @generated from protobuf field: routerrpc.SettleEvent settle_event = 9; + */ + settleEvent: SettleEvent; + } | { + oneofKind: "linkFailEvent"; + /** + * @generated from protobuf field: routerrpc.LinkFailEvent link_fail_event = 10; + */ + linkFailEvent: LinkFailEvent; + } | { + oneofKind: "subscribedEvent"; + /** + * @generated from protobuf field: routerrpc.SubscribedEvent subscribed_event = 11; + */ + subscribedEvent: SubscribedEvent; + } | { + oneofKind: "finalHtlcEvent"; + /** + * @generated from protobuf field: routerrpc.FinalHtlcEvent final_htlc_event = 12; + */ + finalHtlcEvent: FinalHtlcEvent; + } | { + oneofKind: undefined; + }; +} +/** + * @generated from protobuf enum routerrpc.HtlcEvent.EventType + */ +export enum HtlcEvent_EventType { + /** + * @generated from protobuf enum value: UNKNOWN = 0; + */ + UNKNOWN = 0, + /** + * @generated from protobuf enum value: SEND = 1; + */ + SEND = 1, + /** + * @generated from protobuf enum value: RECEIVE = 2; + */ + RECEIVE = 2, + /** + * @generated from protobuf enum value: FORWARD = 3; + */ + FORWARD = 3 +} +/** + * @generated from protobuf message routerrpc.HtlcInfo + */ +export interface HtlcInfo { + /** + * The timelock on the incoming htlc. + * + * @generated from protobuf field: uint32 incoming_timelock = 1; + */ + incomingTimelock: number; + /** + * The timelock on the outgoing htlc. + * + * @generated from protobuf field: uint32 outgoing_timelock = 2; + */ + outgoingTimelock: number; + /** + * The amount of the incoming htlc. + * + * @generated from protobuf field: uint64 incoming_amt_msat = 3; + */ + incomingAmtMsat: bigint; + /** + * The amount of the outgoing htlc. + * + * @generated from protobuf field: uint64 outgoing_amt_msat = 4; + */ + outgoingAmtMsat: bigint; +} +/** + * @generated from protobuf message routerrpc.ForwardEvent + */ +export interface ForwardEvent { + /** + * Info contains details about the htlc that was forwarded. + * + * @generated from protobuf field: routerrpc.HtlcInfo info = 1; + */ + info?: HtlcInfo; +} +/** + * @generated from protobuf message routerrpc.ForwardFailEvent + */ +export interface ForwardFailEvent { +} +/** + * @generated from protobuf message routerrpc.SettleEvent + */ +export interface SettleEvent { + /** + * The revealed preimage. + * + * @generated from protobuf field: bytes preimage = 1; + */ + preimage: Uint8Array; +} +/** + * @generated from protobuf message routerrpc.FinalHtlcEvent + */ +export interface FinalHtlcEvent { + /** + * @generated from protobuf field: bool settled = 1; + */ + settled: boolean; + /** + * @generated from protobuf field: bool offchain = 2; + */ + offchain: boolean; +} +/** + * @generated from protobuf message routerrpc.SubscribedEvent + */ +export interface SubscribedEvent { +} +/** + * @generated from protobuf message routerrpc.LinkFailEvent + */ +export interface LinkFailEvent { + /** + * Info contains details about the htlc that we failed. + * + * @generated from protobuf field: routerrpc.HtlcInfo info = 1; + */ + info?: HtlcInfo; + /** + * FailureCode is the BOLT error code for the failure. + * + * @generated from protobuf field: lnrpc.Failure.FailureCode wire_failure = 2; + */ + wireFailure: Failure_FailureCode; + /** + * + * FailureDetail provides additional information about the reason for the + * failure. This detail enriches the information provided by the wire message + * and may be 'no detail' if the wire message requires no additional metadata. + * + * @generated from protobuf field: routerrpc.FailureDetail failure_detail = 3; + */ + failureDetail: FailureDetail; + /** + * A string representation of the link failure. + * + * @generated from protobuf field: string failure_string = 4; + */ + failureString: string; +} +/** + * @generated from protobuf message routerrpc.PaymentStatus + */ +export interface PaymentStatus { + /** + * Current state the payment is in. + * + * @generated from protobuf field: routerrpc.PaymentState state = 1; + */ + state: PaymentState; + /** + * + * The pre-image of the payment when state is SUCCEEDED. + * + * @generated from protobuf field: bytes preimage = 2; + */ + preimage: Uint8Array; + /** + * + * The HTLCs made in attempt to settle the payment [EXPERIMENTAL]. + * + * @generated from protobuf field: repeated lnrpc.HTLCAttempt htlcs = 4; + */ + htlcs: HTLCAttempt[]; +} +/** + * @generated from protobuf message routerrpc.CircuitKey + */ +export interface CircuitKey { + /** + * / The id of the channel that the is part of this circuit. + * + * @generated from protobuf field: uint64 chan_id = 1; + */ + chanId: bigint; + /** + * / The index of the incoming htlc in the incoming channel. + * + * @generated from protobuf field: uint64 htlc_id = 2; + */ + htlcId: bigint; +} +/** + * @generated from protobuf message routerrpc.ForwardHtlcInterceptRequest + */ +export interface ForwardHtlcInterceptRequest { + /** + * + * The key of this forwarded htlc. It defines the incoming channel id and + * the index in this channel. + * + * @generated from protobuf field: routerrpc.CircuitKey incoming_circuit_key = 1; + */ + incomingCircuitKey?: CircuitKey; + /** + * The incoming htlc amount. + * + * @generated from protobuf field: uint64 incoming_amount_msat = 5; + */ + incomingAmountMsat: bigint; + /** + * The incoming htlc expiry. + * + * @generated from protobuf field: uint32 incoming_expiry = 6; + */ + incomingExpiry: number; + /** + * + * The htlc payment hash. This value is not guaranteed to be unique per + * request. + * + * @generated from protobuf field: bytes payment_hash = 2; + */ + paymentHash: Uint8Array; + /** + * The requested outgoing channel id for this forwarded htlc. Because of + * non-strict forwarding, this isn't necessarily the channel over which the + * packet will be forwarded eventually. A different channel to the same peer + * may be selected as well. + * + * @generated from protobuf field: uint64 outgoing_requested_chan_id = 7; + */ + outgoingRequestedChanId: bigint; + /** + * The outgoing htlc amount. + * + * @generated from protobuf field: uint64 outgoing_amount_msat = 3; + */ + outgoingAmountMsat: bigint; + /** + * The outgoing htlc expiry. + * + * @generated from protobuf field: uint32 outgoing_expiry = 4; + */ + outgoingExpiry: number; + /** + * Any custom records that were present in the payload. + * + * @generated from protobuf field: map custom_records = 8; + */ + customRecords: { + [key: string]: Uint8Array; + }; + /** + * The onion blob for the next hop + * + * @generated from protobuf field: bytes onion_blob = 9; + */ + onionBlob: Uint8Array; + /** + * The block height at which this htlc will be auto-failed to prevent the + * channel from force-closing. + * + * @generated from protobuf field: int32 auto_fail_height = 10; + */ + autoFailHeight: number; +} +/** + * * + * ForwardHtlcInterceptResponse enables the caller to resolve a previously hold + * forward. The caller can choose either to: + * - `Resume`: Execute the default behavior (usually forward). + * - `Reject`: Fail the htlc backwards. + * - `Settle`: Settle this htlc with a given preimage. + * + * @generated from protobuf message routerrpc.ForwardHtlcInterceptResponse + */ +export interface ForwardHtlcInterceptResponse { + /** + * * + * The key of this forwarded htlc. It defines the incoming channel id and + * the index in this channel. + * + * @generated from protobuf field: routerrpc.CircuitKey incoming_circuit_key = 1; + */ + incomingCircuitKey?: CircuitKey; + /** + * The resolve action for this intercepted htlc. + * + * @generated from protobuf field: routerrpc.ResolveHoldForwardAction action = 2; + */ + action: ResolveHoldForwardAction; + /** + * The preimage in case the resolve action is Settle. + * + * @generated from protobuf field: bytes preimage = 3; + */ + preimage: Uint8Array; + /** + * Encrypted failure message in case the resolve action is Fail. + * + * If failure_message is specified, the failure_code field must be set + * to zero. + * + * @generated from protobuf field: bytes failure_message = 4; + */ + failureMessage: Uint8Array; + /** + * Return the specified failure code in case the resolve action is Fail. The + * message data fields are populated automatically. + * + * If a non-zero failure_code is specified, failure_message must not be set. + * + * For backwards-compatibility reasons, TEMPORARY_CHANNEL_FAILURE is the + * default value for this field. + * + * @generated from protobuf field: lnrpc.Failure.FailureCode failure_code = 5; + */ + failureCode: Failure_FailureCode; +} +/** + * @generated from protobuf message routerrpc.UpdateChanStatusRequest + */ +export interface UpdateChanStatusRequest { + /** + * @generated from protobuf field: lnrpc.ChannelPoint chan_point = 1; + */ + chanPoint?: ChannelPoint; + /** + * @generated from protobuf field: routerrpc.ChanStatusAction action = 2; + */ + action: ChanStatusAction; +} +/** + * @generated from protobuf message routerrpc.UpdateChanStatusResponse + */ +export interface UpdateChanStatusResponse { +} +/** + * @generated from protobuf enum routerrpc.FailureDetail + */ +export enum FailureDetail { + /** + * @generated from protobuf enum value: UNKNOWN = 0; + */ + UNKNOWN = 0, + /** + * @generated from protobuf enum value: NO_DETAIL = 1; + */ + NO_DETAIL = 1, + /** + * @generated from protobuf enum value: ONION_DECODE = 2; + */ + ONION_DECODE = 2, + /** + * @generated from protobuf enum value: LINK_NOT_ELIGIBLE = 3; + */ + LINK_NOT_ELIGIBLE = 3, + /** + * @generated from protobuf enum value: ON_CHAIN_TIMEOUT = 4; + */ + ON_CHAIN_TIMEOUT = 4, + /** + * @generated from protobuf enum value: HTLC_EXCEEDS_MAX = 5; + */ + HTLC_EXCEEDS_MAX = 5, + /** + * @generated from protobuf enum value: INSUFFICIENT_BALANCE = 6; + */ + INSUFFICIENT_BALANCE = 6, + /** + * @generated from protobuf enum value: INCOMPLETE_FORWARD = 7; + */ + INCOMPLETE_FORWARD = 7, + /** + * @generated from protobuf enum value: HTLC_ADD_FAILED = 8; + */ + HTLC_ADD_FAILED = 8, + /** + * @generated from protobuf enum value: FORWARDS_DISABLED = 9; + */ + FORWARDS_DISABLED = 9, + /** + * @generated from protobuf enum value: INVOICE_CANCELED = 10; + */ + INVOICE_CANCELED = 10, + /** + * @generated from protobuf enum value: INVOICE_UNDERPAID = 11; + */ + INVOICE_UNDERPAID = 11, + /** + * @generated from protobuf enum value: INVOICE_EXPIRY_TOO_SOON = 12; + */ + INVOICE_EXPIRY_TOO_SOON = 12, + /** + * @generated from protobuf enum value: INVOICE_NOT_OPEN = 13; + */ + INVOICE_NOT_OPEN = 13, + /** + * @generated from protobuf enum value: MPP_INVOICE_TIMEOUT = 14; + */ + MPP_INVOICE_TIMEOUT = 14, + /** + * @generated from protobuf enum value: ADDRESS_MISMATCH = 15; + */ + ADDRESS_MISMATCH = 15, + /** + * @generated from protobuf enum value: SET_TOTAL_MISMATCH = 16; + */ + SET_TOTAL_MISMATCH = 16, + /** + * @generated from protobuf enum value: SET_TOTAL_TOO_LOW = 17; + */ + SET_TOTAL_TOO_LOW = 17, + /** + * @generated from protobuf enum value: SET_OVERPAID = 18; + */ + SET_OVERPAID = 18, + /** + * @generated from protobuf enum value: UNKNOWN_INVOICE = 19; + */ + UNKNOWN_INVOICE = 19, + /** + * @generated from protobuf enum value: INVALID_KEYSEND = 20; + */ + INVALID_KEYSEND = 20, + /** + * @generated from protobuf enum value: MPP_IN_PROGRESS = 21; + */ + MPP_IN_PROGRESS = 21, + /** + * @generated from protobuf enum value: CIRCULAR_ROUTE = 22; + */ + CIRCULAR_ROUTE = 22 +} +/** + * @generated from protobuf enum routerrpc.PaymentState + */ +export enum PaymentState { + /** + * + * Payment is still in flight. + * + * @generated from protobuf enum value: IN_FLIGHT = 0; + */ + IN_FLIGHT = 0, + /** + * + * Payment completed successfully. + * + * @generated from protobuf enum value: SUCCEEDED = 1; + */ + SUCCEEDED = 1, + /** + * + * There are more routes to try, but the payment timeout was exceeded. + * + * @generated from protobuf enum value: FAILED_TIMEOUT = 2; + */ + FAILED_TIMEOUT = 2, + /** + * + * All possible routes were tried and failed permanently. Or were no + * routes to the destination at all. + * + * @generated from protobuf enum value: FAILED_NO_ROUTE = 3; + */ + FAILED_NO_ROUTE = 3, + /** + * + * A non-recoverable error has occurred. + * + * @generated from protobuf enum value: FAILED_ERROR = 4; + */ + FAILED_ERROR = 4, + /** + * + * Payment details incorrect (unknown hash, invalid amt or + * invalid final cltv delta) + * + * @generated from protobuf enum value: FAILED_INCORRECT_PAYMENT_DETAILS = 5; + */ + FAILED_INCORRECT_PAYMENT_DETAILS = 5, + /** + * + * Insufficient local balance. + * + * @generated from protobuf enum value: FAILED_INSUFFICIENT_BALANCE = 6; + */ + FAILED_INSUFFICIENT_BALANCE = 6 +} +/** + * @generated from protobuf enum routerrpc.ResolveHoldForwardAction + */ +export enum ResolveHoldForwardAction { + /** + * @generated from protobuf enum value: SETTLE = 0; + */ + SETTLE = 0, + /** + * @generated from protobuf enum value: FAIL = 1; + */ + FAIL = 1, + /** + * @generated from protobuf enum value: RESUME = 2; + */ + RESUME = 2 +} +/** + * @generated from protobuf enum routerrpc.ChanStatusAction + */ +export enum ChanStatusAction { + /** + * @generated from protobuf enum value: ENABLE = 0; + */ + ENABLE = 0, + /** + * @generated from protobuf enum value: DISABLE = 1; + */ + DISABLE = 1, + /** + * @generated from protobuf enum value: AUTO = 2; + */ + AUTO = 2 +} +// @generated message type with reflection information, may provide speed optimized methods +class SendPaymentRequest$Type extends MessageType { + constructor() { + super("routerrpc.SendPaymentRequest", [ + { no: 1, name: "dest", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "amt", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 12, name: "amt_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "payment_hash", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 4, name: "final_cltv_delta", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 20, name: "payment_addr", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 5, name: "payment_request", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 6, name: "timeout_seconds", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 7, name: "fee_limit_sat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 13, name: "fee_limit_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 8, name: "outgoing_chan_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/ }, + { no: 19, name: "outgoing_chan_ids", kind: "scalar", repeat: 1 /*RepeatType.PACKED*/, T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 14, name: "last_hop_pubkey", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 9, name: "cltv_limit", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 10, name: "route_hints", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => RouteHint }, + { no: 11, name: "dest_custom_records", kind: "map", K: 4 /*ScalarType.UINT64*/, V: { kind: "scalar", T: 12 /*ScalarType.BYTES*/ } }, + { no: 15, name: "allow_self_payment", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 16, name: "dest_features", kind: "enum", repeat: 1 /*RepeatType.PACKED*/, T: () => ["lnrpc.FeatureBit", FeatureBit] }, + { no: 17, name: "max_parts", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 18, name: "no_inflight_updates", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 21, name: "max_shard_size_msat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 22, name: "amp", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 23, name: "time_pref", kind: "scalar", T: 1 /*ScalarType.DOUBLE*/ } + ]); + } + create(value?: PartialMessage): SendPaymentRequest { + const message = { dest: new Uint8Array(0), amt: 0n, amtMsat: 0n, paymentHash: new Uint8Array(0), finalCltvDelta: 0, paymentAddr: new Uint8Array(0), paymentRequest: "", timeoutSeconds: 0, feeLimitSat: 0n, feeLimitMsat: 0n, outgoingChanId: "0", outgoingChanIds: [], lastHopPubkey: new Uint8Array(0), cltvLimit: 0, routeHints: [], destCustomRecords: {}, allowSelfPayment: false, destFeatures: [], maxParts: 0, noInflightUpdates: false, maxShardSizeMsat: 0n, amp: false, timePref: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SendPaymentRequest): SendPaymentRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes dest */ 1: + message.dest = reader.bytes(); + break; + case /* int64 amt */ 2: + message.amt = reader.int64().toBigInt(); + break; + case /* int64 amt_msat */ 12: + message.amtMsat = reader.int64().toBigInt(); + break; + case /* bytes payment_hash */ 3: + message.paymentHash = reader.bytes(); + break; + case /* int32 final_cltv_delta */ 4: + message.finalCltvDelta = reader.int32(); + break; + case /* bytes payment_addr */ 20: + message.paymentAddr = reader.bytes(); + break; + case /* string payment_request */ 5: + message.paymentRequest = reader.string(); + break; + case /* int32 timeout_seconds */ 6: + message.timeoutSeconds = reader.int32(); + break; + case /* int64 fee_limit_sat */ 7: + message.feeLimitSat = reader.int64().toBigInt(); + break; + case /* int64 fee_limit_msat */ 13: + message.feeLimitMsat = reader.int64().toBigInt(); + break; + case /* uint64 outgoing_chan_id = 8 [deprecated = true, jstype = JS_STRING];*/ 8: + message.outgoingChanId = reader.uint64().toString(); + break; + case /* repeated uint64 outgoing_chan_ids */ 19: + if (wireType === WireType.LengthDelimited) + for (let e = reader.int32() + reader.pos; reader.pos < e;) + message.outgoingChanIds.push(reader.uint64().toBigInt()); + else + message.outgoingChanIds.push(reader.uint64().toBigInt()); + break; + case /* bytes last_hop_pubkey */ 14: + message.lastHopPubkey = reader.bytes(); + break; + case /* int32 cltv_limit */ 9: + message.cltvLimit = reader.int32(); + break; + case /* repeated lnrpc.RouteHint route_hints */ 10: + message.routeHints.push(RouteHint.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* map dest_custom_records */ 11: + this.binaryReadMap11(message.destCustomRecords, reader, options); + break; + case /* bool allow_self_payment */ 15: + message.allowSelfPayment = reader.bool(); + break; + case /* repeated lnrpc.FeatureBit dest_features */ 16: + if (wireType === WireType.LengthDelimited) + for (let e = reader.int32() + reader.pos; reader.pos < e;) + message.destFeatures.push(reader.int32()); + else + message.destFeatures.push(reader.int32()); + break; + case /* uint32 max_parts */ 17: + message.maxParts = reader.uint32(); + break; + case /* bool no_inflight_updates */ 18: + message.noInflightUpdates = reader.bool(); + break; + case /* uint64 max_shard_size_msat */ 21: + message.maxShardSizeMsat = reader.uint64().toBigInt(); + break; + case /* bool amp */ 22: + message.amp = reader.bool(); + break; + case /* double time_pref */ 23: + message.timePref = reader.double(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + private binaryReadMap11(map: SendPaymentRequest["destCustomRecords"], reader: IBinaryReader, options: BinaryReadOptions): void { + let len = reader.uint32(), end = reader.pos + len, key: keyof SendPaymentRequest["destCustomRecords"] | undefined, val: SendPaymentRequest["destCustomRecords"][any] | undefined; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + key = reader.uint64().toString(); + break; + case 2: + val = reader.bytes(); + break; + default: throw new globalThis.Error("unknown map entry field for field routerrpc.SendPaymentRequest.dest_custom_records"); + } + } + map[key ?? "0"] = val ?? new Uint8Array(0); + } + internalBinaryWrite(message: SendPaymentRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes dest = 1; */ + if (message.dest.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.dest); + /* int64 amt = 2; */ + if (message.amt !== 0n) + writer.tag(2, WireType.Varint).int64(message.amt); + /* int64 amt_msat = 12; */ + if (message.amtMsat !== 0n) + writer.tag(12, WireType.Varint).int64(message.amtMsat); + /* bytes payment_hash = 3; */ + if (message.paymentHash.length) + writer.tag(3, WireType.LengthDelimited).bytes(message.paymentHash); + /* int32 final_cltv_delta = 4; */ + if (message.finalCltvDelta !== 0) + writer.tag(4, WireType.Varint).int32(message.finalCltvDelta); + /* bytes payment_addr = 20; */ + if (message.paymentAddr.length) + writer.tag(20, WireType.LengthDelimited).bytes(message.paymentAddr); + /* string payment_request = 5; */ + if (message.paymentRequest !== "") + writer.tag(5, WireType.LengthDelimited).string(message.paymentRequest); + /* int32 timeout_seconds = 6; */ + if (message.timeoutSeconds !== 0) + writer.tag(6, WireType.Varint).int32(message.timeoutSeconds); + /* int64 fee_limit_sat = 7; */ + if (message.feeLimitSat !== 0n) + writer.tag(7, WireType.Varint).int64(message.feeLimitSat); + /* int64 fee_limit_msat = 13; */ + if (message.feeLimitMsat !== 0n) + writer.tag(13, WireType.Varint).int64(message.feeLimitMsat); + /* uint64 outgoing_chan_id = 8 [deprecated = true, jstype = JS_STRING]; */ + if (message.outgoingChanId !== "0") + writer.tag(8, WireType.Varint).uint64(message.outgoingChanId); + /* repeated uint64 outgoing_chan_ids = 19; */ + if (message.outgoingChanIds.length) { + writer.tag(19, WireType.LengthDelimited).fork(); + for (let i = 0; i < message.outgoingChanIds.length; i++) + writer.uint64(message.outgoingChanIds[i]); + writer.join(); + } + /* bytes last_hop_pubkey = 14; */ + if (message.lastHopPubkey.length) + writer.tag(14, WireType.LengthDelimited).bytes(message.lastHopPubkey); + /* int32 cltv_limit = 9; */ + if (message.cltvLimit !== 0) + writer.tag(9, WireType.Varint).int32(message.cltvLimit); + /* repeated lnrpc.RouteHint route_hints = 10; */ + for (let i = 0; i < message.routeHints.length; i++) + RouteHint.internalBinaryWrite(message.routeHints[i], writer.tag(10, WireType.LengthDelimited).fork(), options).join(); + /* map dest_custom_records = 11; */ + for (let k of Object.keys(message.destCustomRecords)) + writer.tag(11, WireType.LengthDelimited).fork().tag(1, WireType.Varint).uint64(k).tag(2, WireType.LengthDelimited).bytes(message.destCustomRecords[k]).join(); + /* bool allow_self_payment = 15; */ + if (message.allowSelfPayment !== false) + writer.tag(15, WireType.Varint).bool(message.allowSelfPayment); + /* repeated lnrpc.FeatureBit dest_features = 16; */ + if (message.destFeatures.length) { + writer.tag(16, WireType.LengthDelimited).fork(); + for (let i = 0; i < message.destFeatures.length; i++) + writer.int32(message.destFeatures[i]); + writer.join(); + } + /* uint32 max_parts = 17; */ + if (message.maxParts !== 0) + writer.tag(17, WireType.Varint).uint32(message.maxParts); + /* bool no_inflight_updates = 18; */ + if (message.noInflightUpdates !== false) + writer.tag(18, WireType.Varint).bool(message.noInflightUpdates); + /* uint64 max_shard_size_msat = 21; */ + if (message.maxShardSizeMsat !== 0n) + writer.tag(21, WireType.Varint).uint64(message.maxShardSizeMsat); + /* bool amp = 22; */ + if (message.amp !== false) + writer.tag(22, WireType.Varint).bool(message.amp); + /* double time_pref = 23; */ + if (message.timePref !== 0) + writer.tag(23, WireType.Bit64).double(message.timePref); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.SendPaymentRequest + */ +export const SendPaymentRequest = new SendPaymentRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class TrackPaymentRequest$Type extends MessageType { + constructor() { + super("routerrpc.TrackPaymentRequest", [ + { no: 1, name: "payment_hash", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "no_inflight_updates", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): TrackPaymentRequest { + const message = { paymentHash: new Uint8Array(0), noInflightUpdates: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: TrackPaymentRequest): TrackPaymentRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes payment_hash */ 1: + message.paymentHash = reader.bytes(); + break; + case /* bool no_inflight_updates */ 2: + message.noInflightUpdates = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: TrackPaymentRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes payment_hash = 1; */ + if (message.paymentHash.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.paymentHash); + /* bool no_inflight_updates = 2; */ + if (message.noInflightUpdates !== false) + writer.tag(2, WireType.Varint).bool(message.noInflightUpdates); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.TrackPaymentRequest + */ +export const TrackPaymentRequest = new TrackPaymentRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class TrackPaymentsRequest$Type extends MessageType { + constructor() { + super("routerrpc.TrackPaymentsRequest", [ + { no: 1, name: "no_inflight_updates", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): TrackPaymentsRequest { + const message = { noInflightUpdates: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: TrackPaymentsRequest): TrackPaymentsRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bool no_inflight_updates */ 1: + message.noInflightUpdates = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: TrackPaymentsRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bool no_inflight_updates = 1; */ + if (message.noInflightUpdates !== false) + writer.tag(1, WireType.Varint).bool(message.noInflightUpdates); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.TrackPaymentsRequest + */ +export const TrackPaymentsRequest = new TrackPaymentsRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class RouteFeeRequest$Type extends MessageType { + constructor() { + super("routerrpc.RouteFeeRequest", [ + { no: 1, name: "dest", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "amt_sat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): RouteFeeRequest { + const message = { dest: new Uint8Array(0), amtSat: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: RouteFeeRequest): RouteFeeRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes dest */ 1: + message.dest = reader.bytes(); + break; + case /* int64 amt_sat */ 2: + message.amtSat = reader.int64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: RouteFeeRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes dest = 1; */ + if (message.dest.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.dest); + /* int64 amt_sat = 2; */ + if (message.amtSat !== 0n) + writer.tag(2, WireType.Varint).int64(message.amtSat); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.RouteFeeRequest + */ +export const RouteFeeRequest = new RouteFeeRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class RouteFeeResponse$Type extends MessageType { + constructor() { + super("routerrpc.RouteFeeResponse", [ + { no: 1, name: "routing_fee_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 2, name: "time_lock_delay", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): RouteFeeResponse { + const message = { routingFeeMsat: 0n, timeLockDelay: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: RouteFeeResponse): RouteFeeResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* int64 routing_fee_msat */ 1: + message.routingFeeMsat = reader.int64().toBigInt(); + break; + case /* int64 time_lock_delay */ 2: + message.timeLockDelay = reader.int64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: RouteFeeResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* int64 routing_fee_msat = 1; */ + if (message.routingFeeMsat !== 0n) + writer.tag(1, WireType.Varint).int64(message.routingFeeMsat); + /* int64 time_lock_delay = 2; */ + if (message.timeLockDelay !== 0n) + writer.tag(2, WireType.Varint).int64(message.timeLockDelay); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.RouteFeeResponse + */ +export const RouteFeeResponse = new RouteFeeResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class SendToRouteRequest$Type extends MessageType { + constructor() { + super("routerrpc.SendToRouteRequest", [ + { no: 1, name: "payment_hash", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "route", kind: "message", T: () => Route }, + { no: 3, name: "skip_temp_err", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): SendToRouteRequest { + const message = { paymentHash: new Uint8Array(0), skipTempErr: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SendToRouteRequest): SendToRouteRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes payment_hash */ 1: + message.paymentHash = reader.bytes(); + break; + case /* lnrpc.Route route */ 2: + message.route = Route.internalBinaryRead(reader, reader.uint32(), options, message.route); + break; + case /* bool skip_temp_err */ 3: + message.skipTempErr = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: SendToRouteRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes payment_hash = 1; */ + if (message.paymentHash.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.paymentHash); + /* lnrpc.Route route = 2; */ + if (message.route) + Route.internalBinaryWrite(message.route, writer.tag(2, WireType.LengthDelimited).fork(), options).join(); + /* bool skip_temp_err = 3; */ + if (message.skipTempErr !== false) + writer.tag(3, WireType.Varint).bool(message.skipTempErr); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.SendToRouteRequest + */ +export const SendToRouteRequest = new SendToRouteRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class SendToRouteResponse$Type extends MessageType { + constructor() { + super("routerrpc.SendToRouteResponse", [ + { no: 1, name: "preimage", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "failure", kind: "message", T: () => Failure } + ]); + } + create(value?: PartialMessage): SendToRouteResponse { + const message = { preimage: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SendToRouteResponse): SendToRouteResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes preimage */ 1: + message.preimage = reader.bytes(); + break; + case /* lnrpc.Failure failure */ 2: + message.failure = Failure.internalBinaryRead(reader, reader.uint32(), options, message.failure); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: SendToRouteResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes preimage = 1; */ + if (message.preimage.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.preimage); + /* lnrpc.Failure failure = 2; */ + if (message.failure) + Failure.internalBinaryWrite(message.failure, writer.tag(2, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.SendToRouteResponse + */ +export const SendToRouteResponse = new SendToRouteResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ResetMissionControlRequest$Type extends MessageType { + constructor() { + super("routerrpc.ResetMissionControlRequest", []); + } + create(value?: PartialMessage): ResetMissionControlRequest { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ResetMissionControlRequest): ResetMissionControlRequest { + return target ?? this.create(); + } + internalBinaryWrite(message: ResetMissionControlRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.ResetMissionControlRequest + */ +export const ResetMissionControlRequest = new ResetMissionControlRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ResetMissionControlResponse$Type extends MessageType { + constructor() { + super("routerrpc.ResetMissionControlResponse", []); + } + create(value?: PartialMessage): ResetMissionControlResponse { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ResetMissionControlResponse): ResetMissionControlResponse { + return target ?? this.create(); + } + internalBinaryWrite(message: ResetMissionControlResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.ResetMissionControlResponse + */ +export const ResetMissionControlResponse = new ResetMissionControlResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class QueryMissionControlRequest$Type extends MessageType { + constructor() { + super("routerrpc.QueryMissionControlRequest", []); + } + create(value?: PartialMessage): QueryMissionControlRequest { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: QueryMissionControlRequest): QueryMissionControlRequest { + return target ?? this.create(); + } + internalBinaryWrite(message: QueryMissionControlRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.QueryMissionControlRequest + */ +export const QueryMissionControlRequest = new QueryMissionControlRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class QueryMissionControlResponse$Type extends MessageType { + constructor() { + super("routerrpc.QueryMissionControlResponse", [ + { no: 2, name: "pairs", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => PairHistory } + ]); + } + create(value?: PartialMessage): QueryMissionControlResponse { + const message = { pairs: [] }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: QueryMissionControlResponse): QueryMissionControlResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated routerrpc.PairHistory pairs */ 2: + message.pairs.push(PairHistory.internalBinaryRead(reader, reader.uint32(), options)); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: QueryMissionControlResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated routerrpc.PairHistory pairs = 2; */ + for (let i = 0; i < message.pairs.length; i++) + PairHistory.internalBinaryWrite(message.pairs[i], writer.tag(2, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.QueryMissionControlResponse + */ +export const QueryMissionControlResponse = new QueryMissionControlResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class XImportMissionControlRequest$Type extends MessageType { + constructor() { + super("routerrpc.XImportMissionControlRequest", [ + { no: 1, name: "pairs", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => PairHistory }, + { no: 2, name: "force", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): XImportMissionControlRequest { + const message = { pairs: [], force: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: XImportMissionControlRequest): XImportMissionControlRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* repeated routerrpc.PairHistory pairs */ 1: + message.pairs.push(PairHistory.internalBinaryRead(reader, reader.uint32(), options)); + break; + case /* bool force */ 2: + message.force = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: XImportMissionControlRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* repeated routerrpc.PairHistory pairs = 1; */ + for (let i = 0; i < message.pairs.length; i++) + PairHistory.internalBinaryWrite(message.pairs[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* bool force = 2; */ + if (message.force !== false) + writer.tag(2, WireType.Varint).bool(message.force); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.XImportMissionControlRequest + */ +export const XImportMissionControlRequest = new XImportMissionControlRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class XImportMissionControlResponse$Type extends MessageType { + constructor() { + super("routerrpc.XImportMissionControlResponse", []); + } + create(value?: PartialMessage): XImportMissionControlResponse { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: XImportMissionControlResponse): XImportMissionControlResponse { + return target ?? this.create(); + } + internalBinaryWrite(message: XImportMissionControlResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.XImportMissionControlResponse + */ +export const XImportMissionControlResponse = new XImportMissionControlResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PairHistory$Type extends MessageType { + constructor() { + super("routerrpc.PairHistory", [ + { no: 1, name: "node_from", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "node_to", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 7, name: "history", kind: "message", T: () => PairData } + ]); + } + create(value?: PartialMessage): PairHistory { + const message = { nodeFrom: new Uint8Array(0), nodeTo: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PairHistory): PairHistory { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes node_from */ 1: + message.nodeFrom = reader.bytes(); + break; + case /* bytes node_to */ 2: + message.nodeTo = reader.bytes(); + break; + case /* routerrpc.PairData history */ 7: + message.history = PairData.internalBinaryRead(reader, reader.uint32(), options, message.history); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PairHistory, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes node_from = 1; */ + if (message.nodeFrom.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.nodeFrom); + /* bytes node_to = 2; */ + if (message.nodeTo.length) + writer.tag(2, WireType.LengthDelimited).bytes(message.nodeTo); + /* routerrpc.PairData history = 7; */ + if (message.history) + PairData.internalBinaryWrite(message.history, writer.tag(7, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.PairHistory + */ +export const PairHistory = new PairHistory$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PairData$Type extends MessageType { + constructor() { + super("routerrpc.PairData", [ + { no: 1, name: "fail_time", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 2, name: "fail_amt_sat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "fail_amt_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 5, name: "success_time", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 6, name: "success_amt_sat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 7, name: "success_amt_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): PairData { + const message = { failTime: 0n, failAmtSat: 0n, failAmtMsat: 0n, successTime: 0n, successAmtSat: 0n, successAmtMsat: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PairData): PairData { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* int64 fail_time */ 1: + message.failTime = reader.int64().toBigInt(); + break; + case /* int64 fail_amt_sat */ 2: + message.failAmtSat = reader.int64().toBigInt(); + break; + case /* int64 fail_amt_msat */ 4: + message.failAmtMsat = reader.int64().toBigInt(); + break; + case /* int64 success_time */ 5: + message.successTime = reader.int64().toBigInt(); + break; + case /* int64 success_amt_sat */ 6: + message.successAmtSat = reader.int64().toBigInt(); + break; + case /* int64 success_amt_msat */ 7: + message.successAmtMsat = reader.int64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PairData, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* int64 fail_time = 1; */ + if (message.failTime !== 0n) + writer.tag(1, WireType.Varint).int64(message.failTime); + /* int64 fail_amt_sat = 2; */ + if (message.failAmtSat !== 0n) + writer.tag(2, WireType.Varint).int64(message.failAmtSat); + /* int64 fail_amt_msat = 4; */ + if (message.failAmtMsat !== 0n) + writer.tag(4, WireType.Varint).int64(message.failAmtMsat); + /* int64 success_time = 5; */ + if (message.successTime !== 0n) + writer.tag(5, WireType.Varint).int64(message.successTime); + /* int64 success_amt_sat = 6; */ + if (message.successAmtSat !== 0n) + writer.tag(6, WireType.Varint).int64(message.successAmtSat); + /* int64 success_amt_msat = 7; */ + if (message.successAmtMsat !== 0n) + writer.tag(7, WireType.Varint).int64(message.successAmtMsat); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.PairData + */ +export const PairData = new PairData$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class GetMissionControlConfigRequest$Type extends MessageType { + constructor() { + super("routerrpc.GetMissionControlConfigRequest", []); + } + create(value?: PartialMessage): GetMissionControlConfigRequest { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: GetMissionControlConfigRequest): GetMissionControlConfigRequest { + return target ?? this.create(); + } + internalBinaryWrite(message: GetMissionControlConfigRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.GetMissionControlConfigRequest + */ +export const GetMissionControlConfigRequest = new GetMissionControlConfigRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class GetMissionControlConfigResponse$Type extends MessageType { + constructor() { + super("routerrpc.GetMissionControlConfigResponse", [ + { no: 1, name: "config", kind: "message", T: () => MissionControlConfig } + ]); + } + create(value?: PartialMessage): GetMissionControlConfigResponse { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: GetMissionControlConfigResponse): GetMissionControlConfigResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* routerrpc.MissionControlConfig config */ 1: + message.config = MissionControlConfig.internalBinaryRead(reader, reader.uint32(), options, message.config); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: GetMissionControlConfigResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* routerrpc.MissionControlConfig config = 1; */ + if (message.config) + MissionControlConfig.internalBinaryWrite(message.config, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.GetMissionControlConfigResponse + */ +export const GetMissionControlConfigResponse = new GetMissionControlConfigResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class SetMissionControlConfigRequest$Type extends MessageType { + constructor() { + super("routerrpc.SetMissionControlConfigRequest", [ + { no: 1, name: "config", kind: "message", T: () => MissionControlConfig } + ]); + } + create(value?: PartialMessage): SetMissionControlConfigRequest { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SetMissionControlConfigRequest): SetMissionControlConfigRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* routerrpc.MissionControlConfig config */ 1: + message.config = MissionControlConfig.internalBinaryRead(reader, reader.uint32(), options, message.config); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: SetMissionControlConfigRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* routerrpc.MissionControlConfig config = 1; */ + if (message.config) + MissionControlConfig.internalBinaryWrite(message.config, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.SetMissionControlConfigRequest + */ +export const SetMissionControlConfigRequest = new SetMissionControlConfigRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class SetMissionControlConfigResponse$Type extends MessageType { + constructor() { + super("routerrpc.SetMissionControlConfigResponse", []); + } + create(value?: PartialMessage): SetMissionControlConfigResponse { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SetMissionControlConfigResponse): SetMissionControlConfigResponse { + return target ?? this.create(); + } + internalBinaryWrite(message: SetMissionControlConfigResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.SetMissionControlConfigResponse + */ +export const SetMissionControlConfigResponse = new SetMissionControlConfigResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class MissionControlConfig$Type extends MessageType { + constructor() { + super("routerrpc.MissionControlConfig", [ + { no: 1, name: "half_life_seconds", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 2, name: "hop_probability", kind: "scalar", T: 2 /*ScalarType.FLOAT*/ }, + { no: 3, name: "weight", kind: "scalar", T: 2 /*ScalarType.FLOAT*/ }, + { no: 4, name: "maximum_payment_results", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 5, name: "minimum_failure_relax_interval", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): MissionControlConfig { + const message = { halfLifeSeconds: 0n, hopProbability: 0, weight: 0, maximumPaymentResults: 0, minimumFailureRelaxInterval: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: MissionControlConfig): MissionControlConfig { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint64 half_life_seconds */ 1: + message.halfLifeSeconds = reader.uint64().toBigInt(); + break; + case /* float hop_probability */ 2: + message.hopProbability = reader.float(); + break; + case /* float weight */ 3: + message.weight = reader.float(); + break; + case /* uint32 maximum_payment_results */ 4: + message.maximumPaymentResults = reader.uint32(); + break; + case /* uint64 minimum_failure_relax_interval */ 5: + message.minimumFailureRelaxInterval = reader.uint64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: MissionControlConfig, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint64 half_life_seconds = 1; */ + if (message.halfLifeSeconds !== 0n) + writer.tag(1, WireType.Varint).uint64(message.halfLifeSeconds); + /* float hop_probability = 2; */ + if (message.hopProbability !== 0) + writer.tag(2, WireType.Bit32).float(message.hopProbability); + /* float weight = 3; */ + if (message.weight !== 0) + writer.tag(3, WireType.Bit32).float(message.weight); + /* uint32 maximum_payment_results = 4; */ + if (message.maximumPaymentResults !== 0) + writer.tag(4, WireType.Varint).uint32(message.maximumPaymentResults); + /* uint64 minimum_failure_relax_interval = 5; */ + if (message.minimumFailureRelaxInterval !== 0n) + writer.tag(5, WireType.Varint).uint64(message.minimumFailureRelaxInterval); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.MissionControlConfig + */ +export const MissionControlConfig = new MissionControlConfig$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class QueryProbabilityRequest$Type extends MessageType { + constructor() { + super("routerrpc.QueryProbabilityRequest", [ + { no: 1, name: "from_node", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 2, name: "to_node", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 3, name: "amt_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): QueryProbabilityRequest { + const message = { fromNode: new Uint8Array(0), toNode: new Uint8Array(0), amtMsat: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: QueryProbabilityRequest): QueryProbabilityRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes from_node */ 1: + message.fromNode = reader.bytes(); + break; + case /* bytes to_node */ 2: + message.toNode = reader.bytes(); + break; + case /* int64 amt_msat */ 3: + message.amtMsat = reader.int64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: QueryProbabilityRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes from_node = 1; */ + if (message.fromNode.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.fromNode); + /* bytes to_node = 2; */ + if (message.toNode.length) + writer.tag(2, WireType.LengthDelimited).bytes(message.toNode); + /* int64 amt_msat = 3; */ + if (message.amtMsat !== 0n) + writer.tag(3, WireType.Varint).int64(message.amtMsat); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.QueryProbabilityRequest + */ +export const QueryProbabilityRequest = new QueryProbabilityRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class QueryProbabilityResponse$Type extends MessageType { + constructor() { + super("routerrpc.QueryProbabilityResponse", [ + { no: 1, name: "probability", kind: "scalar", T: 1 /*ScalarType.DOUBLE*/ }, + { no: 2, name: "history", kind: "message", T: () => PairData } + ]); + } + create(value?: PartialMessage): QueryProbabilityResponse { + const message = { probability: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: QueryProbabilityResponse): QueryProbabilityResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* double probability */ 1: + message.probability = reader.double(); + break; + case /* routerrpc.PairData history */ 2: + message.history = PairData.internalBinaryRead(reader, reader.uint32(), options, message.history); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: QueryProbabilityResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* double probability = 1; */ + if (message.probability !== 0) + writer.tag(1, WireType.Bit64).double(message.probability); + /* routerrpc.PairData history = 2; */ + if (message.history) + PairData.internalBinaryWrite(message.history, writer.tag(2, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.QueryProbabilityResponse + */ +export const QueryProbabilityResponse = new QueryProbabilityResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class BuildRouteRequest$Type extends MessageType { + constructor() { + super("routerrpc.BuildRouteRequest", [ + { no: 1, name: "amt_msat", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 2, name: "final_cltv_delta", kind: "scalar", T: 5 /*ScalarType.INT32*/ }, + { no: 3, name: "outgoing_chan_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/ }, + { no: 4, name: "hop_pubkeys", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 12 /*ScalarType.BYTES*/ }, + { no: 5, name: "payment_addr", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): BuildRouteRequest { + const message = { amtMsat: 0n, finalCltvDelta: 0, outgoingChanId: "0", hopPubkeys: [], paymentAddr: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: BuildRouteRequest): BuildRouteRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* int64 amt_msat */ 1: + message.amtMsat = reader.int64().toBigInt(); + break; + case /* int32 final_cltv_delta */ 2: + message.finalCltvDelta = reader.int32(); + break; + case /* uint64 outgoing_chan_id = 3 [jstype = JS_STRING];*/ 3: + message.outgoingChanId = reader.uint64().toString(); + break; + case /* repeated bytes hop_pubkeys */ 4: + message.hopPubkeys.push(reader.bytes()); + break; + case /* bytes payment_addr */ 5: + message.paymentAddr = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: BuildRouteRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* int64 amt_msat = 1; */ + if (message.amtMsat !== 0n) + writer.tag(1, WireType.Varint).int64(message.amtMsat); + /* int32 final_cltv_delta = 2; */ + if (message.finalCltvDelta !== 0) + writer.tag(2, WireType.Varint).int32(message.finalCltvDelta); + /* uint64 outgoing_chan_id = 3 [jstype = JS_STRING]; */ + if (message.outgoingChanId !== "0") + writer.tag(3, WireType.Varint).uint64(message.outgoingChanId); + /* repeated bytes hop_pubkeys = 4; */ + for (let i = 0; i < message.hopPubkeys.length; i++) + writer.tag(4, WireType.LengthDelimited).bytes(message.hopPubkeys[i]); + /* bytes payment_addr = 5; */ + if (message.paymentAddr.length) + writer.tag(5, WireType.LengthDelimited).bytes(message.paymentAddr); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.BuildRouteRequest + */ +export const BuildRouteRequest = new BuildRouteRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class BuildRouteResponse$Type extends MessageType { + constructor() { + super("routerrpc.BuildRouteResponse", [ + { no: 1, name: "route", kind: "message", T: () => Route } + ]); + } + create(value?: PartialMessage): BuildRouteResponse { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: BuildRouteResponse): BuildRouteResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.Route route */ 1: + message.route = Route.internalBinaryRead(reader, reader.uint32(), options, message.route); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: BuildRouteResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.Route route = 1; */ + if (message.route) + Route.internalBinaryWrite(message.route, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.BuildRouteResponse + */ +export const BuildRouteResponse = new BuildRouteResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class SubscribeHtlcEventsRequest$Type extends MessageType { + constructor() { + super("routerrpc.SubscribeHtlcEventsRequest", []); + } + create(value?: PartialMessage): SubscribeHtlcEventsRequest { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SubscribeHtlcEventsRequest): SubscribeHtlcEventsRequest { + return target ?? this.create(); + } + internalBinaryWrite(message: SubscribeHtlcEventsRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.SubscribeHtlcEventsRequest + */ +export const SubscribeHtlcEventsRequest = new SubscribeHtlcEventsRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class HtlcEvent$Type extends MessageType { + constructor() { + super("routerrpc.HtlcEvent", [ + { no: 1, name: "incoming_channel_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 2, name: "outgoing_channel_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "incoming_htlc_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "outgoing_htlc_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 5, name: "timestamp_ns", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 6, name: "event_type", kind: "enum", T: () => ["routerrpc.HtlcEvent.EventType", HtlcEvent_EventType] }, + { no: 7, name: "forward_event", kind: "message", oneof: "event", T: () => ForwardEvent }, + { no: 8, name: "forward_fail_event", kind: "message", oneof: "event", T: () => ForwardFailEvent }, + { no: 9, name: "settle_event", kind: "message", oneof: "event", T: () => SettleEvent }, + { no: 10, name: "link_fail_event", kind: "message", oneof: "event", T: () => LinkFailEvent }, + { no: 11, name: "subscribed_event", kind: "message", oneof: "event", T: () => SubscribedEvent }, + { no: 12, name: "final_htlc_event", kind: "message", oneof: "event", T: () => FinalHtlcEvent } + ]); + } + create(value?: PartialMessage): HtlcEvent { + const message = { incomingChannelId: 0n, outgoingChannelId: 0n, incomingHtlcId: 0n, outgoingHtlcId: 0n, timestampNs: 0n, eventType: 0, event: { oneofKind: undefined } }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: HtlcEvent): HtlcEvent { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint64 incoming_channel_id */ 1: + message.incomingChannelId = reader.uint64().toBigInt(); + break; + case /* uint64 outgoing_channel_id */ 2: + message.outgoingChannelId = reader.uint64().toBigInt(); + break; + case /* uint64 incoming_htlc_id */ 3: + message.incomingHtlcId = reader.uint64().toBigInt(); + break; + case /* uint64 outgoing_htlc_id */ 4: + message.outgoingHtlcId = reader.uint64().toBigInt(); + break; + case /* uint64 timestamp_ns */ 5: + message.timestampNs = reader.uint64().toBigInt(); + break; + case /* routerrpc.HtlcEvent.EventType event_type */ 6: + message.eventType = reader.int32(); + break; + case /* routerrpc.ForwardEvent forward_event */ 7: + message.event = { + oneofKind: "forwardEvent", + forwardEvent: ForwardEvent.internalBinaryRead(reader, reader.uint32(), options, (message.event as any).forwardEvent) + }; + break; + case /* routerrpc.ForwardFailEvent forward_fail_event */ 8: + message.event = { + oneofKind: "forwardFailEvent", + forwardFailEvent: ForwardFailEvent.internalBinaryRead(reader, reader.uint32(), options, (message.event as any).forwardFailEvent) + }; + break; + case /* routerrpc.SettleEvent settle_event */ 9: + message.event = { + oneofKind: "settleEvent", + settleEvent: SettleEvent.internalBinaryRead(reader, reader.uint32(), options, (message.event as any).settleEvent) + }; + break; + case /* routerrpc.LinkFailEvent link_fail_event */ 10: + message.event = { + oneofKind: "linkFailEvent", + linkFailEvent: LinkFailEvent.internalBinaryRead(reader, reader.uint32(), options, (message.event as any).linkFailEvent) + }; + break; + case /* routerrpc.SubscribedEvent subscribed_event */ 11: + message.event = { + oneofKind: "subscribedEvent", + subscribedEvent: SubscribedEvent.internalBinaryRead(reader, reader.uint32(), options, (message.event as any).subscribedEvent) + }; + break; + case /* routerrpc.FinalHtlcEvent final_htlc_event */ 12: + message.event = { + oneofKind: "finalHtlcEvent", + finalHtlcEvent: FinalHtlcEvent.internalBinaryRead(reader, reader.uint32(), options, (message.event as any).finalHtlcEvent) + }; + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: HtlcEvent, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint64 incoming_channel_id = 1; */ + if (message.incomingChannelId !== 0n) + writer.tag(1, WireType.Varint).uint64(message.incomingChannelId); + /* uint64 outgoing_channel_id = 2; */ + if (message.outgoingChannelId !== 0n) + writer.tag(2, WireType.Varint).uint64(message.outgoingChannelId); + /* uint64 incoming_htlc_id = 3; */ + if (message.incomingHtlcId !== 0n) + writer.tag(3, WireType.Varint).uint64(message.incomingHtlcId); + /* uint64 outgoing_htlc_id = 4; */ + if (message.outgoingHtlcId !== 0n) + writer.tag(4, WireType.Varint).uint64(message.outgoingHtlcId); + /* uint64 timestamp_ns = 5; */ + if (message.timestampNs !== 0n) + writer.tag(5, WireType.Varint).uint64(message.timestampNs); + /* routerrpc.HtlcEvent.EventType event_type = 6; */ + if (message.eventType !== 0) + writer.tag(6, WireType.Varint).int32(message.eventType); + /* routerrpc.ForwardEvent forward_event = 7; */ + if (message.event.oneofKind === "forwardEvent") + ForwardEvent.internalBinaryWrite(message.event.forwardEvent, writer.tag(7, WireType.LengthDelimited).fork(), options).join(); + /* routerrpc.ForwardFailEvent forward_fail_event = 8; */ + if (message.event.oneofKind === "forwardFailEvent") + ForwardFailEvent.internalBinaryWrite(message.event.forwardFailEvent, writer.tag(8, WireType.LengthDelimited).fork(), options).join(); + /* routerrpc.SettleEvent settle_event = 9; */ + if (message.event.oneofKind === "settleEvent") + SettleEvent.internalBinaryWrite(message.event.settleEvent, writer.tag(9, WireType.LengthDelimited).fork(), options).join(); + /* routerrpc.LinkFailEvent link_fail_event = 10; */ + if (message.event.oneofKind === "linkFailEvent") + LinkFailEvent.internalBinaryWrite(message.event.linkFailEvent, writer.tag(10, WireType.LengthDelimited).fork(), options).join(); + /* routerrpc.SubscribedEvent subscribed_event = 11; */ + if (message.event.oneofKind === "subscribedEvent") + SubscribedEvent.internalBinaryWrite(message.event.subscribedEvent, writer.tag(11, WireType.LengthDelimited).fork(), options).join(); + /* routerrpc.FinalHtlcEvent final_htlc_event = 12; */ + if (message.event.oneofKind === "finalHtlcEvent") + FinalHtlcEvent.internalBinaryWrite(message.event.finalHtlcEvent, writer.tag(12, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.HtlcEvent + */ +export const HtlcEvent = new HtlcEvent$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class HtlcInfo$Type extends MessageType { + constructor() { + super("routerrpc.HtlcInfo", [ + { no: 1, name: "incoming_timelock", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 2, name: "outgoing_timelock", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 3, name: "incoming_amt_msat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "outgoing_amt_msat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): HtlcInfo { + const message = { incomingTimelock: 0, outgoingTimelock: 0, incomingAmtMsat: 0n, outgoingAmtMsat: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: HtlcInfo): HtlcInfo { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint32 incoming_timelock */ 1: + message.incomingTimelock = reader.uint32(); + break; + case /* uint32 outgoing_timelock */ 2: + message.outgoingTimelock = reader.uint32(); + break; + case /* uint64 incoming_amt_msat */ 3: + message.incomingAmtMsat = reader.uint64().toBigInt(); + break; + case /* uint64 outgoing_amt_msat */ 4: + message.outgoingAmtMsat = reader.uint64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: HtlcInfo, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint32 incoming_timelock = 1; */ + if (message.incomingTimelock !== 0) + writer.tag(1, WireType.Varint).uint32(message.incomingTimelock); + /* uint32 outgoing_timelock = 2; */ + if (message.outgoingTimelock !== 0) + writer.tag(2, WireType.Varint).uint32(message.outgoingTimelock); + /* uint64 incoming_amt_msat = 3; */ + if (message.incomingAmtMsat !== 0n) + writer.tag(3, WireType.Varint).uint64(message.incomingAmtMsat); + /* uint64 outgoing_amt_msat = 4; */ + if (message.outgoingAmtMsat !== 0n) + writer.tag(4, WireType.Varint).uint64(message.outgoingAmtMsat); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.HtlcInfo + */ +export const HtlcInfo = new HtlcInfo$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ForwardEvent$Type extends MessageType { + constructor() { + super("routerrpc.ForwardEvent", [ + { no: 1, name: "info", kind: "message", T: () => HtlcInfo } + ]); + } + create(value?: PartialMessage): ForwardEvent { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ForwardEvent): ForwardEvent { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* routerrpc.HtlcInfo info */ 1: + message.info = HtlcInfo.internalBinaryRead(reader, reader.uint32(), options, message.info); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ForwardEvent, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* routerrpc.HtlcInfo info = 1; */ + if (message.info) + HtlcInfo.internalBinaryWrite(message.info, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.ForwardEvent + */ +export const ForwardEvent = new ForwardEvent$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ForwardFailEvent$Type extends MessageType { + constructor() { + super("routerrpc.ForwardFailEvent", []); + } + create(value?: PartialMessage): ForwardFailEvent { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ForwardFailEvent): ForwardFailEvent { + return target ?? this.create(); + } + internalBinaryWrite(message: ForwardFailEvent, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.ForwardFailEvent + */ +export const ForwardFailEvent = new ForwardFailEvent$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class SettleEvent$Type extends MessageType { + constructor() { + super("routerrpc.SettleEvent", [ + { no: 1, name: "preimage", kind: "scalar", T: 12 /*ScalarType.BYTES*/ } + ]); + } + create(value?: PartialMessage): SettleEvent { + const message = { preimage: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SettleEvent): SettleEvent { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bytes preimage */ 1: + message.preimage = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: SettleEvent, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bytes preimage = 1; */ + if (message.preimage.length) + writer.tag(1, WireType.LengthDelimited).bytes(message.preimage); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.SettleEvent + */ +export const SettleEvent = new SettleEvent$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class FinalHtlcEvent$Type extends MessageType { + constructor() { + super("routerrpc.FinalHtlcEvent", [ + { no: 1, name: "settled", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 2, name: "offchain", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): FinalHtlcEvent { + const message = { settled: false, offchain: false }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: FinalHtlcEvent): FinalHtlcEvent { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bool settled */ 1: + message.settled = reader.bool(); + break; + case /* bool offchain */ 2: + message.offchain = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: FinalHtlcEvent, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bool settled = 1; */ + if (message.settled !== false) + writer.tag(1, WireType.Varint).bool(message.settled); + /* bool offchain = 2; */ + if (message.offchain !== false) + writer.tag(2, WireType.Varint).bool(message.offchain); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.FinalHtlcEvent + */ +export const FinalHtlcEvent = new FinalHtlcEvent$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class SubscribedEvent$Type extends MessageType { + constructor() { + super("routerrpc.SubscribedEvent", []); + } + create(value?: PartialMessage): SubscribedEvent { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SubscribedEvent): SubscribedEvent { + return target ?? this.create(); + } + internalBinaryWrite(message: SubscribedEvent, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.SubscribedEvent + */ +export const SubscribedEvent = new SubscribedEvent$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class LinkFailEvent$Type extends MessageType { + constructor() { + super("routerrpc.LinkFailEvent", [ + { no: 1, name: "info", kind: "message", T: () => HtlcInfo }, + { no: 2, name: "wire_failure", kind: "enum", T: () => ["lnrpc.Failure.FailureCode", Failure_FailureCode] }, + { no: 3, name: "failure_detail", kind: "enum", T: () => ["routerrpc.FailureDetail", FailureDetail] }, + { no: 4, name: "failure_string", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): LinkFailEvent { + const message = { wireFailure: 0, failureDetail: 0, failureString: "" }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: LinkFailEvent): LinkFailEvent { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* routerrpc.HtlcInfo info */ 1: + message.info = HtlcInfo.internalBinaryRead(reader, reader.uint32(), options, message.info); + break; + case /* lnrpc.Failure.FailureCode wire_failure */ 2: + message.wireFailure = reader.int32(); + break; + case /* routerrpc.FailureDetail failure_detail */ 3: + message.failureDetail = reader.int32(); + break; + case /* string failure_string */ 4: + message.failureString = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: LinkFailEvent, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* routerrpc.HtlcInfo info = 1; */ + if (message.info) + HtlcInfo.internalBinaryWrite(message.info, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* lnrpc.Failure.FailureCode wire_failure = 2; */ + if (message.wireFailure !== 0) + writer.tag(2, WireType.Varint).int32(message.wireFailure); + /* routerrpc.FailureDetail failure_detail = 3; */ + if (message.failureDetail !== 0) + writer.tag(3, WireType.Varint).int32(message.failureDetail); + /* string failure_string = 4; */ + if (message.failureString !== "") + writer.tag(4, WireType.LengthDelimited).string(message.failureString); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.LinkFailEvent + */ +export const LinkFailEvent = new LinkFailEvent$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PaymentStatus$Type extends MessageType { + constructor() { + super("routerrpc.PaymentStatus", [ + { no: 1, name: "state", kind: "enum", T: () => ["routerrpc.PaymentState", PaymentState] }, + { no: 2, name: "preimage", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 4, name: "htlcs", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => HTLCAttempt } + ]); + } + create(value?: PartialMessage): PaymentStatus { + const message = { state: 0, preimage: new Uint8Array(0), htlcs: [] }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PaymentStatus): PaymentStatus { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* routerrpc.PaymentState state */ 1: + message.state = reader.int32(); + break; + case /* bytes preimage */ 2: + message.preimage = reader.bytes(); + break; + case /* repeated lnrpc.HTLCAttempt htlcs */ 4: + message.htlcs.push(HTLCAttempt.internalBinaryRead(reader, reader.uint32(), options)); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PaymentStatus, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* routerrpc.PaymentState state = 1; */ + if (message.state !== 0) + writer.tag(1, WireType.Varint).int32(message.state); + /* bytes preimage = 2; */ + if (message.preimage.length) + writer.tag(2, WireType.LengthDelimited).bytes(message.preimage); + /* repeated lnrpc.HTLCAttempt htlcs = 4; */ + for (let i = 0; i < message.htlcs.length; i++) + HTLCAttempt.internalBinaryWrite(message.htlcs[i], writer.tag(4, WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.PaymentStatus + */ +export const PaymentStatus = new PaymentStatus$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class CircuitKey$Type extends MessageType { + constructor() { + super("routerrpc.CircuitKey", [ + { no: 1, name: "chan_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 2, name: "htlc_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ } + ]); + } + create(value?: PartialMessage): CircuitKey { + const message = { chanId: 0n, htlcId: 0n }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: CircuitKey): CircuitKey { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* uint64 chan_id */ 1: + message.chanId = reader.uint64().toBigInt(); + break; + case /* uint64 htlc_id */ 2: + message.htlcId = reader.uint64().toBigInt(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: CircuitKey, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* uint64 chan_id = 1; */ + if (message.chanId !== 0n) + writer.tag(1, WireType.Varint).uint64(message.chanId); + /* uint64 htlc_id = 2; */ + if (message.htlcId !== 0n) + writer.tag(2, WireType.Varint).uint64(message.htlcId); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.CircuitKey + */ +export const CircuitKey = new CircuitKey$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ForwardHtlcInterceptRequest$Type extends MessageType { + constructor() { + super("routerrpc.ForwardHtlcInterceptRequest", [ + { no: 1, name: "incoming_circuit_key", kind: "message", T: () => CircuitKey }, + { no: 5, name: "incoming_amount_msat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 6, name: "incoming_expiry", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 2, name: "payment_hash", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 7, name: "outgoing_requested_chan_id", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 3, name: "outgoing_amount_msat", kind: "scalar", T: 4 /*ScalarType.UINT64*/, L: 0 /*LongType.BIGINT*/ }, + { no: 4, name: "outgoing_expiry", kind: "scalar", T: 13 /*ScalarType.UINT32*/ }, + { no: 8, name: "custom_records", kind: "map", K: 4 /*ScalarType.UINT64*/, V: { kind: "scalar", T: 12 /*ScalarType.BYTES*/ } }, + { no: 9, name: "onion_blob", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 10, name: "auto_fail_height", kind: "scalar", T: 5 /*ScalarType.INT32*/ } + ]); + } + create(value?: PartialMessage): ForwardHtlcInterceptRequest { + const message = { incomingAmountMsat: 0n, incomingExpiry: 0, paymentHash: new Uint8Array(0), outgoingRequestedChanId: 0n, outgoingAmountMsat: 0n, outgoingExpiry: 0, customRecords: {}, onionBlob: new Uint8Array(0), autoFailHeight: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ForwardHtlcInterceptRequest): ForwardHtlcInterceptRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* routerrpc.CircuitKey incoming_circuit_key */ 1: + message.incomingCircuitKey = CircuitKey.internalBinaryRead(reader, reader.uint32(), options, message.incomingCircuitKey); + break; + case /* uint64 incoming_amount_msat */ 5: + message.incomingAmountMsat = reader.uint64().toBigInt(); + break; + case /* uint32 incoming_expiry */ 6: + message.incomingExpiry = reader.uint32(); + break; + case /* bytes payment_hash */ 2: + message.paymentHash = reader.bytes(); + break; + case /* uint64 outgoing_requested_chan_id */ 7: + message.outgoingRequestedChanId = reader.uint64().toBigInt(); + break; + case /* uint64 outgoing_amount_msat */ 3: + message.outgoingAmountMsat = reader.uint64().toBigInt(); + break; + case /* uint32 outgoing_expiry */ 4: + message.outgoingExpiry = reader.uint32(); + break; + case /* map custom_records */ 8: + this.binaryReadMap8(message.customRecords, reader, options); + break; + case /* bytes onion_blob */ 9: + message.onionBlob = reader.bytes(); + break; + case /* int32 auto_fail_height */ 10: + message.autoFailHeight = reader.int32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + private binaryReadMap8(map: ForwardHtlcInterceptRequest["customRecords"], reader: IBinaryReader, options: BinaryReadOptions): void { + let len = reader.uint32(), end = reader.pos + len, key: keyof ForwardHtlcInterceptRequest["customRecords"] | undefined, val: ForwardHtlcInterceptRequest["customRecords"][any] | undefined; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + key = reader.uint64().toString(); + break; + case 2: + val = reader.bytes(); + break; + default: throw new globalThis.Error("unknown map entry field for field routerrpc.ForwardHtlcInterceptRequest.custom_records"); + } + } + map[key ?? "0"] = val ?? new Uint8Array(0); + } + internalBinaryWrite(message: ForwardHtlcInterceptRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* routerrpc.CircuitKey incoming_circuit_key = 1; */ + if (message.incomingCircuitKey) + CircuitKey.internalBinaryWrite(message.incomingCircuitKey, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* uint64 incoming_amount_msat = 5; */ + if (message.incomingAmountMsat !== 0n) + writer.tag(5, WireType.Varint).uint64(message.incomingAmountMsat); + /* uint32 incoming_expiry = 6; */ + if (message.incomingExpiry !== 0) + writer.tag(6, WireType.Varint).uint32(message.incomingExpiry); + /* bytes payment_hash = 2; */ + if (message.paymentHash.length) + writer.tag(2, WireType.LengthDelimited).bytes(message.paymentHash); + /* uint64 outgoing_requested_chan_id = 7; */ + if (message.outgoingRequestedChanId !== 0n) + writer.tag(7, WireType.Varint).uint64(message.outgoingRequestedChanId); + /* uint64 outgoing_amount_msat = 3; */ + if (message.outgoingAmountMsat !== 0n) + writer.tag(3, WireType.Varint).uint64(message.outgoingAmountMsat); + /* uint32 outgoing_expiry = 4; */ + if (message.outgoingExpiry !== 0) + writer.tag(4, WireType.Varint).uint32(message.outgoingExpiry); + /* map custom_records = 8; */ + for (let k of Object.keys(message.customRecords)) + writer.tag(8, WireType.LengthDelimited).fork().tag(1, WireType.Varint).uint64(k).tag(2, WireType.LengthDelimited).bytes(message.customRecords[k]).join(); + /* bytes onion_blob = 9; */ + if (message.onionBlob.length) + writer.tag(9, WireType.LengthDelimited).bytes(message.onionBlob); + /* int32 auto_fail_height = 10; */ + if (message.autoFailHeight !== 0) + writer.tag(10, WireType.Varint).int32(message.autoFailHeight); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.ForwardHtlcInterceptRequest + */ +export const ForwardHtlcInterceptRequest = new ForwardHtlcInterceptRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ForwardHtlcInterceptResponse$Type extends MessageType { + constructor() { + super("routerrpc.ForwardHtlcInterceptResponse", [ + { no: 1, name: "incoming_circuit_key", kind: "message", T: () => CircuitKey }, + { no: 2, name: "action", kind: "enum", T: () => ["routerrpc.ResolveHoldForwardAction", ResolveHoldForwardAction] }, + { no: 3, name: "preimage", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 4, name: "failure_message", kind: "scalar", T: 12 /*ScalarType.BYTES*/ }, + { no: 5, name: "failure_code", kind: "enum", T: () => ["lnrpc.Failure.FailureCode", Failure_FailureCode] } + ]); + } + create(value?: PartialMessage): ForwardHtlcInterceptResponse { + const message = { action: 0, preimage: new Uint8Array(0), failureMessage: new Uint8Array(0), failureCode: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ForwardHtlcInterceptResponse): ForwardHtlcInterceptResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* routerrpc.CircuitKey incoming_circuit_key */ 1: + message.incomingCircuitKey = CircuitKey.internalBinaryRead(reader, reader.uint32(), options, message.incomingCircuitKey); + break; + case /* routerrpc.ResolveHoldForwardAction action */ 2: + message.action = reader.int32(); + break; + case /* bytes preimage */ 3: + message.preimage = reader.bytes(); + break; + case /* bytes failure_message */ 4: + message.failureMessage = reader.bytes(); + break; + case /* lnrpc.Failure.FailureCode failure_code */ 5: + message.failureCode = reader.int32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ForwardHtlcInterceptResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* routerrpc.CircuitKey incoming_circuit_key = 1; */ + if (message.incomingCircuitKey) + CircuitKey.internalBinaryWrite(message.incomingCircuitKey, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* routerrpc.ResolveHoldForwardAction action = 2; */ + if (message.action !== 0) + writer.tag(2, WireType.Varint).int32(message.action); + /* bytes preimage = 3; */ + if (message.preimage.length) + writer.tag(3, WireType.LengthDelimited).bytes(message.preimage); + /* bytes failure_message = 4; */ + if (message.failureMessage.length) + writer.tag(4, WireType.LengthDelimited).bytes(message.failureMessage); + /* lnrpc.Failure.FailureCode failure_code = 5; */ + if (message.failureCode !== 0) + writer.tag(5, WireType.Varint).int32(message.failureCode); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.ForwardHtlcInterceptResponse + */ +export const ForwardHtlcInterceptResponse = new ForwardHtlcInterceptResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class UpdateChanStatusRequest$Type extends MessageType { + constructor() { + super("routerrpc.UpdateChanStatusRequest", [ + { no: 1, name: "chan_point", kind: "message", T: () => ChannelPoint }, + { no: 2, name: "action", kind: "enum", T: () => ["routerrpc.ChanStatusAction", ChanStatusAction] } + ]); + } + create(value?: PartialMessage): UpdateChanStatusRequest { + const message = { action: 0 }; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: UpdateChanStatusRequest): UpdateChanStatusRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* lnrpc.ChannelPoint chan_point */ 1: + message.chanPoint = ChannelPoint.internalBinaryRead(reader, reader.uint32(), options, message.chanPoint); + break; + case /* routerrpc.ChanStatusAction action */ 2: + message.action = reader.int32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: UpdateChanStatusRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* lnrpc.ChannelPoint chan_point = 1; */ + if (message.chanPoint) + ChannelPoint.internalBinaryWrite(message.chanPoint, writer.tag(1, WireType.LengthDelimited).fork(), options).join(); + /* routerrpc.ChanStatusAction action = 2; */ + if (message.action !== 0) + writer.tag(2, WireType.Varint).int32(message.action); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.UpdateChanStatusRequest + */ +export const UpdateChanStatusRequest = new UpdateChanStatusRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class UpdateChanStatusResponse$Type extends MessageType { + constructor() { + super("routerrpc.UpdateChanStatusResponse", []); + } + create(value?: PartialMessage): UpdateChanStatusResponse { + const message = {}; + globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: UpdateChanStatusResponse): UpdateChanStatusResponse { + return target ?? this.create(); + } + internalBinaryWrite(message: UpdateChanStatusResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message routerrpc.UpdateChanStatusResponse + */ +export const UpdateChanStatusResponse = new UpdateChanStatusResponse$Type(); +/** + * @generated ServiceType for protobuf service routerrpc.Router + */ +export const Router = new ServiceType("routerrpc.Router", [ + { name: "SendPaymentV2", serverStreaming: true, options: {}, I: SendPaymentRequest, O: Payment }, + { name: "TrackPaymentV2", serverStreaming: true, options: {}, I: TrackPaymentRequest, O: Payment }, + { name: "TrackPayments", serverStreaming: true, options: {}, I: TrackPaymentsRequest, O: Payment }, + { name: "EstimateRouteFee", options: {}, I: RouteFeeRequest, O: RouteFeeResponse }, + { name: "SendToRoute", options: {}, I: SendToRouteRequest, O: SendToRouteResponse }, + { name: "SendToRouteV2", options: {}, I: SendToRouteRequest, O: HTLCAttempt }, + { name: "ResetMissionControl", options: {}, I: ResetMissionControlRequest, O: ResetMissionControlResponse }, + { name: "QueryMissionControl", options: {}, I: QueryMissionControlRequest, O: QueryMissionControlResponse }, + { name: "XImportMissionControl", options: {}, I: XImportMissionControlRequest, O: XImportMissionControlResponse }, + { name: "GetMissionControlConfig", options: {}, I: GetMissionControlConfigRequest, O: GetMissionControlConfigResponse }, + { name: "SetMissionControlConfig", options: {}, I: SetMissionControlConfigRequest, O: SetMissionControlConfigResponse }, + { name: "QueryProbability", options: {}, I: QueryProbabilityRequest, O: QueryProbabilityResponse }, + { name: "BuildRoute", options: {}, I: BuildRouteRequest, O: BuildRouteResponse }, + { name: "SubscribeHtlcEvents", serverStreaming: true, options: {}, I: SubscribeHtlcEventsRequest, O: HtlcEvent }, + { name: "SendPayment", serverStreaming: true, options: {}, I: SendPaymentRequest, O: PaymentStatus }, + { name: "TrackPayment", serverStreaming: true, options: {}, I: TrackPaymentRequest, O: PaymentStatus }, + { name: "HtlcInterceptor", serverStreaming: true, clientStreaming: true, options: {}, I: ForwardHtlcInterceptResponse, O: ForwardHtlcInterceptRequest }, + { name: "UpdateChanStatus", options: {}, I: UpdateChanStatusRequest, O: UpdateChanStatusResponse } +]); diff --git a/config/invoices.proto b/proto/others/invoices.proto similarity index 64% rename from config/invoices.proto rename to proto/others/invoices.proto index df52b8c8..fde739f7 100644 --- a/config/invoices.proto +++ b/proto/others/invoices.proto @@ -1,6 +1,6 @@ syntax = "proto3"; -import "rpc.proto"; +import "lightning.proto"; package invoicesrpc; @@ -35,10 +35,17 @@ service Invoices { settled, this call will succeed. */ rpc SettleInvoice (SettleInvoiceMsg) returns (SettleInvoiceResp); + + /* + LookupInvoiceV2 attempts to look up at invoice. An invoice can be refrenced + using either its payment hash, payment address, or set ID. + */ + rpc LookupInvoiceV2 (LookupInvoiceMsg) returns (lnrpc.Invoice); } message CancelInvoiceMsg { - // Hash corresponding to the (hold) invoice to cancel. + // Hash corresponding to the (hold) invoice to cancel. When using + // REST, this field must be encoded as base64. bytes payment_hash = 1; } message CancelInvoiceResp { @@ -98,11 +105,26 @@ message AddHoldInvoiceRequest { message AddHoldInvoiceResp { /* - A bare-bones invoice for a payment within the Lightning Network. With the + A bare-bones invoice for a payment within the Lightning Network. With the details of the invoice, the sender has all the data necessary to send a payment to the recipient. */ string payment_request = 1; + + /* + The "add" index of this invoice. Each newly created invoice will increment + this index making it monotonically increasing. Callers to the + SubscribeInvoices call can use this to instantly get notified of all added + invoices with an add_index greater than this one. + */ + uint64 add_index = 2; + + /* + The payment address of the generated invoice. This value should be used + in all payments for this invoice as we require it for end to end + security. + */ + bytes payment_addr = 3; } message SettleInvoiceMsg { @@ -117,6 +139,37 @@ message SettleInvoiceResp { message SubscribeSingleInvoiceRequest { reserved 1; - // Hash corresponding to the (hold) invoice to subscribe to. + // Hash corresponding to the (hold) invoice to subscribe to. When using + // REST, this field must be encoded as base64url. bytes r_hash = 2; } + +enum LookupModifier { + // The default look up modifier, no look up behavior is changed. + DEFAULT = 0; + + /* + Indicates that when a look up is done based on a set_id, then only that set + of HTLCs related to that set ID should be returned. + */ + HTLC_SET_ONLY = 1; + + /* + Indicates that when a look up is done using a payment_addr, then no HTLCs + related to the payment_addr should be returned. This is useful when one + wants to be able to obtain the set of associated setIDs with a given + invoice, then look up the sub-invoices "projected" by that set ID. + */ + HTLC_SET_BLANK = 2; +} + +message LookupInvoiceMsg { + oneof invoice_ref { + // When using REST, this field must be encoded as base64. + bytes payment_hash = 1; + bytes payment_addr = 2; + bytes set_id = 3; + } + + LookupModifier lookup_modifier = 4; +} \ No newline at end of file diff --git a/config/rpc.proto b/proto/others/lightning.proto similarity index 80% rename from config/rpc.proto rename to proto/others/lightning.proto index d3754dbe..9516a69b 100644 --- a/config/rpc.proto +++ b/proto/others/lightning.proto @@ -200,6 +200,16 @@ service Lightning { */ rpc OpenChannel (OpenChannelRequest) returns (stream OpenStatusUpdate); + /* lncli: `batchopenchannel` + BatchOpenChannel attempts to open multiple single-funded channels in a + single transaction in an atomic way. This means either all channel open + requests succeed at once or all attempts are aborted if any of them fail. + This is the safer variant of using PSBTs to manually fund a batch of + channels through the OpenChannel RPC. + */ + rpc BatchOpenChannel (BatchOpenChannelRequest) + returns (BatchOpenChannelResponse); + /* FundingStateStep is an advanced funding related call that allows the caller to either execute some preparatory steps for a funding workflow, or @@ -330,7 +340,14 @@ service Lightning { rpc ListPayments (ListPaymentsRequest) returns (ListPaymentsResponse); /* - DeleteAllPayments deletes all outgoing payments from DB. + DeletePayment deletes an outgoing payment from DB. Note that it will not + attempt to delete an In-Flight payment, since that would be unsafe. + */ + rpc DeletePayment (DeletePaymentRequest) returns (DeletePaymentResponse); + + /* + DeleteAllPayments deletes all outgoing payments from DB. Note that it will + not attempt to delete In-Flight payments, since that would be unsafe. */ rpc DeleteAllPayments (DeleteAllPaymentsRequest) returns (DeleteAllPaymentsResponse); @@ -515,6 +532,93 @@ service Lightning { */ rpc ListPermissions (ListPermissionsRequest) returns (ListPermissionsResponse); + + /* + CheckMacaroonPermissions checks whether a request follows the constraints + imposed on the macaroon and that the macaroon is authorized to follow the + provided permissions. + */ + rpc CheckMacaroonPermissions (CheckMacPermRequest) + returns (CheckMacPermResponse); + + /* + RegisterRPCMiddleware adds a new gRPC middleware to the interceptor chain. A + gRPC middleware is software component external to lnd that aims to add + additional business logic to lnd by observing/intercepting/validating + incoming gRPC client requests and (if needed) replacing/overwriting outgoing + messages before they're sent to the client. When registering the middleware + must identify itself and indicate what custom macaroon caveats it wants to + be responsible for. Only requests that contain a macaroon with that specific + custom caveat are then sent to the middleware for inspection. The other + option is to register for the read-only mode in which all requests/responses + are forwarded for interception to the middleware but the middleware is not + allowed to modify any responses. As a security measure, _no_ middleware can + modify responses for requests made with _unencumbered_ macaroons! + */ + rpc RegisterRPCMiddleware (stream RPCMiddlewareResponse) + returns (stream RPCMiddlewareRequest); + + /* lncli: `sendcustom` + SendCustomMessage sends a custom peer message. + */ + rpc SendCustomMessage (SendCustomMessageRequest) + returns (SendCustomMessageResponse); + + /* lncli: `subscribecustom` + SubscribeCustomMessages subscribes to a stream of incoming custom peer + messages. + */ + rpc SubscribeCustomMessages (SubscribeCustomMessagesRequest) + returns (stream CustomMessage); + + /* lncli: `listaliases` + ListAliases returns the set of all aliases that have ever existed with + their confirmed SCID (if it exists) and/or the base SCID (in the case of + zero conf). + */ + rpc ListAliases (ListAliasesRequest) returns (ListAliasesResponse); + + rpc LookupHtlc (LookupHtlcRequest) returns (LookupHtlcResponse); +} + +message LookupHtlcRequest { + uint64 chan_id = 1; + + uint64 htlc_index = 2; +} + +message LookupHtlcResponse { + bool settled = 1; + + bool offchain = 2; +} + +message SubscribeCustomMessagesRequest { +} + +message CustomMessage { + // Peer from which the message originates + bytes peer = 1; + + // Message type. This value will be in the custom range (>= 32768). + uint32 type = 2; + + // Raw message data + bytes data = 3; +} + +message SendCustomMessageRequest { + // Peer to send the message to + bytes peer = 1; + + // Message type. This value needs to be in the custom range (>= 32768). + uint32 type = 2; + + // Raw message data. + bytes data = 3; +} + +message SendCustomMessageResponse { } message Utxo { @@ -537,6 +641,39 @@ message Utxo { int64 confirmations = 6; } +enum OutputScriptType { + SCRIPT_TYPE_PUBKEY_HASH = 0; + SCRIPT_TYPE_SCRIPT_HASH = 1; + SCRIPT_TYPE_WITNESS_V0_PUBKEY_HASH = 2; + SCRIPT_TYPE_WITNESS_V0_SCRIPT_HASH = 3; + SCRIPT_TYPE_PUBKEY = 4; + SCRIPT_TYPE_MULTISIG = 5; + SCRIPT_TYPE_NULLDATA = 6; + SCRIPT_TYPE_NON_STANDARD = 7; + SCRIPT_TYPE_WITNESS_UNKNOWN = 8; + SCRIPT_TYPE_WITNESS_V1_TAPROOT = 9; +} + +message OutputDetail { + // The type of the output + OutputScriptType output_type = 1; + + // The address + string address = 2; + + // The pkscript in hex + string pk_script = 3; + + // The output index used in the raw transaction + int64 output_index = 4; + + // The value of the output coin in satoshis + int64 amount = 5; + + // Denotes if the output is controlled by the internal wallet + bool is_our_address = 6; +} + message Transaction { // The transaction hash string tx_hash = 1; @@ -559,15 +696,23 @@ message Transaction { // Fees paid for this transaction int64 total_fees = 7; - // Addresses that received funds for this transaction - repeated string dest_addresses = 8; + // Addresses that received funds for this transaction. Deprecated as it is + // now incorporated in the output_details field. + repeated string dest_addresses = 8 [deprecated = true]; + + // Outputs that received funds for this transaction + repeated OutputDetail output_details = 11; // The raw transaction hex. string raw_tx_hex = 9; // A label that was optionally set on transaction broadcast. string label = 10; + + // PreviousOutpoints/Inputs of this transaction. + repeated PreviousOutPoint previous_outpoints = 12; } + message GetTransactionsRequest { /* The height from which to list transactions, inclusive. If this value is @@ -670,7 +815,8 @@ message SendRequest { The maximum number of satoshis that will be paid as a fee of the payment. This value can be represented either as a percentage of the amount being sent, or as a fixed amount of the maximum fee the user is willing the pay to - send the payment. + send the payment. If not specified, lnd will use a default value of 100% + fees for small amounts (<=1k sat) or 5% fees for larger amounts. */ FeeLimit fee_limit = 8; @@ -792,6 +938,17 @@ message ChannelAcceptRequest { // A bit-field which the initiator uses to specify proposed channel // behavior. uint32 channel_flags = 13; + + // The commitment type the initiator wishes to use for the proposed channel. + CommitmentType commitment_type = 14; + + // Whether the initiator wants to open a zero-conf channel via the channel + // type. + bool wants_zero_conf = 15; + + // Whether the initiator wants to use the scid-alias channel type. This is + // separate from the feature bit. + bool wants_scid_alias = 16; } message ChannelAcceptResponse { @@ -852,6 +1009,13 @@ message ChannelAcceptResponse { The number of confirmations we require before we consider the channel open. */ uint32 min_accept_depth = 10; + + /* + Whether the responder wants this to be a zero-conf channel. This will fail + if either side does not have the scid-alias feature bit set. The minimum + depth field must be zero if this is true. + */ + bool zero_conf = 11; } message ChannelPoint { @@ -884,12 +1048,21 @@ message OutPoint { uint32 output_index = 3; } +message PreviousOutPoint { + // The outpoint in format txid:n. + string outpoint = 1; + + // Denotes if the outpoint is controlled by the internal wallet. + // The flag will only detect p2wkh, np2wkh and p2tr inputs as its own. + bool is_our_output = 2; +} + message LightningAddress { - // The identity pubkey of the Lightning node + // The identity pubkey of the Lightning node. string pubkey = 1; // The network location of the lightning node, e.g. `69.69.69.69:1337` or - // `localhost:10011` + // `localhost:10011`. string host = 2; } @@ -1015,12 +1188,15 @@ message ListUnspentResponse { - `p2wkh`: Pay to witness key hash (`WITNESS_PUBKEY_HASH` = 0) - `np2wkh`: Pay to nested witness key hash (`NESTED_PUBKEY_HASH` = 1) +- `p2tr`: Pay to taproot pubkey (`TAPROOT_PUBKEY` = 4) */ enum AddressType { WITNESS_PUBKEY_HASH = 0; NESTED_PUBKEY_HASH = 1; UNUSED_WITNESS_PUBKEY_HASH = 2; UNUSED_NESTED_PUBKEY_HASH = 3; + TAPROOT_PUBKEY = 4; + UNUSED_TAPROOT_PUBKEY = 5; } message NewAddressRequest { @@ -1044,6 +1220,12 @@ message SignMessageRequest { base64. */ bytes msg = 1; + + /* + Instead of the default double-SHA256 hashing of the message before signing, + only use one round of hashing instead. + */ + bool single_hash = 2; } message SignMessageResponse { // The signature for the given message @@ -1069,11 +1251,15 @@ message VerifyMessageResponse { } message ConnectPeerRequest { - // Lightning address of the peer, in the format `@host` + /* + Lightning address of the peer to connect to. + */ LightningAddress addr = 1; - /* If set, the daemon will attempt to persistently connect to the target - * peer. Otherwise, the call will be synchronous. */ + /* + If set, the daemon will attempt to persistently connect to the target + peer. Otherwise, the call will be synchronous. + */ bool perm = 2; /* @@ -1115,11 +1301,16 @@ message HTLC { } enum CommitmentType { + /* + Returned when the commitment type isn't known or unavailable. + */ + UNKNOWN_COMMITMENT_TYPE = 0; + /* A channel using the legacy commitment format having tweaked to_remote keys. */ - LEGACY = 0; + LEGACY = 1; /* A channel that uses the modern commitment format where the key in the @@ -1127,19 +1318,23 @@ enum CommitmentType { up and recovery easier as when the channel is closed, the funds go directly to that key. */ - STATIC_REMOTE_KEY = 1; + STATIC_REMOTE_KEY = 2; /* A channel that uses a commitment format that has anchor outputs on the commitments, allowing fee bumping after a force close transaction has been broadcast. */ - ANCHORS = 2; + ANCHORS = 3; /* - Returned when the commitment type isn't known or unavailable. + A channel that uses a commitment type that builds upon the anchors + commitment format, but in addition requires a CLTV clause to spend outputs + paying to the channel initiator. This is intended for use on leased channels + to guarantee that the channel initiator has no incentives to close a leased + channel before its maturity date. */ - UNKNOWN_COMMITMENT_TYPE = 999; + SCRIPT_ENFORCED_LEASE = 4; } message ChannelConstraints { @@ -1317,6 +1512,18 @@ message Channel { // List constraints for the remote node. ChannelConstraints remote_constraints = 30; + + /* + This lists out the set of alias short channel ids that exist for a channel. + This may be empty. + */ + repeated uint64 alias_scids = 31; + + // Whether or not this is a zero-conf channel. + bool zero_conf = 32; + + // This is the confirmed / on-chain zero-conf SCID. + uint64 zero_conf_confirmed_scid = 33; } message ListChannelsRequest { @@ -1336,6 +1543,22 @@ message ListChannelsResponse { repeated Channel channels = 11; } +message AliasMap { + /* + For non-zero-conf channels, this is the confirmed SCID. Otherwise, this is + the first assigned "base" alias. + */ + uint64 base_scid = 1; + + // The set of all aliases stored for the base SCID. + repeated uint64 aliases = 2; +} +message ListAliasesRequest { +} +message ListAliasesResponse { + repeated AliasMap alias_maps = 1; +} + enum Initiator { INITIATOR_UNKNOWN = 0; INITIATOR_LOCAL = 1; @@ -1400,6 +1623,15 @@ message ChannelCloseSummary { Initiator close_initiator = 12; repeated Resolution resolutions = 13; + + /* + This lists out the set of alias short channel ids that existed for the + closed channel. This may be empty. + */ + repeated uint64 alias_scids = 14; + + // The confirmed SCID for a zero-conf channel. + uint64 zero_conf_confirmed_scid = 15 [jstype = JS_STRING]; } enum ResolutionType { @@ -1561,6 +1793,11 @@ message Peer { zero, we have not observed any flaps for this peer. */ int64 last_flap_ns = 14; + + /* + The last ping payload the peer has sent to us. + */ + bytes last_ping_payload = 15; } message TimestampedError { @@ -1663,6 +1900,11 @@ message GetInfoResponse { announcements and invoices. */ map features = 19; + + /* + Indicates whether the HTLC interceptor API is in always-on mode. + */ + bool require_htlc_interceptor = 21; } message GetRecoveryInfoRequest { @@ -1735,6 +1977,11 @@ message CloseChannelRequest { // A manual fee rate set in sat/vbyte that should be used when crafting the // closure transaction. uint64 sat_per_vbyte = 6; + + // The maximum fee rate the closer is willing to pay. + // + // NOTE: This field is only respected if we're the initiator of the channel. + uint64 max_fee_per_vbyte = 7; } message CloseStatusUpdate { @@ -1771,6 +2018,84 @@ message ReadyForPsbtFunding { bytes psbt = 3; } +message BatchOpenChannelRequest { + // The list of channels to open. + repeated BatchOpenChannel channels = 1; + + // The target number of blocks that the funding transaction should be + // confirmed by. + int32 target_conf = 2; + + // A manual fee rate set in sat/vByte that should be used when crafting the + // funding transaction. + int64 sat_per_vbyte = 3; + + // The minimum number of confirmations each one of your outputs used for + // the funding transaction must satisfy. + int32 min_confs = 4; + + // Whether unconfirmed outputs should be used as inputs for the funding + // transaction. + bool spend_unconfirmed = 5; + + // An optional label for the batch transaction, limited to 500 characters. + string label = 6; +} + +message BatchOpenChannel { + // The pubkey of the node to open a channel with. When using REST, this + // field must be encoded as base64. + bytes node_pubkey = 1; + + // The number of satoshis the wallet should commit to the channel. + int64 local_funding_amount = 2; + + // The number of satoshis to push to the remote side as part of the initial + // commitment state. + int64 push_sat = 3; + + // Whether this channel should be private, not announced to the greater + // network. + bool private = 4; + + // The minimum value in millisatoshi we will require for incoming HTLCs on + // the channel. + int64 min_htlc_msat = 5; + + // The delay we require on the remote's commitment transaction. If this is + // not set, it will be scaled automatically with the channel size. + uint32 remote_csv_delay = 6; + + /* + Close address is an optional address which specifies the address to which + funds should be paid out to upon cooperative close. This field may only be + set if the peer supports the option upfront feature bit (call listpeers + to check). The remote peer will only accept cooperative closes to this + address if it is set. + + Note: If this value is set on channel creation, you will *not* be able to + cooperatively close out to a different address. + */ + string close_address = 7; + + /* + An optional, unique identifier of 32 random bytes that will be used as the + pending channel ID to identify the channel while it is in the pre-pending + state. + */ + bytes pending_chan_id = 8; + + /* + The explicit commitment type to use. Note this field will only be used if + the remote peer supports explicit channel negotiation. + */ + CommitmentType commitment_type = 9; +} + +message BatchOpenChannelResponse { + repeated PendingUpdate pending_channels = 1; +} + message OpenChannelRequest { // A manual fee rate set in sat/vbyte that should be used when crafting the // funding transaction. @@ -1862,6 +2187,57 @@ message OpenChannelRequest { transaction. */ uint32 max_local_csv = 17; + + /* + The explicit commitment type to use. Note this field will only be used if + the remote peer supports explicit channel negotiation. + */ + CommitmentType commitment_type = 18; + + /* + If this is true, then a zero-conf channel open will be attempted. + */ + bool zero_conf = 19; + + /* + If this is true, then an option-scid-alias channel-type open will be + attempted. + */ + bool scid_alias = 20; + + /* + The base fee charged regardless of the number of milli-satoshis sent. + */ + uint64 base_fee = 21; + + /* + The fee rate in ppm (parts per million) that will be charged in + proportion of the value of each forwarded HTLC. + */ + uint64 fee_rate = 22; + + /* + If use_base_fee is true the open channel announcement will update the + channel base fee with the value specified in base_fee. In the case of + a base_fee of 0 use_base_fee is needed downstream to distinguish whether + to use the default base fee value specified in the config or 0. + */ + bool use_base_fee = 23; + + /* + If use_fee_rate is true the open channel announcement will update the + channel fee rate with the value specified in fee_rate. In the case of + a fee_rate of 0 use_fee_rate is needed downstream to distinguish whether + to use the default fee rate value specified in the config or 0. + */ + bool use_fee_rate = 24; + + /* + The number of satoshis we require the remote peer to reserve. This value, + if specified, must be above the dust limit and below 20% of the channel + capacity. + */ + uint64 remote_chan_reserve_sat = 25; } message OpenStatusUpdate { oneof update { @@ -2001,6 +2377,20 @@ message FundingPsbtVerify { // The pending channel ID of the channel to get the PSBT for. bytes pending_chan_id = 2; + + /* + Can only be used if the no_publish flag was set to true in the OpenChannel + call meaning that the caller is solely responsible for publishing the final + funding transaction. If skip_finalize is set to true then lnd will not wait + for a FundingPsbtFinalize state step and instead assumes that a transaction + with the same TXID as the passed in PSBT will eventually confirm. + IT IS ABSOLUTELY IMPERATIVE that the TXID of the transaction that is + eventually published does have the _same TXID_ as the verified PSBT. That + means no inputs or outputs can change, only signatures can be added. If the + TXID changes between this call and the publish step then the channel will + never be created and the funds will be in limbo. + */ + bool skip_finalize = 3; } message FundingPsbtFinalize { @@ -2105,15 +2495,21 @@ message PendingChannelsResponse { // The commitment type used by this channel. CommitmentType commitment_type = 9; + + // Total number of forwarding packages created in this channel. + int64 num_forwarding_packages = 10; + + // A set of flags showing the current state of the channel. + string chan_status_flags = 11; + + // Whether this channel is advertised to the network or not. + bool private = 12; } message PendingOpenChannel { // The pending channel PendingChannel channel = 1; - // The height at which this channel will be confirmed - uint32 confirmation_height = 2; - /* The amount calculated to be paid in fees for the current set of commitment transactions. The fee amount is persisted with the channel @@ -2132,6 +2528,9 @@ message PendingChannelsResponse { transaction. This value can later be updated once the channel is open. */ int64 fee_per_kw = 6; + + // Previously used for confirmation_height. Do not reuse. + reserved 2; } message WaitingCloseChannel { @@ -2146,6 +2545,9 @@ message PendingChannelsResponse { this point. */ Commitments commitments = 3; + + // The transaction id of the closing transaction + string closing_txid = 4; } message Commitments { @@ -2210,9 +2612,17 @@ message PendingChannelsResponse { repeated PendingHTLC pending_htlcs = 8; + /* + There are three resolution states for the anchor: + limbo, lost and recovered. Derive the current state + from the limbo and recovered balances. + */ enum AnchorState { + // The recovered_balance is zero and limbo_balance is non-zero. LIMBO = 0; + // The recovered_balance is non-zero. RECOVERED = 1; + // A state that is neither LIMBO nor RECOVERED. LOST = 2; } @@ -2249,6 +2659,7 @@ message ChannelEventUpdate { ChannelPoint active_channel = 3; ChannelPoint inactive_channel = 4; PendingUpdate pending_open_channel = 6; + ChannelPoint fully_resolved_channel = 7; } enum UpdateType { @@ -2257,6 +2668,7 @@ message ChannelEventUpdate { ACTIVE_CHANNEL = 2; INACTIVE_CHANNEL = 3; PENDING_OPEN_CHANNEL = 4; + FULLY_RESOLVED_CHANNEL = 5; } UpdateType type = 5; @@ -2283,6 +2695,13 @@ message WalletBalanceResponse { // The unconfirmed balance of a wallet(with 0 confirmations) int64 unconfirmed_balance = 3; + // The total amount of wallet UTXOs held in outputs that are locked for + // other usage. + int64 locked_balance = 5; + + // The amount of reserve required. + int64 reserved_balance_anchor_chan = 6; + // A mapping of each wallet account's name to its balance. map account_balance = 4; } @@ -2356,7 +2775,8 @@ message QueryRoutesRequest { The maximum number of satoshis that will be paid as a fee of the payment. This value can be represented either as a percentage of the amount being sent, or as a fixed amount of the maximum fee the user is willing the pay to - send the payment. + send the payment. If not specified, lnd will use a default value of 100% + fees for small amounts (<=1k sat) or 5% fees for larger amounts. */ FeeLimit fee_limit = 5; @@ -2399,7 +2819,7 @@ message QueryRoutesRequest { An optional field that can be used to pass an arbitrary set of TLV records to a peer which understands the new records. This can be used to pass application specific data during the payment attempt. If the destination - does not support the specified recrods, and error will be returned. + does not support the specified records, an error will be returned. Record types are required to be in the custom range >= 65536. When using REST, the values must be encoded as base64. */ @@ -2429,6 +2849,12 @@ message QueryRoutesRequest { fallback. */ repeated lnrpc.FeatureBit dest_features = 17; + + /* + The time preference for this payment. Set to -1 to optimize for fees + only, to 1 to optimize for reliability only or a value inbetween for a mix. + */ + double time_pref = 18; } message NodePair { @@ -2497,7 +2923,7 @@ message Hop { TLV format. Note that if any custom tlv_records below are specified, then this field MUST be set to true for them to be encoded properly. */ - bool tlv_payload = 9; + bool tlv_payload = 9 [deprecated = true]; /* An optional TLV record that signals the use of an MPP payment. If present, @@ -2523,6 +2949,9 @@ message Hop { to drop off at each hop within the onion. */ map custom_records = 11; + + // The payment metadata to send along with the payment to the payee. + bytes metadata = 13; } message MPPRecord { @@ -2639,6 +3068,9 @@ message LightningNode { repeated NodeAddress addresses = 4; string color = 5; map features = 6; + + // Custom node announcement tlv records. + map custom_records = 7; } message NodeAddress { @@ -2654,6 +3086,9 @@ message RoutingPolicy { bool disabled = 5; uint64 max_htlc_msat = 6; uint32 last_update = 7; + + // Custom channel update tlv records. + map custom_records = 8; } /* @@ -2681,6 +3116,9 @@ message ChannelEdge { RoutingPolicy node1_policy = 7; RoutingPolicy node2_policy = 8; + + // Custom channel announcement tlv records. + map custom_records = 9; } message ChannelGraphRequest { @@ -2847,6 +3285,10 @@ message HopHint { uint32 cltv_expiry_delta = 5; } +message SetID { + bytes set_id = 1; +} + message RouteHint { /* A list of hop hints that when chained together can assist in reaching a @@ -2855,6 +3297,20 @@ message RouteHint { repeated HopHint hop_hints = 1; } +message AMPInvoiceState { + // The state the HTLCs associated with this setID are in. + InvoiceHTLCState state = 1; + + // The settle index of this HTLC set, if the invoice state is settled. + uint64 settle_index = 2; + + // The time this HTLC set was settled expressed in unix epoch. + int64 settle_time = 3; + + // The total amount paid for the sub-invoice expressed in milli satoshis. + int64 amt_paid_msat = 5; +} + message Invoice { /* An optional memo to attach along with the invoice. Used for record keeping @@ -2876,6 +3332,7 @@ message Invoice { /* The hash of the preimage. When using REST, this field must be encoded as base64. + Note: Output only, don't specify for creating an invoice. */ bytes r_hash = 4; @@ -2893,19 +3350,30 @@ message Invoice { */ int64 value_msat = 23; - // Whether this invoice has been fulfilled + /* + Whether this invoice has been fulfilled + + The field is deprecated. Use the state field instead (compare to SETTLED). + */ bool settled = 6 [deprecated = true]; - // When this invoice was created + /* + When this invoice was created. + Note: Output only, don't specify for creating an invoice. + */ int64 creation_date = 7; - // When this invoice was settled + /* + When this invoice was settled. + Note: Output only, don't specify for creating an invoice. + */ int64 settle_date = 8; /* A bare-bones invoice for a payment within the Lightning Network. With the details of the invoice, the sender has all the data necessary to send a payment to the recipient. + Note: Output only, don't specify for creating an invoice. */ string payment_request = 9; @@ -2940,6 +3408,7 @@ message Invoice { this index making it monotonically increasing. Callers to the SubscribeInvoices call can use this to instantly get notified of all added invoices with an add_index greater than this one. + Note: Output only, don't specify for creating an invoice. */ uint64 add_index = 16; @@ -2948,6 +3417,7 @@ message Invoice { increment this index making it monotonically increasing. Callers to the SubscribeInvoices call can use this to instantly get notified of all settled invoices with an settle_index greater than this one. + Note: Output only, don't specify for creating an invoice. */ uint64 settle_index = 17; @@ -2961,6 +3431,7 @@ message Invoice { was ultimately accepted. Additionally, it's possible that the sender paid MORE that was specified in the original invoice. So we'll record that here as well. + Note: Output only, don't specify for creating an invoice. */ int64 amt_paid_sat = 19; @@ -2971,6 +3442,7 @@ message Invoice { amount was ultimately accepted. Additionally, it's possible that the sender paid MORE that was specified in the original invoice. So we'll record that here as well. + Note: Output only, don't specify for creating an invoice. */ int64 amt_paid_msat = 20; @@ -2983,25 +3455,34 @@ message Invoice { /* The state the invoice is in. + Note: Output only, don't specify for creating an invoice. */ InvoiceState state = 21; - // List of HTLCs paying to this invoice [EXPERIMENTAL]. + /* + List of HTLCs paying to this invoice [EXPERIMENTAL]. + Note: Output only, don't specify for creating an invoice. + */ repeated InvoiceHTLC htlcs = 22; - // List of features advertised on the invoice. + /* + List of features advertised on the invoice. + Note: Output only, don't specify for creating an invoice. + */ map features = 24; /* Indicates if this invoice was a spontaneous payment that arrived via keysend [EXPERIMENTAL]. + Note: Output only, don't specify for creating an invoice. */ bool is_keysend = 25; /* The payment address of this invoice. This value will be used in MPP - payments, and also for newer invoies that always require the MPP paylaod + payments, and also for newer invoices that always require the MPP payload for added end-to-end security. + Note: Output only, don't specify for creating an invoice. */ bytes payment_addr = 26; @@ -3009,6 +3490,17 @@ message Invoice { Signals whether or not this is an AMP invoice. */ bool is_amp = 27; + + /* + [EXPERIMENTAL]: + + Maps a 32-byte hex-encoded set ID to the sub-invoice AMP state for the + given set ID. This field is always populated for AMP invoices, and can be + used along side LookupInvoice to obtain the HTLC information related to a + given sub-invoice. + Note: Output only, don't specify for creating an invoice. + */ + map amp_invoice_state = 28; } enum InvoiceHTLCState { @@ -3328,6 +3820,14 @@ message ListPaymentsRequest { of the returned payments is always oldest first (ascending index order). */ bool reversed = 4; + + /* + If set, all payments (complete and incomplete, independent of the + max_payments parameter) will be counted. Note that setting this to true will + increase the run time of the call significantly on systems that have a lot + of payments, as all of them have to be iterated through to be counted. + */ + bool count_total_payments = 5; } message ListPaymentsResponse { @@ -3345,6 +3845,24 @@ message ListPaymentsResponse { as the index_offset to continue seeking forwards in the next request. */ uint64 last_index_offset = 3; + + /* + Will only be set if count_total_payments in the request was set. Represents + the total number of payments (complete and incomplete, independent of the + number of payments requested in the query) currently present in the payments + database. + */ + uint64 total_num_payments = 4; +} + +message DeletePaymentRequest { + // Payment hash to delete. + bytes payment_hash = 1; + + /* + Only delete failed HTLCs from the payment, not the payment itself. + */ + bool failed_htlcs_only = 2; } message DeleteAllPaymentsRequest { @@ -3357,6 +3875,9 @@ message DeleteAllPaymentsRequest { bool failed_htlcs_only = 2; } +message DeletePaymentResponse { +} + message DeleteAllPaymentsResponse { } @@ -3364,6 +3885,13 @@ message AbandonChannelRequest { ChannelPoint channel_point = 1; bool pending_funding_shim_only = 2; + + /* + Override the requirement for being in dev mode by setting this to true and + confirming the user knows what they are doing and this is a potential foot + gun to lose funds if used on active channels. + */ + bool i_know_what_i_am_doing = 3; } message AbandonChannelResponse { @@ -3485,6 +4013,9 @@ message PolicyUpdateRequest { // goes up to 6 decimal places, so 1e-6. double fee_rate = 4; + // The effective fee rate in micro-satoshis (parts per million). + uint32 fee_rate_ppm = 9; + // The required timelock delta for HTLCs forwarded over the channel. uint32 time_lock_delta = 5; @@ -3499,7 +4030,28 @@ message PolicyUpdateRequest { // If true, min_htlc_msat is applied. bool min_htlc_msat_specified = 8; } +enum UpdateFailure { + UPDATE_FAILURE_UNKNOWN = 0; + UPDATE_FAILURE_PENDING = 1; + UPDATE_FAILURE_NOT_FOUND = 2; + UPDATE_FAILURE_INTERNAL_ERR = 3; + UPDATE_FAILURE_INVALID_PARAMETER = 4; +} + +message FailedUpdate { + // The outpoint in format txid:n + OutPoint outpoint = 1; + + // Reason for the policy update failure. + UpdateFailure reason = 2; + + // A string representation of the policy update error. + string update_error = 3; +} + message PolicyUpdateResponse { + // List of failed policy updates. + repeated FailedUpdate failed_updates = 1; } message ForwardingHistoryRequest { @@ -3520,6 +4072,10 @@ message ForwardingHistoryRequest { // The max number of events to return in the response to this query. uint32 num_max_events = 4; + + // Informs the server if the peer alias should be looked up for each + // forwarding event. + bool peer_alias_lookup = 5; } message ForwardingEvent { // Timestamp is the time (unix epoch offset) that this circuit was @@ -3559,6 +4115,12 @@ message ForwardingEvent { // circuit was completed. uint64 timestamp_ns = 11; + // The peer alias of the incoming channel. + string peer_alias_in = 12; + + // The peer alias of the outgoing channel. + string peer_alias_out = 13; + // TODO(roasbeef): add settlement latency? // * use FPE on the chan id? // * also list failures? @@ -3667,6 +4229,12 @@ message BakeMacaroonRequest { // The root key ID used to create the macaroon, must be a positive integer. uint64 root_key_id = 2; + + /* + Informs the RPC on whether to allow external permissions that LND is not + aware of. + */ + bool allow_external_permissions = 3; } message BakeMacaroonResponse { // The hex encoded macaroon, serialized in binary format. @@ -3878,3 +4446,224 @@ message Op { string entity = 1; repeated string actions = 2; } + +message CheckMacPermRequest { + bytes macaroon = 1; + repeated MacaroonPermission permissions = 2; + string fullMethod = 3; +} + +message CheckMacPermResponse { + bool valid = 1; +} + +message RPCMiddlewareRequest { + /* + The unique ID of the intercepted original gRPC request. Useful for mapping + request to response when implementing full duplex message interception. For + streaming requests, this will be the same ID for all incoming and outgoing + middleware intercept messages of the _same_ stream. + */ + uint64 request_id = 1; + + /* + The raw bytes of the complete macaroon as sent by the gRPC client in the + original request. This might be empty for a request that doesn't require + macaroons such as the wallet unlocker RPCs. + */ + bytes raw_macaroon = 2; + + /* + The parsed condition of the macaroon's custom caveat for convenient access. + This field only contains the value of the custom caveat that the handling + middleware has registered itself for. The condition _must_ be validated for + messages of intercept_type stream_auth and request! + */ + string custom_caveat_condition = 3; + + /* + There are three types of messages that will be sent to the middleware for + inspection and approval: Stream authentication, request and response + interception. The first two can only be accepted (=forward to main RPC + server) or denied (=return error to client). Intercepted responses can also + be replaced/overwritten. + */ + oneof intercept_type { + /* + Intercept stream authentication: each new streaming RPC call that is + initiated against lnd and contains the middleware's custom macaroon + caveat can be approved or denied based upon the macaroon in the stream + header. This message will only be sent for streaming RPCs, unary RPCs + must handle the macaroon authentication in the request interception to + avoid an additional message round trip between lnd and the middleware. + */ + StreamAuth stream_auth = 4; + + /* + Intercept incoming gRPC client request message: all incoming messages, + both on streaming and unary RPCs, are forwarded to the middleware for + inspection. For unary RPC messages the middleware is also expected to + validate the custom macaroon caveat of the request. + */ + RPCMessage request = 5; + + /* + Intercept outgoing gRPC response message: all outgoing messages, both on + streaming and unary RPCs, are forwarded to the middleware for inspection + and amendment. The response in this message is the original response as + it was generated by the main RPC server. It can either be accepted + (=forwarded to the client), replaced/overwritten with a new message of + the same type, or replaced by an error message. + */ + RPCMessage response = 6; + + /* + This is used to indicate to the client that the server has successfully + registered the interceptor. This is only used in the very first message + that the server sends to the client after the client sends the server + the middleware registration message. + */ + bool reg_complete = 8; + } + + /* + The unique message ID of this middleware intercept message. There can be + multiple middleware intercept messages per single gRPC request (one for the + incoming request and one for the outgoing response) or gRPC stream (one for + each incoming message and one for each outgoing response). This message ID + must be referenced when responding (accepting/rejecting/modifying) to an + intercept message. + */ + uint64 msg_id = 7; +} + +message StreamAuth { + /* + The full URI (in the format /./MethodName, for + example /lnrpc.Lightning/GetInfo) of the streaming RPC method that was just + established. + */ + string method_full_uri = 1; +} + +message RPCMessage { + /* + The full URI (in the format /./MethodName, for + example /lnrpc.Lightning/GetInfo) of the RPC method the message was sent + to/from. + */ + string method_full_uri = 1; + + /* + Indicates whether the message was sent over a streaming RPC method or not. + */ + bool stream_rpc = 2; + + /* + The full canonical gRPC name of the message type (in the format + .TypeName, for example lnrpc.GetInfoRequest). In case of an + error being returned from lnd, this simply contains the string "error". + */ + string type_name = 3; + + /* + The full content of the gRPC message, serialized in the binary protobuf + format. + */ + bytes serialized = 4; + + /* + Indicates that the response from lnd was an error, not a gRPC response. If + this is set to true then the type_name contains the string "error" and + serialized contains the error string. + */ + bool is_error = 5; +} + +message RPCMiddlewareResponse { + /* + The request message ID this response refers to. Must always be set when + giving feedback to an intercept but is ignored for the initial registration + message. + */ + uint64 ref_msg_id = 1; + + /* + The middleware can only send two types of messages to lnd: The initial + registration message that identifies the middleware and after that only + feedback messages to requests sent to the middleware. + */ + oneof middleware_message { + /* + The registration message identifies the middleware that's being + registered in lnd. The registration message must be sent immediately + after initiating the RegisterRpcMiddleware stream, otherwise lnd will + time out the attempt and terminate the request. NOTE: The middleware + will only receive interception messages for requests that contain a + macaroon with the custom caveat that the middleware declares it is + responsible for handling in the registration message! As a security + measure, _no_ middleware can intercept requests made with _unencumbered_ + macaroons! + */ + MiddlewareRegistration register = 2; + + /* + The middleware received an interception request and gives feedback to + it. The request_id indicates what message the feedback refers to. + */ + InterceptFeedback feedback = 3; + } +} + +message MiddlewareRegistration { + /* + The name of the middleware to register. The name should be as informative + as possible and is logged on registration. + */ + string middleware_name = 1; + + /* + The name of the custom macaroon caveat that this middleware is responsible + for. Only requests/responses that contain a macaroon with the registered + custom caveat are forwarded for interception to the middleware. The + exception being the read-only mode: All requests/responses are forwarded to + a middleware that requests read-only access but such a middleware won't be + allowed to _alter_ responses. As a security measure, _no_ middleware can + change responses to requests made with _unencumbered_ macaroons! + NOTE: Cannot be used at the same time as read_only_mode. + */ + string custom_macaroon_caveat_name = 2; + + /* + Instead of defining a custom macaroon caveat name a middleware can register + itself for read-only access only. In that mode all requests/responses are + forwarded to the middleware but the middleware isn't allowed to alter any of + the responses. + NOTE: Cannot be used at the same time as custom_macaroon_caveat_name. + */ + bool read_only_mode = 3; +} + +message InterceptFeedback { + /* + The error to return to the user. If this is non-empty, the incoming gRPC + stream/request is aborted and the error is returned to the gRPC client. If + this value is empty, it means the middleware accepts the stream/request/ + response and the processing of it can continue. + */ + string error = 1; + + /* + A boolean indicating that the gRPC message should be replaced/overwritten. + This boolean is needed because in protobuf an empty message is serialized as + a 0-length or nil byte slice and we wouldn't be able to distinguish between + an empty replacement message and the "don't replace anything" case. + */ + bool replace_response = 2; + + /* + If the replace_response field is set to true, this field must contain the + binary serialized gRPC message in the protobuf format. + */ + bytes replacement_serialized = 3; +} \ No newline at end of file diff --git a/config/router.proto b/proto/others/router.proto similarity index 90% rename from config/router.proto rename to proto/others/router.proto index 2743dff0..1105fd63 100644 --- a/config/router.proto +++ b/proto/others/router.proto @@ -1,6 +1,6 @@ syntax = "proto3"; -import "rpc.proto"; +import "lightning.proto"; package routerrpc; @@ -22,6 +22,16 @@ service Router { */ rpc TrackPaymentV2 (TrackPaymentRequest) returns (stream lnrpc.Payment); + /* + TrackPayments returns an update stream for every payment that is not in a + terminal state. Note that if payments are in-flight while starting a new + subscription, the start of the payment stream could produce out-of-order + and/or duplicate events. In order to get updates for every in-flight + payment attempt make sure to subscribe to this method before initiating any + payments. + */ + rpc TrackPayments (TrackPaymentsRequest) returns (stream lnrpc.Payment); + /* EstimateRouteFee allows callers to obtain a lower bound w.r.t how much it may cost to send an HTLC to the target end destination. @@ -284,6 +294,12 @@ message SendPaymentRequest { If set, an AMP-payment will be attempted. */ bool amp = 22; + + /* + The time preference for this payment. Set to -1 to optimize for fees + only, to 1 to optimize for reliability only or a value inbetween for a mix. + */ + double time_pref = 23; } message TrackPaymentRequest { @@ -297,6 +313,14 @@ message TrackPaymentRequest { bool no_inflight_updates = 2; } +message TrackPaymentsRequest { + /* + If set, only the final payment updates are streamed back. Intermediate + updates that show which htlcs are still in flight are suppressed. + */ + bool no_inflight_updates = 1; +} + message RouteFeeRequest { /* The destination once wishes to obtain a routing fee quote to. @@ -330,6 +354,14 @@ message SendToRouteRequest { // Route that should be used to attempt to complete the payment. lnrpc.Route route = 2; + + /* + Whether the payment should be marked as failed when a temporary error is + returned from the given route. Set it to true so the payment won't be + failed unless a terminal error is occurred, such as payment timeout, no + routes, incorrect payment details, or insufficient funds. + */ + bool skip_temp_err = 3; } message SendToRouteResponse { @@ -360,6 +392,11 @@ message QueryMissionControlResponse { message XImportMissionControlRequest { // Node pair-level mission control state to be imported. repeated PairHistory pairs = 1; + + // Whether to force override MC pair history. Note that even with force + // override the failure pair is imported before the success pair and both + // still clamp existing failure/success amounts. + bool force = 2; } message XImportMissionControlResponse { @@ -581,6 +618,8 @@ message HtlcEvent { ForwardFailEvent forward_fail_event = 8; SettleEvent settle_event = 9; LinkFailEvent link_fail_event = 10; + SubscribedEvent subscribed_event = 11; + FinalHtlcEvent final_htlc_event = 12; } } @@ -607,6 +646,16 @@ message ForwardFailEvent { } message SettleEvent { + // The revealed preimage. + bytes preimage = 1; +} + +message FinalHtlcEvent { + bool settled = 1; + bool offchain = 2; +} + +message SubscribedEvent { } message LinkFailEvent { @@ -676,7 +725,7 @@ enum PaymentState { FAILED_NO_ROUTE = 3; /* - A non-recoverable error has occured. + A non-recoverable error has occurred. */ FAILED_ERROR = 4; @@ -753,6 +802,10 @@ message ForwardHtlcInterceptRequest { // The onion blob for the next hop bytes onion_blob = 9; + + // The block height at which this htlc will be auto-failed to prevent the + // channel from force-closing. + int32 auto_fail_height = 10; } /** @@ -774,6 +827,21 @@ message ForwardHtlcInterceptResponse { // The preimage in case the resolve action is Settle. bytes preimage = 3; + + // Encrypted failure message in case the resolve action is Fail. + // + // If failure_message is specified, the failure_code field must be set + // to zero. + bytes failure_message = 4; + + // Return the specified failure code in case the resolve action is Fail. The + // message data fields are populated automatically. + // + // If a non-zero failure_code is specified, failure_message must not be set. + // + // For backwards-compatibility reasons, TEMPORARY_CHANNEL_FAILURE is the + // default value for this field. + lnrpc.Failure.FailureCode failure_code = 5; } enum ResolveHoldForwardAction { @@ -795,4 +863,4 @@ enum ChanStatusAction { } message UpdateChanStatusResponse { -} +} \ No newline at end of file diff --git a/proto/protoc-gen-pub.exe b/proto/protoc-gen-pub.exe new file mode 100644 index 00000000..80ef68cb Binary files /dev/null and b/proto/protoc-gen-pub.exe differ diff --git a/proto/service/methods.proto b/proto/service/methods.proto new file mode 100644 index 00000000..a7125bc4 --- /dev/null +++ b/proto/service/methods.proto @@ -0,0 +1,122 @@ +syntax = "proto3"; + +package methods; + +import "google/protobuf/descriptor.proto"; +import "structs.proto"; + +option go_package = "github.com/shocknet/lightning.pub"; +option (file_options) = { + supported_http_methods:["post", "get"]; + supported_auths:[ + { + id: "guest" + name: "Guest" + context:[] + }, + { + id: "user" + name: "User", + context:{ + key:"user_id", + value:"string" + } + }, + { + id: "admin", + name: "Admin", + encrypted:true, + context:{ + key:"admin_id", + value:"string" + } + } + ]; +}; + +message MethodQueryOptions { + repeated string items = 1; +} + +extend google.protobuf.MethodOptions { // TODO: move this stuff to dep repo? + string auth_type = 50003; + string http_method = 50004; + string http_route = 50005; + MethodQueryOptions query = 50006; + +} + +message ProtoFileOptions { + message SupportedAuth { + string id = 1; + string name = 2; + bool encrypted = 3; + map context = 4; + } + repeated SupportedAuth supported_auths = 1; + repeated string supported_http_methods = 2; +} + +extend google.protobuf.FileOptions { + ProtoFileOptions file_options = 50004; +} + +service LightningPub { + rpc Health(structs.Empty) returns (structs.Empty){ + option (auth_type) = "Guest"; + option (http_method) = "get"; + option (http_route) = "/api/health"; + }; + rpc EncryptionExchange(structs.EncryptionExchangeRequest) returns (structs.Empty){ + option (auth_type) = "Guest"; + option (http_method) = "post"; + option (http_route) = "/api/encryption/exchange"; + }; + rpc LndGetInfo(structs.LndGetInfoRequest) returns (structs.LndGetInfoResponse){ + option (auth_type) = "Admin"; + option (http_method) = "post"; + option (http_route) = "/api/lnd/getinfo"; + }; + + rpc AddUser(structs.AddUserRequest)returns (structs.AddUserResponse){ + option (auth_type) = "Guest"; + option (http_method) = "post"; + option (http_route) = "/api/user/add"; + } + rpc AuthUser(structs.AuthUserRequest)returns (structs.AuthUserResponse){ + option (auth_type) = "Guest"; + option (http_method) = "post"; + option (http_route) = "/api/user/auth"; + } + // USER + rpc NewAddress(structs.NewAddressRequest) returns (structs.NewAddressResponse) { + option (auth_type) = "User"; + option (http_method) = "post"; + option (http_route) = "/api/user/chain/new"; + } + rpc PayAddress(structs.PayAddressRequest) returns (structs.PayAddressResponse){ + option (auth_type) = "User"; + option (http_method) = "post"; + option (http_route) = "/api/user/chain/pay"; + } + rpc NewInvoice(structs.NewInvoiceRequest) returns (structs.NewInvoiceResponse){ + option (auth_type) = "User"; + option (http_method) = "post"; + option (http_route) = "/api/user/invoice/new"; + } + rpc PayInvoice(structs.PayInvoiceRequest) returns (structs.PayInvoiceResponse){ + option (auth_type) = "User"; + option (http_method) = "post"; + option (http_route) = "/api/user/invoice/pay"; + } + rpc OpenChannel(structs.OpenChannelRequest) returns (structs.OpenChannelResponse){ + option (auth_type) = "User"; + option (http_method) = "post"; + option (http_route) = "/api/user/open/channel"; + } + rpc GetOpenChannelLNURL(structs.Empty) returns (structs.GetOpenChannelLNURLResponse){ + option (auth_type) = "User"; + option (http_method) = "post"; + option (http_route) = "/api/user/lnurl_channel"; + } +} \ No newline at end of file diff --git a/proto/service/structs.proto b/proto/service/structs.proto new file mode 100644 index 00000000..fb16525f --- /dev/null +++ b/proto/service/structs.proto @@ -0,0 +1,93 @@ +syntax = "proto3"; + +package structs; + +option go_package = "github.com/shocknet/lightning.pub"; + +message Empty {} + + +message EncryptionExchangeRequest { + string public_key = 1; + string device_id = 2; +} + +message LndGetInfoRequest { + int64 node_id = 1; +} + +message LndGetInfoResponse { + string alias = 1; +} +enum AddressType { + WITNESS_PUBKEY_HASH = 0; + NESTED_PUBKEY_HASH = 1; + TAPROOT_PUBKEY = 2; +} +message NewAddressRequest { + AddressType address_type = 1; +} +message NewAddressResponse{ + string address = 1; +} +message PayAddressRequest{ + string address = 1; + int64 amout_sats = 2; +} + +message PayAddressResponse{ + string tx_id = 1; +} + +message NewInvoiceRequest{ + int64 amount_sats = 1; +} + +message NewInvoiceResponse{ + string invoice = 1; +} + +message PayInvoiceRequest{ + string invoice = 1; + int64 amount = 2; +} + +message PayInvoiceResponse{ + string preimage = 1; +} + +message OpenChannelRequest{ + string destination = 1; + int64 funding_amount = 2; + int64 push_amount = 3; + string close_address = 4; +} + +message OpenChannelResponse{ + string channel_id = 1; +} + +message GetOpenChannelLNURLResponse{ + string lnurl = 1; +} + +message AddUserRequest{ + string callback_url = 1; + string name = 2; + string secret = 3; +} + +message AddUserResponse{ + string user_id = 1; + string auth_token = 2; +} + +message AuthUserRequest{ + string name = 2; + string secret = 3; +} + +message AuthUserResponse{ + string user_id = 1; + string auth_token = 2; +} \ No newline at end of file diff --git a/public/localHomepage.html b/public/localHomepage.html deleted file mode 100644 index 832973bd..00000000 --- a/public/localHomepage.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - Document - - - -

-
-

Tunnel

-

-
-
-

Access Secret

-

-
-
- - - \ No newline at end of file diff --git a/public/obsOverlay.html b/public/obsOverlay.html deleted file mode 100644 index d3d5daed..00000000 --- a/public/obsOverlay.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - Document - - - - - -
-
-

some random name i dont know

-

JUST TIPPED YOU!

-

100sats

-
-
- - - \ No newline at end of file diff --git a/public/qrcode.min.js b/public/qrcode.min.js deleted file mode 100644 index 993e88f3..00000000 --- a/public/qrcode.min.js +++ /dev/null @@ -1 +0,0 @@ -var QRCode;!function(){function a(a){this.mode=c.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=[],d=0,e=this.data.length;e>d;d++){var f=this.data.charCodeAt(d);f>65536?(b[0]=240|(1835008&f)>>>18,b[1]=128|(258048&f)>>>12,b[2]=128|(4032&f)>>>6,b[3]=128|63&f):f>2048?(b[0]=224|(61440&f)>>>12,b[1]=128|(4032&f)>>>6,b[2]=128|63&f):f>128?(b[0]=192|(1984&f)>>>6,b[1]=128|63&f):b[0]=f,this.parsedData=this.parsedData.concat(b)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function i(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c=f;f++){var h=0;switch(b){case d.L:h=l[f][0];break;case d.M:h=l[f][1];break;case d.Q:h=l[f][2];break;case d.H:h=l[f][3]}if(h>=e)break;c++}if(c>l.length)throw new Error("Too long data");return c}function s(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(this.modules[a+c][b+d]=c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?!0:!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=f.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f=g;g++)for(var h=-2;2>=h;h++)this.modules[d+g][e+h]=-2==g||2==g||-2==h||2==h||0==g&&0==h?!0:!1}},setupTypeNumber:function(a){for(var b=f.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=f.getBCHTypeInfo(c),e=0;15>e;e++){var g=!a&&1==(1&d>>e);6>e?this.modules[e][8]=g:8>e?this.modules[e+1][8]=g:this.modules[this.moduleCount-15+e][8]=g}for(var e=0;15>e;e++){var g=!a&&1==(1&d>>e);8>e?this.modules[8][this.moduleCount-e-1]=g:9>e?this.modules[8][15-e-1+1]=g:this.modules[8][15-e-1]=g}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,g=0,h=this.moduleCount-1;h>0;h-=2)for(6==h&&h--;;){for(var i=0;2>i;i++)if(null==this.modules[d][h-i]){var j=!1;g>>e));var k=f.getMask(b,d,h-i);k&&(j=!j),this.modules[d][h-i]=j,e--,-1==e&&(g++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,d){for(var e=j.getRSBlocks(a,c),g=new k,h=0;h8*l)throw new Error("code length overflow. ("+g.getLengthInBits()+">"+8*l+")");for(g.getLengthInBits()+4<=8*l&&g.put(0,4);0!=g.getLengthInBits()%8;)g.putBit(!1);for(;;){if(g.getLengthInBits()>=8*l)break;if(g.put(b.PAD0,8),g.getLengthInBits()>=8*l)break;g.put(b.PAD1,8)}return b.createBytes(g,e)},b.createBytes=function(a,b){for(var c=0,d=0,e=0,g=new Array(b.length),h=new Array(b.length),j=0;j=0?p.get(q):0}}for(var r=0,m=0;mm;m++)for(var j=0;jm;m++)for(var j=0;j=0;)b^=f.G15<=0;)b^=f.G18<>>=1;return b},getPatternPosition:function(a){return f.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case e.PATTERN000:return 0==(b+c)%2;case e.PATTERN001:return 0==b%2;case e.PATTERN010:return 0==c%3;case e.PATTERN011:return 0==(b+c)%3;case e.PATTERN100:return 0==(Math.floor(b/2)+Math.floor(c/3))%2;case e.PATTERN101:return 0==b*c%2+b*c%3;case e.PATTERN110:return 0==(b*c%2+b*c%3)%2;case e.PATTERN111:return 0==(b*c%3+(b+c)%2)%2;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new i([1],0),c=0;a>c;c++)b=b.multiply(new i([1,g.gexp(c)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case c.MODE_NUMBER:return 10;case c.MODE_ALPHA_NUM:return 9;case c.MODE_8BIT_BYTE:return 8;case c.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case c.MODE_NUMBER:return 12;case c.MODE_ALPHA_NUM:return 11;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case c.MODE_NUMBER:return 14;case c.MODE_ALPHA_NUM:return 13;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||(0!=h||0!=i)&&g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,(0==j||4==j)&&(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},g={glog:function(a){if(1>a)throw new Error("glog("+a+")");return g.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return g.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},h=0;8>h;h++)g.EXP_TABLE[h]=1<h;h++)g.EXP_TABLE[h]=g.EXP_TABLE[h-4]^g.EXP_TABLE[h-5]^g.EXP_TABLE[h-6]^g.EXP_TABLE[h-8];for(var h=0;255>h;h++)g.LOG_TABLE[g.EXP_TABLE[h]]=h;i.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),c=0;cf;f++)for(var g=c[3*f+0],h=c[3*f+1],i=c[3*f+2],k=0;g>k;k++)e.push(new j(h,i));return e},j.getRsBlockTable=function(a,b){switch(b){case d.L:return j.RS_BLOCK_TABLE[4*(a-1)+0];case d.M:return j.RS_BLOCK_TABLE[4*(a-1)+1];case d.Q:return j.RS_BLOCK_TABLE[4*(a-1)+2];case d.H:return j.RS_BLOCK_TABLE[4*(a-1)+3];default:return void 0}},k.prototype={get:function(a){var b=Math.floor(a/8);return 1==(1&this.buffer[b]>>>7-a%8)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(1&a>>>b-c-1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer[b]|=128>>>this.length%8),this.length++}};var l=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],o=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function g(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var b=this._htOption,c=this._el,d=a.getModuleCount();Math.floor(b.width/d),Math.floor(b.height/d),this.clear();var h=g("svg",{viewBox:"0 0 "+String(d)+" "+String(d),width:"100%",height:"100%",fill:b.colorLight});h.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),c.appendChild(h),h.appendChild(g("rect",{fill:b.colorDark,width:"1",height:"1",id:"template"}));for(var i=0;d>i;i++)for(var j=0;d>j;j++)if(a.isDark(i,j)){var k=g("use",{x:String(i),y:String(j)});k.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),h.appendChild(k)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),p="svg"===document.documentElement.tagName.toLowerCase(),q=p?o:m()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function d(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&_fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",void 0}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var b=1/window.devicePixelRatio,c=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,d,e,f,g,h,i,j){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*b;else"undefined"==typeof j&&(arguments[1]*=b,arguments[2]*=b,arguments[3]*=b,arguments[4]*=b);c.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=n(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&d.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){for(var b=this._htOption,c=this._el,d=a.getModuleCount(),e=Math.floor(b.width/d),f=Math.floor(b.height/d),g=[''],h=0;d>h;h++){g.push("");for(var i=0;d>i;i++)g.push('');g.push("")}g.push("
"),c.innerHTML=g.join("");var j=c.childNodes[0],k=(b.width-j.offsetWidth)/2,l=(b.height-j.offsetHeight)/2;k>0&&l>0&&(j.style.margin=l+"px "+k+"px")},a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCode=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:d.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._android=n(),this._el=a,this._oQRCode=null,this._oDrawing=new q(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)},QRCode.prototype.makeCode=function(a){this._oQRCode=new b(r(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=d}(); \ No newline at end of file diff --git a/services/auth/auth.js b/services/auth/auth.js deleted file mode 100644 index d44ac608..00000000 --- a/services/auth/auth.js +++ /dev/null @@ -1,79 +0,0 @@ -/* - * @prettier - */ -// @ts-nocheck -const jwt = require('jsonwebtoken') -const uuidv1 = require('uuid/v1') -const jsonfile = require('jsonfile') -const path = require('path') -const logger = require('../../config/log') -const Storage = require('node-persist') -const FS = require('../../utils/fs') - -const rootFolder = process.resourcesPath || __dirname - -class Auth { - readSecrets = async () => { - const secrets = await Storage.get('auth/secrets') - - if (secrets) { - return secrets - } - - const newSecrets = await Storage.set('auth/secrets', {}) - - return newSecrets - } - - async writeSecrets(key, value) { - const allSecrets = await this.readSecrets() - const newSecrets = await Storage.set('auth/secrets', { - ...allSecrets, - [key]: value - }) - return newSecrets - } - - async generateToken() { - const timestamp = Date.now() - const secret = uuidv1() - logger.info('Generating new secret...') - const token = jwt.sign( - { - data: { timestamp } - }, - secret, - { expiresIn: '500h' } - ) - logger.info('Saving secret...') - await this.writeSecrets(timestamp, secret) - return token - } - - async validateToken(token) { - try { - const key = jwt.decode(token).data.timestamp - const secrets = await this.readSecrets() - const secret = secrets[key] - if (!secret) { - throw { valid: false } - } - return new Promise((resolve, reject) => { - jwt.verify(token, secret, (err, decoded) => { - if (err) { - logger.info('validateToken err', err) - reject(err) - } else { - // logger.info('decoded', decoded) - resolve({ valid: true }) - } - }) - }) - } catch (err) { - logger.error(err) - throw err - } - } -} - -module.exports = new Auth() diff --git a/services/gunDB/Mediator/index.js b/services/gunDB/Mediator/index.js deleted file mode 100644 index bcf10e8c..00000000 --- a/services/gunDB/Mediator/index.js +++ /dev/null @@ -1,491 +0,0 @@ -/** - * @format - */ -const Common = require('shock-common') -const Gun = require('../../../utils/GunSmith') -// @ts-ignore -require('gun/nts') -const logger = require('../../../config/log') -// @ts-ignore -// Gun.log = () => {} -// @ts-ignore -require('gun/lib/open') -// @ts-ignore -require('gun/lib/load') -//@ts-ignore -const { encryptedEmit, encryptedOn } = require('../../../utils/ECC/socket') -const Key = require('../contact-api/key') -const Config = require('../config') - -/** @type {import('../contact-api/SimpleGUN').ISEA} */ -// @ts-ignore -const SEAx = require('gun/sea') -// Re-enable in the future, when SEA errors inside user.auth/etc actually -// propagate up. -// SEAx.throw = true - -/** @type {import('../contact-api/SimpleGUN').ISEA} */ -const mySEA = {} - -// Avoid this: https://github.com/amark/gun/issues/804 and any other issues -const $$__SHOCKWALLET__ENCRYPTED__ = '$$_SHOCKWALLET__ENCRYPTED__' -const $$__SHOCKWALLET__MSG__ = '$$__SHOCKWALLET__MSG__' -const $$__SHOCKWALLET__NUMBER__ = '$$__SHOCKWALLET__NUMBER__' -const $$__SHOCKWALLET__BOOLEAN__ = '$$__SHOCKWALLET__BOOLEAN__' - -/// - -mySEA.encrypt = (msg, secret) => { - if (typeof secret !== 'string') { - throw new TypeError( - `mySEA.encrypt() -> expected secret to be a an string, args: |msg| -- ${JSON.stringify( - secret - )}` - ) - } - - if (secret.length < 1) { - throw new TypeError( - `mySEA.encrypt() -> expected secret to be a populated string` - ) - } - - let strToEncode = '' - - if (typeof msg === 'string') { - if (msg.length === 0) { - throw new TypeError( - 'mySEA.encrypt() -> expected msg to be a populated string' - ) - } - - strToEncode = $$__SHOCKWALLET__MSG__ + msg - } else if (typeof msg === 'boolean') { - strToEncode = $$__SHOCKWALLET__BOOLEAN__ + msg - } else if (typeof msg === 'number') { - strToEncode = $$__SHOCKWALLET__NUMBER__ + msg - } else { - throw new TypeError('mySea.encrypt() -> Not a valid msg type.') - } - - return SEAx.encrypt(strToEncode, secret).then(encMsg => { - return $$__SHOCKWALLET__ENCRYPTED__ + encMsg - }) -} - -/** - * @param {string} encMsg - * @param {string} secret - * @returns {Promise} - */ -const decryptBase = (encMsg, secret) => { - if (typeof encMsg !== 'string') { - throw new TypeError( - 'mySEA.encrypt() -> expected encMsg to be an string instead got: ' + - typeof encMsg - ) - } - - if (encMsg.length === 0) { - throw new TypeError( - 'mySEA.encrypt() -> expected encMsg to be a populated string' - ) - } - - if (typeof secret !== 'string') { - throw new TypeError('mySea.decrypt() -> expected secret to be an string') - } - - if (secret.length === 0) { - throw new TypeError( - 'mySea.decrypt() -> expected secret to be a populated string' - ) - } - - if (encMsg.indexOf($$__SHOCKWALLET__ENCRYPTED__) !== 0) { - throw new TypeError( - 'Trying to pass a non prefixed encrypted string to mySea.decrypt(): ' + - encMsg - ) - } - - return SEAx.decrypt( - encMsg.slice($$__SHOCKWALLET__ENCRYPTED__.length), - secret - ).then(decodedMsg => { - if (typeof decodedMsg !== 'string') { - throw new TypeError('Could not decrypt') - } - - if (decodedMsg.startsWith($$__SHOCKWALLET__MSG__)) { - return decodedMsg.slice($$__SHOCKWALLET__MSG__.length) - } else if (decodedMsg.startsWith($$__SHOCKWALLET__BOOLEAN__)) { - const dec = decodedMsg.slice($$__SHOCKWALLET__BOOLEAN__.length) - if (dec === 'true') { - return true - } else if (dec === 'false') { - return false - } - throw new Error('Could not decrypt boolean value.') - } else if (decodedMsg.startsWith($$__SHOCKWALLET__NUMBER__)) { - return Number(decodedMsg.slice($$__SHOCKWALLET__NUMBER__.length)) - } - - throw new TypeError( - `mySea.encrypt() -> Unexpected type of prefix found inside decrypted value, first 20 characters: ${decodedMsg.slice( - 0, - 20 - )}` - ) - }) -} - -mySEA.decrypt = (encMsg, secret) => { - return decryptBase(encMsg, secret) -} - -mySEA.decryptNumber = (encMsg, secret) => { - return decryptBase(encMsg, secret) -} - -mySEA.decryptBoolean = (encMsg, secret) => { - return decryptBase(encMsg, secret) -} - -mySEA.secret = async (recipientOrSenderEpub, recipientOrSenderSEA) => { - if (typeof recipientOrSenderEpub !== 'string') { - throw new TypeError( - 'epub has to be an string, args:' + - `${JSON.stringify(recipientOrSenderEpub)} -- ${JSON.stringify( - recipientOrSenderSEA - )}` - ) - } - if (recipientOrSenderEpub.length === 0) { - throw new TypeError( - 'epub has to be populated string, args: ' + - `${JSON.stringify(recipientOrSenderEpub)} -- ${JSON.stringify( - recipientOrSenderSEA - )}` - ) - } - if (typeof recipientOrSenderSEA !== 'object') { - throw new TypeError( - 'sea has to be an object, args: ' + - `${JSON.stringify(recipientOrSenderEpub)} -- ${JSON.stringify( - recipientOrSenderSEA - )}` - ) - } - - if (recipientOrSenderSEA === null) { - throw new TypeError( - 'sea has to be non null, args: ' + - `${JSON.stringify(recipientOrSenderEpub)} -- ${JSON.stringify( - recipientOrSenderSEA - )}` - ) - } - - if (recipientOrSenderEpub === recipientOrSenderSEA.pub) { - throw new Error( - 'Do not use pub for mySecret, args: ' + - `${JSON.stringify(recipientOrSenderEpub)} -- ${JSON.stringify( - recipientOrSenderSEA - )}` - ) - } - - const sec = await SEAx.secret(recipientOrSenderEpub, recipientOrSenderSEA) - - if (typeof sec !== 'string') { - throw new TypeError( - `Could not generate secret, args: ${JSON.stringify( - recipientOrSenderEpub - )} -- ${JSON.stringify(recipientOrSenderSEA)}` - ) - } - - if (sec.length === 0) { - throw new TypeError( - `SEA.secret returned an empty string!, args: ${JSON.stringify( - recipientOrSenderEpub - )} -- ${JSON.stringify(recipientOrSenderSEA)}` - ) - } - - return sec -} - -const { Constants } = require('shock-common') - -const API = require('../contact-api/index') - -/** - * @typedef {import('../contact-api/SimpleGUN').GUNNode} GUNNode - * @typedef {import('../contact-api/SimpleGUN').UserGUNNode} UserGUNNode - * @typedef {import('../contact-api/SimpleGUN').ValidDataValue} ValidDataValue - */ - -// TO DO: move to common repo -/** - * @typedef {object} Emission - * @prop {boolean} ok - * @prop {any} msg - * @prop {Record} origBody - */ - -/** - * @typedef {object} EncryptedEmissionLegacy - * @prop {string} encryptedData - * @prop {string} encryptedKey - * @prop {string} iv - */ - -/** - * @typedef {object} EncryptedEmission - * @prop {string} ciphertext - * @prop {string} mac - * @prop {string} iv - * @prop {string} ephemPublicKey - */ - -// TO DO: move to common repo -/** - * @typedef {object} SimpleSocket - * @prop {(eventName: string, data?: Emission|EncryptedEmissionLegacy|EncryptedEmission|ValidDataValue) => void} emit - * @prop {(eventName: string, handler: (data: any, callback: (err?: any, data?: any) => void) => void) => void} on - * @prop {{ auth: { [key: string]: any } }} handshake - */ - -/* eslint-disable init-declarations */ - -const gun = Gun({ - axe: false, - peers: Config.PEERS -}) - -const user = gun.user() - -/* eslint-enable init-declarations */ - -/** @type {string|null} */ -let mySec = null - -/** @returns {string} */ -const getMySecret = () => /** @type {string} */ (mySec) - -let _isAuthenticating = false -let _isRegistering = false - -const isAuthenticated = () => typeof user.is === 'object' && user.is !== null -const isAuthenticating = () => _isAuthenticating -const isRegistering = () => _isRegistering - -/** - * @returns {Smith.GunSmithNode} - */ -const getGun = () => { - throw new Error('NO GUNS') -} - -const getUser = () => { - if (!user.is) { - logger.warn('called getUser() without being authenticated') - throw new Error(Constants.ErrorCode.NOT_AUTH) - } - return user -} - -/** - * Returns a promise containing the public key of the newly created user. - * @param {string} alias - * @param {string} pass - * @returns {Promise} - */ -const authenticate = async (alias, pass) => { - if (!Common.isPopulatedString(alias)) { - throw new TypeError( - `Expected alias to be a populated string, instead got: ${alias}` - ) - } - if (!Common.isPopulatedString(pass)) { - throw new TypeError( - `Expected pass to be a populated string, instead got: ${pass}` - ) - } - - if (isAuthenticating()) { - throw new Error( - 'Cannot authenticate while another authentication attempt is going on' - ) - } - - _isAuthenticating = true - - const ack = await new Promise(res => { - user.auth(alias, pass, _ack => { - res(_ack) - }) - }) - - _isAuthenticating = false - - if (typeof ack.err === 'string') { - throw new Error(ack.err) - } else if (typeof ack.sea === 'object') { - mySec = await mySEA.secret(user._.sea.epub, user._.sea) - // clock skew - await new Promise(res => setTimeout(res, 2000)) - - await /** @type {Promise} */ (new Promise((res, rej) => { - user.get(Key.FOLLOWS).put( - { - unused: null - }, - ack => { - if (ack.err && typeof ack.err !== 'number') { - rej( - new Error( - `Error initializing follows: ${JSON.stringify( - ack.err, - null, - 4 - )}` - ) - ) - } else { - res() - } - } - ) - })) - - // move this to a subscription; implement off() ? todo - API.Jobs.onOrders(user, gun, mySEA) - API.Jobs.lastSeenNode(user) - API.Events.onSeedBackup(() => {}, user, mySEA) - - return ack.sea.pub - } else { - logger.info(ack) - logger.error( - `Unknown error, wrong password? Ack looks like: ${JSON.stringify(ack)}` - ) - throw new Error(`Didn't work, bad password?`) - } -} - -const logoff = () => { - user.leave() -} - -/** - * Creates an user for gun. Returns a promise containing the public key of the - * newly created user. - * @param {string} alias - * @param {string} pass - * @throws {Error} If gun is authenticated or is in the process of - * authenticating. Use `isAuthenticating()` and `isAuthenticated()` to check for - * this first. It can also throw if the alias is already registered on gun. - * @returns {Promise} - */ -const register = async (alias, pass) => { - if (isRegistering()) { - throw new Error('Already registering.') - } - - if (isAuthenticating()) { - throw new Error( - 'Cannot register while gun is being authenticated (reminder: there should only be one user created for each node).' - ) - } - - if (isAuthenticated()) { - throw new Error( - 'Cannot register if gun is already authenticated (reminder: there should only be one user created for each node).' - ) - } - - /** - * Peers provided to gun. - */ - const peers = Object.values(gun._.opt.peers) - - const theresPeers = peers.length > 0 - const atLeastOneIsConnected = peers.some( - p => p.wire && p.wire.readyState === 1 - ) - - if (theresPeers && !atLeastOneIsConnected) { - throw new Error( - 'Not connected to any peers for checking of duplicate aliases' - ) - } - - if (theresPeers && atLeastOneIsConnected) { - await new Promise(res => setTimeout(res, 300)) - - const userData = await new Promise(res => { - gun.get(`~@${alias}`).once(ud => res(ud), { - // https://github.com/amark/gun/pull/971#issue-438630761 - wait: 1500 - }) - }) - - if (userData) { - throw new Error( - 'The given alias has been used before, use a unique alias instead. (Caught at 2nd try)' - ) - } - } - - _isRegistering = true - - /** @type {import('../contact-api/SimpleGUN').CreateAck} */ - const ack = await new Promise(res => - user.create(alias, pass, ack => res(ack)) - ) - - // An empty ack object seems to be caused by a duplicate alias sign up - if ('{}' === JSON.stringify(ack)) { - throw new Error( - 'The given alias has been used before, use an unique alias instead. (Empty ack)' - ) - } - - _isRegistering = false - - if (typeof ack.err === 'string') { - throw new Error(ack.err) - } else if (typeof ack.pub === 'string' || typeof user._.sea === 'object') { - // OK - } else { - throw new Error('unknown error, ack: ' + JSON.stringify(ack)) - } - - // restart instances so write to user graph work, there's an issue with gun - // (at least on node) where after initial user creation, writes to user graph - // don't work - // instantiateGun() - - logoff() - - return authenticate(alias, pass) -} - -module.exports = { - authenticate, - isAuthenticated, - isAuthenticating, - isRegistering, - gun, - user, - register, - getGun, - getUser, - mySEA, - getMySecret, - logoff, - $$__SHOCKWALLET__ENCRYPTED__ -} diff --git a/services/gunDB/config.js b/services/gunDB/config.js deleted file mode 100644 index 44dab137..00000000 --- a/services/gunDB/config.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * @format - */ -/* eslint-disable no-process-env */ - -const dotenv = require('dotenv') -const defaults = require('../../config/defaults')(false) - -dotenv.config() - -// @ts-ignore Let it crash if undefined -exports.DATA_FILE_NAME = process.env.DATA_FILE_NAME || defaults.dataFileName - -/** - * @type {string[]} - */ -exports.PEERS = process.env.PEERS - ? JSON.parse(process.env.PEERS) - : defaults.peers - -exports.MS_TO_TOKEN_EXPIRATION = Number( - process.env.MS_TO_TOKEN_EXPIRATION || defaults.tokenExpirationMS -) - -exports.SHOW_LOG = process.env.SHOW_GUN_DB_LOG === 'true' diff --git a/services/gunDB/contact-api/SimpleGUN.ts b/services/gunDB/contact-api/SimpleGUN.ts deleted file mode 100644 index fee7b196..00000000 --- a/services/gunDB/contact-api/SimpleGUN.ts +++ /dev/null @@ -1,149 +0,0 @@ -/** - * @prettier - */ -export type Primitive = boolean | string | number - -export interface Data { - [K: string]: ValidDataValue -} - -export type ValidDataValue = Primitive | null | Data - -export interface Ack { - err: string | undefined -} - -type ListenerObjSoul = { - '#': string -} - -export type ListenerObj = Record & { - _: ListenerObjSoul -} - -export type ListenerData = Primitive | null | ListenerObj | undefined - -interface OpenListenerDataObj { - [k: string]: OpenListenerData -} - -export type Listener = (data: ListenerData, key: string) => void -export type Callback = (ack: Ack) => void - -export interface Peer { - url: string - id: string - wire?: { - readyState: number - } -} - -export interface Soul { - get: string - put: Primitive | null | object | undefined - opt: { - peers: Record - } -} - -export type OpenListenerData = Primitive | null | OpenListenerDataObj -export type OpenListener = (data: OpenListenerData, key: string) => void - -export type LoadListenerData = OpenListenerData -export type LoadListener = (data: LoadListenerData, key: string) => void - -export interface GUNNodeBase { - _: Soul - - map(): GUNNode - - on(this: GUNNode, cb: Listener): void - once(this: GUNNode, cb?: Listener, opts?: { wait: number }): GUNNode - - open(this: GUNNode, cb?: OpenListener): GUNNode - load(this: GUNNode, cb?: OpenListener): GUNNode - - load(this: GUNNode, cb?: LoadListener): GUNNode - - off(): void - user(): UserGUNNode - user(epub: string): GUNNode - - then(): Promise - then(cb: (v: ListenerData) => T): Promise -} - -export interface GUNNode extends GUNNodeBase { - get(key: string): GUNNode - put(data: ValidDataValue | GUNNode, cb?: Callback): GUNNode - set(data: ValidDataValue | GUNNode, cb?: Callback): GUNNode -} - -export interface CreateAck { - pub: string | undefined - err: string | undefined -} - -export type CreateCB = (ack: CreateAck) => void - -export interface AuthAck { - err: string | undefined - sea: - | { - pub: string - } - | undefined -} - -export type AuthCB = (ack: AuthAck) => void - -export interface UserPair { - epriv: string - epub: string - priv: string - pub: string -} - -export interface UserSoul extends Soul { - sea: UserPair -} - -export interface UserGUNNode extends GUNNode { - _: UserSoul - auth(user: string, pass: string, cb: AuthCB): void - is?: { - alias: string - pub: string - } - create(user: string, pass: string, cb: CreateCB): void - leave(): void -} - -export interface ISEA { - encrypt( - message: string | number | boolean, - senderSecret: string - ): Promise - decrypt(encryptedMessage: string, recipientSecret: string): Promise - decryptNumber( - encryptedMessage: string, - recipientSecret: string - ): Promise - decryptBoolean( - encryptedMessage: string, - recipientSecret: string - ): Promise - secret( - recipientOrSenderEpub: string, - recipientOrSenderUserPair: UserPair - ): Promise -} - -export interface MySEA { - encrypt(message: string, senderSecret: string): Promise - decrypt(encryptedMessage: string, recipientSecret: string): Promise - secret( - recipientOrSenderEpub: string, - recipientOrSenderUserPair: UserPair - ): Promise -} diff --git a/services/gunDB/contact-api/actions.js b/services/gunDB/contact-api/actions.js deleted file mode 100644 index f63e665a..00000000 --- a/services/gunDB/contact-api/actions.js +++ /dev/null @@ -1,1030 +0,0 @@ -/** - * @format - */ -const uuidv1 = require('uuid/v1') -const logger = require('../../../config/log') -const throttle = require('lodash/throttle') -const Common = require('shock-common') -const { Constants, Schema } = Common - -const { ErrorCode } = Constants - -const { - sendPaymentV2Invoice, - decodePayReq -} = require('../../../utils/lightningServices/v2') - -/** - * @typedef {import('../../../utils/lightningServices/types').PaymentV2} PaymentV2 - */ - -const Getters = require('./getters') -const Key = require('./key') -const Utils = require('./utils') -const SchemaManager = require('../../schema') -const LNDHealthManager = require('../../../utils/lightningServices/errors') -const { enrollContentTokens, selfContentToken } = require('../../seed') - -/// - -/** - * @typedef {import('./SimpleGUN').ISEA} ISEA - * @typedef {Smith.UserSmithNode} UserGUNNode - */ - -/** - * @param {string} user - * @param {string} pass - * @param {UserGUNNode} userNode - */ -const authenticate = (user, pass, userNode) => - /** @type {Promise} */ (new Promise((resolve, reject) => { - if (typeof user !== 'string') { - throw new TypeError('expected user to be of type string') - } - - if (typeof pass !== 'string') { - throw new TypeError('expected pass to be of type string') - } - - if (user.length === 0) { - throw new TypeError('expected user to have length greater than zero') - } - - if (pass.length === 0) { - throw new TypeError('expected pass to have length greater than zero') - } - - if (typeof userNode.is === 'undefined') { - throw new Error(ErrorCode.ALREADY_AUTH) - } - - userNode.auth(user, pass, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - reject(new Error(ack.err)) - } else if (!userNode.is) { - reject(new Error('authentication failed')) - } else { - resolve() - } - }) - })) - -/** - * @param {string} publicKey - * @param {UserGUNNode} user Pass only for testing. - * @throws {Error} If there's an error saving to the blacklist. - * @returns {Promise} - */ -const blacklist = (publicKey, user) => - new Promise((resolve, reject) => { - if (!user.is) { - throw new Error(ErrorCode.NOT_AUTH) - } - - user.get(Key.BLACKLIST).set(publicKey, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - reject(new Error(ack.err)) - } else { - resolve() - } - }) - }) - -/** - * @returns {Promise} - */ -const generateHandshakeAddress = async () => { - const gun = require('../Mediator').getGun() - const user = require('../Mediator').getUser() - - const address = uuidv1() - - await /** @type {Promise} */ (new Promise((res, rej) => { - user.get(Key.CURRENT_HANDSHAKE_ADDRESS).put(address, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - rej(new Error(ack.err)) - } else { - res() - } - }) - })) - //why await if you dont need the response? - await /** @type {Promise} */ (new Promise((res, rej) => { - gun - .get(Key.HANDSHAKE_NODES) - .get(address) - .put({ unused: 0 }, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - rej(new Error(ack.err)) - } else { - res() - } - }) - })) -} - -/** - * @param {string|null} avatar - * @param {UserGUNNode} user - * @throws {TypeError} Rejects if avatar is not an string or an empty string. - * @returns {Promise} - */ -const setAvatar = (avatar, user) => - new Promise((resolve, reject) => { - if (!user.is) { - throw new Error(ErrorCode.NOT_AUTH) - } - - if (typeof avatar === 'string' && avatar.length === 0) { - throw new TypeError( - "'avatar' must be an string and have length greater than one or be null" - ) - } - - if (typeof avatar !== 'string' && avatar !== null) { - throw new TypeError( - "'avatar' must be an string and have length greater than one or be null" - ) - } - - user - .get(Key.PROFILE_BINARY) - .get(Key.AVATAR) - .put(avatar, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - reject(new Error(ack.err)) - } else { - resolve() - } - }) - }) - -/** - * @param {string} displayName - * @param {UserGUNNode} user - * @throws {TypeError} Rejects if displayName is not an string or an empty - * string. - * @returns {Promise} - */ -const setDisplayName = (displayName, user) => - new Promise((resolve, reject) => { - if (!user.is) { - throw new Error(ErrorCode.NOT_AUTH) - } - - if (typeof displayName !== 'string') { - throw new TypeError() - } - - if (displayName.length === 0) { - throw new TypeError() - } - - user - .get(Key.PROFILE) - .get(Key.DISPLAY_NAME) - .put(displayName, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - reject(new Error(ack.err)) - } else { - resolve() - } - }) - }) - -/** - * @param {string} encryptedSeedProvider - * @param {UserGUNNode} user - * @throws {TypeError} Rejects if displayName is not an string or an empty - * string. - * @returns {Promise} - */ -const setDefaultSeedProvider = (encryptedSeedProvider, user) => - new Promise((resolve, reject) => { - if (!user.is) { - throw new Error(ErrorCode.NOT_AUTH) - } - - if (typeof encryptedSeedProvider !== 'string') { - throw new TypeError() - } - user - .get('preferencesSeedServiceProvider') - .put(encryptedSeedProvider, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - reject(new Error(ack.err)) - } else { - resolve() - } - }) - }) -/** - * @param {string} encryptedSeedServiceData - * @param {UserGUNNode} user - * @throws {TypeError} - * @returns {Promise} - */ -const setSeedServiceData = (encryptedSeedServiceData, user) => - new Promise((resolve, reject) => { - if (!user.is) { - throw new Error(ErrorCode.NOT_AUTH) - } - - if (typeof encryptedSeedServiceData !== 'string') { - throw new TypeError() - } - user - .get('preferencesSeedServiceData') - .put(encryptedSeedServiceData, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - reject(new Error(ack.err)) - } else { - resolve() - } - }) - }) -/** - * @param {string} encryptedCurrentStreamInfo - * @param {UserGUNNode} user - * @throws {TypeError} - * @returns {Promise} - */ -const setCurrentStreamInfo = (encryptedCurrentStreamInfo, user) => - new Promise((resolve, reject) => { - if (!user.is) { - throw new Error(ErrorCode.NOT_AUTH) - } - - if (typeof encryptedCurrentStreamInfo !== 'string') { - throw new TypeError() - } - user.get('currentStreamInfo').put(encryptedCurrentStreamInfo, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - reject(new Error(ack.err)) - } else { - resolve() - } - }) - }) - -/** - * @typedef {object} SpontaneousPaymentOptions - * @prop {Common.Schema.OrderTargetType=} type - * @prop {string=} ackInfo - * @prop {number=} maxParts - * @prop {number=} timeoutSeconds - */ -/** - * @typedef {object} OrderRes - * @prop {PaymentV2|null} payment - * @prop {object=} orderAck - */ -/** - * Returns the preimage corresponding to the payment. - * @param {string} to - * @param {number} amount - * @param {string} memo - * @param {number} feeLimit - * @param {SpontaneousPaymentOptions} opts - * @throws {Error} If no response in less than 20 seconds from the recipient, or - * lightning cannot find a route for the payment. - * @returns {Promise} The payment's preimage. - */ -const sendSpontaneousPayment = async ( - to, - amount, - memo, - feeLimit, - { ackInfo, maxParts, timeoutSeconds, type = 'spontaneousPayment' } -) => { - try { - const SEA = require('../Mediator').mySEA - const getUser = () => require('../Mediator').getUser() - const myPub = getUser()._.sea.pub - if ( - to === myPub && - type === 'torrentSeed' && - ackInfo && - !isNaN(parseInt(ackInfo, 10)) - ) { - //user requested a seed to themselves - const numberOfTokens = Number(ackInfo) || 1 - const seedInfo = selfContentToken() - if (!seedInfo) { - throw new Error('torrentSeed service not available') - } - const { seedUrl } = seedInfo - logger.info('SEED URL OK') - const tokens = await enrollContentTokens(numberOfTokens, seedInfo) - logger.info('RES SEED OK') - const ackData = JSON.stringify({ seedUrl, tokens }) - return { - payment: null, - orderAck: { response: ackData, type: 'orderAck' } - } - } - const recipientEpub = await Utils.pubToEpub(to) - const ourSecret = await SEA.secret(recipientEpub, getUser()._.sea) - - if (amount < 1) { - throw new RangeError('Amount must be at least 1 sat.') - } - - const currOrderAddress = await Getters.currentOrderAddress(to) - - logger.info('sendPayment() -> will now create order:') - - /** @type {import('shock-common').Schema.Order} */ - const order = { - amount: amount.toString(), - from: getUser()._.sea.pub, - memo: memo || 'no memo', - timestamp: Date.now(), - targetType: type, - ackInfo - } - - logger.info(JSON.stringify(order)) - - /* eslint-disable require-atomic-updates */ - const [encMemo, encAmount] = await Promise.all([ - SEA.encrypt(order.memo, ourSecret), - SEA.encrypt(order.amount, ourSecret) - ]) - - order.memo = encMemo - order.amount = encAmount - order.timestamp = Date.now() // most up to date timestamp - logger.info(`sendPayment() -> encrypted order: ${JSON.stringify(order)}`) - - /* eslint-enable require-atomic-updates */ - - logger.info( - `sendPayment() -> will now place order into address: ${currOrderAddress} for PK: ${to}` - ) - - /** @type {string} */ - const orderID = await new Promise((res, rej) => { - const ord = require('../Mediator') - .getGun() - .get(Key.ORDER_NODES) - .get(currOrderAddress) - //@ts-ignore - .set(order, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - rej( - new Error( - `Error writing order to order node: ${currOrderAddress} for pub: ${to}: ${ack.err}` - ) - ) - } else { - setTimeout(() => res(ord._.get), 0) - } - }) - }) - - if (typeof orderID !== 'string') { - const msg = `orderID returned by gun not an string, got: ${JSON.stringify( - orderID - )}` - throw new Error(msg) - } - logger.info('ORDER ID') - logger.info(orderID) - /** @type {import('shock-common').Schema.OrderResponse} */ - const encryptedOrderRes = await Common.makePromise((res, rej) => { - setTimeout(() => { - rej(new Error('Timeout of 30s passed when awaiting order response.')) - }, 30000) - - require('../Mediator') - .getGun() - .user(to) - .get(Key.ORDER_TO_RESPONSE) - .get(orderID) - .on(orderResponse => { - logger.info(orderResponse) - if (Schema.isOrderResponse(orderResponse)) { - res(orderResponse) - } - }) - }) - - if (!Schema.isOrderResponse(encryptedOrderRes)) { - const e = TypeError( - `Expected OrderResponse got: ${typeof encryptedOrderRes}` - ) - logger.error(e) - throw e - } - - /** @type {import('shock-common').Schema.OrderResponse &{ackNode:string}} */ - const orderResponse = { - response: await SEA.decrypt(encryptedOrderRes.response, ourSecret), - type: encryptedOrderRes.type, - //@ts-expect-error - ackNode: encryptedOrderRes.ackNode - } - - logger.info('decoded orderResponse: ' + JSON.stringify(orderResponse)) - - if (orderResponse.type === 'err') { - throw new Error(orderResponse.response) - } - - logger.info('Will now check for invoice amount mismatch') - - const encodedInvoice = orderResponse.response - - const { num_satoshis: decodedAmt } = await decodePayReq(encodedInvoice) - - if (decodedAmt.toString() !== amount.toString()) { - throw new Error( - `Invoice amount mismatch got: ${decodedAmt.toString()} expected: ${amount.toString()}` - ) - } - - // double check - if (Number(decodedAmt) !== Number(amount)) { - throw new Error( - `Invoice amount mismatch got:${Number(decodedAmt)} expected:${Number( - amount - )}` - ) - } - - logger.info('Will now send payment through lightning') - - const payment = await sendPaymentV2Invoice({ - feeLimit, - payment_request: orderResponse.response, - max_parts: maxParts, - timeoutSeconds - }) - const myLndPub = LNDHealthManager.lndPub - if ( - (type !== 'contentReveal' && - type !== 'torrentSeed' && - type !== 'service' && - type !== 'product') || - !orderResponse.ackNode - ) { - SchemaManager.AddOrder({ - type, - amount: parseInt(payment.value_sat, 10), - coordinateHash: payment.payment_hash, - coordinateIndex: parseInt(payment.payment_index, 10), - fromLndPub: myLndPub || undefined, - inbound: false, - fromGunPub: getUser()._.sea.pub, - toGunPub: to, - invoiceMemo: memo - }) - return { payment } - } - logger.info('ACK NODE') - logger.info(orderResponse.ackNode) - /** @type {import('shock-common').Schema.OrderResponse} */ - const encryptedOrderAckRes = await Common.makePromise((res, rej) => { - setTimeout(() => { - rej( - new Error( - "Timeout of 30s exceeded when waiting for order response's ack." - ) - ) - }, 30000) - - require('../Mediator') - .getGun() - .user(to) - .get(Key.ORDER_TO_RESPONSE) - .get(orderResponse.ackNode) - .on(orderResponse => { - logger.info(orderResponse) - logger.info(Schema.isOrderResponse(orderResponse)) - - //@ts-expect-error - if (orderResponse && orderResponse.type === 'orderAck') { - //@ts-expect-error - res(orderResponse) - } - }) - }) - - if (!encryptedOrderAckRes || !encryptedOrderAckRes.type) { - const e = TypeError( - `Expected encryptedOrderAckRes got: ${typeof encryptedOrderAckRes}` - ) - logger.error(e) - throw e - } - - const decryptedResponse = await SEA.decrypt( - encryptedOrderAckRes.response, - ourSecret - ) - logger.info(`decryptedResponse: `, decryptedResponse) - const parsedResponse = JSON.parse(decryptedResponse) - logger.info(`parsedResponse: `, parsedResponse) - - /** @type {import('shock-common').Schema.OrderResponse} */ - const orderAck = { - response: parsedResponse, - type: encryptedOrderAckRes.type - } - - logger.info('decoded encryptedOrderAck: ' + JSON.stringify(orderAck)) - - if (orderAck.type === 'err') { - throw new Error(orderAck.response) - } - - if (orderAck.type !== 'orderAck') { - throw new Error(`expected orderAck response, got: ${orderAck.type}`) - } - SchemaManager.AddOrder({ - type, - amount: parseInt(payment.value_sat, 10), - coordinateHash: payment.payment_hash, - coordinateIndex: parseInt(payment.payment_index, 10), - fromLndPub: myLndPub || undefined, - inbound: false, - fromGunPub: getUser()._.sea.pub, - toGunPub: to, - invoiceMemo: memo, - metadata: JSON.stringify(orderAck) - }) - return { payment, orderAck } - } catch (e) { - logger.info(e) - logger.error('Error inside sendPayment()') - logger.error(e) - throw e - } -} - -/** - * Returns the preimage corresponding to the payment. - * @param {string} to - * @param {number} amount - * @param {string} memo - * @param {number} feeLimit - * @param {number=} maxParts - * @param {number=} timeoutSeconds - * @throws {Error} If no response in less than 20 seconds from the recipient, or - * lightning cannot find a route for the payment. - * @returns {Promise} The payment's preimage. - */ -const sendPayment = async ( - to, - amount, - memo, - feeLimit, - maxParts, - timeoutSeconds -) => { - const res = await sendSpontaneousPayment(to, amount, memo, feeLimit, { - maxParts, - timeoutSeconds - }) - if (!res.payment) { - throw new Error('invalid payment params') //only if it's a torrentSeed request to self - } - return res.payment.payment_preimage -} - -/** - * @param {UserGUNNode} user - * @returns {Promise} - */ -const generateOrderAddress = user => - new Promise((res, rej) => { - if (!user.is) { - throw new Error(ErrorCode.NOT_AUTH) - } - - const address = uuidv1() - - user.get(Key.CURRENT_ORDER_ADDRESS).put(address, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - rej(new Error(ack.err)) - } else { - res() - } - }) - }) - -/** - * @param {string|null} bio - * @param {UserGUNNode} user - * @throws {TypeError} Rejects if avatar is not an string or an empty string. - * @returns {Promise} - */ -const setBio = (bio, user) => - /** @type {Promise} */ (new Promise((resolve, reject) => { - if (!user.is) { - throw new Error(ErrorCode.NOT_AUTH) - } - - if (typeof bio === 'string' && bio.length === 0) { - throw new TypeError( - "'bio' must be an string and have length greater than one or be null" - ) - } - - if (typeof bio !== 'string' && bio !== null) { - throw new TypeError( - "'bio' must be an string and have length greater than one or be null" - ) - } - - user.get(Key.BIO).put(bio, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - reject(new Error(ack.err)) - } else { - resolve() - } - }) - })).then( - () => - new Promise((resolve, reject) => { - user - .get(Key.PROFILE) - .get(Key.BIO) - .put(bio, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - reject(new Error(ack.err)) - } else { - resolve() - } - }) - }) - ) - -/** - * @param {string[]} mnemonicPhrase - * @param {UserGUNNode} user - * @param {ISEA} SEA - * @returns {Promise} - */ -const saveSeedBackup = async (mnemonicPhrase, user, SEA) => { - if ( - !Array.isArray(mnemonicPhrase) || - mnemonicPhrase.some(word => typeof word !== 'string') || - mnemonicPhrase.length === 0 - ) { - throw new TypeError('expected mnemonicPhrase to be an string array') - } - - const mySecret = require('../Mediator').getMySecret() - const encryptedSeed = await SEA.encrypt(mnemonicPhrase.join(' '), mySecret) - - return new Promise((res, rej) => { - user.get(Key.SEED_BACKUP).put(encryptedSeed, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - rej(new Error(ack.err)) - } else { - res() - } - }) - }) -} - -/** - * @param {string} backups - * @param {UserGUNNode} user - * @param {ISEA} SEA - * @returns {Promise} - */ -const saveChannelsBackup = async (backups, user, SEA) => { - if (backups === '') { - throw new TypeError('cant save an empty channel backup') - } - const mySecret = require('../Mediator').getMySecret() - const encryptBackups = await SEA.encrypt(backups, mySecret) - return new Promise((res, rej) => { - user.get(Key.CHANNELS_BACKUP).put(encryptBackups, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - rej(new Error(ack.err)) - } else { - res() - } - }) - }) -} - -/** - * @returns {Promise} - */ -const setLastSeenApp = throttle(() => { - const user = require('../Mediator').getUser() - - return user - .get(Key.PROFILE) - .get(Key.LAST_SEEN_APP) - .pPut(Date.now()) -}, 10000) - -/** - * @param {string[]} tags - * @param {string} title - * @param {Common.Schema.ContentItem[]} content - * @returns {Promise<[string, Common.Schema.RawPost]>} - */ -const createPostNew = async (tags, title, content) => { - const SEA = require('../Mediator').mySEA - /** @type {Common.Schema.RawPost} */ - const newPost = { - date: Date.now(), - status: 'publish', - tags: tags.join('-'), - title, - contentItems: {} - } - - const mySecret = require('../Mediator').getMySecret() - - await Common.Utils.asyncForEach(content, async c => { - const uuid = Utils.gunID() - newPost.contentItems[uuid] = c - if ( - (c.type === 'image/embedded' || c.type === 'video/embedded') && - c.isPrivate - ) { - const encryptedMagnet = await SEA.encrypt(c.magnetURI, mySecret) - newPost.contentItems[uuid] = { ...c, magnetURI: encryptedMagnet } - } else { - newPost.contentItems[uuid] = c - } - }) - - /** @type {string} */ - const postID = await Common.makePromise((res, rej) => { - const _n = require('../Mediator') - .getUser() - .get(Key.POSTS_NEW) - .set( - // @ts-expect-error - newPost, - ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - rej(new Error(ack.err)) - } else { - res(_n._.get) - } - } - ) - }) - - return [postID, newPost] -} - -/** - * @param {string} postId - * @param {string} page - * @returns {Promise} - */ -const deletePost = async (postId, page) => { - await /** @type {Promise} */ (new Promise((res, rej) => { - require('../Mediator') - .getUser() - .get(Key.WALL) - .get(Key.PAGES) - .get(page) - .get(Key.POSTS) - .get(postId) - .put(null, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - rej(new Error(ack.err)) - } else { - res() - } - }) - })) -} - -/** - * @param {string} publicKey - * @param {boolean} isPrivate Will overwrite previous private status. - * @returns {Promise} - */ -const follow = async (publicKey, isPrivate) => { - /** @type {import('shock-common').Schema.Follow} */ - const newFollow = { - private: isPrivate, - status: 'ok', - user: publicKey - } - //why await if you dont need the response? - await /** @type {Promise} */ (new Promise((res, rej) => { - require('../Mediator') - .getUser() - .get(Key.FOLLOWS) - .get(publicKey) - // @ts-ignore - .put(newFollow, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - rej(new Error(ack.err)) - } else { - res() - } - }) - })) -} - -/** - * @param {string} publicKey - * @returns {Promise} - */ -const unfollow = publicKey => - new Promise((res, rej) => { - require('../Mediator') - .getUser() - .get(Key.FOLLOWS) - .get(publicKey) - .put(null, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - rej(new Error(ack.err)) - } else { - res() - } - }) - }) - -/** - * @throws {Error} - * @returns {Promise} - */ -const initWall = async () => { - const user = require('../Mediator').getUser() - - const promises = [] - - promises.push( - /** @type {Promise} */ (new Promise((res, rej) => { - user - .get(Key.WALL) - .get(Key.NUM_OF_PAGES) - .put(0, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - rej(new Error(ack.err)) - } else { - res() - } - }) - })) - ) - - promises.push( - /** @type {Promise} */ (new Promise((res, rej) => { - user - .get(Key.WALL) - .get(Key.PAGES) - .get('0') - .get(Key.POSTS) - .put( - { - unused: null - }, - ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - rej(new Error(ack.err)) - } else { - res() - } - } - ) - })) - ) - - promises.push( - /** @type {Promise} */ (new Promise((res, rej) => { - user - .get(Key.WALL) - .get(Key.PAGES) - .get('0') - .get(Key.COUNT) - .put(0, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - rej(new Error(ack.err)) - } else { - res() - } - }) - })) - ) - - await Promise.all(promises) -} - -module.exports = { - authenticate, - blacklist, - generateHandshakeAddress, - setAvatar, - setDisplayName, - sendPayment, - generateOrderAddress, - setBio, - saveSeedBackup, - saveChannelsBackup, - setLastSeenApp, - deletePost, - follow, - unfollow, - initWall, - sendSpontaneousPayment, - createPostNew, - setDefaultSeedProvider, - setSeedServiceData, - setCurrentStreamInfo -} diff --git a/services/gunDB/contact-api/events/index.js b/services/gunDB/contact-api/events/index.js deleted file mode 100644 index d060cb34..00000000 --- a/services/gunDB/contact-api/events/index.js +++ /dev/null @@ -1,45 +0,0 @@ -/** - * @prettier - */ -const debounce = require('lodash/debounce') - -const { - Constants: { ErrorCode } -} = require('shock-common') - -const Key = require('../key') -/// - -const DEBOUNCE_WAIT_TIME = 500 - -/** @type {string|null} */ -let currentSeedBackup = null - -/** - * @param {(seedBackup: string|null) => void} cb - * @param {Smith.UserSmithNode} user - * @param {import('../SimpleGUN').ISEA} SEA - * @throws {Error} If user hasn't been auth. - * @returns {void} - */ -const onSeedBackup = (cb, user, SEA) => { - if (!user.is) { - throw new Error(ErrorCode.NOT_AUTH) - } - - const mySecret = require('../../Mediator').getMySecret() - - const callb = debounce(cb, DEBOUNCE_WAIT_TIME) - callb(currentSeedBackup) - - user.get(Key.SEED_BACKUP).on(async seedBackup => { - if (typeof seedBackup === 'string') { - currentSeedBackup = await SEA.decrypt(seedBackup, mySecret) - callb(currentSeedBackup) - } - }) -} - -module.exports = { - onSeedBackup -} diff --git a/services/gunDB/contact-api/getters/index.js b/services/gunDB/contact-api/getters/index.js deleted file mode 100644 index 2f2d9944..00000000 --- a/services/gunDB/contact-api/getters/index.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * @format - */ - -const Key = require('../key') - -/** - * @param {string} pub - * @returns {Promise} - */ -exports.currentOrderAddress = async pub => { - const currAddr = await require('../../Mediator') - .getGun() - .user(pub) - .get(Key.CURRENT_ORDER_ADDRESS) - .specialThen() - - if (typeof currAddr !== 'string') { - throw new TypeError('Expected user.currentOrderAddress to be an string') - } - - return currAddr -} diff --git a/services/gunDB/contact-api/index.js b/services/gunDB/contact-api/index.js deleted file mode 100644 index 8ca1c443..00000000 --- a/services/gunDB/contact-api/index.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * @prettier - */ -const Actions = require('./actions') -const Events = require('./events') -const Jobs = require('./jobs') -const Key = require('./key') - -module.exports = { Actions, Events, Jobs, Key } diff --git a/services/gunDB/contact-api/jobs/index.js b/services/gunDB/contact-api/jobs/index.js deleted file mode 100644 index 96dcc67d..00000000 --- a/services/gunDB/contact-api/jobs/index.js +++ /dev/null @@ -1,18 +0,0 @@ -/** - * @format - * Jobs are subscriptions to events that perform actions (write to GUN) on - * response to certain ways events can happen. These tasks need to be fired up - * at app launch otherwise certain features won't work as intended. Tasks should - * ideally be idempotent, that is, if they were to be fired up after a certain - * amount of time after app launch, everything should work as intended. For this - * to work, special care has to be put into how these respond to events. These - * tasks accept factories that are homonymous to the events on this same module. - */ - -const onOrders = require('./onOrders') -const lastSeenNode = require('./lastSeenNode') - -module.exports = { - onOrders, - lastSeenNode -} diff --git a/services/gunDB/contact-api/jobs/lastSeenNode.js b/services/gunDB/contact-api/jobs/lastSeenNode.js deleted file mode 100644 index c92ef7e6..00000000 --- a/services/gunDB/contact-api/jobs/lastSeenNode.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - * @format - */ - -const logger = require('../../../../config/log') - -const { - Constants: { - ErrorCode, - Misc: { LAST_SEEN_NODE_INTERVAL } - } -} = require('shock-common') -const Key = require('../key') -/// - -/** - * @typedef {Smith.GunSmithNode} GUNNode - * @typedef {GunT.ListenerData} ListenerData - * @typedef {import('../SimpleGUN').ISEA} ISEA - * @typedef {Smith.UserSmithNode} UserGUNNode - */ - -/** - * @param {UserGUNNode} user - * @throws {Error} NOT_AUTH - * @returns {void} - */ -const lastSeenNode = user => { - if (!user.is) { - logger.warn('lastSeenNode() -> tried to sub without authing') - throw new Error(ErrorCode.NOT_AUTH) - } - - let gotLatestProfileAck = true - - setInterval(() => { - if (!user.is) { - return - } - if (!gotLatestProfileAck) { - logger.error(`lastSeenNode profile job: didnt get latest ack`) - return - } - gotLatestProfileAck = false - user - .get(Key.PROFILE) - .get(Key.LAST_SEEN_NODE) - .put(Date.now(), ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - logger.error(`Error inside lastSeenNode profile job: ${ack.err}`) - } - gotLatestProfileAck = true - }) - }, LAST_SEEN_NODE_INTERVAL) -} - -module.exports = lastSeenNode diff --git a/services/gunDB/contact-api/jobs/onOrders.js b/services/gunDB/contact-api/jobs/onOrders.js deleted file mode 100644 index d9e8634b..00000000 --- a/services/gunDB/contact-api/jobs/onOrders.js +++ /dev/null @@ -1,627 +0,0 @@ -/** - * @format - */ -// @ts-check -const logger = require('../../../../config/log') -const isFinite = require('lodash/isFinite') -const isNumber = require('lodash/isNumber') -const isNaN = require('lodash/isNaN') -const Common = require('shock-common') -const { - Constants: { ErrorCode }, - Schema -} = Common -const SchemaManager = require('../../../schema') -const LightningServices = require('../../../../utils/lightningServices') -const Key = require('../key') -const Utils = require('../utils') -const { selfContentToken, enrollContentTokens } = require('../../../seed') -/// -const TipForwarder = require('../../../tipsCallback') - -const getUser = () => require('../../Mediator').getUser() - -/** - * @type {Set} - */ -const ordersProcessed = new Set() - -/** - * @typedef {Smith.GunSmithNode} GUNNode - * @typedef {GunT.ListenerData} ListenerData - * @typedef {import('../SimpleGUN').ISEA} ISEA - * @typedef {Smith.UserSmithNode} UserGUNNode - */ - -/** - * @typedef {object} InvoiceRequest - * @prop {number} expiry - * @prop {string} memo - * @prop {number} value - * @prop {boolean} private - */ - -/** - * @typedef {object} InvoiceResponse - * @prop {string} payment_request - * @prop {Buffer} r_hash - */ - -/** - * @typedef {object} TipPaymentStatus - * @prop {string} hash - * @prop {import('shock-common').Schema.InvoiceState} state - * @prop {string} targetType - * @prop {(string)=} postID - */ - -let currentOrderAddr = '' - -/** - * @param {InvoiceRequest} invoiceReq - * @returns {Promise} - */ -const _addInvoice = invoiceReq => - new Promise((resolve, rej) => { - const { - services: { lightning } - } = LightningServices - - lightning.addInvoice(invoiceReq, ( - /** @type {any} */ error, - /** @type {InvoiceResponse} */ response - ) => { - if (error) { - rej(error) - } else { - resolve(response) - } - }) - }) - -/** - * @param {string} addr - * @param {ISEA} SEA - * @returns {(order: ListenerData, orderID: string) => void} - */ -const listenerForAddr = (addr, SEA) => async (order, orderID) => { - try { - if (addr !== currentOrderAddr) { - logger.info( - orderID, - `order address: ${addr} invalidated (current address: ${currentOrderAddr})` - ) - return - } - - // Was recycled - if (order === null) { - return - } - - if (!Schema.isOrder(order)) { - logger.info( - orderID, - `Expected an order instead got: ${JSON.stringify(order)}` - ) - return - } - - // Gun might callback several times for the same order, avoid dupe - // processing. - if (ordersProcessed.has(orderID)) { - return - } - - //const listenerStartTime = performance.now() - - ordersProcessed.add(orderID) - - if (Date.now() - order.timestamp > 66000) { - logger.info('Not processing old order', orderID) - return - } - - logger.info('processing order ', orderID) - - const alreadyAnswered = await getUser() - .get(Key.ORDER_TO_RESPONSE) - .get(orderID) - .then() - - if (alreadyAnswered) { - logger.info(orderID, 'alreadyAnswered') - return - } - - logger.info(orderID, ' was not answered, will now answer') - - const senderEpub = await Utils.pubToEpub(order.from) - const secret = await SEA.secret(senderEpub, getUser()._.sea) - - const [decryptedAmount, memo] = await Promise.all([ - SEA.decrypt(order.amount, secret), - SEA.decrypt(order.memo, secret) - ]) - - const amount = Number(decryptedAmount) - - if (!isNumber(amount)) { - throw new TypeError( - `${orderID} Could not parse decrypted amount as a number, not a number?, decryptedAmount: ${decryptedAmount}` - ) - } - - if (isNaN(amount)) { - throw new TypeError( - `${orderID} Could not parse decrypted amount as a number, got NaN, decryptedAmount: ${decryptedAmount}` - ) - } - - if (!isFinite(amount)) { - throw new TypeError( - `${orderID} Amount was correctly decrypted, but got a non finite number, decryptedAmount: ${decryptedAmount}` - ) - } - const mySecret = require('../../Mediator').getMySecret() - /** - * @type {string|null} - */ - let serviceOrderType = null //if the order refers to a service, we take the info from the service before sending the invoice - /** - * @type {{ seedUrl: string, seedToken: string }|null} - */ - let serviceOrderContentSeedInfo = null //in case the service is of type 'torrentSeed' this is {seedUrl,seedToken}, can be omitted, in that case, it will be taken from env - if (order.targetType === 'service') { - logger.info(orderID, 'General Service') - const { ackInfo: serviceID } = order - logger.info(orderID, 'ACK INFO') - logger.info(orderID, serviceID) - if (!Common.isPopulatedString(serviceID)) { - throw new TypeError(`${orderID} no serviceID provided to orderAck`) - } - const selectedService = await getUser() - .get(Key.OFFERED_SERVICES) - .get(serviceID) - .then() - - logger.info(orderID, selectedService) - if (!Common.isObj(selectedService)) { - throw new TypeError( - `${orderID} invalid serviceID provided to orderAck or service is not an object` - ) - } - - const { - serviceType, - servicePrice, - serviceSeedUrl: encSeedUrl, //= - serviceSeedToken: encSeedToken //= - } = /** @type {Record} */ (selectedService) - if (Number(amount) !== Number(servicePrice)) { - throw new TypeError( - `${orderID} service price mismatch ${amount} : ${servicePrice}` - ) - } - if (serviceType === 'torrentSeed') { - if (encSeedUrl && encSeedToken) { - const seedUrl = await SEA.decrypt(encSeedUrl, mySecret) - const seedToken = await SEA.decrypt(encSeedToken, mySecret) - serviceOrderContentSeedInfo = { seedUrl, seedToken } - } - } - - serviceOrderType = serviceType - } - - const invoiceReq = { - expiry: 36000, - memo, - value: amount, - private: true - } - - const invoice = await _addInvoice(invoiceReq) - - logger.info( - `${orderID} onOrders() -> Successfully created the invoice, will now encrypt it` - ) - - const encInvoice = await SEA.encrypt(invoice.payment_request, secret) - - logger.info( - `${orderID} onOrders() -> Will now place the encrypted invoice in order to response usergraph: ${addr}` - ) - - const ackNode = Utils.gunID() - - /** @type {import('shock-common').Schema.OrderResponse} */ - const orderResponse = { - response: encInvoice, - type: 'invoice', - ackNode - } - - await /** @type {Promise} */ (new Promise((res, rej) => { - getUser() - .get(Key.ORDER_TO_RESPONSE) - .get(orderID) - // @ts-expect-error - .put(orderResponse, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - rej( - new Error( - `${orderID} Error saving encrypted invoice to order to response usergraph: ${ack}` - ) - ) - } else { - res() - } - }) - })) - - //logger.info(`[PERF] Added invoice to GunDB in ${invoicePutEndTime}ms`) - /** - * - * @param {Common.Schema.InvoiceWhenListed & {r_hash:Buffer,payment_addr:Buffer}} paidInvoice - */ - const invoicePaidCb = async paidInvoice => { - logger.info(orderID, 'INVOICE PAID') - // Recycle - require('../../Mediator') - .getGun() - .get('orderNodes') - .get(addr) - .get(orderID) - .put(null) - - let breakError = null - let orderMetadata //eslint-disable-line init-declarations - const hashString = paidInvoice.r_hash.toString('hex') - const { - amt_paid_sat: amt, - add_index: addIndex, - payment_addr - } = paidInvoice - const paymentAddr = payment_addr.toString('hex') - const orderType = serviceOrderType || order.targetType - const { ackInfo } = order //a string representing what has been requested - switch (orderType) { - case 'tip': { - const postID = ackInfo - if (!Common.isPopulatedString(postID)) { - breakError = orderID + ' invalid ackInfo provided for postID' - break //create the coordinate, but stop because of the invalid id - } - getUser() - .get(Key.POSTS_NEW) - .get(postID) - .get('tipsSet') - .set(amt) // each item in the set is a tip - - TipForwarder.notifySocketIfAny( - postID, - order.from, - paidInvoice.memo || 'TIPPED YOU', - amt + ' sats' - ) - const ackData = { tippedPost: postID } - const toSend = JSON.stringify(ackData) - const encrypted = await SEA.encrypt(toSend, secret) - const ordResponse = { - type: 'orderAck', - response: encrypted - } - await new Promise((res, rej) => { - getUser() - .get(Key.ORDER_TO_RESPONSE) - .get(ackNode) - .put(ordResponse, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - rej( - new Error( - `${orderID} Error saving encrypted orderAck to order to response usergraph: ${ack}` - ) - ) - } else { - res(null) - } - }) - }) - orderMetadata = JSON.stringify(ackData) - break - } - case 'spontaneousPayment': { - //no action required - break - } - case 'contentReveal': { - logger.info(orderID, 'CONTENT REVEAL') - //assuming digital product that only requires to be unlocked - const postID = ackInfo - logger.info(orderID, 'ACK INFO') - logger.info(ackInfo) - if (!Common.isPopulatedString(postID)) { - breakError = 'invalid ackInfo provided for postID' - break //create the coordinate, but stop because of the invalid id - } - logger.info(orderID, 'IS STRING') - const selectedPost = /** @type {Record} */ (await getUser() - .get(Key.POSTS_NEW) - .get(postID) - .then()) - const selectedPostContent = /** @type {Record} */ (await getUser() - .get(Key.POSTS_NEW) - .get(postID) - .get(Key.CONTENT_ITEMS) - .then()) - - logger.info(orderID, 'LOAD ok') - logger.info(selectedPost) - if ( - !selectedPost || - !selectedPost.status || - selectedPost.status !== 'publish' - ) { - breakError = 'ackInfo provided does not correspond to a valid post' - break //create the coordinate, but stop because of the invalid post - } - logger.info(orderID, 'IS POST') - /** - * @type {Record} - */ - const contentsToSend = {} - logger.info(orderID, 'SECRET OK') - let privateFound = false - await Common.Utils.asyncForEach( - Object.entries(selectedPostContent), - async ([contentID, item]) => { - if ( - item.type !== 'image/embedded' && - item.type !== 'video/embedded' - ) { - return //only visual content can be private - } - if (!item.isPrivate) { - return - } - privateFound = true - const decrypted = await SEA.decrypt(item.magnetURI, mySecret) - contentsToSend[contentID] = decrypted - } - ) - if (!privateFound) { - breakError = - 'post provided from ackInfo does not contain private content' - break //no private content in this post - } - const ackData = { unlockedContents: contentsToSend, ackInfo } - const toSend = JSON.stringify(ackData) - const encrypted = await SEA.encrypt(toSend, secret) - const ordResponse = { - type: 'orderAck', - response: encrypted - } - logger.info(orderID, 'RES READY') - - await new Promise((res, rej) => { - getUser() - .get(Key.ORDER_TO_RESPONSE) - .get(ackNode) - .put(ordResponse, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - rej( - new Error( - `Error saving encrypted orderAck to order to response usergraph: ${ack}` - ) - ) - } else { - res(null) - } - }) - }) - logger.info(orderID, 'RES SENT CONTENT') - orderMetadata = JSON.stringify(ackData) - break - } - case 'torrentSeed': { - logger.info(orderID, 'TORRENT') - const numberOfTokens = Number(ackInfo) || 1 - const seedInfo = selfContentToken() - if (!seedInfo && !serviceOrderContentSeedInfo) { - breakError = 'torrentSeed service not available' - break //service not available - } - const seedInfoReady = serviceOrderContentSeedInfo || seedInfo - if (!seedInfoReady) { - breakError = 'torrentSeed service not available' - break //service not available - } - const { seedUrl } = seedInfoReady - const tokens = await enrollContentTokens( - numberOfTokens, - seedInfoReady - ) - logger.info(orderID, 'RES SEED OK') - const ackData = { seedUrl, tokens, ackInfo } - const toSend = JSON.stringify(ackData) - const encrypted = await SEA.encrypt(toSend, secret) - const serviceResponse = { - type: 'orderAck', - response: encrypted - } - logger.info(orderID, 'RES SEED SENT') - await new Promise((res, rej) => { - getUser() - .get(Key.ORDER_TO_RESPONSE) - .get(ackNode) - .put(serviceResponse, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - rej( - new Error( - `Error saving encrypted orderAck to order to response usergraph: ${ack}` - ) - ) - } else { - res(null) - } - }) - }) - logger.info(orderID, 'RES SENT SEED') - orderMetadata = JSON.stringify(ackData) - break - } - case 'other': //not implemented yet but save them as a coordinate anyways - break - default: - breakError = 'invalid service type provided' - return //exit because not implemented - } - const metadata = breakError ? JSON.stringify(breakError) : orderMetadata - const myGunPub = getUser()._.sea.pub - SchemaManager.AddOrder({ - type: orderType, - coordinateHash: hashString, - coordinateIndex: parseInt(addIndex, 10), - inbound: true, - amount: parseInt(amt, 10), - - toLndPub: paymentAddr, - fromGunPub: order.from, - toGunPub: myGunPub, - invoiceMemo: memo, - - metadata - }) - if (breakError) { - throw new Error(breakError) - } - } - logger.info(orderID, 'Waiting for invoice to be paid for order ' + orderID) - new Promise(res => SchemaManager.addListenInvoice(invoice.r_hash, res)) - .then(invoicePaidCb) - .catch(err => { - logger.error( - orderID, - `error inside onOrders, orderAddr: ${addr}, orderID: ${orderID}, order: ${JSON.stringify( - order - )}` - ) - logger.error(orderID, err) - logger.info(orderID, err) - - /** @type {import('shock-common').Schema.OrderResponse} */ - const orderResponse = { - response: err.message, - type: 'err' - } - - getUser() - .get(Key.ORDER_TO_RESPONSE) - .get(orderID) - // @ts-expect-error - .put(orderResponse, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - logger.error( - orderID, - `Error saving encrypted invoice to order to response usergraph: ${ack}` - ) - } - }) - }) - } catch (/** @type {any} */ err) { - logger.error( - orderID, - `error inside onOrders, orderAddr: ${addr}, orderID: ${orderID}, order: ${JSON.stringify( - order - )}` - ) - logger.error(orderID, err) - logger.info(orderID, err) - - /** @type {import('shock-common').Schema.OrderResponse} */ - const orderResponse = { - response: err.message, - type: 'err' - } - - getUser() - .get(Key.ORDER_TO_RESPONSE) - .get(orderID) - // @ts-expect-error - .put(orderResponse, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - logger.error( - orderID, - `Error saving encrypted invoice to order to response usergraph: ${ack}` - ) - } - }) - } -} - -/** - * @param {UserGUNNode} user - * @param {GUNNode} gun - * @param {ISEA} SEA - * @throws {Error} NOT_AUTH - * @returns {void} - */ -const onOrders = (user, gun, SEA) => { - if (!user.is) { - logger.warn('onOrders() -> tried to sub without authing') - throw new Error(ErrorCode.NOT_AUTH) - } - - user.get(Key.CURRENT_ORDER_ADDRESS).on(addr => { - try { - if (typeof addr !== 'string') { - logger.error('Expected current order address to be an string') - return - } - - if (currentOrderAddr === addr) { - // Already subscribed - return - } - - currentOrderAddr = addr - logger.info(`listening to address: ${addr}`) - - gun - .get(Key.ORDER_NODES) - .get(addr) - .map() - .on(listenerForAddr(currentOrderAddr, SEA)) - } catch (e) { - logger.error(`Could not subscribe to order node: ${addr}, error:`) - logger.error(e) - } - }) -} - -module.exports = onOrders diff --git a/services/gunDB/contact-api/key.js b/services/gunDB/contact-api/key.js deleted file mode 100644 index fe9ee683..00000000 --- a/services/gunDB/contact-api/key.js +++ /dev/null @@ -1,75 +0,0 @@ -/** - * @format - */ -exports.HANDSHAKE_NODES = 'handshakeNodes' - -exports.CURRENT_HANDSHAKE_ADDRESS = 'currentHandshakeAddress' - -exports.MESSAGES = 'messages' -exports.OUTGOINGS = 'outgoings' - -exports.RECIPIENT_TO_OUTGOING = 'recipientToOutgoing' -exports.USER_TO_INCOMING = 'userToIncoming' - -exports.STORED_REQS = 'storedReqs' - -exports.BLACKLIST = 'blacklist' - -exports.PROFILE = 'Profile' -exports.AVATAR = 'avatar' -exports.DISPLAY_NAME = 'displayName' - -/** - * Maps user to the last request sent to them. - */ -exports.USER_TO_LAST_REQUEST_SENT = 'USER_TO_LAST_REQUEST_SENT' - -exports.CURRENT_ORDER_ADDRESS = 'currentOrderAddress' - -exports.ORDER_NODES = 'orderNodes' - -/** - * Another user that placed an order can look for a response in here. - */ -exports.ORDER_TO_RESPONSE = 'orderToResponse' - -exports.BIO = 'bio' - -exports.SEED_BACKUP = 'seedBackup' - -exports.CHANNELS_BACKUP = 'channelsBackup' - -exports.LAST_SEEN_APP = 'lastSeenApp' - -exports.LAST_SEEN_NODE = 'lastSeenNode' - -exports.WALL = 'wall' - -exports.NUM_OF_PAGES = 'numOfPages' - -exports.PAGES = 'pages' - -exports.COUNT = 'count' - -exports.CONTENT_ITEMS = 'contentItems' -exports.FOLLOWS = 'follows' - -exports.POSTS = 'posts' - -// Tips counter for posts -exports.TOTAL_TIPS = 'totalTips' - -exports.PROFILE_BINARY = 'profileBinary' - -exports.POSTS_NEW = 'posts' - -// For Coordinates -exports.COORDINATES = 'coordinates' - -exports.COORDINATE_INDEX = 'coordinateIndex' - -exports.TMP_CHAIN_COORDINATE = 'tmpChainCoordinate' - -exports.DATE_COORDINATE_INDEX = 'dateCoordinateIndex' - -exports.OFFERED_SERVICES = 'offeredServices' diff --git a/services/gunDB/contact-api/streams/index.js b/services/gunDB/contact-api/streams/index.js deleted file mode 100644 index 7ff4d7be..00000000 --- a/services/gunDB/contact-api/streams/index.js +++ /dev/null @@ -1,6 +0,0 @@ -/** @format */ - -module.exports = { - getPubToLastSeenApp: require('./pubToLastSeenApp').getPubToLastSeenApp, - onPubToLastSeenApp: require('./pubToLastSeenApp').on -} diff --git a/services/gunDB/contact-api/streams/pubToLastSeenApp.js b/services/gunDB/contact-api/streams/pubToLastSeenApp.js deleted file mode 100644 index 421b9f29..00000000 --- a/services/gunDB/contact-api/streams/pubToLastSeenApp.js +++ /dev/null @@ -1,50 +0,0 @@ -const Key = require('../key') -/** - * @typedef {Record} Timestamps - * @typedef {(timestamps: Timestamps) => void} Listener - */ - -/** @type {Timestamps} */ -const pubToLastSeenApp = {} - -const getPubToLastSeenApp = () => pubToLastSeenApp - -/** @type {Set} */ -const listeners = new Set() - -const notifyListeners = () => { - listeners.forEach(l => l(pubToLastSeenApp)) -} - -/** @type {Set} */ -const pubsWithListeners = new Set() - -/** - * @param {Listener} cb - * @param {string=} pub - */ -const on = (cb, pub) => { - listeners.add(cb) - cb(pubToLastSeenApp) - if (pub && pubsWithListeners.add(pub)) { - pubToLastSeenApp[pub] = null - notifyListeners() - require('../../Mediator') - .getGun() - .user(pub) - .get(Key.LAST_SEEN_APP) - .on(timestamp => { - pubToLastSeenApp[pub] = - typeof timestamp === 'number' ? timestamp : undefined - notifyListeners() - }) - } - return () => { - listeners.delete(cb) - } -} - -module.exports = { - getPubToLastSeenApp, - on -} diff --git a/services/gunDB/contact-api/utils/PGUNNode.ts b/services/gunDB/contact-api/utils/PGUNNode.ts deleted file mode 100644 index 5c74b0e1..00000000 --- a/services/gunDB/contact-api/utils/PGUNNode.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** @format */ -import { GUNNode, GUNNodeBase, ValidDataValue } from '../SimpleGUN' - -export interface PGUNNode extends GUNNodeBase { - get(key: string): PGUNNode - put(data: ValidDataValue | GUNNode): Promise - set(data: ValidDataValue | GUNNode): Promise -} diff --git a/services/gunDB/contact-api/utils/index.js b/services/gunDB/contact-api/utils/index.js deleted file mode 100644 index 60a744cc..00000000 --- a/services/gunDB/contact-api/utils/index.js +++ /dev/null @@ -1,243 +0,0 @@ -/** - * @format - */ -/* eslint-disable init-declarations */ -const logger = require('../../../../config/log') -const { Constants, Utils: CommonUtils } = require('shock-common') - -const Key = require('../key') -/// - -/** - * @typedef {Smith.GunSmithNode} GUNNode - * @typedef {import('../SimpleGUN').ISEA} ISEA - * @typedef {Smith.UserSmithNode} UserGUNNode - */ - -/** - * @param {number} ms - * @returns {Promise} - */ -const delay = ms => new Promise(res => setTimeout(res, ms)) - -/** - * @returns {Promise} - */ -const mySecret = () => Promise.resolve(require('../../Mediator').getMySecret()) - -/** - * Just a pointer. - */ -const TIMEOUT_PTR = {} - -/** - * @param {number} ms Milliseconds - * @returns {(promise: Promise) => Promise} - */ -const timeout = ms => async promise => { - /** @type {NodeJS.Timeout} */ - // @ts-ignore - let timeoutID - - const result = await Promise.race([ - promise.then(v => { - clearTimeout(timeoutID) - return v - }), - - CommonUtils.makePromise(res => { - timeoutID = setTimeout(() => { - clearTimeout(timeoutID) - res(TIMEOUT_PTR) - }, ms) - }) - ]) - - if (result === TIMEOUT_PTR) { - throw new Error(Constants.TIMEOUT_ERR) - } - - return result -} - -/** - * Time outs at 10 seconds. - */ -const timeout10 = timeout(10) - -/** - * Time outs at 5 seconds. - */ -const timeout5 = timeout(5) - -/** - * Time outs at 2 seconds. - */ -const timeout2 = timeout(2) - -/** - * @template T - * @param {(gun: GUNNode, user: UserGUNNode) => Promise} promGen The function - * receives the most recent gun and user instances. - * @param {((resolvedValue: unknown) => boolean)=} shouldRetry - * @returns {Promise} - */ -const tryAndWait = async (promGen, shouldRetry = () => false) => { - /* eslint-disable init-declarations */ - - // If hang stop at 10, wait 3, retry, if hang stop at 5, reinstate, warm for - // 5, retry, stop at 10, err - - /** @type {T} */ - let resolvedValue - - try { - resolvedValue = await timeout2( - promGen( - require('../../Mediator/index').getGun(), - require('../../Mediator/index').getUser() - ) - ) - - if (!shouldRetry(resolvedValue)) { - return resolvedValue - } - } catch (e) { - if (e.message !== Constants.ErrorCode.TIMEOUT_ERR) { - throw e - } - } - - await delay(200) - - try { - resolvedValue = await timeout5( - promGen( - require('../../Mediator/index').getGun(), - require('../../Mediator/index').getUser() - ) - ) - - if (!shouldRetry(resolvedValue)) { - return resolvedValue - } - } catch (e) { - if (e.message !== Constants.ErrorCode.TIMEOUT_ERR) { - throw e - } - } - - await delay(3000) - - try { - resolvedValue = await timeout5( - promGen( - require('../../Mediator/index').getGun(), - require('../../Mediator/index').getUser() - ) - ) - - if (!shouldRetry(resolvedValue)) { - return resolvedValue - } - } catch (e) { - if (e.message !== Constants.ErrorCode.TIMEOUT_ERR) { - throw e - } - } - - return timeout10( - promGen( - require('../../Mediator/index').getGun(), - require('../../Mediator/index').getUser() - ) - ) - - /* eslint-enable init-declarations */ -} - -/** - * @param {string} pub - * @returns {Promise} - */ -const pubToEpub = async pub => { - try { - const epub = await require('../../Mediator/index') - .getGun() - .user(pub) - .get('epub') - .specialThen() - - return /** @type {string} */ (epub) - } catch (err) { - logger.error( - `Error inside pubToEpub for pub ${pub.slice(0, 8)}...${pub.slice(-8)}:` - ) - logger.error(err) - throw err - } -} - -/** - * @param {import('../SimpleGUN').ListenerData} listenerData - * @returns {listenerData is import('../SimpleGUN').ListenerObj} - */ -const dataHasSoul = listenerData => - typeof listenerData === 'object' && listenerData !== null - -/** - * @param {string} pub - * @returns {Promise} - */ -const isNodeOnline = async pub => { - const SET_LAST_SEEN_APP_INTERVAL = 15000 - - /** - * @param {any} lastSeen - * @returns {boolean} - */ - const isAppOnline = lastSeen => - typeof lastSeen === 'number' && - Date.now() - lastSeen < SET_LAST_SEEN_APP_INTERVAL * 2 - - const userNode = require('../../Mediator') - .getGun() - .user(pub) - - const isOnlineApp = isAppOnline(await userNode.get(Key.LAST_SEEN_APP).then()) - const lastSeenNode = await userNode.get(Key.LAST_SEEN_NODE).then() - - return ( - isOnlineApp || - (typeof lastSeenNode === 'number' && - Date.now() - lastSeenNode < Constants.Misc.LAST_SEEN_NODE_INTERVAL * 2) - ) -} - -/** - * @returns {string} - */ -const gunID = () => { - // Copied from gun internals - let s = '' - let l = 24 // you are not going to make a 0 length random number, so no need to check type - const c = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXZabcdefghijklmnopqrstuvwxyz' - while (l > 0) { - s += c.charAt(Math.floor(Math.random() * c.length)) - l-- - } - return s -} - -module.exports = { - dataHasSoul, - delay, - pubToEpub, - tryAndWait, - mySecret, - promisifyGunNode: require('./promisifygun'), - timeout5, - timeout2, - isNodeOnline, - gunID -} diff --git a/services/gunDB/contact-api/utils/index.spec.js b/services/gunDB/contact-api/utils/index.spec.js deleted file mode 100644 index 228a9908..00000000 --- a/services/gunDB/contact-api/utils/index.spec.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * @format - */ -const expect = require('expect') - -const { gunID } = require('./index') - -describe('gunID()', () => { - it('generates 24-chars-long unique IDs', () => { - const id = gunID() - expect(id).toBeTruthy() - expect(id.length).toBe(24) - }) -}) diff --git a/services/gunDB/contact-api/utils/promisifygun.js b/services/gunDB/contact-api/utils/promisifygun.js deleted file mode 100644 index d5944dda..00000000 --- a/services/gunDB/contact-api/utils/promisifygun.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * @format - * @typedef {import("../SimpleGUN").ValidDataValue} ValidDataValue - * @typedef {import('../SimpleGUN').GUNNode} GUNNode - * @typedef {import('./PGUNNode').PGUNNode} PGUNNode - */ - -/** - * @param {GUNNode} node - * @returns {PGUNNode} - */ -const promisify = node => { - const oldPut = node.put.bind(node) - const oldSet = node.set.bind(node) - const oldGet = node.get.bind(node) - - const _pnode = /** @type {unknown} */ (node) - const pnode = /** @type {PGUNNode} */ (_pnode) - - pnode.put = data => - new Promise((res, rej) => { - oldPut(data, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - rej(new Error(ack.err)) - } else { - res() - } - }) - }) - - pnode.set = data => - new Promise((res, rej) => { - oldSet(data, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - rej(new Error(ack.err)) - } else { - res() - } - }) - }) - - pnode.get = key => promisify(oldGet(key)) - - return pnode -} - -module.exports = promisify diff --git a/services/gunDB/rpc/index.js b/services/gunDB/rpc/index.js deleted file mode 100644 index 5682a988..00000000 --- a/services/gunDB/rpc/index.js +++ /dev/null @@ -1,315 +0,0 @@ -/** - * @format - */ -/* eslint-disable no-use-before-define */ -// @ts-check -const { makePromise, Constants, Schema } = require('shock-common') -const mapValues = require('lodash/mapValues') -const Bluebird = require('bluebird') - -const { pubToEpub } = require('../contact-api/utils') -const { - getGun, - getUser, - mySEA: SEA, - getMySecret, - $$__SHOCKWALLET__ENCRYPTED__ -} = require('../Mediator') -const logger = require('../../../config/log') -const Utils = require('../contact-api/utils') -/** - * @typedef {import('../contact-api/SimpleGUN').ValidDataValue} ValidDataValue - * @typedef {import('./types').ValidRPCDataValue} ValidRPCDataValue - * @typedef {import('./types').RPCData} RPCData - */ - -const PATH_SEPARATOR = '>' - -/** - * @param {ValidDataValue} value - * @param {string} publicKey - * @param {string=} epubForDecryption - * @returns {Promise} - */ -const deepDecryptIfNeeded = async (value, publicKey, epubForDecryption) => { - if (Schema.isObj(value)) { - return Bluebird.props( - mapValues(value, o => - deepDecryptIfNeeded(o, publicKey, epubForDecryption) - ) - ) - } - - if ( - typeof value === 'string' && - value.indexOf($$__SHOCKWALLET__ENCRYPTED__) === 0 - ) { - const user = getUser() - if (!user.is) { - throw new Error(Constants.ErrorCode.NOT_AUTH) - } - - let sec = '' - if (user.is.pub === publicKey || 'me' === publicKey) { - sec = getMySecret() - } else { - let epub = epubForDecryption - - if (!epub) { - epub = await pubToEpub(publicKey) - } - - sec = await SEA.secret(epub, user._.sea) - } - - const decrypted = SEA.decrypt(value, sec) - - return decrypted - } - - return value -} - -/** - * @param {ValidRPCDataValue} value - * @returns {Promise} - */ -// eslint-disable-next-line func-style -async function deepEncryptIfNeeded(value) { - const u = getUser() - - if (!u.is) { - throw new Error(Constants.ErrorCode.NOT_AUTH) - } - - if (!Schema.isObj(value)) { - return value - } - - if (Array.isArray(value)) { - return Promise.all(value.map(v => deepEncryptIfNeeded(v))) - } - - const pk = /** @type {string|undefined} */ (value.$$__ENCRYPT__FOR) - const epub = /** @type {string|undefined} */ (value.$$__EPUB__FOR) - - if (!pk) { - return Bluebird.props(mapValues(value, deepEncryptIfNeeded)) - } - - const actualValue = /** @type {string} */ (value.value) - - let encryptedValue = '' - - if (pk === u.is.pub || pk === 'me') { - encryptedValue = await SEA.encrypt(actualValue, getMySecret()) - } else { - const sec = await SEA.secret( - await (() => { - if (epub) { - return epub - } - return pubToEpub(pk) - })(), - u._.sea - ) - - encryptedValue = await SEA.encrypt(actualValue, sec) - } - - return encryptedValue -} - -/** - * @param {string} rawPath - * @param {ValidRPCDataValue} value - * @returns {Promise} - */ -const put = async (rawPath, value) => { - const [root, ...path] = rawPath.split(PATH_SEPARATOR) - - const node = (() => { - // eslint-disable-next-line init-declarations - let _node - - if (root === '$gun') { - _node = getGun() - } else if (root === '$user') { - const u = getUser() - - if (!u.is) { - throw new Error(Constants.ErrorCode.NOT_AUTH) - } - - _node = u - } else { - throw new TypeError( - `Unknown kind of root, expected $gun or $user but got: ${root}` - ) - } - - for (const bit of path) { - _node = _node.get(bit) - } - - return _node - })() - - const theValue = await deepEncryptIfNeeded(value) - - if (Array.isArray(theValue)) { - await Promise.all(theValue.map(v => set(rawPath, v))) - - // Do not remove this return, an array is also an object - // eslint-disable-next-line no-useless-return - return - } else if (Schema.isObj(theValue)) { - const currValue = await node.then() - - if (Schema.isObj(currValue)) { - const writes = mapValues(theValue, (v, k) => - put(rawPath + PATH_SEPARATOR + k, v) - ) - - await Bluebird.props(writes) - } else { - // if the value at path foo is null or another primitive, then - // foo.get('bar').put(baz) will NOT work, the write needs to happen like so: - // foo.put({ bar: baz }). Doing foo.put({}) also works but it won't replace - // the primitive value with an empty object but with the last object - // representation of that node. Doing foo.put({ anything: whatever }) will - // merge that new object with the previous representation too. Both of which - // can result in inconsistent states so please thread carefully. What I - // chose to do here was put without waiting for ack, and if the actual - // user-generated puts fail, roll back to the previous local state in order - // to accomplish some kind of atomicity. This bug will mostly affect maps - // instead of sets as deleted keys in a set should not be reused. - // Maps should conform to an schema to avoid inconsistent data. - try { - node.put({}) // changes from current primitive value to last known object value - - const writes = mapValues(theValue, (v, k) => - put(rawPath + PATH_SEPARATOR + k, v) - ) - - await Bluebird.props(writes) - } catch (e) { - if (typeof currValue !== 'undefined') { - // if write was somehow unsuccessful, revert to last known primitive value - node.put(currValue) - } - - throw e - } - } - } /* is primitive */ else { - await makePromise((res, rej) => { - node.put(/** @type {ValidDataValue} */ (theValue), ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - if (typeof ack.err === 'string') { - rej(new Error(ack.err)) - } else { - logger.info(`NON STANDARD GUN ERROR:`) - logger.info(ack) - rej(new Error(JSON.stringify(ack.err, null, 4))) - } - } else { - res() - } - }) - }) - } -} - -/** - * @param {string} rawPath - * @param {ValidRPCDataValue} value - * @returns {Promise} - */ -// eslint-disable-next-line func-style -async function set(rawPath, value) { - const [root, ...path] = rawPath.split(PATH_SEPARATOR) - - const node = (() => { - // eslint-disable-next-line init-declarations - let _node - - if (root === '$gun') { - _node = getGun() - } else if (root === '$user') { - const u = getUser() - - if (!u.is) { - throw new Error(Constants.ErrorCode.NOT_AUTH) - } - - _node = u - } else { - throw new TypeError( - `Unknown kind of root, expected $gun or $user but got: ${root}` - ) - } - - for (const bit of path) { - _node = _node.get(bit) - } - - return _node - })() - - const theValue = await deepEncryptIfNeeded(value) - - if (Array.isArray(theValue)) { - // we'll create a set of sets - - const uuid = Utils.gunID() - - // here we are simulating the top-most set() - const subPath = rawPath + PATH_SEPARATOR + uuid - - const writes = theValue.map(v => set(subPath, v)) - - await Promise.all(writes) - - return uuid - } else if (Schema.isObj(theValue)) { - const uuid = Utils.gunID() // we'll handle UUID ourselves - - // so we can use our own put() - - const subPath = rawPath + PATH_SEPARATOR + uuid - - await put(subPath, theValue) - - return uuid - } - - /* else is primitive */ - - const id = await makePromise((res, rej) => { - const subNode = node.set(theValue, ack => { - if ( - ack.err && - typeof ack.err !== 'number' && - typeof ack.err !== 'object' - ) { - rej(new Error(ack.err)) - } else { - res(subNode._.get) - } - }) - }) - - return id -} - -module.exports = { - put, - set, - deepDecryptIfNeeded, - deepEncryptIfNeeded -} diff --git a/services/gunDB/rpc/types.ts b/services/gunDB/rpc/types.ts deleted file mode 100644 index e30bb4b8..00000000 --- a/services/gunDB/rpc/types.ts +++ /dev/null @@ -1,8 +0,0 @@ -import {Primitive} from '../contact-api/SimpleGUN' - - -export interface RPCData { - [K: string]: ValidRPCDataValue -} - -export type ValidRPCDataValue = Primitive | null | RPCData | Array \ No newline at end of file diff --git a/services/gunDB/sockets/index.js b/services/gunDB/sockets/index.js deleted file mode 100644 index 9b52563b..00000000 --- a/services/gunDB/sockets/index.js +++ /dev/null @@ -1,254 +0,0 @@ -/** - * @format - */ - -const logger = require('../../../config/log') -const Common = require('shock-common') -const uuidv4 = require('uuid/v4') - -const { getGun, getUser, isAuthenticated } = require('../Mediator') -const { deepDecryptIfNeeded } = require('../rpc') -const Subscriptions = require('./subscriptions') -const GunActions = require('../../gunDB/contact-api/actions') -const { - encryptedEmit, - encryptedOn, - encryptedCallback -} = require('../../../utils/ECC/socket') -/// - -const ALLOWED_GUN_METHODS = [ - 'map', - 'map.on', - 'on', - 'once', - 'load', - 'then', - 'open' -] - -/** - * @typedef {import('../contact-api/SimpleGUN').ValidDataValue} ValidDataValue - */ - -/** - * @typedef {(data: ValidDataValue, key?: string, _msg?: any, event?: any) => (void | Promise)} GunListener - * @typedef {{ reconnect: boolean, token: string }} SubscriptionOptions - */ - -/** - * @param {string} root - */ -const getNode = root => { - if (root === '$gun') { - return getGun() - } - - if (root === '$user') { - return getUser() - } - - return getGun().user(root) -} - -/** - * @param {Smith.GunSmithNode} node - * @param {string} path - */ -const getGunQuery = (node, path) => { - const bits = path.split('>') - const query = bits.reduce((gunQuery, bit) => gunQuery.get(bit), node) - return query -} - -/** - * Executes a GunDB query call using the specified method - * @param {any} query - * @param {string} method - * @param {GunListener} listener - */ -const executeGunQuery = (query, method, listener) => { - if (!ALLOWED_GUN_METHODS.includes(method)) { - throw { - field: 'method', - message: `Invalid GunDB method specified (${method}). ` - } - } - - if (method === 'on') { - return query.on(listener) - } - - if (method === 'open') { - return query.open(listener) - } - - if (method === 'map.on') { - return query.map().on(listener) - } - - if (method === 'map.once') { - return query.map().once(listener) - } -} - -/** - * @param {Object} queryData - * @param {(eventName: string, ...args: any[]) => Promise} queryData.emit - * @param {string} queryData.publicKeyForDecryption - * @param {string} queryData.subscriptionId - * @param {string} queryData.deviceId - * @param {string=} queryData.epubForDecryption - * @param {string=} queryData.epubField If the epub is included in the received - * data itself. Handshake requests for example, have an epub field. - * @returns {GunListener} - */ -const queryListenerCallback = ({ - emit, - publicKeyForDecryption, - subscriptionId, - deviceId, - epubForDecryption, - epubField -}) => async (data, key, _msg, event) => { - try { - const subscription = Subscriptions.get({ - deviceId, - subscriptionId - }) - if (subscription && !subscription.unsubscribe && event) { - Subscriptions.attachUnsubscribe({ - deviceId, - subscriptionId, - unsubscribe: () => event.off() - }) - } - const eventName = `query:data` - if (publicKeyForDecryption?.length > 0 || epubForDecryption || epubField) { - const decData = await deepDecryptIfNeeded( - data, - publicKeyForDecryption, - (() => { - if (epubField) { - if (Common.isObj(data)) { - const epub = data[epubField] - if (Common.isPopulatedString(epub)) { - return epub - } - - logger.error( - `Got epubField in a rifle query, but the resulting value obtained is not an string -> `, - { - data, - epub - } - ) - } else { - logger.warn( - `Got epubField in a rifle query for a non-object data -> `, - { - epubField, - data - } - ) - } - } - return epubForDecryption - })() - ) - emit(eventName, { subscriptionId, response: { data: decData, key } }) - return - } - - emit(eventName, { subscriptionId, response: { data, key } }) - } catch (err) { - logger.error(`Error for gun rpc socket: ${err.message}`) - } -} - -/** @param {import('socket.io').Socket} socket */ -const startSocket = socket => { - try { - const emit = encryptedEmit(socket) - const on = encryptedOn(socket) - const { encryptionId } = socket.handshake.auth - - if (!isAuthenticated()) { - logger.warn('GunDB is not yet authenticated') - socket.emit(Common.Constants.ErrorCode.NOT_AUTH) - } - - if (isAuthenticated()) { - socket.onAny(async () => { - try { - await GunActions.setLastSeenApp() - } catch (err) { - logger.info('error setting last seen app', err) - } - }) - } - - on('subscribe:query', (query, response) => { - const { $shock, publicKey, epubForDecryption, epubField } = query - const subscriptionId = uuidv4() - try { - if (!isAuthenticated()) { - socket.emit(Common.Constants.ErrorCode.NOT_AUTH) - return - } - - const [root, path, method] = $shock.split('::') - const socketCallback = encryptedCallback(socket, response) - - if (!ALLOWED_GUN_METHODS.includes(method)) { - socketCallback( - `Invalid method for gun rpc call: ${method}, query: ${$shock}` - ) - return - } - - Subscriptions.add({ - deviceId: encryptionId, - subscriptionId - }) - - const queryCallback = queryListenerCallback({ - emit, - publicKeyForDecryption: publicKey, - subscriptionId, - deviceId: encryptionId, - epubForDecryption, - epubField - }) - - socketCallback(null, { - subscriptionId - }) - - const node = getNode(root) - const query = getGunQuery(node, path) - - executeGunQuery(query, method, queryCallback) - } catch (error) { - emit(`query:error`, { subscriptionId, response: { data: error } }) - } - }) - - on('unsubscribe', ({ subscriptionId }, response) => { - const callback = encryptedCallback(socket, response) - Subscriptions.remove({ deviceId: encryptionId, subscriptionId }) - callback(null, { - message: 'Unsubscribed successfully!', - success: true - }) - }) - - socket.on('disconnect', () => { - Subscriptions.removeDevice({ deviceId: encryptionId }) - }) - } catch (err) { - logger.error('GUNRPC: ' + err.message) - } -} - -module.exports = startSocket diff --git a/services/gunDB/sockets/subscriptions.js b/services/gunDB/sockets/subscriptions.js deleted file mode 100644 index 553a11d7..00000000 --- a/services/gunDB/sockets/subscriptions.js +++ /dev/null @@ -1,123 +0,0 @@ -/** - * @typedef {() => void} Unsubscribe - */ - -/** @type {Map void, metadata?: object }>>} */ -const userSubscriptions = new Map() - -/** - * Adds a new Subscription - * @param {Object} subscription - * @param {string} subscription.deviceId - * @param {string} subscription.subscriptionId - * @param {(Unsubscribe)=} subscription.unsubscribe - * @param {(object)=} subscription.metadata - */ -const add = ({ deviceId, subscriptionId, unsubscribe, metadata }) => { - const deviceSubscriptions = userSubscriptions.get(deviceId) - - const subscriptions = deviceSubscriptions ?? new Map() - subscriptions.set(subscriptionId, { - subscriptionId, - unsubscribe, - metadata - }) - userSubscriptions.set(deviceId, subscriptions) -} - -/** - * Adds a new Subscription - * @param {Object} subscription - * @param {string} subscription.deviceId - * @param {string} subscription.subscriptionId - * @param {Unsubscribe} subscription.unsubscribe - */ -const attachUnsubscribe = ({ deviceId, subscriptionId, unsubscribe }) => { - const deviceSubscriptions = userSubscriptions.get(deviceId) - - const subscriptions = deviceSubscriptions - - if (!subscriptions) { - return - } - - const subscription = subscriptions.get(subscriptionId) - - if (!subscription) { - return - } - - subscriptions.set(subscriptionId, { - ...subscription, - unsubscribe - }) - userSubscriptions.set(deviceId, subscriptions) -} - -/** - * Unsubscribes from a GunDB query - * @param {Object} subscription - * @param {string} subscription.deviceId - * @param {string} subscription.subscriptionId - */ -const remove = ({ deviceId, subscriptionId }) => { - const deviceSubscriptions = userSubscriptions.get(deviceId) - - const subscriptions = deviceSubscriptions ?? new Map() - const subscription = subscriptions.get(subscriptionId) - - if (subscription?.unsubscribe) { - subscription.unsubscribe() - } - - subscriptions.delete(subscriptionId) - userSubscriptions.set(deviceId, subscriptions) -} - -/** - * Unsubscribes from all GunDB queries for a specific device - * @param {Object} subscription - * @param {string} subscription.deviceId - */ -const removeDevice = ({ deviceId }) => { - const deviceSubscriptions = userSubscriptions.get(deviceId) - - if (!deviceSubscriptions) { - return - } - - Array.from(deviceSubscriptions.values()).map(subscription => { - if (subscription && subscription.unsubscribe) { - subscription.unsubscribe() - } - - return subscription - }) - - userSubscriptions.set(deviceId, new Map()) -} - -/** - * Retrieves the specified subscription's info if it exists - * @param {Object} subscription - * @param {string} subscription.deviceId - * @param {string} subscription.subscriptionId - */ -const get = ({ deviceId, subscriptionId }) => { - const deviceSubscriptions = userSubscriptions.get(deviceId) - - if (!deviceSubscriptions) { - return false - } - - const subscription = deviceSubscriptions.get(subscriptionId) - return subscription -} - -module.exports = { - add, - attachUnsubscribe, - get, - remove, - removeDevice -} diff --git a/services/initializer.js b/services/initializer.js deleted file mode 100644 index 9d12684c..00000000 --- a/services/initializer.js +++ /dev/null @@ -1,12 +0,0 @@ -const API = require('./gunDB/contact-api') - -module.exports.InitUserData = async (user) => { - await API.Actions.setDisplayName('anon' + user._.sea.pub.slice(0, 8), user) - await API.Actions.generateHandshakeAddress() - await API.Actions.generateOrderAddress(user) - await API.Actions.initWall() - await API.Actions.setBio('A little bit about myself.', user) - await API.Actions.setDefaultSeedProvider('', user) - await API.Actions.setSeedServiceData('', user) - await API.Actions.setCurrentStreamInfo('', user) -} \ No newline at end of file diff --git a/services/lnd/lightning.js b/services/lnd/lightning.js deleted file mode 100644 index 18237d44..00000000 --- a/services/lnd/lightning.js +++ /dev/null @@ -1,134 +0,0 @@ -const Path = require("path"); -const grpc = require("@grpc/grpc-js"); -const protoLoader = require("@grpc/proto-loader"); -const logger = require("winston"); -const fs = require("../../utils/fs"); -const errorConstants = require("../../constants/errors"); - -// expose the routes to our app with module.exports -/** - * @typedef LightningConfig - * @prop {string} lnrpcProtoPath - * @prop {string} routerProtoPath - * @prop {string} invoicesProtoPath - * @prop {string} walletUnlockerProtoPath - * @prop {string} lndHost - * @prop {string} lndCertPath - * @prop {string?} macaroonPath - */ - -/** - * @typedef LightningServices - * @prop {any} lightning - * @prop {any} walletUnlocker - * @prop {any} router - * @prop {any} invoices - */ - -/** - * @param {LightningConfig} args0 - * @returns {Promise} - */ -module.exports = async ({ - lnrpcProtoPath, - routerProtoPath, - invoicesProtoPath, - walletUnlockerProtoPath, - lndHost, - lndCertPath, - macaroonPath -}) => { - try { - process.env.GRPC_SSL_CIPHER_SUITES = "HIGH+ECDSA"; - const protoLoaderConfig = { - keepCase: true, - longs: String, - enums: String, - defaults: true, - oneofs: true, - includeDirs: ["node_modules/google-proto-files", "proto", Path.resolve(__dirname, "../../config")] - } - - const [lnrpcProto, routerProto, walletUnlockerProto, invoicesProto] = await Promise.all([ - protoLoader.load(lnrpcProtoPath, protoLoaderConfig), - protoLoader.load(routerProtoPath, protoLoaderConfig), - protoLoader.load(walletUnlockerProtoPath, protoLoaderConfig), - protoLoader.load(invoicesProtoPath, protoLoaderConfig) - ]); - const { lnrpc } = grpc.loadPackageDefinition(lnrpcProto); - const { routerrpc } = grpc.loadPackageDefinition(routerProto); - const { invoicesrpc } = grpc.loadPackageDefinition(invoicesProto); - const { lnrpc: walletunlockerrpc } = grpc.loadPackageDefinition(walletUnlockerProto); - - const getCredentials = async () => { - const lndCert = await fs.readFile(lndCertPath); - const sslCreds = grpc.credentials.createSsl(lndCert); - - if (macaroonPath) { - const macaroonExists = await fs.access(macaroonPath); - - if (macaroonExists) { - const macaroonCreds = grpc.credentials.createFromMetadataGenerator( - async (_, callback) => { - const adminMacaroon = await fs.readFile(macaroonPath); - const metadata = new grpc.Metadata(); - metadata.add("macaroon", adminMacaroon.toString("hex")); - callback(null, metadata); - } - ); - return grpc.credentials.combineChannelCredentials( - sslCreds, - macaroonCreds - ); - } - - const error = errorConstants.MACAROON_PATH(macaroonPath); - logger.error(error); - throw error; - } else { - return sslCreds; - } - }; - - if (lndCertPath) { - const certExists = await fs.access(lndCertPath); - - if (certExists) { - const credentials = await getCredentials(); - - // @ts-ignore - const lightning = new lnrpc.Lightning(lndHost, credentials); - // @ts-ignore - const walletUnlocker = new walletunlockerrpc.WalletUnlocker(lndHost, credentials); - // @ts-ignore - const router = new routerrpc.Router(lndHost, credentials); - // @ts-ignore - const invoices = new invoicesrpc.Invoices(lndHost, credentials); - return { - lightning, - walletUnlocker, - router, - invoices - }; - } - - const error = errorConstants.CERT_PATH(lndCertPath); - logger.error(error); - throw error; - } else { - const error = errorConstants.CERT_AND_MACAROON_MISSING(macaroonPath, lndCertPath); - logger.error(error); - throw error; - } - } catch (err) { - logger.error(err); - if (err.code === 14) { - throw { - field: "unknown", - message: - "Failed to connect to LND server, make sure it's up and running." - }; - } - throw err; - } -}; diff --git a/services/schema/index.js b/services/schema/index.js deleted file mode 100644 index 4fb0034c..00000000 --- a/services/schema/index.js +++ /dev/null @@ -1,601 +0,0 @@ -const Crypto = require('crypto') -const logger = require('../../config/log') -const Common = require('shock-common') -const getGunUser = () => require('../gunDB/Mediator').getUser() -const isAuthenticated = () => require('../gunDB/Mediator').isAuthenticated() -const Key = require('../gunDB/contact-api/key') -const lndV2 = require('../../utils/lightningServices/v2') -/** - * @typedef {import('../gunDB/contact-api/SimpleGUN').ISEA} ISEA - * @typedef { 'spontaneousPayment' | 'tip' | 'torrentSeed' | 'contentReveal' | 'other'|'invoice'|'payment'|'chainTx' | 'streamSeed' |'service'|'product' } OrderType - * - * This represents a settled order only, unsettled orders have no coordinate - * @typedef {object} CoordinateOrder //everything is optional for different types - * @prop {string=} fromLndPub can be unknown when inbound - * @prop {string=} toLndPub always known - * @prop {string=} fromGunPub can be optional, if the payment/invoice is not related to an order - * @prop {string=} toGunPub can be optional, if the payment/invoice is not related to an order - * @prop {string=} fromBtcPub - * @prop {string=} toBtcPub - * @prop {boolean} inbound - * NOTE: type specific checks are not made before creating the order node, filters must be done before rendering or processing - * - * @prop {string=} ownerGunPub Reserved for buddy system: - * can be undefined, '', 'me', or node owner pub key to represent node owner, - * otherwise it represents a buddy - * - * @prop {number} coordinateIndex can be payment_index, or add_index depending on if it's a payment or an invoice - * @prop {string} coordinateHash can be payment_hash, or r_hash depending on if it's a payment or an invoice, - * if it's a r_hash, must be hex encoded - * - * @prop {OrderType} type - * @prop {number} amount - * @prop {string=} description - * @prop {string=} invoiceMemo - * @prop {string=} metadata JSON encoded string to store extra data for special use cases - * @prop {number=} timestamp timestamp will be added at processing time if empty - * - */ - -/** - * @param {CoordinateOrder} order - */ -const checkOrderInfo = order => { - const { - fromLndPub, - toLndPub, - fromGunPub, - toGunPub, - fromBtcPub, - toBtcPub, - inbound, - type, - amount, - description, - coordinateIndex, - coordinateHash, - metadata, - invoiceMemo - } = order - - if (fromLndPub && (typeof fromLndPub !== 'string' || fromLndPub === '')) { - return 'invalid "fromLndPub" field provided to order coordinate' - } - if (toLndPub && (typeof toLndPub !== 'string' || toLndPub === '')) { - return 'invalid or no "toLndPub" field provided to order coordinate' - } - if (fromGunPub && (typeof fromGunPub !== 'string' || fromGunPub === '')) { - return 'invalid "fromGunPub" field provided to order coordinate' - } - if (toGunPub && (typeof toGunPub !== 'string' || toGunPub === '')) { - return 'invalid "toGunPub" field provided to order coordinate' - } - if (fromBtcPub && (typeof fromBtcPub !== 'string' || fromBtcPub === '')) { - return 'invalid "fromBtcPub" field provided to order coordinate' - } - if (toBtcPub && (typeof toBtcPub !== 'string' || toBtcPub === '')) { - return 'invalid "toBtcPub" field provided to order coordinate' - } - if (typeof inbound !== 'boolean') { - return 'invalid or no "inbound" field provided to order coordinate' - } - //@ts-expect-error - if (typeof type !== 'string' || type === '') { - return 'invalid or no "type" field provided to order coordinate' - } - if (typeof amount !== 'number') { - return 'invalid or no "amount" field provided to order coordinate' - } - - if (typeof coordinateIndex !== 'number') { - return 'invalid or no "coordinateIndex" field provided to order coordinate' - } - if (typeof coordinateHash !== 'string' || coordinateHash === '') { - return 'invalid or no "coordinateHash" field provided to order coordinate' - } - - if (description && (typeof description !== 'string' || description === '')) { - return 'invalid "description" field provided to order coordinate' - } - if (invoiceMemo && (typeof invoiceMemo !== 'string' || invoiceMemo === '')) { - return 'invalid "invoiceMemo" field provided to order coordinate' - } - if (metadata && (typeof metadata !== 'string' || metadata === '')) { - return 'invalid "metadata" field provided to order coordinate' - } - return null -} - -/* - * - * @param {CoordinateOrder} orderInfo - * @param {string} coordinateSHA256 - *//* -const dateIndexCreateCb = (orderInfo, coordinateSHA256) => { -//if (this.memIndex) { need bind to use this here -//update date memIndex -//} -const date = new Date(orderInfo.timestamp || 0) -//use UTC for consistency? -const year = date.getUTCFullYear().toString() -const month = date.getUTCMonth().toString() - -getGunUser() -.get(Key.DATE_COORDINATE_INDEX) -.get(year) -.get(month) -.set(coordinateSHA256) -}*/ - -/* - * if not provided, assume current month and year - * @param {number|null} year - * @param {number|null} month - *//* -const getMonthCoordinates = async (year = null, month = null) => { -const now = Date.now() -const stringYear = year !== null ? year.toString() : now.getUTCFullYear().toString() -const stringMonth = month !== null ? month.toString() : now.getUTCMonth().toString() - -const data = await new Promise(res => { - getGunUser() - .get(Key.DATE_COORDINATE_INDEX) - .get(stringYear) - .get(stringMonth) - .load(res) -}) -const coordinatesArray = Object - .values(data) - .filter(coordinateSHA256 => typeof coordinateSHA256 === 'string') - -return coordinatesArray -}*/ - -/** - * - * @param {string|undefined} address - * @param {CoordinateOrder} orderInfo - */ -const AddTmpChainOrder = async (address, orderInfo) => { - if (!address) { - throw new Error("invalid address passed to AddTmpChainOrder") - } - if (!orderInfo.toBtcPub) { - throw new Error("invalid toBtcPub passed to AddTmpChainOrder") - } - const checkErr = checkOrderInfo(orderInfo) - if (checkErr) { - throw new Error(checkErr) - } - - /** - * @type {CoordinateOrder} - */ - const filteredOrder = { - fromLndPub: orderInfo.fromLndPub, - toLndPub: orderInfo.toLndPub, - fromGunPub: orderInfo.fromGunPub, - toGunPub: orderInfo.toGunPub, - inbound: orderInfo.inbound, - ownerGunPub: orderInfo.ownerGunPub, - coordinateIndex: orderInfo.coordinateIndex, - coordinateHash: orderInfo.coordinateHash, - type: orderInfo.type, - amount: orderInfo.amount, - description: orderInfo.description, - metadata: orderInfo.metadata, - - timestamp: orderInfo.timestamp || Date.now(), - } - const orderString = JSON.stringify(filteredOrder) - const mySecret = require('../gunDB/Mediator').getMySecret() - const SEA = require('../gunDB/Mediator').mySEA - const encryptedOrderString = await SEA.encrypt(orderString, mySecret) - - const addressSHA256 = Crypto.createHash('SHA256') - .update(address) - .digest('hex') - - await new Promise((res, rej) => { - getGunUser() - .get(Key.TMP_CHAIN_COORDINATE) - .get(addressSHA256) - .put(encryptedOrderString, ack => { - if (ack.err && typeof ack.err !== 'number' && typeof ack.err !== 'object') { - rej( - new Error( - `Error saving tmp chain coordinate order to user-graph: ${ack}` - ) - ) - } else { - res(null) - } - }) - }) -} - -/** - * - * @param {string} address - * @returns {Promise} - */ -const isTmpChainOrder = async (address) => { - if (typeof address !== 'string' || address === '') { - return false - } - const addressSHA256 = Crypto.createHash('SHA256') - .update(address) - .digest('hex') - - const maybeData = await getGunUser() - .get(Key.TMP_CHAIN_COORDINATE) - .get(addressSHA256) - .then() - - if (typeof maybeData !== 'string' || maybeData === '') { - return false - } - const mySecret = require('../gunDB/Mediator').getMySecret() - const SEA = require('../gunDB/Mediator').mySEA - const decryptedString = await SEA.decrypt(maybeData, mySecret) - if (typeof decryptedString !== 'string' || decryptedString === '') { - return false - } - - const tmpOrder = JSON.parse(decryptedString) - const checkErr = checkOrderInfo(tmpOrder) - if (checkErr) { - return false - } - - return tmpOrder - -} - -/** - * @param {string} address - */ -const clearTmpChainOrder = async (address) => { - if (typeof address !== 'string' || address === '') { - return - } - const addressSHA256 = Crypto.createHash('SHA256') - .update(address) - .digest('hex') - - await new Promise((res, rej) => { - getGunUser() - .get(Key.TMP_CHAIN_COORDINATE) - .get(addressSHA256) - .put(null, ack => { - if (ack.err && typeof ack.err !== 'number' && typeof ack.err !== 'object') { - rej( - new Error( - `Error nulling tmp chain coordinate order to user-graph: ${ack}` - ) - ) - } else { - res(null) - } - }) - }) -} - -/** - * @param {Common.Schema.ChainTransaction} tx - * @param {CoordinateOrder|false| undefined} order - */ -const handleUnconfirmedTx = (tx, order) => { - const { tx_hash } = tx - const amountInt = parseInt(tx.amount, 10) - if (order) { - /*if an order already exists, update the order data - if an unconfirmed transaction has a tmp order already - it means the address was generated by shockAPI, or the tx was sent by shockAPI*/ - const orderUpdate = order - orderUpdate.amount = Math.abs(amountInt) - orderUpdate.inbound = amountInt > 0 - /*tmp coordinate does not have a coordinate hash until the transaction is created, - before it will contain 'unknown' */ - orderUpdate.coordinateHash = tx_hash - /*update the order data, - provides a notification when the TX enters the mempool */ - AddTmpChainOrder(orderUpdate.toBtcPub, orderUpdate) - } else { - /*if an order does not exist, create the tmp order, - and use tx_hash as key. - this means the address was NOT generated by shockAPI, or the tx was NOT sent by shockAPI */ - AddTmpChainOrder(tx_hash, { - type: 'chainTx', - amount: Math.abs(amountInt), - coordinateHash: tx_hash, - coordinateIndex: 0, //coordinate index is 0 until the tx is confirmed and the block is known - inbound: amountInt > 0, - toBtcPub: 'unknown' - }) - } - -} - -class SchemaManager { - //constructor() { - // this.orderCreateIndexCallbacks.push(dateIndexCreateCb) //create more Cbs and put them here for more indexes callbacks - //} - - //dateIndexName = 'dateIndex' - /** - * @type {((order : CoordinateOrder,coordinateSHA256 : string)=>void)[]} - */ - orderCreateIndexCallbacks = [] - - /** - * @param {CoordinateOrder} orderInfo - */ - // eslint-disable-next-line class-methods-use-this - async AddOrder(orderInfo) { - const checkErr = checkOrderInfo(orderInfo) - if (checkErr) { - throw new Error(checkErr) - } - - /** - * @type {CoordinateOrder} - */ - const filteredOrder = { - fromLndPub: orderInfo.fromLndPub, - toLndPub: orderInfo.toLndPub, - fromGunPub: orderInfo.fromGunPub, - toGunPub: orderInfo.toGunPub, - inbound: orderInfo.inbound, - ownerGunPub: orderInfo.ownerGunPub, - coordinateIndex: orderInfo.coordinateIndex, - coordinateHash: orderInfo.coordinateHash, - type: orderInfo.type, - amount: orderInfo.amount, - description: orderInfo.description, - metadata: orderInfo.metadata, - timestamp: orderInfo.timestamp || Date.now(), - } - const orderString = JSON.stringify(filteredOrder) - const mySecret = require('../gunDB/Mediator').getMySecret() - const SEA = require('../gunDB/Mediator').mySEA - const encryptedOrderString = await SEA.encrypt(orderString, mySecret) - const coordinatePub = filteredOrder.inbound ? filteredOrder.toLndPub : filteredOrder.fromLndPub - const coordinate = `${coordinatePub}__${filteredOrder.coordinateIndex}__${filteredOrder.coordinateHash}` - const coordinateSHA256 = Crypto.createHash('SHA256') - .update(coordinate) - .digest('hex') - await new Promise((res, rej) => { - getGunUser() - .get(Key.COORDINATES) - .get(coordinateSHA256) - .put(encryptedOrderString, ack => { - if (ack.err && typeof ack.err !== 'number' && typeof ack.err !== 'object') { - logger.info(ack) - rej( - new Error( - `Error saving coordinate order to user-graph: ${ack}` - ) - ) - } else { - res(null) - } - }) - }) - - //update all indexes with - //this.orderCreateIndexCallbacks.forEach(cb => cb(filteredOrder, coordinateSHA256)) - } - - - - /* - * if not provided, assume current month and year - * @param {number|null} year - * @param {number|null} month - * @returns {Promise} from newer to older - *//* -async getMonthOrders(year = null, month = null) { -const now = new Date() -const intYear = year !== null ? year : now.getUTCFullYear() -const intMonth = month !== null ? month : now.getUTCMonth() - -let coordinates = null -if (this.memIndex) { - //get coordinates from this.memDateIndex -} else { - coordinates = await getMonthCoordinates(intYear, intMonth) -} -const orders = [] -if (!coordinates) { - return orders -} -await Common.Utils.asyncForEach(coordinates, async coordinateSHA256 => { - const encryptedOrderString = await getGunUser() - .get(Key.COORDINATES) - .get(coordinateSHA256) - .then() - if (typeof encryptedOrderString !== 'string') { - return - } - const mySecret = require('../gunDB/Mediator').getMySecret() - const SEA = require('../gunDB/Mediator').mySEA - const decryptedString = await SEA.decrypt(encryptedOrderString, mySecret) - const orderJSON = JSON.parse(decryptedString) - orders.push(orderJSON) -}) -const orderedOrders = orders.sort((a, b) => b.timestamp - a.timestamp) -return orderedOrders -}*/ - - /** - * @typedef {Common.Schema.InvoiceWhenListed & {r_hash:Buffer,payment_addr:Buffer}} Invoice - */ - /** - * @type {Recordvoid>} - */ - _listeningInvoices = {} - - /** - * - * @param {Buffer} r_hash - * @param {(invoice:Invoice) =>void} done - */ - addListenInvoice(r_hash, done) { - const hashString = r_hash.toString("hex") - this._listeningInvoices[hashString] = done - } - - /** - * - * @param {Common.Schema.InvoiceWhenListed & {r_hash:Buffer,payment_addr:Buffer}} data - */ - invoiceStreamDataCb(data) { - if (!data.settled) { - //invoice not paid yet - return - } - const hashString = data.r_hash.toString('hex') - const amt = parseInt(data.amt_paid_sat, 10) - if (this._listeningInvoices[hashString]) { - const done = this._listeningInvoices[hashString] - delete this._listeningInvoices[hashString] - done(data) - } else { - this.AddOrder({ - type: 'invoice', - coordinateHash: hashString, - coordinateIndex: parseInt(data.add_index, 10), - inbound: true, - amount: amt, - toLndPub: data.payment_addr.toString('hex'), - invoiceMemo: data.memo - }) - } - } - - - - - - - - /** - * @type {Record} - * lnd fires a confirmed transaction event TWICE, let's make sure it is only managed ONCE - */ - _confirmedTransactions = {} - - /** - * @param {Common.Schema.ChainTransaction} data - */ - async transactionStreamDataCb(data) { - const { num_confirmations } = data - const responses = await Promise.all(data.dest_addresses.map(isTmpChainOrder)) - const hasOrder = responses.find(res => res !== false) - - if (num_confirmations === 0) { - handleUnconfirmedTx(data, hasOrder) - } else { - this.handleConfirmedTx(data, hasOrder) - } - } - - - - /** - * - * @param {Common.Schema.ChainTransaction} tx - * @param {CoordinateOrder|false| undefined} order - */ - handleConfirmedTx(tx, order) { - const { tx_hash } = tx - if (this._confirmedTransactions[tx_hash]) { - //this tx confirmation was already handled - return - } - if (!order) { - /*confirmed transaction MUST have a tmp order, - if not, means something gone wrong */ - logger.error('found a confirmed transaction that does not have a tmp order!!') - return - } - if (!order.toBtcPub) { - /*confirmed transaction tmp order MUST have a non null toBtcPub */ - logger.error('found a confirmed transaction that does not have toBtcPub in the order!!') - return - } - const finalOrder = order - finalOrder.coordinateIndex = tx.block_height - this.AddOrder(finalOrder) - if (order.toBtcPub === 'unknown') { - clearTmpChainOrder(tx_hash) - } else { - clearTmpChainOrder(order.toBtcPub) - } - this._confirmedTransactions[tx_hash] = true - } -} - -const Manager = new SchemaManager() -/*invoice stream, -this is the only place where it's needed, -everything is a coordinate now*/ -let InvoiceShouldRetry = true -setInterval(() => { - if (!InvoiceShouldRetry) { - return - } - if (!isAuthenticated()) { - return - } - InvoiceShouldRetry = false - - lndV2.subscribeInvoices( - invoice => { - if (!isAuthenticated) { - logger.error("got an invoice while not authenticated, will ignore it and cancel the stream") - return true - } - Manager.invoiceStreamDataCb(invoice) - return false - }, - error => { - logger.error(`Error in invoices sub, will retry in two second, reason: ${error.reason}`) - InvoiceShouldRetry = true - } - ) - -}, 2000) - -/*transactions stream, -this is the only place where it's needed, -everything is a coordinate now*/ -let TransactionShouldRetry = true -setInterval(() => { - if (!TransactionShouldRetry) { - return - } - if (!isAuthenticated()) { - return - } - TransactionShouldRetry = false - - lndV2.subscribeTransactions( - transaction => { - if (!isAuthenticated) { - logger.error("got a transaction while not authenticated, will ignore it and cancel the stream") - return true - } - Manager.transactionStreamDataCb(transaction) - return false - }, - error => { - logger.error(`Error in transaction sub, will retry in two second, reason: ${error.reason}`) - TransactionShouldRetry = true - } - ) - -}, 2000) - -module.exports = Manager \ No newline at end of file diff --git a/services/seed.js b/services/seed.js deleted file mode 100644 index 4ec24d17..00000000 --- a/services/seed.js +++ /dev/null @@ -1,51 +0,0 @@ -const crypto = require('crypto') -const fetch = require('node-fetch') - -const selfContentToken = () => { - const seedUrl = process.env.TORRENT_SEED_URL - const seedToken = process.env.TORRENT_SEED_TOKEN - if (!seedUrl || !seedToken) { - return false - } - return {seedUrl,seedToken} -} - -/** - * - * @param {number} nOfTokens - * @param {{seedUrl:string,seedToken:string}} param1 - * @returns - */ -const enrollContentTokens = async (nOfTokens,{seedUrl,seedToken}) => { - const tokens = Array(nOfTokens) - for (let i = 0; i < nOfTokens; i++) { - tokens[i] = crypto.randomBytes(32).toString('hex') - } - /**@param {string} token */ - const enrollToken = async token => { - const reqData = { - seed_token: seedToken, - wallet_token: token - } - //@ts-expect-error - const res = await fetch(`${seedUrl}/api/enroll_token`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify(reqData) - }) - if (res.status !== 200) { - throw new Error('torrentSeed service currently not available') - } - } - await Promise.all(tokens.map(enrollToken)) - return tokens -} - - - -module.exports = { - selfContentToken, - enrollContentTokens -} \ No newline at end of file diff --git a/services/streams.js b/services/streams.js deleted file mode 100644 index d567fb35..00000000 --- a/services/streams.js +++ /dev/null @@ -1,150 +0,0 @@ - -const EventEmitter = require('events') -const fetch = require('node-fetch') -const Key = require('./gunDB/contact-api/key') -const StreamLiveManager = new EventEmitter() - -const startedStream = (data) => { - StreamLiveManager.emit('awaitStream',data) -} -const endStream = (data) => { - StreamLiveManager.emit('endStream',data) -} -module.exports = {startedStream,endStream} - -//----------------------------------------- - -const intervalsWaitingAlive = {} -const intervalsStreamingViewers = {} -const intervalsWaitingMp4 = {} - -const clearStreamInterval = (postId, map) => { - if(!postId){ - return - } - if(map === "intervalsWaitingAlive"){ - if(!intervalsWaitingAlive[postId]){ - return - } - clearInterval(intervalsWaitingAlive[postId]) - delete intervalsWaitingAlive[postId] - } - if(map === "intervalsStreamingViewers"){ - if(!intervalsStreamingViewers[postId]){ - return - } - clearInterval(intervalsStreamingViewers[postId]) - delete intervalsStreamingViewers[postId] - } - if(map === "intervalsWaitingMp4"){ - if(!intervalsWaitingMp4[postId]){ - return - } - clearInterval(intervalsWaitingMp4[postId]) - delete intervalsWaitingMp4[postId] - } -} - -StreamLiveManager.on('awaitStream', data => { - const { postId, contentId, statusUrl } = data - if(intervalsWaitingAlive[postId]){ - clearStreamInterval(intervalsWaitingAlive[postId]) - } - const user = require('../services/gunDB/Mediator').getUser() - intervalsWaitingAlive[postId] = setInterval(async () => { - try { - const res = await fetch(statusUrl) - const j = await res.json() - if (!j.isLive) { - return - } - user - .get(Key.POSTS_NEW) - .get(postId) - .get('contentItems') - .get(contentId) - .get('liveStatus') - .put('live') - clearStreamInterval(postId,"intervalsWaitingAlive") - StreamLiveManager.emit('followStream', data) - //eslint-disable-next-line no-empty - } catch{} - }, 2 * 1000) - //kill sub after 10 minutes - setTimeout(()=>{ - clearStreamInterval(postId,"intervalsWaitingAlive") - },10 * 60 * 1000) -}) - -StreamLiveManager.on('followStream', data => { - const { postId, contentId, statusUrl } = data - if(intervalsStreamingViewers[postId]){ - clearStreamInterval(postId,"intervalsStreamingViewers") - } - const user = require('../services/gunDB/Mediator').getUser() - intervalsStreamingViewers[postId] = setInterval(async () => { - try { - const res = await fetch(statusUrl) - const j = await res.json() - if (typeof j.viewers !== 'number') { - return - } - user - .get(Key.POSTS_NEW) - .get(postId) - .get('contentItems') - .get(contentId) - .get('viewersCounter') - .put(j.viewers) - //eslint-disable-next-line no-empty - } catch{} - }, 5 * 1000) -}) - -StreamLiveManager.on('endStream', data => { - const { postId, contentId, endUrl, urlForMagnet, obsToken } = data - console.log("ending stream!") - clearStreamInterval(postId,"intervalsStreamingViewers") - if(intervalsWaitingMp4[postId]){ - clearStreamInterval(postId,"intervalsWaitingMp4") - } - const user = require('../services/gunDB/Mediator').getUser() - user - .get(Key.POSTS_NEW) - .get(postId) - .get('contentItems') - .get(contentId) - .get('liveStatus') - .put('waiting') - fetch(endUrl,{ - headers: { - 'Authorization': `Bearer ${obsToken}` - }, - }) - intervalsWaitingMp4[postId] = setInterval(async () => { - try { - const res = await fetch(urlForMagnet) - const j = await res.json() - if (!j.magnet) { - return - } - user - .get(Key.POSTS_NEW) - .get(postId) - .get('contentItems') - .get(contentId) - .get('liveStatus') - .put('wasLive') - user - .get(Key.POSTS_NEW) - .get(postId) - .get('contentItems') - .get(contentId) - .get('playbackMagnet') - .put(j.magnet) - clearStreamInterval(postId,"intervalsWaitingMp4") - //eslint-disable-next-line no-empty - } catch{} - }, 5 * 1000) -}) - diff --git a/services/tipsCallback.js b/services/tipsCallback.js deleted file mode 100644 index e0bf73e5..00000000 --- a/services/tipsCallback.js +++ /dev/null @@ -1,44 +0,0 @@ -//@ts-nocheck TODO- fix types -const { gunUUID } = require("../utils") -const logger = require('../config/log') -class TipsCB { - listeners = {} - - postsEnabled = {} - - enablePostNotifications(postID){ - const accessId = gunUUID() - this.postsEnabled[accessId] = postID - return accessId - } - - addSocket(accessId,socket){ - if(!this.postsEnabled[accessId]){ - return "invalid access id" - } - const postID = this.postsEnabled[accessId] - logger.info("subbing new socket for post: "+postID) - - if(!this.listeners[postID]){ - this.listeners[postID] = [] - } - this.listeners[postID].push(socket) - } - - notifySocketIfAny(postID,name,message,amount){ - if(!this.listeners[postID]){ - return - } - this.listeners[postID].forEach(socket => { - if(!socket.connected){ - return - } - socket.emit("update",{ - name,message,amount - }) - }); - } -} - -const TipsForwarder = new TipsCB() -module.exports = TipsForwarder \ No newline at end of file diff --git a/src/__gun__tests__/mySea.ts b/src/__gun__tests__/mySea.ts deleted file mode 100644 index f2f2af21..00000000 --- a/src/__gun__tests__/mySea.ts +++ /dev/null @@ -1,109 +0,0 @@ -/** - * @format - */ -import Gun from 'gun' -import uuid from 'uuid/v1' - -import { mySEA } from '../../services/gunDB/Mediator' -import { UserGUNNode } from '../../services/gunDB/contact-api/SimpleGUN' - -const setupUser = async (): Promise<[UserGUNNode]> => { - const gun = Gun({ - file: 'GUN-TEST-' + uuid() - }) - - const user = (gun.user() as unknown) as UserGUNNode - - await new Promise((res, rej) => { - user.create('testAlias-' + uuid(), 'testPass', ack => { - if (typeof ack.err === 'string') { - rej(new Error(ack.err)) - } else { - res() - } - }) - }) - - return [user] -} - -const encryptsDecryptsStrings = async () => { - const [user] = await setupUser() - - const stringMessage = 'Lorem ipsum dolor' - - const sec = await mySEA.secret(user._.sea.epub, user._.sea) - const encrypted = await mySEA.encrypt(stringMessage, sec) - const decrypted = await mySEA.decrypt(encrypted, sec) - - if (decrypted !== stringMessage) { - throw new Error() - } -} - -const encryptsDecryptsBooleans = async () => { - const [user] = await setupUser() - - const truth = true - const lie = false - - const sec = await mySEA.secret(user._.sea.epub, user._.sea) - - const encryptedTruth = await mySEA.encrypt(truth, sec) - const decryptedTruth = await mySEA.decryptBoolean(encryptedTruth, sec) - - if (decryptedTruth !== truth) { - throw new Error() - } - - const encryptedLie = await mySEA.encrypt(lie, sec) - const decryptedLie = await mySEA.decryptBoolean(encryptedLie, sec) - - if (decryptedLie !== lie) { - throw new Error( - `Expected false got: ${decryptedLie} - ${typeof decryptedLie}` - ) - } -} - -const encryptsDecryptsNumbers = async () => { - const [user] = await setupUser() - - const number = Math.random() * 999999 - - const sec = await mySEA.secret(user._.sea.epub, user._.sea) - const encrypted = await mySEA.encrypt(number, sec) - const decrypted = await mySEA.decryptNumber(encrypted, sec) - - if (decrypted !== number) { - throw new Error() - } -} - -const encryptsDecryptsZero = async () => { - const [user] = await setupUser() - - const zero = 0 - - const sec = await mySEA.secret(user._.sea.epub, user._.sea) - const encrypted = await mySEA.encrypt(zero, sec) - const decrypted = await mySEA.decryptNumber(encrypted, sec) - - if (decrypted !== zero) { - throw new Error() - } -} - -const runAllTests = async () => { - await encryptsDecryptsStrings() - await encryptsDecryptsBooleans() - await encryptsDecryptsNumbers() - await encryptsDecryptsZero() - - console.log('\n--------------------------------') - console.log('All tests ran successfully') - console.log('--------------------------------\n') - process.exit(0) -} - -runAllTests() diff --git a/src/auth.ts b/src/auth.ts new file mode 100644 index 00000000..737f5284 --- /dev/null +++ b/src/auth.ts @@ -0,0 +1,12 @@ +import { ServerOptions } from "../proto/autogenerated/ts/express_server"; +import Main from './services/main' +const serverOptions = (mainHandler: Main): ServerOptions => { + return { + AdminAuthGuard: async (authHeader) => { console.log("admin auth login with header: " + authHeader); return { admin_id: "__Admin__" } }, + UserAuthGuard: async (authHeader) => { return { user_id: mainHandler.DecodeUserToken(authHeader) } }, + GuestAuthGuard: async (_) => ({}), + encryptCallback: async (_, b) => b, + decryptCallback: async (_, b) => b, + } +} +export default serverOptions \ No newline at end of file diff --git a/src/cors.js b/src/cors.js deleted file mode 100644 index 0c6ef438..00000000 --- a/src/cors.js +++ /dev/null @@ -1,19 +0,0 @@ -const setAccessControlHeaders = (req, res) => { - res.header("Access-Control-Allow-Origin", "*"); - res.header("Access-Control-Allow-Methods", "OPTIONS,POST,GET,PUT,DELETE") - res.header( - "Access-Control-Allow-Headers", - "Origin, X-Requested-With, Content-Type, Accept, Authorization, public-key-for-decryption, encryption-device-id, public-key-for-decryption,x-shock-hybrid-relay-id-x" - ); -}; - -module.exports = (req, res, next) => { - if (req.method === "OPTIONS") { - setAccessControlHeaders(req, res); - res.sendStatus(204); - return; - } - - setAccessControlHeaders(req, res); - next(); -}; diff --git a/src/index.spec.ts b/src/index.spec.ts new file mode 100644 index 00000000..923a9619 --- /dev/null +++ b/src/index.spec.ts @@ -0,0 +1,59 @@ +import 'dotenv/config' // TODO - test env +import { AfterAll, BeforeAll, expect, FTest, Test, TestSuite } from 'testyts'; +import NewServer from '../proto/autogenerated/ts/express_server' +import NewClient from '../proto/autogenerated/ts/http_client' +import methods from './services/serverMethods'; +import serverOptions from './auth'; +import GetServerMethods from './services/serverMethods' +import Main, { LoadMainSettingsFromEnv } from './services/main' +import * as Types from '../proto/autogenerated/ts/types'; +const testPort = 4000 + +@TestSuite() +export class ServerTestSuite { + userAuthHeader = "" + client = NewClient({ + baseUrl: `http://localhost:${testPort}`, + retrieveAdminAuth: async () => (""), + retrieveGuestAuth: async () => (""), + retrieveUserAuth: async () => this.userAuthHeader, + decryptCallback: async (b) => b, + encryptCallback: async (b) => b, + deviceId: "device0" + }) + mainHandler = new Main(LoadMainSettingsFromEnv()) // TODO - test env file + server = NewServer(GetServerMethods(this.mainHandler), { ...serverOptions(this.mainHandler), throwErrors: true }) + + + @BeforeAll() + async startServer() { + await this.mainHandler.storage.Connect() + this.server.Listen(testPort) + } + @AfterAll() + stopServer() { + this.server.Close() + } + @Test() + async health() { + await this.client.Health() + } + + @Test() + async getInfo() { + console.log(await this.client.LndGetInfo({ node_id: 0 })) + } + @Test() + async createUser() { + const res = await this.client.AddUser({ name: "test", callback_url: "http://...", secret: "shhhhhht" }) + if (res.status === 'ERROR') throw new Error(res.reason) + console.log(res.result) + const user = await this.mainHandler.storage.GetUser(res.result.user_id) + console.log(user) + this.userAuthHeader = res.result.auth_token + } + @Test() + async newAddress() { + console.log(await this.client.NewAddress({ address_type: Types.AddressType.WITNESS_PUBKEY_HASH })) + } +} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 00000000..a75e22bd --- /dev/null +++ b/src/index.ts @@ -0,0 +1,11 @@ +import 'dotenv/config' +import NewServer from '../proto/autogenerated/ts/express_server' +import GetServerMethods from './services/serverMethods' +import serverOptions from './auth'; +import Main, { LoadMainSettingsFromEnv } from './services/main' +(async () => { + const mainHandler = new Main(LoadMainSettingsFromEnv()) + await mainHandler.storage.Connect() + const Server = NewServer(GetServerMethods(mainHandler), serverOptions(mainHandler)) + Server.Listen(3000) +})() diff --git a/src/routes.js b/src/routes.js deleted file mode 100644 index 76037045..00000000 --- a/src/routes.js +++ /dev/null @@ -1,2669 +0,0 @@ -/** - * @prettier - */ -// @ts-check -'use strict' - -const Axios = require('axios').default -const Crypto = require('crypto') -const Storage = require('node-persist') -const logger = require('../config/log') -const httpsAgent = require('https') -const responseTime = require('response-time') -const uuid = require('uuid/v4') -const Common = require('shock-common') -const isARealUsableNumber = require('lodash/isFinite') -const Big = require('big.js').default -const { evolve } = require('ramda') -const path = require('path') -const cors = require('cors') -const ECCrypto = require('eccrypto') - -const getListPage = require('../utils/paginate') -const auth = require('../services/auth/auth') -const FS = require('../utils/fs') -const ECC = require('../utils/ECC') -const LightningServices = require('../utils/lightningServices') -const lndErrorManager = require('../utils/lightningServices/errors') -const GunDB = require('../services/gunDB/Mediator') -const { - unprotectedRoutes, - nonEncryptedRoutes -} = require('../utils/protectedRoutes') -const GunActions = require('../services/gunDB/contact-api/actions') -const LV2 = require('../utils/lightningServices/v2') -const GunWriteRPC = require('../services/gunDB/rpc') -const Key = require('../services/gunDB/contact-api/key') -const { startedStream, endStream } = require('../services/streams') -const channelRequest = require('../utils/lightningServices/channelRequests') -const TipsForwarder = require('../services/tipsCallback') -const UserInitializer = require('../services/initializer') - -const DEFAULT_MAX_NUM_ROUTES_TO_QUERY = 10 -const SESSION_ID = uuid() - -// module.exports = (app) => { -module.exports = async ( - _app, - config, - { serverPort, useTLS, CA, CA_KEY, runPrivateKey, runPublicKey, accessSecret } -) => { - /** - * @typedef {import('express').Application} Application - */ - - const app = /** @type {Application} */ (_app) - - try { - const Http = Axios.create({ - httpsAgent: new httpsAgent.Agent( - CA && CA_KEY - ? { - ca: await FS.readFile(CA), - key: await FS.readFile(CA_KEY) - } - : {} - ) - }) - - const sanitizeLNDError = (message = '') => { - if (message.toLowerCase().includes('unknown')) { - const splittedMessage = message.split('UNKNOWN: ') - return splittedMessage.length > 1 - ? splittedMessage.slice(1).join('') - : splittedMessage.join('') - } - - return message - } - - const unlockWallet = password => - new Promise((resolve, reject) => { - try { - const args = { - wallet_password: Buffer.from(password, 'utf-8') - } - const { walletUnlocker } = LightningServices.services - walletUnlocker.unlockWallet(args, (unlockErr, unlockResponse) => { - if (unlockErr) { - reject(unlockErr) - return - } - - resolve(unlockResponse) - }) - } catch (err) { - if (err.message === 'unknown service lnrpc.WalletUnlocker') { - resolve({ - field: 'walletUnlocker', - message: 'Wallet already unlocked' - }) - return - } - - logger.error('Unlock Error:', err) - - reject({ - field: 'wallet', - code: err.code, - message: sanitizeLNDError(err.message) - }) - } - }) - - const getAvailableService = () => { - return lndErrorManager.getAvailableService() - } - - // Hack to check whether or not a wallet exists - const walletExists = async () => { - try { - const availableService = await getAvailableService() - if (availableService.service === 'lightning') { - return true - } - - if (availableService.service === 'walletUnlocker') { - const randomPassword = Crypto.randomBytes(4).toString('hex') - try { - await unlockWallet(randomPassword) - return true - } catch (err) { - if (err.message.indexOf('invalid passphrase') > -1) { - return true - } - return false - } - } - } catch (err) { - logger.error('LND error:', err) - return false - } - } - - const checkHealth = async () => { - let LNDStatus = {} - try { - const serviceStatus = await getAvailableService() - LNDStatus = { - ...serviceStatus, - walletExists: await walletExists() - } - } catch (e) { - LNDStatus = { - message: e.message, - success: false - } - } - - try { - const APIHealth = await Http.get( - `${useTLS ? 'https' : 'http'}://localhost:${serverPort}/ping` - ) - const APIStatus = { - message: APIHealth.data, - responseTime: APIHealth.headers['x-response-time'], - success: true, - encryptionPublicKey: runPublicKey.toString('base64') - } - return { - LNDStatus, - APIStatus, - deploymentType: process.env.DEPLOYMENT_TYPE || 'default' - } - } catch (err) { - logger.error(err) - const APIStatus = { - message: err?.response?.data, - responseTime: err?.response?.headers['x-response-time'], - success: false, - encryptionPublicKey: runPublicKey.toString('base64') - } - logger.warn('Failed to retrieve API status', APIStatus) - return { - LNDStatus, - APIStatus, - deploymentType: process.env.DEPLOYMENT_TYPE || 'default' - } - } - } - - const handleError = async (res, err) => { - const health = await checkHealth() - if (health.LNDStatus.success) { - if (err) { - res.json({ - errorMessage: sanitizeLNDError(err.message) - }) - } else { - res.sendStatus(403) - } - } else { - res.status(500) - res.json({ errorMessage: 'LND is down' }) - } - } - - const recreateLnServices = async () => { - await LightningServices.init() - - return true - } - - const lastSeenMiddleware = (req, res, next) => { - const { authorization } = req.headers - const { path, method } = req - if ( - !unprotectedRoutes[method][path] && - authorization && - GunDB.isAuthenticated() - ) { - GunActions.setLastSeenApp() - } - - next() - } - - app.use( - cors({ - credentials: true, - origin: '*' - }) - ) - - app.use((req, res, next) => { - res.setHeader('x-session-id', SESSION_ID) - next() - }) - - app.use(async (req, res, next) => { - const deviceId = req.headers['encryption-device-id'] - try { - if ( - nonEncryptedRoutes.includes(req.path) || - process.env.DISABLE_SHOCK_ENCRYPTION === 'true' - ) { - return next() - } - - if (typeof deviceId !== 'string' || !deviceId) { - const error = { - field: 'deviceId', - message: 'Please specify a device ID' - } - logger.error('Please specify a device ID') - return res.status(401).json(error) - } - - if (!ECC.isAuthorizedDevice({ deviceId })) { - const error = { - field: 'deviceId', - message: 'Please specify a device ID' - } - logger.error('Unknown Device') - return res.status(401).json(error) - } - - if (req.method === 'GET' || req.method === 'DELETE') { - return next() - } - - if (!ECC.isEncryptedMessage(req.body)) { - logger.warn('Message not encrypted!', req.body) - return next() - } - - logger.info('Decrypting ECC message...') - - const asBuffers = await ECC.convertToEncryptedMessage(req.body) - - const decryptedMessage = await ECCrypto.decrypt( - runPrivateKey, - asBuffers - ) - - // eslint-disable-next-line - req.body = JSON.parse(decryptedMessage.toString('utf8')) - - return next() - } catch (err) { - logger.error(err) - return res.status(401).json(err) - } - }) - - app.use(async (req, res, next) => { - if (!req.method) { - logger.error( - 'No req.method in unprotected routes middleware.', - 'req.path:', - req.path - ) - next() - } else if (!req.path) { - logger.error( - 'No req.path in unprotected routes middleware.', - 'req.method:', - req.method - ) - next() - } else if (unprotectedRoutes[req.method][req.path]) { - next() - } else { - try { - const response = await auth.validateToken( - (req.headers.authorization || '').replace('Bearer ', '') - ) - if (response.valid) { - next() - } else { - res.status(401).json({ - field: 'authorization', - errorMessage: "The authorization token you've supplied is invalid" - }) - } - } catch (err) { - logger.error( - !req.headers.authorization - ? 'Please add an Authorization header' - : err - ) - res - .status(401) - .json({ field: 'authorization', errorMessage: 'Please log in' }) - } - } - }) - - app.use(async (req, res, next) => { - try { - if (unprotectedRoutes[req.method][req.path]) { - next() - return - } - - if (req.path.includes('/api/lnd')) { - const walletStatus = await walletExists() - const availableService = await getAvailableService() - const statusMessage = availableService.walletStatus - if (availableService.code === 12) { - return res.status(401).json({ - field: 'lnd_locked', - errorMessage: availableService.message - ? availableService.message - : 'unknown' - }) - } - if (availableService.code === 14) { - return res.status(401).json({ - field: 'lnd_dead', - errorMessage: availableService.message - ? availableService.message - : 'unknown' - }) - } - if (walletStatus) { - if (statusMessage === 'unlocked') { - return next() - } - return res.status(401).json({ - field: 'wallet', - errorMessage: availableService.message - ? availableService.message - : 'unknown' - }) - } - - return res.status(401).json({ - field: 'wallet', - errorMessage: 'Please create a wallet before using the API' - }) - } - - if (req.path.includes('/api/gun')) { - const authenticated = GunDB.isAuthenticated() - - if (!authenticated) { - return res.status(401).json({ - field: 'gun', - errorMessage: 'Please login in order to perform this action' - }) - } - } - next() - } catch (err) { - logger.error(err) - if (err.code === 12) { - return res.status(401).json({ - field: 'lnd_locked', - errorMessage: err.message ? err.message : 'unknown' - }) - } - if (err.code === 14) { - return res.status(401).json({ - field: 'lnd_dead', - errorMessage: err.message ? err.message : 'unknown' - }) - } - res.status(500).json({ - field: 'wallet', - errorMessage: err.message ? err.message : err - }) - } - }) - - app.use(lastSeenMiddleware) - - app.use(['/ping'], responseTime()) - - /** - * health check - */ - app.get('/health', async (req, res) => { - const health = await checkHealth() - res.json(health) - }) - - app.get('/tunnel/status', async (req, res) => { - const [relayId, relayUrl] = await Promise.all([ - Storage.getItem('relay/id'), - Storage.getItem('relay/url') - ]) - res.json({ uri: `${relayId}@${relayUrl}` }) - }) - - /** - * kubernetes health check - */ - app.get('/healthz', async (req, res) => { - const health = await checkHealth() - logger.info('Healthz response:', health.APIStatus.success) - res.json(health) - }) - - app.get('/ping', (req, res) => { - logger.info('Ping completed!') - res.json({ message: 'OK' }) - }) - - app.post('/api/mobile/error', (req, res) => { - logger.debug('Mobile error:', JSON.stringify(req.body)) - res.json({ msg: 'OK' }) - }) - - app.post('/api/encryption/exchange', async (req, res) => { - try { - let { publicKey, deviceId } = req.body - - logger.info('Will decrypt public key and device ID for key exchange.') - - console.log(req.body) - - publicKey = await ECCrypto.decrypt( - accessSecret, - ECC.convertToEncryptedMessage(publicKey) - ) - deviceId = await ECCrypto.decrypt( - accessSecret, - ECC.convertToEncryptedMessage(deviceId) - ) - - publicKey = publicKey.toString('utf8') - deviceId = deviceId.toString('utf8') - - if (typeof publicKey !== 'string' || !publicKey) { - return res.status(500).json({ - field: 'publicKey', - errorMessage: 'Please provide a valid public key' - }) - } - - if ( - !deviceId || - !/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/iu.test( - deviceId - ) - ) { - return res.status(500).json({ - field: 'deviceId', - errorMessage: 'Please provide a valid device ID' - }) - } - - await ECC.authorizeDevice({ - deviceId, - publicKey - }) - res.sendStatus(200) - } catch (err) { - logger.error(err) - return res.status(401).json({ - field: 'unknown', - message: err, - errorMessage: err.message || err - }) - } - }) - - app.get('/api/lnd/wallet/status', async (req, res) => { - try { - const walletStatus = await walletExists() - const availableService = await getAvailableService() - - res.json({ - walletExists: walletStatus, - walletStatus: walletStatus ? availableService.walletStatus : null - }) - } catch (err) { - logger.error(err) - const sanitizedMessage = sanitizeLNDError(err.message) - res.status(500).json({ - field: 'LND', - errorMessage: sanitizedMessage - ? sanitizedMessage - : 'An unknown error has occurred, please try restarting your LND and API servers' - }) - } - }) - - /** - * Get the latest channel backups before subscribing. - */ - const saveChannelsBackup = async () => { - const { getUser } = require('../services/gunDB/Mediator') - const { lightning } = LightningServices.services - const SEA = require('../services/gunDB/Mediator').mySEA - await Common.Utils.makePromise((res, rej) => { - lightning.exportAllChannelBackups({}, (err, channelBackups) => { - if (err) { - return rej(new Error(err.details)) - } - - res( - GunActions.saveChannelsBackup( - JSON.stringify(channelBackups), - getUser(), - SEA - ) - ) - }) - }) - } - - /** - * Register to listen for channel backups. - */ - const onNewChannelBackup = () => { - const { getUser } = require('../services/gunDB/Mediator') - const { lightning } = LightningServices.services - const SEA = require('../services/gunDB/Mediator').mySEA - - logger.warn('Subscribing to channel backup ...') - - const stream = lightning.SubscribeChannelBackups({}) - - stream.on('data', data => { - logger.info(' New channel backup data') - GunActions.saveChannelsBackup(JSON.stringify(data), getUser(), SEA) - }) - stream.on('end', () => { - logger.info('Channel backup stream ended, starting a new one...') - // Prevents call stack overflow exceptions - //process.nextTick(onNewChannelBackup) - }) - stream.on('error', err => { - logger.error('Channel backup stream error:', err) - }) - stream.on('status', status => { - logger.error('Channel backup stream status:', status) - switch (status.code) { - case 0: { - logger.info('Channel backup stream ok') - break - } - case 2: { - //Happens to fire when the grpc client lose access to macaroon file - logger.warn('Channel backup got UNKNOWN error status') - break - } - case 12: { - logger.warn( - 'Channel backup LND locked, new registration in 60 seconds' - ) - process.nextTick(() => - setTimeout(() => onNewChannelBackup(), 60000) - ) - break - } - case 13: { - //https://grpc.github.io/grpc/core/md_doc_statuscodes.html - logger.error('Channel backup INTERNAL LND error') - break - } - case 14: { - logger.error( - 'Channel backup LND disconnected, sockets reconnecting in 30 seconds...' - ) - process.nextTick(() => - setTimeout(() => onNewChannelBackup(), 30000) - ) - break - } - default: { - logger.error('[event:transaction:new] UNKNOWN LND error') - } - } - }) - } - - app.post('/api/lnd/unlock', async (req, res) => { - try { - const health = await checkHealth() - const walletInitialized = await walletExists() - const { pass } = req.body - const lndUp = health.LNDStatus.success - const walletUnlocked = health.LNDStatus.walletStatus === 'unlocked' - const { lightning } = LightningServices.services - - if (!lndUp) { - throw new Error(health.LNDStatus.message) - } - - if (!walletInitialized) { - throw new Error('Please create a wallet before authenticating') - } - - await recreateLnServices() - - if (!walletUnlocked) { - await unlockWallet(pass) - } - - // Generate auth token and send it as a JSON response - const token = await auth.generateToken() - - // wait for wallet to warm up - await Common.Utils.makePromise((res, rej) => { - let tries = 0 - let intervalID = null - - intervalID = setInterval(() => { - if (tries === 7) { - rej(new Error(`Wallet did not warm up in under 7 seconds.`)) - - clearInterval(intervalID) - return - } - - tries++ - - lightning.listInvoices({}, err => { - if (!err) { - clearInterval(intervalID) - res() - } - }) - }, 1000) - }) - - // saveChannelsBackup() - // onNewChannelBackup() - // setTimeout(() => { - // channelRequest() - // }, 30 * 1000) - - res.json({ - authorization: token - }) - } catch (err) { - logger.error('Unlock Error:', err) - res.status(400) - res.json({ - field: 'user', - errorMessage: err.message ? sanitizeLNDError(err.message) : err, - success: false - }) - return err - } - }) - - app.post('/api/lnd/wallet', async (req, res) => { - try { - const { walletUnlocker } = LightningServices.services - const { password } = req.body - const healthResponse = await checkHealth() - const walletInitialized = await walletExists() - const isUnlocked = healthResponse.LNDStatus.service !== 'walletUnlocker' - - if (!password) { - return res.status(400).json({ - field: 'password', - errorMessage: 'Please specify a password for your new wallet' - }) - } - - if (password.length < 8) { - return res.status(400).json({ - field: 'password', - errorMessage: - "Please specify a password that's longer than 8 characters" - }) - } - - if (walletInitialized || isUnlocked) { - throw new Error('A wallet already exists') - } - - const [genSeedErr, genSeedResponse] = await new Promise(res => { - walletUnlocker.genSeed({}, (_genSeedErr, _genSeedResponse) => { - res([_genSeedErr, _genSeedResponse]) - }) - }) - - if (genSeedErr) { - logger.debug('GenSeed Error:', genSeedErr) - - const healthResponse = await checkHealth() - if (healthResponse.LNDStatus.success) { - const message = genSeedErr.details - throw new Error(message) - } - - throw new Error('LND is down') - } - - logger.debug('GenSeed:', genSeedResponse) - - const mnemonicPhrase = genSeedResponse.cipher_seed_mnemonic - const walletArgs = { - wallet_password: Buffer.from(password, 'utf8'), - cipher_seed_mnemonic: mnemonicPhrase - } - - const [initWalletErr, initWalletResponse] = await new Promise(res => { - walletUnlocker.initWallet( - walletArgs, - (_initWalletErr, _initWalletResponse) => { - res([_initWalletErr, _initWalletResponse]) - } - ) - }) - - if (initWalletErr) { - logger.error('initWallet Error:', initWalletErr.message) - const healthResponse = await checkHealth() - if (healthResponse.LNDStatus.success) { - const errorMessage = initWalletErr.details - - throw new Error(errorMessage) - } - throw new Error('LND is down') - } - - logger.info('initWallet:', initWalletResponse) - - const waitUntilFileExists = seconds => { - logger.info( - `Waiting for admin.macaroon to be created. Seconds passed: ${seconds} Path: ${LightningServices.servicesConfig.macaroonPath}` - ) - setTimeout(async () => { - try { - const macaroonExists = await FS.access( - LightningServices.servicesConfig.macaroonPath - ) - - if (!macaroonExists) { - return waitUntilFileExists(seconds + 1) - } - - logger.info('admin.macaroon file created') - - await LightningServices.init() - - const token = await auth.generateToken() - setTimeout(() => { - channelRequest() - }, 30 * 1000) - return res.json({ - mnemonicPhrase, - authorization: token - }) - } catch (err) { - logger.error(err) - res.status(500).json({ - field: 'unknown', - errorMessage: sanitizeLNDError(err.message) - }) - } - }, 1000) - } - - waitUntilFileExists(1) - } catch (err) { - logger.error(err) - return res.status(500).json({ - field: 'unknown', - errorMessage: err - }) - } - }) - - app.post('/api/lnd/wallet/existing', async (req, res) => { - try { - const { password, alias } = req.body - const healthResponse = await checkHealth() - const exists = await walletExists() - const allowUnlockedLND = process.env.ALLOW_UNLOCKED_LND === 'true' - const isLocked = healthResponse.LNDStatus.service === 'walletUnlocker' - - if (!exists) { - throw new Error('LND wallet does not exist, please create a new one') - } - - if (!alias) { - return res.status(400).json({ - field: 'alias', - errorMessage: 'Please specify an alias for your wallet' - }) - } - - if (!password) { - return res.status(400).json({ - field: 'password', - errorMessage: 'Please specify a password for your wallet alias' - }) - } - - if (password.length < 8) { - return res.status(400).json({ - field: 'password', - errorMessage: - "Please specify a password that's longer than 8 characters" - }) - } - - if (!isLocked && !allowUnlockedLND) { - throw new Error( - 'Wallet is already unlocked. Please restart your LND instance and try again.' - ) - } - - try { - if (isLocked) { - await unlockWallet(password) - } - } catch (_) { - throw new Error('Invalid LND wallet password') - } - - // Register user after verifying wallet password - const publicKey = await GunDB.register(alias, password) - - // Generate Access Token - const token = await auth.generateToken() - setTimeout(() => { - channelRequest() - }, 30 * 1000) - res.json({ - authorization: token, - user: { - alias, - publicKey - } - }) - } catch (err) { - return res.status(500).json({ - errorMessage: err.message - }) - } - }) - - // get lnd info - app.get('/api/lnd/getinfo', (req, res) => { - const { lightning } = LightningServices.services - - lightning.getInfo({}, async (err, response) => { - if (err) { - logger.error('GetInfo Error:', err) - const health = await checkHealth() - if (health.LNDStatus.success) { - res.status(400).json({ - field: 'getInfo', - errorMessage: sanitizeLNDError(err.message) - }) - } else { - res.status(500) - res.json({ errorMessage: 'LND is down' }) - } - } - if (!response.uris || response.uris.length === 0) { - if (config.lndAddress) { - response.uris = [response.identity_pubkey + '@' + config.lndAddress] - } - } - res.json(response) - }) - }) - - // get lnd node info - app.post('/api/lnd/getnodeinfo', (req, res) => { - const { lightning } = LightningServices.services - - lightning.getNodeInfo( - { pub_key: req.body.pubkey }, - async (err, response) => { - if (err) { - logger.debug('GetNodeInfo Error:', err) - const health = await checkHealth() - if (health.LNDStatus.success) { - res.status(400) - res.json({ - field: 'getNodeInfo', - errorMessage: sanitizeLNDError(err.message) - }) - } else { - res.status(500) - res.json({ errorMessage: 'LND is down' }) - } - } - logger.debug('GetNodeInfo:', response) - res.json(response) - } - ) - }) - // get lnd chan info - app.post('/api/lnd/getchaninfo', async (req, res) => { - try { - return res.json(await LV2.getChanInfo(req.body.chan_id)) - } catch (e) { - logger.error(e) - return res.status(500).json({ - errorMessage: e.message - }) - } - }) - - app.get('/api/lnd/getnetworkinfo', (req, res) => { - const { lightning } = LightningServices.services - lightning.getNetworkInfo({}, async (err, response) => { - if (err) { - logger.debug('GetNetworkInfo Error:', err) - const health = await checkHealth() - if (health.LNDStatus.success) { - res.status(400).json({ - field: 'getNodeInfo', - errorMessage: sanitizeLNDError(err.message) - }) - } else { - res.status(500) - res.json({ errorMessage: 'LND is down' }) - } - } - logger.debug('GetNetworkInfo:', response) - res.json(response) - }) - }) - - // get lnd node active channels list - app.get('/api/lnd/listpeers', async (req, res) => { - try { - return res.json({ - peers: await LV2.listPeers(req.body.latestError) - }) - } catch (e) { - logger.error(e) - return res.status(500).json({ - errorMessage: e.message - }) - } - }) - - // newaddress - app.post('/api/lnd/newaddress', async (req, res) => { - try { - return res.json({ - address: await LV2.newAddress(req.body.type) - }) - } catch (e) { - return res.status(500).json({ - errorMessage: e.message - }) - } - }) - - // connect peer to lnd node - app.post('/api/lnd/connectpeer', (req, res) => { - const { lightning } = LightningServices.services - const connectRequest = { - addr: { pubkey: req.body.pubkey, host: req.body.host }, - perm: true - } - logger.debug('ConnectPeer Request:', connectRequest) - lightning.connectPeer(connectRequest, (err, response) => { - if (err) { - logger.debug('ConnectPeer Error:', err) - res.status(500).json({ - field: 'connectPeer', - errorMessage: sanitizeLNDError(err.message) - }) - } else { - logger.debug('ConnectPeer:', response) - res.json(response) - } - }) - }) - - // disconnect peer from lnd node - app.post('/api/lnd/disconnectpeer', (req, res) => { - const { lightning } = LightningServices.services - const disconnectRequest = { pub_key: req.body.pubkey } - logger.debug('DisconnectPeer Request:', disconnectRequest) - lightning.disconnectPeer(disconnectRequest, (err, response) => { - if (err) { - logger.debug('DisconnectPeer Error:', err) - res.status(400).json({ - field: 'disconnectPeer', - errorMessage: sanitizeLNDError(err.message) - }) - } else { - logger.debug('DisconnectPeer:', response) - res.json(response) - } - }) - }) - - // get lnd node opened channels list - app.get('/api/lnd/listchannels', async (_, res) => { - try { - return res.json({ - channels: await LV2.listChannels({ active_only: false }) - }) - } catch (e) { - logger.error(e) - return res.status(500).json({ - errorMessage: e.message - }) - } - }) - - app.get('/api/lnd/pendingchannels', async (req, res) => { - try { - return res.json(await LV2.pendingChannels()) - } catch (e) { - logger.error(e) - return res.status(500).json({ - errorMessage: e.message - }) - } - }) - - app.get('/api/lnd/unifiedTrx', (req, res) => { - const { lightning } = LightningServices.services - const { itemsPerPage, page, reversed = true } = req.query - if (typeof itemsPerPage !== 'number') { - throw new TypeError('itemsPerPage not a number') - } - if (typeof page !== 'number') { - throw new TypeError('page not a number') - } - const offset = (page - 1) * itemsPerPage - lightning.listPayments({}, (err, { payments = [] } = {}) => { - if (err) { - return handleError(res, err) - } - - lightning.listInvoices( - { reversed, index_offset: offset, num_max_invoices: itemsPerPage }, - (err, { invoices, last_index_offset }) => { - if (err) { - return handleError(res, err) - } - - lightning.getTransactions({}, (err, { transactions = [] } = {}) => { - if (err) { - return handleError(res, err) - } - - res.json({ - transactions: getListPage({ - entries: transactions.reverse(), - itemsPerPage, - page - }), - payments: getListPage({ - entries: payments.reverse(), - itemsPerPage, - page - }), - invoices: { - content: invoices.filter(invoice => invoice.settled), - page, - totalPages: Math.ceil(last_index_offset / itemsPerPage), - totalItems: last_index_offset - } - }) - }) - } - ) - }) - }) - - app.post('/api/lnd/unifiedTrx', async (req, res) => { - try { - const { type, amt, to, memo, feeLimit, ackInfo } = req.body - if ( - type !== 'spontaneousPayment' && - type !== 'tip' && - type !== 'torrentSeed' && - type !== 'contentReveal' && - type !== 'service' && - type !== 'product' && - type !== 'other' - ) { - return res.status(415).json({ - field: 'type', - errorMessage: `Only 'spontaneousPayment'| 'tip' | 'torrentSeed' | 'contentReveal' | 'service' | 'product' |'other' payments supported via this endpoint for now.` - }) - } - - const amount = Number(amt) - - if (!isARealUsableNumber(amount)) { - return res.status(400).json({ - field: 'amt', - errorMessage: 'Not an usable number' - }) - } - - if (amount < 1) { - return res.status(400).json({ - field: 'amt', - errorMessage: 'Must be 1 or greater.' - }) - } - - if (!isARealUsableNumber(feeLimit)) { - return res.status(400).json({ - field: 'feeLimit', - errorMessage: 'Not an usable number' - }) - } - - if (feeLimit < 1) { - return res.status(400).json({ - field: 'feeLimit', - errorMessage: 'Must be 1 or greater.' - }) - } - - if (type === 'tip' && typeof ackInfo !== 'string') { - return res.status(400).json({ - field: 'ackInfo', - errorMessage: `Send ackInfo` - }) - } - - return res.status(200).json( - await GunActions.sendSpontaneousPayment(to, amt, memo, feeLimit, { - type, - ackInfo - }) - ) - } catch (e) { - return res.status(500).json({ - errorMessage: e.message - }) - } - }) - - // get lnd node payments list - app.get('/api/lnd/listpayments', (req, res) => { - const { lightning } = LightningServices.services - const { itemsPerPage, page, paginate = true } = req.query - if (typeof itemsPerPage !== 'number') { - throw new TypeError('itemsPerPage not a number') - } - if (typeof page !== 'number') { - throw new TypeError('page not a number') - } - lightning.listPayments( - { - // TODO - include_incomplete: !!req.body.include_incomplete - }, - (err, { payments = [] } = {}) => { - if (err) { - logger.debug('ListPayments Error:', err) - handleError(res, err) - } else { - logger.debug('ListPayments:', payments) - if (paginate) { - res.json(getListPage({ entries: payments, itemsPerPage, page })) - } else { - res.json({ payments }) - } - } - } - ) - }) - - app.get('/api/lnd/payments', async (req, res) => { - const { - include_incomplete, - index_offset, - max_payments, - reversed - } = /** @type {Common.APISchema.ListPaymentsRequest} */ (evolve( - { - include_incomplete: x => x === 'true', - index_offset: x => Number(x), - max_payments: x => Number(x), - reversed: x => x === 'true' - }, - // TODO Validate - /** @type {any} */ (req.query) - )) - - if (typeof include_incomplete !== 'boolean') { - return res.status(400).json({ - field: 'include_incomplete', - errorMessage: 'include_incomplete not a boolean' - }) - } - - if (!isARealUsableNumber(index_offset)) { - return res.status(400).json({ - field: 'index_offset', - errorMessage: 'index_offset not a number' - }) - } - - if (!isARealUsableNumber(max_payments)) { - return res.status(400).json({ - field: 'max_payments', - errorMessage: 'max_payments not a number' - }) - } - - if (typeof reversed !== 'boolean') { - return res.status(400).json({ - field: 'reversed', - errorMessage: 'reversed not a boolean' - }) - } - - return res.status(200).json( - await LV2.listPayments({ - include_incomplete, - index_offset, - max_payments, - reversed - }) - ) - }) - - // get lnd node invoices list - app.get('/api/lnd/listinvoices', (req, res) => { - const { lightning } = LightningServices.services - const { page, itemsPerPage, reversed = true } = req.query - if (typeof itemsPerPage !== 'number') { - throw new TypeError('itemsPerPage not a number') - } - if (typeof page !== 'number') { - throw new TypeError('page not a number') - } - const offset = (page - 1) * itemsPerPage - // const limit = page * itemsPerPage; - lightning.listInvoices( - { reversed, index_offset: offset, num_max_invoices: itemsPerPage }, - async ( - err, - { invoices, last_index_offset } = { - invoices: [], - last_index_offset: 1 - } - ) => { - if (err) { - logger.debug('ListInvoices Error:', err) - const health = await checkHealth() - if (health.LNDStatus.success) { - res.status(400).json({ - errorMessage: sanitizeLNDError(err.message), - success: false - }) - } else { - res.status(500) - res.json({ - errorMessage: health.LNDStatus.message, - success: false - }) - } - } else { - // logger.debug("ListInvoices:", response); - res.json({ - content: invoices, - page, - totalPages: Math.ceil(last_index_offset / itemsPerPage), - success: true - }) - } - } - ) - }) - - // get lnd node forwarding history - app.get('/api/lnd/forwardinghistory', (req, res) => { - const { lightning } = LightningServices.services - lightning.forwardingHistory({}, async (err, response) => { - if (err) { - logger.debug('ForwardingHistory Error:', err) - const health = await checkHealth() - if (health.LNDStatus.success) { - res.status(400).json({ - field: 'forwardingHistory', - errorMessage: sanitizeLNDError(err.message) - }) - } else { - res.status(500) - res.json({ errorMessage: 'LND is down' }) - } - } - logger.debug('ForwardingHistory:', response) - res.json(response) - }) - }) - - // get the lnd node wallet balance - app.get('/api/lnd/walletbalance', (req, res) => { - const { lightning } = LightningServices.services - lightning.walletBalance({}, async (err, response) => { - if (err) { - logger.debug('WalletBalance Error:', err) - const health = await checkHealth() - if (health.LNDStatus.success) { - res.status(400).json({ - field: 'walletBalance', - errorMessage: sanitizeLNDError(err.message) - }) - } else { - res.status(500) - res.json({ errorMessage: 'LND is down' }) - } - } - logger.debug('WalletBalance:', response) - res.json(response) - }) - }) - - // get the lnd node wallet balance and channel balance - app.get('/api/lnd/balance', async (req, res) => { - const { lightning } = LightningServices.services - const health = await checkHealth() - lightning.walletBalance({}, (err, walletBalance) => { - if (err) { - logger.debug('WalletBalance Error:', err) - if (health.LNDStatus.success) { - res.status(400).json({ - field: 'walletBalance', - errorMessage: sanitizeLNDError(err.message) - }) - } else { - res.status(500) - res.json(health.LNDStatus) - } - return err - } - - lightning.channelBalance({}, (err, channelBalance) => { - if (err) { - logger.debug('ChannelBalance Error:', err) - if (health.LNDStatus.success) { - res.status(400).json({ - field: 'channelBalance', - errorMessage: sanitizeLNDError(err.message) - }) - } else { - res.status(500) - res.json(health.LNDStatus) - } - return err - } - - logger.debug('ChannelBalance:', channelBalance) - res.json({ - ...walletBalance, - channel_balance: channelBalance.balance, - pending_channel_balance: channelBalance.pending_open_balance - }) - }) - }) - }) - - app.post('/api/lnd/decodePayReq', (req, res) => { - const { lightning } = LightningServices.services - const { payReq } = req.body - lightning.decodePayReq( - { pay_req: payReq }, - async (err, paymentRequest) => { - if (err) { - logger.debug('DecodePayReq Error:', err) - const health = await checkHealth() - if (health.LNDStatus.success) { - res.status(500).json({ - errorMessage: sanitizeLNDError(err.message) - }) - } else { - res.status(500).json({ errorMessage: 'LND is down' }) - } - } else { - logger.info('DecodePayReq:', paymentRequest) - res.json({ - decodedRequest: paymentRequest - }) - } - } - ) - }) - - app.get('/api/lnd/channelbalance', (req, res) => { - const { lightning } = LightningServices.services - lightning.channelBalance({}, async (err, response) => { - if (err) { - logger.debug('ChannelBalance Error:', err) - const health = await checkHealth() - if (health.LNDStatus.success) { - res.status(400).json({ - field: 'channelBalance', - errorMessage: sanitizeLNDError(err.message) - }) - } else { - res.status(500) - res.json({ errorMessage: 'LND is down' }) - } - } - logger.debug('ChannelBalance:', response) - res.json(response) - }) - }) - - // openchannel - app.post('/api/lnd/openchannel', (req, res) => { - const { lightning } = LightningServices.services - - const { - pubkey, - channelCapacity, - channelPushAmount, - satPerByte - } = req.body - - const openChannelRequest = { - node_pubkey: Buffer.from(pubkey, 'hex'), - local_funding_amount: channelCapacity, - push_sat: channelPushAmount === '' ? '0' : channelPushAmount, - sat_per_byte: satPerByte - } - logger.info('OpenChannelRequest', openChannelRequest) - let finalEvent = null //Object to send to the socket, depends on final event from the stream - const openedChannel = lightning.openChannel(openChannelRequest) - openedChannel.on('data', response => { - logger.debug('OpenChannelRequest:', response) - if (res.headersSent) { - //if res was already sent - if (response.update === 'chan_open') { - finalEvent = { status: 'chan_open' } - } - } else { - res.json(response) - } - }) - openedChannel.on('error', async err => { - logger.info('OpenChannelRequest Error:', err) - if (res.headersSent) { - finalEvent = { error: err.details } //send error on socket if http has already finished - } else { - const health = await checkHealth() - if (health.LNDStatus.success) { - res.status(500).json({ - field: 'openChannelRequest', - errorMessage: sanitizeLNDError(err.details) - }) - } else if (!res.headersSent) { - res.status(500) - res.json({ errorMessage: 'LND is down' }) - } - } - }) - openedChannel.on('end', () => { - if (finalEvent !== null) { - //send the last event got from the stream - //TO DO send finalEvent on socket - } - }) - }) - - // closechannel - app.post('/api/lnd/closechannel', (req, res) => { - const { lightning } = LightningServices.services - const { channelPoint, outputIndex, force, satPerByte } = req.body - const closeChannelRequest = { - channel_point: { - funding_txid_bytes: Buffer.from(channelPoint, 'hex'), - funding_txid_str: channelPoint, - output_index: outputIndex, - sat_per_byte: satPerByte - }, - force - } - logger.info('CloseChannelRequest', closeChannelRequest) - const closedChannel = lightning.closeChannel(closeChannelRequest) - - closedChannel.on('data', response => { - if (!res.headersSent) { - logger.info('CloseChannelRequest:', response) - res.json(response) - } - }) - - closedChannel.on('error', async err => { - logger.error('CloseChannelRequest Error:', err) - const health = await checkHealth() - if (!res.headersSent) { - if (health.LNDStatus.success) { - logger.debug('CloseChannelRequest Error:', err) - res.status(400).json({ - field: 'closeChannel', - errorMessage: sanitizeLNDError(err.message) - }) - } else { - res.status(500) - res.json({ errorMessage: 'LND is down' }) - } - } - }) - }) - - // sendpayment - app.post('/api/lnd/sendpayment', async (req, res) => { - // this is the recommended value from lightning labs - const { keysend, maxParts = 3, timeoutSeconds = 5, feeLimit } = req.body - - if (!feeLimit) { - return res.status(400).json({ - errorMessage: - 'please provide a "feeLimit" to the send payment request' - }) - } - - try { - if (keysend) { - const { dest, amt, finalCltvDelta = 40 } = req.body - if (!dest || !amt) { - return res.status(400).json({ - errorMessage: - 'please provide "dest" and "amt" for keysend payments' - }) - } - - const payment = await LV2.sendPaymentV2Keysend({ - amt, - dest, - feeLimit, - finalCltvDelta, - maxParts, - timeoutSeconds - }) - - return res.status(200).json(payment) - } - const { payreq } = req.body - - const payment = await LV2.sendPaymentV2Invoice({ - feeLimit, - payment_request: payreq, - amt: req.body.amt, - max_parts: maxParts, - timeoutSeconds - }) - - return res.status(200).json(payment) - } catch (e) { - let msg = 'Unknown Error' - - if (e.message) msg = e.message - - logger.error(e) - return res.status(500).json({ errorMessage: msg }) - } - }) - - app.post('/api/lnd/trackpayment', (req, res) => { - const { router } = LightningServices.services - const { paymentHash, inflightUpdates = true } = req.body - - logger.info('Tracking payment payment', { paymentHash, inflightUpdates }) - const trackedPayment = router.trackPaymentV2({ - payment_hash: paymentHash, - no_inflight_updates: !inflightUpdates - }) - - // only emits one event - trackedPayment.on('data', response => { - if (response.payment_error) { - logger.error('TrackPayment Info:', response) - return res.status(500).json({ - errorMessage: response.payment_error - }) - } - - logger.info('TrackPayment Data:', response) - return res.json(response) - }) - - trackedPayment.on('status', status => { - logger.info('TrackPayment Status:', status) - }) - - trackedPayment.on('error', async err => { - logger.error('TrackPayment Error:', err) - const health = await checkHealth() - if (health.LNDStatus.success) { - res.status(500).json({ - errorMessage: sanitizeLNDError(err.message) - }) - } else { - res.status(500) - res.json({ errorMessage: 'LND is down' }) - } - }) - }) - - app.post('/api/lnd/sendtoroute', (req, res) => { - const { router } = LightningServices.services - const { paymentHash, route } = req.body - - router.sendToRoute({ payment_hash: paymentHash, route }, (err, data) => { - if (err) { - logger.error('SendToRoute Error:', err) - return res.status(400).json(err) - } - - return res.json(data) - }) - }) - - app.post('/api/lnd/estimateroutefee', (req, res) => { - const { router } = LightningServices.services - const { dest, amount } = req.body - - router.estimateRouteFee({ dest, amt_sat: amount }, (err, data) => { - if (err) { - logger.error('EstimateRouteFee Error:', err) - return res.status(400).json(err) - } - - return res.json(data) - }) - }) - - // addinvoice - app.post('/api/lnd/addinvoice', async (req, res) => { - const { expiry, value, memo } = req.body - const addInvoiceRes = await LV2.addInvoice(value, memo, true, expiry) - - if (value) { - const channelsList = await LV2.listChannels({ active_only: true }) - let remoteBalance = Big(0) - channelsList.forEach(element => { - const remB = Big(element.remote_balance) - if (remB.gt(remoteBalance)) { - remoteBalance = remB - } - }) - - addInvoiceRes.liquidityCheck = remoteBalance > value - //newInvoice.remoteBalance = remoteBalance - } - - try { - return res.json(addInvoiceRes) - } catch (e) { - logger.error(e) - return res.status(500).json({ - errorMessage: e.message - }) - } - }) - - // signmessage - app.post('/api/lnd/signmessage', (req, res) => { - const { lightning } = LightningServices.services - lightning.signMessage( - { msg: Buffer.from(req.body.msg, 'utf8') }, - async (err, response) => { - if (err) { - logger.debug('SignMessage Error:', err) - const health = await checkHealth() - if (health.LNDStatus.success) { - res.status(400).json({ - field: 'signMessage', - errorMessage: sanitizeLNDError(err.message) - }) - } else { - res.status(500) - res.json({ errorMessage: 'LND is down' }) - } - } - logger.debug('SignMessage:', response) - res.json(response) - } - ) - }) - - // verifymessage - app.post('/api/lnd/verifymessage', (req, res) => { - const { lightning } = LightningServices.services - lightning.verifyMessage( - { - msg: Buffer.from(req.body.msg, 'utf8'), - signature: req.body.signature - }, - async (err, response) => { - if (err) { - logger.debug('VerifyMessage Error:', err) - const health = await checkHealth() - if (health.LNDStatus.success) { - res.status(400).json({ - field: 'verifyMessage', - errorMessage: sanitizeLNDError(err.message) - }) - } else { - res.status(500) - res.json({ errorMessage: 'LND is down' }) - } - } - logger.debug('VerifyMessage:', response) - res.json(response) - } - ) - }) - - // sendcoins - app.post('/api/lnd/sendcoins', (req, res) => { - const { lightning } = LightningServices.services - const sendCoinsRequest = { - addr: req.body.addr, - amount: req.body.amount, - sat_per_byte: req.body.satPerByte, - send_all: req.body.send_all === true - } - logger.debug('SendCoins', sendCoinsRequest) - lightning.sendCoins(sendCoinsRequest, async (err, response) => { - if (err) { - logger.debug('SendCoins Error:', err) - const health = await checkHealth() - if (health.LNDStatus.success) { - res.status(400).json({ - field: 'sendCoins', - errorMessage: sanitizeLNDError(err.message) - }) - } else { - res.status(500) - res.json({ errorMessage: 'LND is down' }) - } - } - logger.debug('SendCoins:', response) - res.json(response) - }) - }) - - // queryroute - app.post('/api/lnd/queryroute', (req, res) => { - const { lightning } = LightningServices.services - const numRoutes = - config.maxNumRoutesToQuery || DEFAULT_MAX_NUM_ROUTES_TO_QUERY - lightning.queryRoutes( - { pub_key: req.body.pubkey, amt: req.body.amt, num_routes: numRoutes }, - async (err, response) => { - if (err) { - logger.debug('QueryRoute Error:', err) - const health = await checkHealth() - if (health.LNDStatus.success) { - res.status(400).json({ - field: 'queryRoute', - errorMessage: sanitizeLNDError(err.message) - }) - } else { - res.status(500) - res.json({ errorMessage: 'LND is down' }) - } - } - logger.debug('QueryRoute:', response) - res.json(response) - } - ) - }) - - app.post('/api/lnd/estimatefee', (req, res) => { - const { lightning } = LightningServices.services - const { amount, confirmationBlocks } = req.body - lightning.estimateFee( - { - AddrToAmount: { - tb1qnpq3vj8p6jymah6nnh6wz3p333tt360mq32dtt: amount - }, - target_conf: confirmationBlocks - }, - async (err, fee) => { - if (err) { - const health = await checkHealth() - if (health.LNDStatus.success) { - res.status(400).json({ - error: err.message - }) - } else { - res.status(500) - res.json({ errorMessage: 'LND is down' }) - } - } else { - logger.debug('EstimateFee:', fee) - res.json(fee) - } - } - ) - }) - - const listunspent = async (req, res) => { - try { - return res.status(200).json({ - utxos: await LV2.listUnspent( - req.body.minConfirmations, - req.body.maxConfirmations - ) - }) - } catch (e) { - return res.status(500).json({ - errorMessage: e.message - }) - } - } - - app.get('/api/lnd/listunspent', listunspent) - - // TODO: should be GET - app.post('/api/lnd/listunspent', listunspent) - - app.get('/api/lnd/transactions', (req, res) => { - const { lightning } = LightningServices.services - const { page, paginate = true, itemsPerPage } = req.query - if (typeof page !== 'number') { - throw new TypeError('page is not a number') - } - if (typeof itemsPerPage !== 'number') { - throw new TypeError('itemsPerPage is not a number') - } - lightning.getTransactions({}, (err, { transactions = [] } = {}) => { - if (err) { - return handleError(res, err) - } - logger.debug('Transactions:', transactions) - if (paginate) { - res.json(getListPage({ entries: transactions, itemsPerPage, page })) - } else { - res.json({ transactions }) - } - }) - }) - - app.post('/api/lnd/sendmany', (req, res) => { - const { lightning } = LightningServices.services - const { addresses, satPerByte } = req.body - lightning.sendMany( - { AddrToAmount: addresses, sat_per_byte: satPerByte }, - (err, transactions) => { - if (err) { - return handleError(res, err) - } - logger.debug('Transactions:', transactions) - res.json(transactions) - } - ) - }) - - app.get('/api/lnd/closedchannels', (req, res) => { - const { lightning } = LightningServices.services - const { closeTypeFilters = [] } = req.query - if (!Array.isArray(closeTypeFilters)) { - throw new TypeError('closeTypeFilters not an Array') - } - // @ts-expect-error I dunno what's going on here, all arrays have reduce() - const lndFilters = closeTypeFilters.reduce( - (filters, filter) => ({ ...filters, [filter]: true }), - {} - ) - lightning.closedChannels(lndFilters, (err, channels) => { - if (err) { - return handleError(res, err) - } - logger.debug('Channels:', channels) - res.json(channels) - }) - }) - - app.post('/api/lnd/exportchanbackup', (req, res) => { - const { lightning } = LightningServices.services - const { channelPoint } = req.body - lightning.exportChannelBackup( - { chan_point: { funding_txid_str: channelPoint } }, - (err, backup) => { - if (err) { - return handleError(res, err) - } - logger.debug('ExportChannelBackup:', backup) - res.json(backup) - } - ) - }) - - app.post('/api/lnd/exportallchanbackups', (req, res) => { - const { lightning } = LightningServices.services - lightning.exportAllChannelBackups({}, (err, channelBackups) => { - if (err) { - return handleError(res, err) - } - logger.debug('ExportAllChannelBackups:', channelBackups) - res.json(channelBackups) - }) - }) - - app.get('/api/gun/lndchanbackups', async (req, res) => { - try { - const user = require('../services/gunDB/Mediator').getUser() - - const SEA = require('../services/gunDB/Mediator').mySEA - const mySecret = require('../services/gunDB/Mediator').getMySecret() - const encBackup = await user.get(Key.CHANNELS_BACKUP).then() - if (typeof encBackup !== 'string') { - throw new TypeError( - 'Encrypted backup fetched from gun not an string.' - ) - } - const backup = await SEA.decrypt(encBackup, mySecret) - logger.info(backup) - res.json({ data: backup }) - } catch (err) { - res.json({ ok: 'err' }) - } - }) - - //////////////////////////////////////////////////////////////////////////////// - - app.post(`/api/gun/sendpayment`, async (req, res) => { - const { - recipientPub, - amount, - memo, - maxParts, - timeoutSeconds, - feeLimit, - sessionUuid - } = req.body - logger.info('handling spontaneous pay') - if (!feeLimit) { - logger.error( - 'please provide a "feeLimit" to the send spontaneous payment request' - ) - return res.status(500).json({ - errorMessage: - 'please provide a "feeLimit" to the send spontaneous payment request' - }) - } - if (!recipientPub || !amount) { - logger.info( - 'please provide a "recipientPub" and "amount" to the send spontaneous payment request' - ) - return res.status(500).json({ - errorMessage: - 'please provide a "recipientPub" and "amount" to the send spontaneous payment request' - }) - } - try { - const preimage = await GunActions.sendPayment( - recipientPub, - amount, - memo, - feeLimit, - // TODO - maxParts, - timeoutSeconds - ) - res.json({ preimage, sessionUuid }) - } catch (err) { - logger.info('spontaneous pay err:', err) - return res.status(500).json({ - errorMessage: err.message - }) - } - }) - - app.post(`/api/gun/wall/`, async (req, res) => { - try { - const { tags, title, contentItems, enableTipsOverlay } = req.body - const postRes = await GunActions.createPostNew( - tags, - title, - contentItems - ) - if (enableTipsOverlay) { - const [postID] = postRes - const accessId = TipsForwarder.enablePostNotifications(postID) - return res.status(200).json([...postRes, accessId]) - } - return res.status(200).json(postRes) - } catch (e) { - logger.error(e) - return res.status(500).json({ - errorMessage: - (typeof e === 'string' ? e : e.message) || 'Unknown error.' - }) - } - }) - - app.delete(`/api/gun/wall/:postInfo`, async (req, res) => { - try { - const { postInfo } = req.params - const parts = postInfo.split('&') - const [page, postId] = parts - if (!page || !postId) { - throw new Error(`please provide a "postId" and a "page"`) - } - await GunActions.deletePost(postId, page) - return res.status(200).json({ - ok: 'true' - }) - } catch (e) { - return res.status(500).json({ - errorMessage: - (typeof e === 'string' ? e : e.message) || 'Unknown error.' - }) - } - }) - - ///////////////////////////////// - /** - * @template P - * @typedef {import('express-serve-static-core').RequestHandler

} RequestHandler - */ - - /** - * @typedef {object} FollowsRouteParams - * @prop {(string|undefined)=} publicKey - */ - - /** - * @type {RequestHandler} - */ - const apiGunFollowsPut = async (req, res) => { - try { - const { publicKey } = req.params - if (!publicKey) { - throw new Error(`Missing publicKey route param.`) - } - - await GunActions.follow(publicKey, false) - - // 201 would be extraneous here. Implement it inside app.put - res.status(200).json({ - ok: true - }) - } catch (err) { - res.status(500).json({ - errorMessage: err.message || 'Unknown error inside /api/gun/follows/' - }) - } - } - - /** - * @type {RequestHandler} - */ - const apiGunFollowsDelete = async (req, res) => { - try { - const { publicKey } = req.params - if (!publicKey) { - throw new Error(`Missing publicKey route param.`) - } - - await GunActions.unfollow(publicKey) - - res.status(200).json({ - ok: true - }) - } catch (err) { - res.status(500).json({ - errorMessage: err.message || 'Unknown error inside /api/gun/follows/' - }) - } - } - - app.get('/api/gun/initwall', async (req, res) => { - try { - await GunActions.initWall() - res.json({ ok: true }) - } catch (err) { - logger.error(err) - return res.status(500).json({ - errorMessage: err.message - }) - } - }) - app.put(`/api/gun/follows/:publicKey`, apiGunFollowsPut) - app.delete(`/api/gun/follows/:publicKey`, apiGunFollowsDelete) - - /** - * @type {RequestHandler<{}>} - */ - const apiGunMePut = async (req, res) => { - /** - * @typedef {Omit} UserWithoutPK - * @typedef {{ handshakeAddress: boolean }} HasHandshakeAddress - * @typedef {UserWithoutPK & HasHandshakeAddress} MePutBody - */ - try { - const { - avatar, - bio, - displayName, - handshakeAddress - } = /** @type {Partial} */ (req.body) - - if (avatar) { - await GunActions.setAvatar( - avatar, - require('../services/gunDB/Mediator').getUser() - ) - } - - if (bio) { - await GunActions.setBio( - bio, - require('../services/gunDB/Mediator').getUser() - ) - } - - if (displayName) { - await GunActions.setDisplayName( - displayName, - require('../services/gunDB/Mediator').getUser() - ) - } - - if (handshakeAddress) { - await GunActions.generateHandshakeAddress() - } - - res.status(200).json({ - ok: true - }) - } catch (err) { - logger.error(err) - res.status(500).json({ - errorMessage: err.message - }) - } - } - - app.put(`/api/gun/me`, apiGunMePut) - - app.get(`/api/gun/auth`, (_, res) => { - const { isAuthenticated } = require('../services/gunDB/Mediator') - - return res.status(200).json({ - data: isAuthenticated() - }) - }) - - /** - * @typedef {object} HandleGunFetchParams - * @prop {'once'|'load'|'specialOnce'} type - * @prop {boolean} startFromUserGraph - * @prop {string} path - * @prop {string=} publicKey - * @prop {string=} publicKeyForDecryption - * @prop {string=} epubForDecryption - */ - /** - * @param {HandleGunFetchParams} args0 - * @returns {Promise} - */ - const handleGunFetch = ({ - type, - startFromUserGraph, - path, - publicKey, - publicKeyForDecryption, - epubForDecryption - }) => { - const keys = path.split('>') - const { gun, user } = require('../services/gunDB/Mediator') - - // eslint-disable-next-line no-nested-ternary - let node = startFromUserGraph - ? user - : publicKey - ? gun.user(publicKey) - : gun - keys.forEach(key => (node = node.get(key))) - logger.info(`fetching: ${keys}`) - return new Promise((res, rej) => { - const listener = data => { - logger.info(`got res for: ${keys}`) - logger.info(data || 'falsey data (does not get logged)') - if (publicKeyForDecryption) { - GunWriteRPC.deepDecryptIfNeeded( - data, - publicKeyForDecryption, - epubForDecryption - ) - .then(res) - .catch(rej) - } else { - res(data) - } - } - - if (type === 'once') node.once(listener) - if (type === 'specialOnce') node.specialOnce(listener) - }) - } - - /** - * Used decryption of incoming data. - */ - const PUBKEY_FOR_DECRYPT_HEADER = 'public-key-for-decryption' - /** - * Used decryption of incoming data. - */ - const EPUB_FOR_DECRYPT_HEADER = 'epub-for-decryption' - - app.get('/api/gun/once/:path', async (req, res) => { - try { - const publicKeyForDecryption = req.header(PUBKEY_FOR_DECRYPT_HEADER) - const epubForDecryption = req.header(EPUB_FOR_DECRYPT_HEADER) - const { path } = req.params - logger.info(`gun ONCE: ${path}`) - const data = await handleGunFetch({ - path, - startFromUserGraph: false, - type: 'once', - publicKeyForDecryption, - epubForDecryption - }) - res.status(200).json({ - data - }) - } catch (e) { - logger.error(e) - res.status(500).json({ - errorMessage: e.message - }) - } - }) - - app.get('/api/gun/specialOnce/:path', async (req, res) => { - try { - const publicKeyForDecryption = req.header(PUBKEY_FOR_DECRYPT_HEADER) - const epubForDecryption = req.header(EPUB_FOR_DECRYPT_HEADER) - const { path } = req.params - logger.info(`Gun special once: ${path}`) - const data = await handleGunFetch({ - path, - startFromUserGraph: false, - type: 'specialOnce', - publicKeyForDecryption, - epubForDecryption - }) - res.status(200).json({ - data - }) - } catch (e) { - logger.error(e) - res.status(500).json({ - errorMessage: e.message - }) - } - }) - - app.get('/api/gun/load/:path', async (req, res) => { - try { - const publicKeyForDecryption = req.header(PUBKEY_FOR_DECRYPT_HEADER) - const epubForDecryption = req.header(EPUB_FOR_DECRYPT_HEADER) - const { path } = req.params - logger.info(`gun LOAD: ${path}`) - const data = await handleGunFetch({ - path, - startFromUserGraph: false, - type: 'load', - publicKeyForDecryption, - epubForDecryption - }) - res.status(200).json({ - data - }) - } catch (e) { - logger.error(e) - res.status(500).json({ - errorMessage: e.message - }) - } - }) - - app.get('/api/gun/user/once/:path', async (req, res) => { - try { - const publicKeyForDecryption = req.header(PUBKEY_FOR_DECRYPT_HEADER) - const epubForDecryption = req.header(EPUB_FOR_DECRYPT_HEADER) - const { path } = req.params - logger.info(`gun otheruser ONCE: ${path}`) - const data = await handleGunFetch({ - path, - startFromUserGraph: true, - type: 'once', - publicKeyForDecryption, - epubForDecryption - }) - res.status(200).json({ - data - }) - } catch (e) { - logger.error(e) - res.status(500).json({ - errorMessage: e.message - }) - } - }) - - app.get('/api/gun/user/specialOnce/:path', async (req, res) => { - try { - const publicKeyForDecryption = req.header(PUBKEY_FOR_DECRYPT_HEADER) - const epubForDecryption = req.header(EPUB_FOR_DECRYPT_HEADER) - const { path } = req.params - logger.info(`Gun user special once: ${path}`) - const data = await handleGunFetch({ - path, - startFromUserGraph: true, - type: 'specialOnce', - publicKeyForDecryption, - epubForDecryption - }) - res.status(200).json({ - data - }) - } catch (e) { - logger.error(e) - res.status(500).json({ - errorMessage: e.message - }) - } - }) - - app.get('/api/gun/user/load/:path', async (req, res) => { - try { - const publicKeyForDecryption = req.header(PUBKEY_FOR_DECRYPT_HEADER) - const epubForDecryption = req.header(EPUB_FOR_DECRYPT_HEADER) - const { path } = req.params - logger.info(`gun self user LOAD: ${path}`) - const data = await handleGunFetch({ - path, - startFromUserGraph: true, - type: 'load', - publicKeyForDecryption, - epubForDecryption - }) - res.status(200).json({ - data - }) - } catch (e) { - logger.error(e) - res.status(500).json({ - errorMessage: e.message - }) - } - }) - - app.get('/api/gun/otheruser/:publicKey/:type/:path', async (req, res) => { - try { - const allowedTypes = ['once', 'open', 'specialOnce'] - const publicKeyForDecryption = req.header(PUBKEY_FOR_DECRYPT_HEADER) - const epubForDecryption = req.header(EPUB_FOR_DECRYPT_HEADER) - const { path /*:rawPath*/, publicKey, type } = req.params - logger.info(`Gun other user ${type}: ${path}`) - // const path = decodeURI(rawPath) - if (!publicKey || publicKey === 'undefined') { - res.status(400).json({ - errorMessage: 'Invalid publicKey specified' - }) - return - } - - if (!allowedTypes.includes(type)) { - res.status(400).json({ - errorMessage: 'Invalid type specified' - }) - return - } - const data = await handleGunFetch({ - path, - startFromUserGraph: false, - // @ts-expect-error Validated above - type, - publicKey, - publicKeyForDecryption, - epubForDecryption - }) - try { - res.status(200).json({ - data - }) - } catch (err) { - res - .status( - err.message === Common.Constants.ErrorCode.NOT_AUTH ? 401 : 500 - ) - .json({ - errorMessage: err.message - }) - } - } catch (e) { - logger.error(e) - res.status(500).json({ - errorMessage: e.message - }) - } - }) - - app.post('/api/lnd/cb/:methodName', (req, res) => { - try { - const { lightning } = LightningServices.services - const { methodName } = req.params - logger.info(`lnd RPC: ${methodName}`) - const args = req.body - - lightning[methodName](args, (err, lres) => { - if (err) { - res.status(500).json({ - errorMessage: err.details - }) - } else if (lres) { - res.status(200).json(lres) - } else { - res.status(500).json({ - errorMessage: 'Unknown error' - }) - } - }) - } catch (err) { - logger.warn(`Error inside api cb:`) - logger.error(err) - logger.error(err.message) - - return res.status(500).json({ - errorMessage: err.message - }) - } - }) - - app.post('/api/gun/put', async (req, res) => { - try { - const { path, value } = req.body - logger.info(`gun PUT: ${path}`) - await GunWriteRPC.put(path, value) - - res.status(200).json({ - ok: true - }) - } catch (err) { - logger.error(err) - res - .status( - err.message === Common.Constants.ErrorCode.NOT_AUTH ? 401 : 500 - ) - .json({ - errorMessage: err.message - }) - } - }) - - app.post('/api/gun/set', async (req, res) => { - try { - const { path, value } = req.body - logger.info(`gun SET: ${path}`) - const id = await GunWriteRPC.set(path, value) - - res.status(200).json({ - ok: true, - id - }) - } catch (err) { - logger.error(err) - res - .status( - err.message === Common.Constants.ErrorCode.NOT_AUTH ? 401 : 500 - ) - .json({ - errorMessage: err.message - }) - } - }) - - app.get('/api/log', async (_, res) => { - try { - // https://github.com/winstonjs/winston#querying-logs - /** - * @type {import('winston').QueryOptions} - */ - const options = { - // @ts-expect-error Winston's typings don't account for supporting - // numbers here. - from: (new Date()).valueOf() - 1 * 60 * 60 * 1000, - until: new Date() - } - - const results = await Common.Utils.makePromise((res, rej) => { - logger.query(options, (err, results) => { - if (err) { - rej(err) - } else { - res(results) - } - }) - }) - - res.status(200).json(results) - } catch (e) { - logger.error(e) - res - .status(e.message === Common.Constants.ErrorCode.NOT_AUTH ? 401 : 500) - .json({ - errorMessage: e.message - }) - } - }) - //this is for OBS notifications, not wired with UI. - app.get('/api/subscribeStream', (req, res) => { - try { - res.sendFile(path.join(__dirname, '../public/obsOverlay.html')) - } catch (e) { - logger.error(e) - res.status(500).json({ - errorMessage: e.message - }) - } - }) - app.post('/api/enableNotificationsOverlay', (req, res) => { - try { - const { postID } = req.body - if (!postID) { - return res.status(400).json({ - errorMessage: 'no post id provided' - }) - } - const accessId = TipsForwarder.enablePostNotifications(postID) - res.json({ - accessId - }) - } catch (e) { - logger.error(e) - res.status(500).json({ - errorMessage: e.message - }) - } - }) - //this is for wasLive/isLive status - app.post('/api/listenStream', (req, res) => { - try { - startedStream(req.body) - return res.status(200).json({ - ok: true - }) - } catch (e) { - logger.error(e) - return res.status(500).json({ - errorMessage: - (typeof e === 'string' ? e : e.message) || 'Unknown error.' - }) - } - }) - app.post('/api/stopStream', (req, res) => { - try { - endStream(req.body) - return res.status(200).json({ - ok: true - }) - } catch (e) { - logger.error(e) - return res.status(500).json({ - errorMessage: - (typeof e === 'string' ? e : e.message) || 'Unknown error.' - }) - } - }) - - app.get('/', (req, res) => { - try { - res.sendFile(path.join(__dirname, '../public/localHomepage.html')) - } catch (e) { - logger.error(e) - res.status(500).json({ - errorMessage: e.message - }) - } - }) - - app.get('/qrCodeGenerator', (req, res) => { - console.log('/qrCodeGenerator') - try { - res.sendFile(path.join(__dirname, '../public/qrcode.min.js')) - } catch (e) { - logger.error(e) - res.status(500).json({ - errorMessage: e.message - }) - } - }) - - app.get('/api/accessInfo', (req, res) => { - if (req.ip !== '127.0.0.1') { - res.json({ - field: 'origin', - message: 'invalid origin, cant serve access info' - }) - return - } - try { - throw new Error('') - } catch (e) { - logger.error(e) - res.status(500).json({ - errorMessage: e.message - }) - } - }) - - app.post('/api/initUserInformation', async (req, res) => { - try { - const user = require('../services/gunDB/Mediator').getUser() - await UserInitializer.InitUserData(user) - } catch (err) { - logger.error(err) - res - .status( - err.message === Common.Constants.ErrorCode.NOT_AUTH ? 401 : 500 - ) - .json({ - errorMessage: err.message - }) - } - }) - } catch (err) { - logger.warn('Unhandled rejection:', err) - } -} diff --git a/src/server.js b/src/server.js deleted file mode 100644 index 38ad63bc..00000000 --- a/src/server.js +++ /dev/null @@ -1,439 +0,0 @@ -/** - * @prettier - */ -// @ts-check - -const ECCrypto = require('eccrypto') - -const ECC = require('../utils/ECC') - -/** - * This API run's private key. - */ -const runPrivateKey = ECCrypto.generatePrivate() -/** - * This API run's public key. - */ -const runPublicKey = ECCrypto.getPublic(runPrivateKey) - -process.on('uncaughtException', e => { - console.log('something bad happened!') - console.log(e) -}) -/** - * Module dependencies. - */ -const server = program => { - const Http = require('http') - const Https = require('https') - const FS = require('fs') - const Express = require('express') - const Crypto = require('crypto') - const Dotenv = require('dotenv') - const Storage = require('node-persist') - const Path = require('path') - const { Logger: CommonLogger } = require('shock-common') - const binaryParser = require('socket.io-msgpack-parser') - - const LightningServices = require('../utils/lightningServices') - const app = Express() - - const compression = require('compression') - const bodyParser = require('body-parser') - const session = require('express-session') - const methodOverride = require('method-override') - const qrcode = require('qrcode-terminal') - const relayClient = require('hybrid-relay-client/build') - const { - sensitiveRoutes, - nonEncryptedRoutes - } = require('../utils/protectedRoutes') - - /** - * An offline-only private key used for authenticating a client's key - * exchange. Neither the tunnel nor the WWW should see this private key, it - * should only be served through STDOUT (via QR or else). - */ - const accessSecret = ECCrypto.generatePrivate() - const accessSecretBase64 = accessSecret.toString('base64') - - // load app default configuration data - const defaults = require('../config/defaults')(program.mainnet) - const rootFolder = program.rootPath || process.resourcesPath || __dirname - - // define env variables - Dotenv.config() - - const serverPort = program.serverport || defaults.serverPort - const serverHost = program.serverhost || defaults.serverHost - const tunnelHost = process.env.LOCAL_TUNNEL_SERVER || defaults.localtunnelHost - - // setup winston logging ========== - const logger = require('../config/log') - - CommonLogger.setLogger(logger) - - // utilities functions ================= - require('../utils/server-utils')(module) - - logger.info('Mainnet Mode:', !!program.mainnet) - - if (process.env.SHOCK_ENCRYPTION_ECC === 'false') { - logger.error('Encryption Mode: false') - } else { - logger.info('Encryption Mode: true') - } - - const stringifyData = data => { - if (typeof data === 'object') { - const stringifiedData = JSON.stringify(data) - return stringifiedData - } - - if (data.toString) { - return data.toString() - } - - return data - } - - const hashData = data => { - return Crypto.createHash('SHA256') - .update(Buffer.from(stringifyData(data))) - .digest('hex') - } - - /** - * @param {Express.Request} req - * @param {Express.Response} res - * @param {(() => void)} next - */ - const modifyResponseBody = (req, res, next) => { - const deviceId = req.headers['encryption-device-id'] - const oldSend = res.send - - console.log({ - deviceId, - encryptionDisabled: process.env.SHOCK_ENCRYPTION_ECC === 'false', - unprotectedRoute: nonEncryptedRoutes.includes(req.path) - }) - - if ( - nonEncryptedRoutes.includes(req.path) || - process.env.SHOCK_ENCRYPTION_ECC === 'false' - ) { - next() - return - } - - // @ts-expect-error - res.send = (...args) => { - if (args[0] && args[0].ciphertext && args[0].iv) { - logger.warn('Response loop detected!') - oldSend.apply(res, args) - return - } - - if (typeof deviceId !== 'string' || !deviceId) { - // TODO - } - - const authorized = ECC.devicePublicKeys.has(deviceId) - - // Using classic promises syntax to avoid - // modifying res.send's return type - if (authorized && process.env.SHOCK_ENCRYPTION_ECC !== 'false') { - const devicePub = Buffer.from(ECC.devicePublicKeys.get(deviceId)) - - ECCrypto.encrypt(devicePub, Buffer.from(args[0], 'utf-8')).then( - encryptedMessage => { - args[0] = JSON.stringify(encryptedMessage) - oldSend.apply(res, args) - } - ) - } - - if (!authorized || process.env.SHOCK_ENCRYPTION_ECC === 'false') { - if (!authorized) { - logger.warn( - `An unauthorized Device ID is contacting the API: ${deviceId}` - ) - logger.warn( - `Authorized Device IDs: ${[...ECC.devicePublicKeys.keys()].join( - ', ' - )}` - ) - } - args[0] = JSON.stringify(args[0]) - oldSend.apply(res, args) - } - } - - next() - } - - const wait = seconds => - new Promise(resolve => { - const timer = setTimeout(() => resolve(timer), seconds * 1000) - }) - - // eslint-disable-next-line consistent-return - const startServer = async () => { - try { - LightningServices.setDefaults(program) - if (!LightningServices.isInitialized()) { - await LightningServices.init() - } - - await /** @type {Promise} */ (new Promise((resolve, reject) => { - LightningServices.services.lightning.getInfo({}, (err, res) => { - if ( - err && - !err.details.includes('wallet not created') && - !err.details.includes('wallet locked') - ) { - reject(err) - } else { - resolve() - } - }) - })) - - app.use(compression()) - - app.use((req, res, next) => { - if (process.env.ROUTE_LOGGING === 'true') { - if (sensitiveRoutes[req.method][req.path]) { - logger.info( - JSON.stringify({ - time: new Date(), - ip: req.ip, - method: req.method, - path: req.path, - sessionId: req.sessionId - }) - ) - } else { - logger.info( - JSON.stringify({ - time: new Date(), - ip: req.ip, - method: req.method, - path: req.path, - body: req.body, - query: req.query, - sessionId: req.sessionId - }) - ) - } - } - next() - }) - - app.use((req, res, next) => { - res.set('Version', program.version ? program.version() : 'N/A') - next() - }) - - const storageDirectory = Path.resolve( - rootFolder, - `${program.rootPath ? '.' : '..'}/.storage` - ) - - await Storage.init({ - dir: storageDirectory - }) /* - if (false) { - await Storage.removeItem('tunnel/token') - await Storage.removeItem('tunnel/subdomain') - await Storage.removeItem('tunnel/url') - }*/ - - const storePersistentRandomField = async ({ fieldName, length = 16 }) => { - const randomField = await Storage.getItem(fieldName) - - if (randomField) { - return randomField - } - - const newValue = await ECC.generateRandomString(length) - await Storage.setItem(fieldName, newValue) - return newValue - } - - const [sessionSecret] = await Promise.all([ - storePersistentRandomField({ - fieldName: 'config/sessionSecret' - }), - storePersistentRandomField({ - fieldName: 'encryption/hostId', - length: 8 - }) - ]) - - app.use( - session({ - secret: sessionSecret, - cookie: { maxAge: defaults.sessionMaxAge }, - resave: true, - rolling: true, - saveUninitialized: true - }) - ) - app.use(bodyParser.urlencoded({ extended: true })) - app.use(bodyParser.json({ limit: '500kb' })) - app.use(bodyParser.json({ type: 'application/vnd.api+json' })) - app.use(methodOverride()) - // WARNING - // error handler middleware, KEEP 4 parameters as express detects the - // arity of the function to treat it as a err handling middleware - // eslint-disable-next-line no-unused-vars - app.use((err, _, res, __) => { - // Do logging and user-friendly error message display - logger.error(err) - res.status(500).send({ status: 500, errorMessage: 'internal error' }) - }) - - const CA = program.httpsCert - const CA_KEY = program.httpsCertKey - - const createServer = () => { - try { - if (program.useTLS) { - const key = FS.readFileSync(CA_KEY, 'utf-8') - const cert = FS.readFileSync(CA, 'utf-8') - - const httpsServer = Https.createServer({ key, cert }, app) - - return httpsServer - } - - const httpServer = new Http.Server(app) - return httpServer - } catch (err) { - logger.error(err.message) - logger.error( - 'An error has occurred while finding an LND cert to use to open an HTTPS server' - ) - logger.warn('Falling back to opening an HTTP server...') - const httpServer = new Http.Server(app) - return httpServer - } - } - - const serverInstance = await createServer() - - require('socket.io')(serverInstance, { - parser: binaryParser, - transports: ['websocket', 'polling'], - cors: { - origin: (origin, callback) => { - callback(null, true) - }, - allowedHeaders: [ - 'Origin', - 'X-Requested-With', - 'Content-Type', - 'Accept', - 'Authorization', - 'public-key-for-decryption', - 'encryption-device-id' - ], - credentials: true - } - }) - - require('./routes')( - app, - { - ...defaults, - lndAddress: program.lndAddress, - cliArgs: program - }, - { - serverPort, - useTLS: program.useTLS, - CA, - CA_KEY, - runPrivateKey, - runPublicKey, - accessSecret - } - ) - - // enable CORS headers - app.use(require('./cors')) - // app.use(bodyParser.json({limit: '100000mb'})); - app.use(bodyParser.json({ limit: '50mb' })) - app.use(bodyParser.urlencoded({ limit: '50mb', extended: true })) - if (process.env.SHOCK_ENCRYPTION_ECC !== 'false') { - app.use(modifyResponseBody) - } - - if (program.tunnel) { - const [relayToken, relayId, relayUrl] = await Promise.all([ - Storage.getItem('relay/token'), - Storage.getItem('relay/id'), - Storage.getItem('relay/url') - ]) - const opts = { - relayId, - relayToken, - address: tunnelHost, - port: serverPort - } - logger.info(opts) - relayClient.default(opts, async (connected, params) => { - if (connected) { - const noProtocolAddress = params.address.replace( - /^http(?s)?:\/\//giu, - '' - ) - await Promise.all([ - Storage.setItem('relay/token', params.relayToken), - Storage.setItem('relay/id', params.relayId), - Storage.setItem('relay/url', noProtocolAddress) - ]) - const dataToQr = JSON.stringify({ - URI: `https://${params.relayId}@${noProtocolAddress}`, - // Null-check is just to please typescript - accessSecret: accessSecretBase64 - }) - qrcode.generate(dataToQr, { small: false }) - logger.info(`connect to ${params.relayId}@${noProtocolAddress}:443`) - console.log('\n') - console.log(`Here's your access secret:`) - console.log('\n') - console.log(accessSecretBase64) - console.log('\n') - console.log('\n') - } else { - logger.error('!! Relay did not connect to server !!') - } - }) - } else { - console.log('\n') - console.log(`Here's your access secret:`) - console.log('\n') - console.log(accessSecretBase64) - console.log('\n') - console.log('\n') - } - - serverInstance.listen(serverPort, serverHost) - logger.info('App listening on ' + serverHost + ' port ' + serverPort) - // @ts-expect-error - module.server = serverInstance - } catch (err) { - logger.error({ exception: err, message: err.message, code: err.code }) - logger.info('Restarting server in 30 seconds...') - await wait(30) - startServer() - return false - } - } - - startServer() -} - -module.exports = server diff --git a/src/services/lnd/addInvoiceReq.ts b/src/services/lnd/addInvoiceReq.ts new file mode 100644 index 00000000..f981598b --- /dev/null +++ b/src/services/lnd/addInvoiceReq.ts @@ -0,0 +1,34 @@ +import { OpenChannelRequest, Invoice } from "../../../proto/lnd/lightning"; + +export const AddInvoiceReq = (value: number, memo = "", privateHints = false, expiry = 60 * 60): Invoice => ({ + expiry: BigInt(expiry), + memo: memo, + private: privateHints, + value: BigInt(value), + + fallbackAddr: "", + cltvExpiry: 0n, + descriptionHash: Buffer.alloc(0), + features: {}, + isAmp: false, + rPreimage: Buffer.alloc(0), + routeHints: [], + valueMsat: 0n, + + addIndex: 0n, + ampInvoiceState: {}, + amtPaidMsat: 0n, + amtPaidSat: 0n, + creationDate: 0n, + htlcs: [], + isKeysend: false, + paymentAddr: Buffer.alloc(0), + paymentRequest: "", + rHash: Buffer.alloc(0), + settleDate: 0n, + settleIndex: 0n, + state: 0, + + amtPaid: 0n, + settled: false, +}) \ No newline at end of file diff --git a/src/services/lnd/index.spec.ts b/src/services/lnd/index.spec.ts new file mode 100644 index 00000000..82bb0383 --- /dev/null +++ b/src/services/lnd/index.spec.ts @@ -0,0 +1,36 @@ +import 'dotenv/config' // TODO - test env +import { AfterAll, BeforeAll, expect, FTest, FTestSuite, Test, TestSuite } from 'testyts'; +import LndHandler, { LoadLndSettingsFromEnv } from '.' +import * as Types from '../../../proto/autogenerated/ts/types'; +@TestSuite() +export class LndTestSuite { + lnd: LndHandler + @BeforeAll() + createLnd() { + this.lnd = new LndHandler(LoadLndSettingsFromEnv()) + } + @AfterAll() + stopStreams() { + } + @Test() + async getAlias() { + const res = await this.lnd.GetInfo() + expect.toBeEqual(res.alias, "alice") + } + @Test() + async newAddress() { + const res = await this.lnd.NewAddress(Types.AddressType.WITNESS_PUBKEY_HASH) + console.log(res) + } + @Test() + async newInvoice() { + const res = await this.lnd.NewInvoice(1000) + console.log(res) + } + + @Test() + async openChannel() { + //const res = await this.lnd.OpenChannel("025ed7fc85fc05a07fc5acc13a6e3836cd11c5587c1d400afcd22630a9e230eb7a", "", 20000, 0) + } + +} \ No newline at end of file diff --git a/src/services/lnd/index.ts b/src/services/lnd/index.ts new file mode 100644 index 00000000..dd145186 --- /dev/null +++ b/src/services/lnd/index.ts @@ -0,0 +1,221 @@ +//const grpc = require('@grpc/grpc-js'); +import { credentials, Metadata } from '@grpc/grpc-js' +import { GrpcTransport } from "@protobuf-ts/grpc-transport"; +import fs from 'fs' +import * as Types from '../../../proto/autogenerated/ts/types' +import { LightningClient } from '../../../proto/lnd/lightning.client' +import { InvoicesClient } from '../../../proto/lnd/invoices.client' +import { RouterClient } from '../../../proto/lnd/router.client' +import { GetInfoResponse, AddressType, NewAddressResponse, AddInvoiceResponse, Invoice_InvoiceState, PayReq, Payment_PaymentStatus, Payment } from '../../../proto/lnd/lightning' +import { OpenChannelReq } from './openChannelReq'; +import { AddInvoiceReq } from './addInvoiceReq'; +import { PayInvoiceReq } from './payInvoiceReq'; +const DeadLineMetadata = (deadline = 10 * 1000) => ({ deadline: Date.now() + deadline }) +export type LndSettings = { + lndAddr: string + lndCertPath: string + lndMacaroonPath: string + walletAccount: string + feeRateLimit: number + feeFixedLimit: number +} +export const LoadLndSettingsFromEnv = (test = false): LndSettings => { + const lndAddr = process.env.LND_ADDRESS; + const lndCertPath = process.env.LND_CERT_PATH; + const lndMacaroonPath = process.env.LND_MACAROON_PATH; + if (!lndAddr) throw new Error(`missing env for LND_ADDRESS`) + if (!lndCertPath) throw new Error(`missing env for LND_CERT_PATH`) + if (!lndMacaroonPath) throw new Error(`missing env for LND_MACAROON_PATH`) + + if (!process.env.LIMIT_FEE_RATE_MILLISATS) { + throw new Error(`missing env for LIMIT_FEE_RATE_MILLISATS`) + } + if (isNaN(+process.env.LIMIT_FEE_RATE_MILLISATS) || !Number.isInteger(+process.env.LIMIT_FEE_RATE_MILLISATS)) { + throw new Error("LIMIT_FEE_RATE_MILLISATS must be an integer number"); + } + + if (!process.env.LIMIT_FEE_FIXED_SATS) { + throw new Error(`missing env for LIMIT_FEE_FIXED_SATS`) + } + if (isNaN(+process.env.LIMIT_FEE_FIXED_SATS) || !Number.isInteger(+process.env.LIMIT_FEE_FIXED_SATS)) { + throw new Error("LIMIT_FEE_FIXED_SATS must be an integer number"); + } + const feeRateLimit = +process.env.LIMIT_FEE_RATE_MILLISATS / 1000 + const feeFixedLimit = +process.env.LIMIT_FEE_FIXED_SATS + + const walletAccount = process.env.LND_WALLET_ACCOUNT || "" + return { lndAddr, lndCertPath, lndMacaroonPath, walletAccount, feeRateLimit, feeFixedLimit } +} +type TxOutput = { + hash: string + index: number +} +export type AddressPaidCb = (txOutput: TxOutput, address: string, amount: number) => void +export type InvoicePaidCb = (paymentRequest: string, amount: number) => void +export default class { + lightning: LightningClient + invoices: InvoicesClient + router: RouterClient + settings: LndSettings + ready = false + latestKnownBlockHeigh = 0 + latestKnownSettleIndex = 0 + abortController = new AbortController() + addressPaidCb: AddressPaidCb + invoicePaidCb: InvoicePaidCb + constructor(settings: LndSettings, addressPaidCb: AddressPaidCb, invoicePaidCb: InvoicePaidCb) { + this.settings = settings + this.addressPaidCb = addressPaidCb + this.invoicePaidCb = invoicePaidCb + const { lndAddr, lndCertPath, lndMacaroonPath } = this.settings + const lndCert = fs.readFileSync(lndCertPath); + const macaroon = fs.readFileSync(lndMacaroonPath).toString('hex'); + const sslCreds = credentials.createSsl(lndCert); + const macaroonCreds = credentials.createFromMetadataGenerator( + function (args: any, callback: any) { + let metadata = new Metadata(); + metadata.add('macaroon', macaroon); + callback(null, metadata); + }, + ); + const creds = credentials.combineChannelCredentials( + sslCreds, + macaroonCreds, + ); + const transport = new GrpcTransport({ host: lndAddr, channelCredentials: creds }) + this.lightning = new LightningClient(transport) + this.invoices = new InvoicesClient(transport) + this.router = new RouterClient(transport) + this.SubscribeAddressPaid() + } + Stop() { + this.abortController.abort() + } + async Warmup() { this.ready = true } + + async GetInfo(): Promise { + const res = await this.lightning.getInfo({}, DeadLineMetadata()) + return res.response + } + checkReady() { + if (!this.ready) throw new Error("lnd not ready, warmup required before usage") + } + SubscribeAddressPaid() { + const stream = this.lightning.subscribeTransactions({ + account: this.settings.walletAccount, + endHeight: 0, + startHeight: this.latestKnownBlockHeigh, + }, { abort: this.abortController.signal }) + stream.responses.onMessage(tx => { + if (tx.blockHeight > this.latestKnownBlockHeigh) { + this.latestKnownBlockHeigh = tx.blockHeight + } + if (tx.numConfirmations > 0) { + tx.outputDetails.forEach(output => { + if (output.isOurAddress) { + this.addressPaidCb({ hash: tx.txHash, index: Number(output.outputIndex) }, output.address, Number(output.amount)) + } + }) + } + }) + stream.responses.onError(error => { + // TODO... + }) + } + + SubscribeInvoicePaid() { + const stream = this.lightning.subscribeInvoices({ + settleIndex: BigInt(this.latestKnownSettleIndex), + addIndex: 0n, + }, { abort: this.abortController.signal }) + stream.responses.onMessage(invoice => { + if (invoice.state === Invoice_InvoiceState.SETTLED) { + this.latestKnownSettleIndex = Number(invoice.settleIndex) + this.invoicePaidCb(invoice.paymentRequest, Number(invoice.amtPaidSat)) + } + }) + stream.responses.onError(error => { + // TODO... + }) + } + async NewAddress(addressType: Types.AddressType): Promise { + this.checkReady() + let lndAddressType: AddressType + switch (addressType) { + case Types.AddressType.NESTED_PUBKEY_HASH: + lndAddressType = AddressType.NESTED_PUBKEY_HASH + break; + case Types.AddressType.WITNESS_PUBKEY_HASH: + lndAddressType = AddressType.WITNESS_PUBKEY_HASH + break; + case Types.AddressType.TAPROOT_PUBKEY: + lndAddressType = AddressType.TAPROOT_PUBKEY + break; + default: + throw new Error("unknown address type " + addressType) + } + const res = await this.lightning.newAddress({ account: this.settings.walletAccount, type: lndAddressType }, DeadLineMetadata()) + return res.response + } + + async NewInvoice(value: number): Promise { + this.checkReady() + const res = await this.lightning.addInvoice(AddInvoiceReq(value), DeadLineMetadata()) + return res.response + } + + async DecodeInvoice(paymentRequest: string): Promise { + const res = await this.lightning.decodePayReq({ payReq: paymentRequest }, DeadLineMetadata()) + return res.response + } + + GetFeeLimitAmount(amount: number) { + return Math.ceil(amount * this.settings.feeRateLimit + this.settings.feeFixedLimit); + } + + async PayInvoice(invoice: string, amount: number, feeLimit: number): Promise { + this.checkReady() + const abortController = new AbortController() + const stream = this.router.sendPaymentV2(PayInvoiceReq(invoice, amount, feeLimit), { abort: abortController.signal }) + return new Promise((res, rej) => { + stream.responses.onError(error => { + rej(error) + }) + stream.responses.onMessage(payment => { + switch (payment.status) { + case Payment_PaymentStatus.FAILED: + rej(payment.failureReason) + return + case Payment_PaymentStatus.SUCCEEDED: + res(payment) + } + }) + }) + } + + + async OpenChannel(destination: string, closeAddress: string, fundingAmount: number, pushSats: number): Promise { + this.checkReady() + const abortController = new AbortController() + const req = OpenChannelReq(destination, closeAddress, fundingAmount, pushSats) + const stream = this.lightning.openChannel(req, { abort: abortController.signal }) + return new Promise((res, rej) => { + stream.responses.onMessage(message => { + switch (message.update.oneofKind) { + case 'chanPending': + abortController.abort() + res(Buffer.from(message.pendingChanId).toString('base64')) + break + default: + abortController.abort() + rej("unexpected state response: " + message.update.oneofKind) + } + }) + stream.responses.onError(error => { + rej(error) + }) + }) + } +} + + diff --git a/src/services/lnd/openChannelReq.ts b/src/services/lnd/openChannelReq.ts new file mode 100644 index 00000000..3010e96b --- /dev/null +++ b/src/services/lnd/openChannelReq.ts @@ -0,0 +1,32 @@ +import { OpenChannelRequest } from "../../../proto/lnd/lightning"; + +export const OpenChannelReq = (destination: string, closeAddress: string, fundingAmount: number, pushSats: number): OpenChannelRequest => ({ + nodePubkey: Buffer.from(destination, 'hex'), + closeAddress: closeAddress, + localFundingAmount: BigInt(fundingAmount), + pushSat: BigInt(pushSats), + + satPerVbyte: 0n, // TBD + private: false, + minConfs: 0, // TBD + baseFee: 0n, // TBD + feeRate: 0n, // TBD + zeroConf: false, + maxLocalCsv: 0, + remoteCsvDelay: 0, + spendUnconfirmed: false, + minHtlcMsat: 0n, + remoteChanReserveSat: 0n, + remoteMaxHtlcs: 0, + remoteMaxValueInFlightMsat: 0n, + targetConf: 0, + useBaseFee: false, + useFeeRate: false, + + // Default stuff + commitmentType: 0, + scidAlias: false, + nodePubkeyString: "", + satPerByte: 0n, + +}) \ No newline at end of file diff --git a/src/services/lnd/payInvoiceReq.ts b/src/services/lnd/payInvoiceReq.ts new file mode 100644 index 00000000..b8c5223e --- /dev/null +++ b/src/services/lnd/payInvoiceReq.ts @@ -0,0 +1,30 @@ +import { OpenChannelRequest } from "../../../proto/lnd/lightning"; +import { SendPaymentRequest } from "../../../proto/lnd/router"; + +export const PayInvoiceReq = (invoice: string, amount: number, feeLimit: number): SendPaymentRequest => ({ + amt: BigInt(amount), + feeLimitSat: BigInt(feeLimit), + noInflightUpdates: true, + paymentRequest: invoice, + maxParts: 3, + timeoutSeconds: 50, + + allowSelfPayment: false, + amp: false, + amtMsat: 0n, + cltvLimit: 0, + dest: Buffer.alloc(0), + destCustomRecords: {}, + destFeatures: [], + feeLimitMsat: 0n, + finalCltvDelta: 0, + lastHopPubkey: Buffer.alloc(0), + maxShardSizeMsat: 0n, + outgoingChanIds: [], + paymentAddr: Buffer.alloc(0), + paymentHash: Buffer.alloc(0), + routeHints: [], + timePref: 0, + + outgoingChanId: "" +}) \ No newline at end of file diff --git a/src/services/main/index.ts b/src/services/main/index.ts new file mode 100644 index 00000000..605e4771 --- /dev/null +++ b/src/services/main/index.ts @@ -0,0 +1,97 @@ +import jwt from 'jsonwebtoken' +import Storage, { LoadStorageSettingsFromEnv, StorageSettings } from '../storage' +import * as Types from '../../../proto/autogenerated/ts/types' +import LND, { AddressPaidCb, InvoicePaidCb, LndSettings, LoadLndSettingsFromEnv } from '../lnd' +export type MainSettings = { + storageSettings: StorageSettings, + lndSettings: LndSettings, + jwtSecret: string +} +export const LoadMainSettingsFromEnv = (test = false): MainSettings => { + const jwtSecret = process.env.JWT_SECRET; + if (!jwtSecret) throw new Error(`missing env for JWT_SECRET`) + return { + lndSettings: LoadLndSettingsFromEnv(test), + storageSettings: LoadStorageSettingsFromEnv(test), + jwtSecret + } +} +export default class { + storage: Storage + lnd: LND + settings: MainSettings + constructor(settings: MainSettings) { + this.settings = settings + this.storage = new Storage(settings.storageSettings) + this.lnd = new LND(settings.lndSettings, this.addressPaidCb, this.invoicePaidCb) + } + addressPaidCb: AddressPaidCb = (txOutput, address, amount) => { + this.storage.StartTransaction(async tx => { + const userAddress = await this.storage.GetAddressOwner(address, tx) + if (!userAddress) { return } + // This call will fail if the transaction is already registered + const addedTx = await this.storage.AddAddressTransaction(address, txOutput.hash, txOutput.index, amount) + await this.storage.IncrementUserBalance(userAddress.user.user_id, addedTx.amount, tx) + }) + } + invoicePaidCb: InvoicePaidCb = (paymentRequest, amount) => { + this.storage.StartTransaction(async tx => { + const userInvoice = await this.storage.GetInvoiceOwner(paymentRequest, tx) + if (!userInvoice || userInvoice.paid) { return } + // This call will fail if the invoice is already registered + await this.storage.FlagInvoiceAsPaid(userInvoice.serial_id, amount, tx) + await this.storage.IncrementUserBalance(userInvoice.user.user_id, amount) + }) + } + SignUserToken(userId: string): string { + return jwt.sign({ userId }, this.settings.jwtSecret); + } + + DecodeUserToken(token?: string): string { + if (!token) throw new Error("empty auth token provided") + return (jwt.verify(token, this.settings.jwtSecret) as { userId: string }).userId + } + + async AddUser(req: Types.AddUserRequest): Promise { + const newUser = await this.storage.AddUser(req.name, req.callback_url, req.secret) + return { + user_id: newUser.user_id, + auth_token: this.SignUserToken(newUser.user_id) + } + } + + async NewAddress(userId: string, req: Types.NewAddressRequest): Promise { + const res = await this.lnd.NewAddress(req.address_type) + const userAddress = await this.storage.AddUserAddress(userId, res.address) + return { + address: userAddress.address + } + } + + async NewInvoice(userId: string, req: Types.NewInvoiceRequest): Promise { + const res = await this.lnd.NewInvoice(req.amount_sats) + const userInvoice = await this.storage.AddUserInvoice(userId, res.paymentRequest) + return { + invoice: userInvoice.invoice + } + } + + async PayInvoice(userId: string, req: Types.PayInvoiceRequest): Promise { + const decoded = await this.lnd.DecodeInvoice(req.invoice) + const payAmount = Number(decoded.numSatoshis) + const feeLimit = this.lnd.GetFeeLimitAmount(payAmount) + const decrement = payAmount + feeLimit + // this call will fail if the user balance is not enough + await this.storage.DecrementUserBalance(userId, decrement) + try { + await this.lnd.PayInvoice(req.invoice, req.amount, feeLimit) + + } catch (e) { + await this.storage.IncrementUserBalance(userId, decrement) + throw e + } + await this.storage.AddUserPayment(userId, req.invoice,) + } + + async OpenChannel(userId: string, req: Types.OpenChannelRequest): Promise { throw new Error("WIP") } +} \ No newline at end of file diff --git a/src/services/serverMethods/index.ts b/src/services/serverMethods/index.ts new file mode 100644 index 00000000..e86aca58 --- /dev/null +++ b/src/services/serverMethods/index.ts @@ -0,0 +1,48 @@ +import * as Types from '../../../proto/autogenerated/ts/types' +import Main from '../main' +export default (mainHandler: Main): Types.ServerMethods => { + return { + EncryptionExchange: async (ctx: Types.EncryptionExchange_Context, req: Types.EncryptionExchangeRequest): Promise => { }, + Health: async (ctx: Types.Health_Context): Promise => { }, + LndGetInfo: async (ctx: Types.LndGetInfo_Context): Promise => { + const info = await mainHandler.lnd.GetInfo() + return { alias: info.alias } + }, + AddUser: async (ctx: Types.GuestContext, req: Types.AddUserRequest): Promise => { + const err = Types.AddUserRequestValidate(req, { + callback_url_CustomCheck: url => url.startsWith("http://") || url.startsWith("https://"), + name_CustomCheck: name => name.length > 0, + secret_CustomCheck: secret => secret.length >= 8 + }) + if (err != null) throw new Error(err.message) + return mainHandler.AddUser(req) + }, + AuthUser: async (ctx: Types.GuestContext, req: Types.AuthUserRequest): Promise => { + throw new Error("unimplemented") + }, + OpenChannel: async (ctx: Types.UserContext, req: Types.OpenChannelRequest): Promise => { + const err = Types.OpenChannelRequestValidate(req, { + funding_amount_CustomCheck: amt => amt > 0, + push_amount_CustomCheck: amt => amt > 0, + destination_CustomCheck: dest => dest !== "" + }) + if (err != null) throw new Error(err.message) + return mainHandler.OpenChannel(ctx.user_id, req) + }, + NewAddress: async (ctx: Types.UserContext, req: Types.NewAddressRequest): Promise => { + return mainHandler.NewAddress(ctx.user_id, req) + }, + PayAddress: async (ctx: Types.UserContext, req: Types.PayAddressRequest): Promise => { + throw new Error("unimplemented") + }, + NewInvoice: async (ctx: Types.UserContext, req: Types.NewInvoiceRequest): Promise => { + throw new Error("unimplemented") + }, + PayInvoice: async (ctx: Types.UserContext, req: Types.PayInvoiceRequest): Promise => { + throw new Error("unimplemented") + }, + GetOpenChannelLNURL: async (ctx: Types.UserContext): Promise => { + throw new Error("unimplemented") + } + } +} \ No newline at end of file diff --git a/src/services/storage/db.ts b/src/services/storage/db.ts new file mode 100644 index 00000000..b0db4963 --- /dev/null +++ b/src/services/storage/db.ts @@ -0,0 +1,24 @@ +import "reflect-metadata" +import { DataSource } from "typeorm" +import { AddressTransaction } from "./entity/AddressTransaction" +import { User } from "./entity/User" +import { UserAddress } from "./entity/UserAddress" +import { UserInvoice } from "./entity/UserInvoice" +import { UserPayment } from "./entity/UserPayment" +export type DbSettings = { + databaseFile: string +} +export const LoadDbSettingsFromEnv = (test = false): DbSettings => { + const databaseFile = process.env.DATABASE_FILE + if (!databaseFile) throw new Error(`missing env for DATABASE_FILE`) + return { databaseFile: test ? ":memory:" : databaseFile } +} +export default async (settings: DbSettings) => { + return new DataSource({ + type: "sqlite", + database: settings.databaseFile, + //logging: true, + entities: [User, UserInvoice, UserAddress, AddressTransaction, UserPayment], + synchronize: true + }).initialize() +} \ No newline at end of file diff --git a/src/services/storage/entity/AddressTransaction.ts b/src/services/storage/entity/AddressTransaction.ts new file mode 100644 index 00000000..36e08133 --- /dev/null +++ b/src/services/storage/entity/AddressTransaction.ts @@ -0,0 +1,23 @@ +import { Entity, PrimaryGeneratedColumn, Column, Index, Check, ManyToOne } from "typeorm" +import { User } from "./User" +import { UserAddress } from "./UserAddress" + +@Entity() +@Index("address_transaction_unique", ["tx_hash", "output_index"], { unique: true }) +export class AddressTransaction { + + @PrimaryGeneratedColumn() + serial_id: number + + @ManyToOne(type => UserAddress) + user_address: UserAddress + + @Column() + tx_hash: string + + @Column() + output_index: number + + @Column() + amount: number +} diff --git a/src/services/storage/entity/User.ts b/src/services/storage/entity/User.ts new file mode 100644 index 00000000..1d26459a --- /dev/null +++ b/src/services/storage/entity/User.ts @@ -0,0 +1,29 @@ +import { Entity, PrimaryGeneratedColumn, Column, Index, Check } from "typeorm" + +@Entity() +@Check(`"balance_sats" >= 0`) +export class User { + + @PrimaryGeneratedColumn() + serial_id: number + + @Column() + @Index({ unique: true }) + user_id: string + + @Column() + @Index({ unique: true }) + name: string + + @Column() + secret_sha256: string + + @Column() + callbackUrl: string + + @Column({ type: 'integer', default: 0 }) + balance_sats: number + + @Column({ default: false }) + locked: boolean +} diff --git a/src/services/storage/entity/UserAddress.ts b/src/services/storage/entity/UserAddress.ts new file mode 100644 index 00000000..aa8853ae --- /dev/null +++ b/src/services/storage/entity/UserAddress.ts @@ -0,0 +1,19 @@ +import { Entity, PrimaryGeneratedColumn, Column, Index, Check, ManyToOne } from "typeorm" +import { User } from "./User" + +@Entity() +export class UserAddress { + + @PrimaryGeneratedColumn() + serial_id: number + + @ManyToOne(type => User) + user: User + + @Column() + @Index({ unique: true }) + address: string + + @Column() + callbackUrl: string +} diff --git a/src/services/storage/entity/UserInvoice.ts b/src/services/storage/entity/UserInvoice.ts new file mode 100644 index 00000000..9d223dd8 --- /dev/null +++ b/src/services/storage/entity/UserInvoice.ts @@ -0,0 +1,25 @@ +import { Entity, PrimaryGeneratedColumn, Column, Index, Check, ManyToOne } from "typeorm" +import { User } from "./User" + +@Entity() +export class UserInvoice { + + @PrimaryGeneratedColumn() + serial_id: number + + @ManyToOne(type => User) + user: User + + @Column() + @Index({ unique: true }) + invoice: string + + @Column({ default: false }) + paid: boolean + + @Column() + callbackUrl: string + + @Column({ default: 0 }) + settle_amount: number +} diff --git a/src/services/storage/entity/UserPayment.ts b/src/services/storage/entity/UserPayment.ts new file mode 100644 index 00000000..45d2eb2f --- /dev/null +++ b/src/services/storage/entity/UserPayment.ts @@ -0,0 +1,19 @@ +import { Entity, PrimaryGeneratedColumn, Column, Index, Check, ManyToOne } from "typeorm" +import { User } from "./User" + +@Entity() +export class UserPayment { + + @PrimaryGeneratedColumn() + serial_id: number + + @ManyToOne(type => User) + user: User + + @Column() + @Index({ unique: true }) + invoice: string + + @Column() + amount: number +} diff --git a/src/services/storage/index.ts b/src/services/storage/index.ts new file mode 100644 index 00000000..31088026 --- /dev/null +++ b/src/services/storage/index.ts @@ -0,0 +1,135 @@ +import { DataSource, EntityManager } from "typeorm" +import crypto from 'crypto'; +import NewDB, { DbSettings, LoadDbSettingsFromEnv } from "./db" +import { User } from "./entity/User" +import { UserAddress } from "./entity/UserAddress"; +import { UserInvoice } from "./entity/UserInvoice"; +import { AddressTransaction } from "./entity/AddressTransaction"; +import { UserPayment } from "./entity/UserPayment"; +export type StorageSettings = { + dbSettings: DbSettings +} +export const LoadStorageSettingsFromEnv = (test = false): StorageSettings => { + return { dbSettings: LoadDbSettingsFromEnv(test) } +} + +export default class { + DB: DataSource | EntityManager + settings: StorageSettings + constructor(settings: StorageSettings) { + this.settings = settings + } + async Connect() { + this.DB = await NewDB(this.settings.dbSettings) + } + StartTransaction(exec: (entityManager: EntityManager) => Promise) { + this.DB.transaction(exec) + } + async AddUser(name: string, callbackUrl: string, secret: string, entityManager = this.DB): Promise { + const newUser = entityManager.getRepository(User).create({ + user_id: crypto.randomBytes(32).toString('hex'), + name: name, + callbackUrl: callbackUrl, + secret_sha256: crypto.createHash('sha256').update(secret).digest('base64') + }) + return entityManager.getRepository(User).save(newUser) + } + FindUser(userId: string, entityManager = this.DB) { + return entityManager.getRepository(User).findOne({ + where: { + user_id: userId + } + }) + } + async GetUser(userId: string, entityManager = this.DB): Promise { + const user = await this.FindUser(userId, entityManager) + if (!user) { + throw new Error(`user ${userId} not found`) // TODO: fix logs doxing + } + return user + } + + async AddAddressTransaction(address: string, txHash: string, outputIndex: number, amount: number, entityManager = this.DB) { + const newAddressTransaction = entityManager.getRepository(AddressTransaction).create({ + user_address: { address: address }, + tx_hash: txHash, + output_index: outputIndex, + amount: amount + }) + return entityManager.getRepository(AddressTransaction).save(newAddressTransaction) + } + + async AddUserAddress(userId: string, address: string, callbackUrl = "", entityManager = this.DB): Promise { + const newUserAddress = entityManager.getRepository(UserAddress).create({ + address, + callbackUrl, + user: { user_id: userId } + }) + return entityManager.getRepository(UserAddress).save(newUserAddress) + } + + async FlagInvoiceAsPaid(invoiceSerialId: number, amount: number, entityManager = this.DB) { + return entityManager.getRepository(UserInvoice).update(invoiceSerialId, { paid: true, settle_amount: amount }) + } + + async AddUserInvoice(userId: string, invoice: string, callbackUrl = "", entityManager = this.DB): Promise { + const newUserInvoice = entityManager.getRepository(UserInvoice).create({ + invoice: invoice, + callbackUrl, + user: { user_id: userId } + }) + return entityManager.getRepository(UserInvoice).save(newUserInvoice) + } + + async GetAddressOwner(address: string, entityManager = this.DB): Promise { + return entityManager.getRepository(UserAddress).findOne({ + where: { + address + } + }) + } + + async GetInvoiceOwner(paymentRequest: string, entityManager = this.DB): Promise { + return entityManager.getRepository(UserInvoice).findOne({ + where: { + invoice: paymentRequest + } + }) + } + + async AddUserPayment(userId: string, invoice: string, amount: number, entityManager = this.DB): Promise { + const newPayment = entityManager.getRepository(UserPayment).create({ + user: { user_id: userId }, + amount, + invoice + }) + return entityManager.getRepository(UserPayment).save(newPayment) + } + + LockUser(userId: string, entityManager = this.DB) { + return entityManager.getRepository(User).update({ + user_id: userId + }, { locked: true }) + } + UnlockUser(userId: string, entityManager = this.DB) { + return entityManager.getRepository(User).update({ + user_id: userId + }, { locked: false }) + } + async IncrementUserBalance(userId: string, increment: number, entityManager = this.DB) { + const res = await entityManager.getRepository(User).increment({ + user_id: userId, + }, "balance_sats", increment) + if (!res.affected) { + throw new Error("unaffected balance increment for " + userId) // TODO: fix logs doxing + } + } + async DecrementUserBalance(userId: string, decrement: number, entityManager = this.DB) { + const res = await entityManager.getRepository(User).decrement({ + user_id: userId, + }, "balance_sats", decrement) + if (!res.affected) { + throw new Error("unaffected balance decrement for " + userId) // TODO: fix logs doxing + } + } +} \ No newline at end of file diff --git a/src/sockets.js b/src/sockets.js deleted file mode 100644 index 2e908de4..00000000 --- a/src/sockets.js +++ /dev/null @@ -1,212 +0,0 @@ -/** - * @format - */ -// @ts-check - -const logger = require('../config/log') -const Common = require('shock-common') -const mapValues = require('lodash/mapValues') - -const auth = require('../services/auth/auth') -const LightningServices = require('../utils/lightningServices') -const { isAuthenticated } = require('../services/gunDB/Mediator') -const initGunDBSocket = require('../services/gunDB/sockets') -const { encryptedEmit, encryptedOn } = require('../utils/ECC/socket') -const TipsForwarder = require('../services/tipsCallback') -/** - * @typedef {import('../services/gunDB/Mediator').SimpleSocket} SimpleSocket - * @typedef {import('../services/gunDB/contact-api/SimpleGUN').ValidDataValue} ValidDataValue - */ - -module.exports = ( - /** @type {import('socket.io').Server} */ - io -) => { - io.on('connect', socket => { - const isLNDSocket = !!socket.handshake.auth.IS_LND_SOCKET - const isNotificationsSocket = !!socket.handshake.auth - .IS_NOTIFICATIONS_SOCKET - - if (!isLNDSocket) { - /** printing out the client who joined */ - logger.info('New socket client connected (id=' + socket.id + ').') - } - - if (isLNDSocket) { - const subID = Math.floor(Math.random() * 1000).toString() - const isNotifications = isNotificationsSocket ? 'notifications' : '' - logger.info('[LND] New LND Socket created:' + isNotifications + subID) - } - }) - - io.of('lndstreaming').on('connect', socket => { - // TODO: unsubscription - - /** - * Streaming stuff in LND uses these events: data, status, end, error. - */ - - try { - logger.info( - 'Connect event for socket with handshake: ', - socket.handshake.auth - ) - if (!isAuthenticated()) { - socket.emit(Common.Constants.ErrorCode.NOT_AUTH) - return - } - - const on = encryptedOn(socket) - const emit = encryptedEmit(socket) - - const { services } = LightningServices - - const { - service, - method, - args: unParsed, - isInitial - } = socket.handshake.auth - - if (isInitial) { - return - } - - const args = JSON.parse(unParsed) - - const call = services[service][method](args) - - call.on('data', _data => { - // socket.io serializes buffers differently from express - const data = (() => { - if (!Common.Schema.isObj(_data)) { - return _data - } - - return mapValues(_data, (item, key) => { - if (!(item instanceof Buffer)) { - return item - } - - return item.toJSON() - }) - })() - - emit('data', data) - }) - - call.on('status', status => { - emit('status', status) - }) - - call.on('end', () => { - emit('end') - }) - - call.on('error', err => { - // 'error' is a reserved event name we can't use it - emit('$error', err) - }) - - // Possibly allow streaming writes such as sendPaymentV2 - on('write', args => { - call.write(args) - }) - } catch (err) { - logger.error(err) - logger.error('LNDRPC: ' + err.message) - } - }) - - io.of('gun').on('connect', socket => { - initGunDBSocket(socket) - }) - - /** - * @param {string} token - * @returns {Promise} - */ - const isValidToken = async token => { - const validation = await auth.validateToken(token) - - if (typeof validation !== 'object') { - return false - } - - if (validation === null) { - return false - } - - if (typeof validation.valid !== 'boolean') { - return false - } - - return validation.valid - } - - /** @type {null|NodeJS.Timeout} */ - let pingIntervalID = null - // TODO: Unused? - io.of('shockping').on( - 'connect', - // TODO: make this sync - async socket => { - try { - logger.info('Received connect request for shockping socket') - if (!isAuthenticated()) { - logger.info( - 'not authenticated in gun for shockping socket, will send NOT_AUTH' - ) - socket.emit(Common.Constants.ErrorCode.NOT_AUTH) - - return - } - - logger.info('now checking token') - const { token } = socket.handshake.auth - const isAuth = await isValidToken(token) - - if (!isAuth) { - logger.warn('invalid token for socket ping') - socket.emit(Common.Constants.ErrorCode.NOT_AUTH) - return - } - - if (pingIntervalID !== null) { - logger.error( - 'Tried to set ping socket twice, this might be due to an app restart and the old socket not being recycled by socket.io in time, will disable the older ping interval, which means the old socket wont work and will ping this new socket instead' - ) - clearInterval(pingIntervalID) - pingIntervalID = null - } - - pingIntervalID = setInterval(() => { - socket.emit('shockping') - }, 3000) - - socket.on('disconnect', () => { - logger.warn('ping socket disconnected') - if (pingIntervalID !== null) { - clearInterval(pingIntervalID) - pingIntervalID = null - } - }) - } catch (err) { - logger.error('Error inside shockping connect: ' + err.message) - socket.emit('$error', err.message) - } - } - ) - - io.of('streams').on('connect', socket => { - logger.info('a user connected') - socket.on('accessId', accessId => { - const err = TipsForwarder.addSocket(accessId, socket) - if (err) { - logger.info('err invalid socket for tips notifications ' + err) - socket.disconnect(true) - } - }) - }) - return io -} diff --git a/src/tunnel.js b/src/tunnel.js deleted file mode 100644 index 4d1c2b26..00000000 --- a/src/tunnel.js +++ /dev/null @@ -1,59 +0,0 @@ -const localtunnel = require('localtunnel') -let tunnelRef = null -process.on('message', async (tunnelOpts) => { - const tunnel = await localtunnel(tunnelOpts) - tunnelRef = tunnel - console.log(tunnelOpts) - const {subdomain:tunnelSubdomain} = tunnelOpts - process.send({ type: 'info', tunnel:{ - url:tunnel.url, - token:tunnel.token, - clientId:tunnel.clientId, - } }); - if(tunnelSubdomain !== tunnel.clientId && !tunnel.token){ - console.log("AM killing it yo!") - console.log(tunnel.clientId) - tunnel.close() - // eslint-disable-next-line no-process-exit - process.exit() - } -}); - -setInterval(() => { - process.send({ type: "ping" }); -}, 1000); - - -process.on('uncaughtException', ()=> { - if(tunnelRef){ - console.log("clogin yo") - tunnelRef.close() - } - // eslint-disable-next-line no-process-exit - process.exit() -}); -process.on('SIGINT', ()=>{ - if(tunnelRef){ - console.log("clogin yo") - tunnelRef.close() - } - // eslint-disable-next-line no-process-exit - process.exit()}) -process.on('exit', ()=> { - if(tunnelRef){ - console.log("clogin yo") - tunnelRef.close() - } -}); -/* -const f = async () => { - const tunnelOpts = - { port: 9835, host: 'https://tunnel.rip' , - tunnelToken:'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7InRpbWVzdGFtcCI6MTYxODg2NTAxNjkzNywic3ViZG9tYWluIjoidGVycmlibGUtZWFyd2lnLTU2In0sImlhdCI6MTYxODg2NTAxNiwiZXhwIjo1MjE4ODY1MDE2fQ.m2H4B1NatErRqcriB9lRfusZmLdRee9-VXACfnKT-QY', - subdomain:'terrible-earwig-56' - } - const tunnel = await localtunnel(tunnelOpts) - console.log(tunnel) - tunnelRef = tunnel -} -f()*/ \ No newline at end of file diff --git a/testscript.js b/testscript.js deleted file mode 100644 index 4bb0446f..00000000 --- a/testscript.js +++ /dev/null @@ -1,158 +0,0 @@ -/** - * @format - * Example usage: - * ```bash - * node testcript.js on [user|gun|capdog|{publicKey}].[path] [alias] [pass] - * ``` - * If no alias/pass provided, new user will be created, otherwise gun will - * authenticate with the provided credentials. - */ -// @ts-check -const Gun = require('gun') -const randomWords = require('random-words') - -/** @returns {string} */ -const randomWord = () => { - const word = randomWords() - if (typeof word !== 'string') { - throw new TypeError(`Not string`) - } - return word -} - -require('gun/nts') -require('gun/lib/open') -require('gun/lib/load') - -const args = process.argv.slice(2) - -// eslint-disable-next-line prefer-const -let [method, path, alias, pass] = args - -const fileName = randomWord() - -if (!alias) { - alias = '$$__GENERATE' -} - -if (!pass) { - pass = '$$__GENERATE' -} - -console.log('\n') -console.log(`method: ${method}`) -console.log(`path: ${path}`) -console.log(`fileName: ${fileName}`) -console.log('\n') - -// @ts-expect-error -const gun = /** @type {import('./services/gunDB/contact-api/SimpleGUN').GUNNode} */ (Gun( - { - axe: false, - multicast: false, - peers: ['https://gun.shock.network/gun', 'https://gun-eu.shock.network'], - file: `TESTSCRIPT-RADATA/${fileName}` - } -)) - -const user = gun.user() - -/** - * @param {any} data - * @param {string} key - */ -const cb = (data, key) => { - console.log('\n') - console.log(`key: ${key}`) - console.log('\n') - console.log(data) - console.log('\n') -} - -;(async () => { - try { - // gun - // .get('handshakeNodes') - // .map() - // .once(cb) - - // wait for user data to be received - // await new Promise(res => setTimeout(res, 10000)) - - const ack = await new Promise(res => { - if (alias === '$$__GENERATE' || pass === '$$__GENERATE') { - alias = randomWord() - pass = randomWord() - console.log(`alias: ${alias}`) - console.log(`pass: ${pass}`) - - user.create(alias, pass, _ack => { - res(_ack) - }) - } else { - user.auth(alias, pass, _ack => { - res(_ack) - }) - } - }) - - if (typeof ack.err === 'string') { - throw new Error(ack.err) - } else if (typeof ack.pub === 'string' || typeof user._.sea === 'object') { - console.log(`\n`) - console.log(`public key:`) - console.log(`\n`) - console.log(ack.pub || user._.sea.pub) - console.log(`\n`) - - // clock skew - await new Promise(res => setTimeout(res, 2000)) - } else { - throw new Error('unknown error, ack: ' + JSON.stringify(ack)) - } - - const [root, ...keys] = path.split('.') - - let node = (() => { - if (root === 'gun') { - return gun - } - if (root === 'user') { - return user - } - if (root === 'capdog') { - return gun.user( - 'qsgziGQS99sPUxV1CRwwRckn9cG6cJ3prbDsrbL7qko.oRbCaVKwJFQURWrS1pFhkfAzrkEvkQgBRIUz9uoWtrg' - ) - } - if (root === 'explorador') { - return gun.user( - `zBQkPb1ohbdjVp_29TKFXyv_0g3amKgRJRqKr0E-Oyk.yB1P4UmOrzkGuPEL5zUgLETJWyYpM9K3l2ycNlt8jiY` - ) - } - if (root === 'pleb') { - return gun.user( - `e1C60yZ1Cm3Mkceq7L9SmH6QQ7zsDdbibPFeQz7tNsk._1VlqJNo8BIJmzz2D5WELiMiRjBh3DBlDvzC6fNltZw` - ) - } - if (root === 'boblazar') { - return gun.user( - `g6fcZ_1zyFwV1jR1eNK1GTUr2sSlEDL1D5vBsSvKoKg.2OA9MQHO2c1wjv6L-VPBFf36EZXjgQ1nnZFbOE9_5-o` - ) - } - - return gun.user(root) - })() - - keys.forEach(key => (node = node.get(key))) - - if (method === 'once') node.once(cb) - if (method === 'load') node.load(cb) - if (method === 'on') node.on(cb) - if (method === 'map.once') node.map().once(cb) - if (method === 'map.on') node.map().on(cb) - } catch (e) { - console.log(`\nCaught error in app:\n`) - console.log(e) - } -})() diff --git a/testy.json b/testy.json new file mode 100644 index 00000000..e4218f58 --- /dev/null +++ b/testy.json @@ -0,0 +1 @@ +{"include":["**/*.spec.ts"]} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 9ee816c3..7e549e23 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,66 +1,68 @@ { - "include": ["./services/gunDB/**/*.*", "./utils/lightningServices/**/*.*"], - "exclude": ["./node_modules/**/*.*"], - "compilerOptions": { - /* Basic Options */ - // "incremental": true, /* Enable incremental compilation */ - "target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */, - "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, - // "lib": [], /* Specify library files to be included in the compilation. */ - "allowJs": true /* Allow javascript files to be compiled. */, - "checkJs": true /* Report errors in .js files. */, - // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ - // "declaration": true, /* Generates corresponding '.d.ts' file. */ - // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ - // "sourceMap": true, /* Generates corresponding '.map' file. */ - // "outFile": "./", /* Concatenate and emit output to single file. */ - // "outDir": "./", /* Redirect output structure to the directory. */ - // "rootDir": "./" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, - // "composite": true, /* Enable project compilation */ - // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ - // "removeComments": true, /* Do not emit comments to output. */ - "noEmit": true /* Do not emit outputs. */, - // "importHelpers": true, /* Import emit helpers from 'tslib'. */ - "downlevelIteration": true /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */, - // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ - - /* Strict Type-Checking Options */ - "strict": true /* Enable all strict type-checking options. */, - "noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */, - "strictNullChecks": true /* Enable strict null checks. */, - "strictFunctionTypes": true /* Enable strict checking of function types. */, - "strictBindCallApply": true /* Enable strict 'bind', 'call', and 'apply' methods on functions. */, - "strictPropertyInitialization": true /* Enable strict checking of property initialization in classes. */, - "noImplicitThis": true /* Raise error on 'this' expressions with an implied 'any' type. */, - "alwaysStrict": true /* Parse in strict mode and emit "use strict" for each source file. */, - - /* Additional Checks */ - "noUnusedLocals": true /* Report errors on unused locals. */, - "noUnusedParameters": true /* Report errors on unused parameters. */, - "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, - "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, - - /* Module Resolution Options */ - // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ - // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ - // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ - // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ - // "typeRoots": [], /* List of folders to include type definitions from. */ - // "types": [], /* Type declaration files to be included in compilation. */ - // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ - "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, - // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - - /* Source Map Options */ - // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ - // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ - - /* Experimental Options */ - // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ - // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ - "useUnknownInCatchVariables": false - } -} + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "ES2020" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */, + "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */ + // "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + "sourceMap": true /* Generates corresponding '.map' file. */, + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "build" /* Redirect output structure to the directory. */, + // "rootDir": "src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + /* Strict Type-Checking Options */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + "strictPropertyInitialization": false /* Enable strict checking of property initialization in classes. */, + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an 'override' modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */ + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + /* Experimental Options */ + "experimentalDecorators": true /* Enables experimental support for ES7 decorators. */, + "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */, + /* Advanced Options */ + "skipLibCheck": true /* Skip type checking of declaration files. */, + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + }, + "exclude": [ + "./tests" + ], +} \ No newline at end of file diff --git a/utils/ECC/ECC.js b/utils/ECC/ECC.js deleted file mode 100644 index e72db2e5..00000000 --- a/utils/ECC/ECC.js +++ /dev/null @@ -1,233 +0,0 @@ -/** @format */ -const Storage = require('node-persist') -const { fork } = require('child_process') - -const FieldError = require('../fieldError') -const logger = require('../../config/log') -const { - generateRandomString, - convertBufferToBase64, - processKey, - convertToEncryptedMessageResponse, - convertUTF8ToBuffer, - convertToEncryptedMessage, - convertBase64ToBuffer -} = require('./crypto') -const { invoke } = require('./subprocess') - -const cryptoSubprocess = fork('utils/ECC/subprocess') - -const nodeKeyPairs = new Map() -const devicePublicKeys = new Map() - -/** - * @typedef {object} EncryptedMessage - * @prop {string} ciphertext - * @prop {string} iv - * @prop {string} mac - * @prop {string} ephemPublicKey - */ - -/** - * Checks if the message supplied is encrypted or not - * @param {EncryptedMessage} message - */ -const isEncryptedMessage = message => - message && - message.ciphertext && - message.iv && - message.mac && - message.ephemPublicKey - -/** - * @typedef {object} Pair - * @prop {Buffer} privateKey - * @prop {Buffer} publicKey - * @prop {string} privateKeyBase64 - * @prop {string} publicKeyBase64 - */ - -/** - * Generates a new encryption key pair that will be used - * when communicating with the deviceId specified - * @param {string} deviceId - * @returns {Promise} - */ -const generateKeyPair = async deviceId => { - try { - const existingKey = nodeKeyPairs.get(deviceId) - - if (existingKey) { - logger.info('Device ID is already trusted') - return { - ...existingKey, - publicKeyBase64: convertBufferToBase64(existingKey.publicKey), - privateKeyBase64: convertBufferToBase64(existingKey.privateKey) - } - } - - const privateKey = await invoke('generatePrivate', [], cryptoSubprocess) - const publicKey = await invoke('getPublic', [privateKey], cryptoSubprocess) - const privateKeyBase64 = convertBufferToBase64(privateKey) - const publicKeyBase64 = convertBufferToBase64(publicKey) - - if (!Buffer.isBuffer(privateKey) || !Buffer.isBuffer(publicKey)) { - throw new Error('Invalid KeyPair Generated') - } - - nodeKeyPairs.set(deviceId, { - privateKey, - publicKey - }) - - return { - privateKey, - publicKey, - privateKeyBase64, - publicKeyBase64 - } - } catch (err) { - logger.error( - '[ENCRYPTION] An error has occurred while generating a new KeyPair', - err - ) - logger.error('Device ID:', deviceId) - - throw err - } -} - -/** - * Checks if the specified device has a keypair generated - * @param {{ deviceId: string }} arg0 - */ -const isAuthorizedDevice = ({ deviceId }) => devicePublicKeys.has(deviceId) - -/** - * Generates a new keypair for the deviceId specified and - * saves its publicKey locally - * @param {{ deviceId: string, publicKey: string }} arg0 - */ -const authorizeDevice = async ({ deviceId, publicKey }) => { - const hostId = await Storage.get('encryption/hostId') - devicePublicKeys.set(deviceId, convertBase64ToBuffer(publicKey)) - const keyPair = await generateKeyPair(deviceId) - - return { - success: true, - APIPublicKey: keyPair.publicKeyBase64, - hostId - } -} - -/** - * Encrypts the specified message using the specified deviceId's - * public key - * @param {{ deviceId: string, message: string | number | boolean }} arg0 - * @returns {Promise} - */ -const encryptMessage = async ({ message = '', deviceId }) => { - const parsedMessage = message.toString() - // decryptMessage checks for known devices while this one checks for - // authorized ones instead, why? - const publicKey = devicePublicKeys.get(deviceId) - - if (!publicKey) { - throw new FieldError({ - field: 'deviceId', - message: 'encryptMessage() -> Unauthorized Device ID detected' - }) - } - - const processedPublicKey = processKey(publicKey) - const messageBuffer = convertUTF8ToBuffer(parsedMessage) - const encryptedMessage = await invoke( - 'encrypt', - [processedPublicKey, messageBuffer], - cryptoSubprocess - ) - - const encryptedMessageResponse = { - ciphertext: encryptedMessage.ciphertext, - iv: encryptedMessage.iv, - mac: encryptedMessage.mac, - ephemPublicKey: encryptedMessage.ephemPublicKey, - metadata: { - _deviceId: deviceId, - _publicKey: publicKey - } - } - - return convertToEncryptedMessageResponse(encryptedMessageResponse) -} - -/** - * Decrypts the specified message using the API keypair - * associated with the specified deviceId - * @param {{ encryptedMessage: import('./crypto').EncryptedMessageResponse, deviceId: string }} arg0 - */ -const decryptMessage = async ({ encryptedMessage, deviceId }) => { - // encryptMessages checks for authorized devices while this one checks for - // known ones, why? - const keyPair = nodeKeyPairs.get(deviceId) - try { - if (!keyPair) { - throw new FieldError({ - field: 'deviceId', - message: 'decryptMessage() -> Unknown Device ID detected' - }) - } - - const processedPrivateKey = processKey(keyPair.privateKey) - const decryptedMessage = await invoke( - 'decrypt', - [processedPrivateKey, convertToEncryptedMessage(encryptedMessage)], - cryptoSubprocess - ) - const parsedMessage = decryptedMessage.toString('utf8') - - return parsedMessage - } catch (err) { - logger.error(err) - if (err.message?.toLowerCase() === 'bad mac') { - logger.error( - 'Bad Mac!', - err, - convertToEncryptedMessage(encryptedMessage), - !!keyPair - ) - } - throw err - } -} - -/** - * @returns {Promise} - */ -const generatePrivate = () => invoke('generatePrivate', [], cryptoSubprocess) - -/** - * @param {Buffer} priv - * @returns {Promise} - */ -const getPublic = priv => invoke('getPublic', [priv], cryptoSubprocess) - -module.exports = { - isAuthorizedDevice, - isEncryptedMessage, - generateKeyPair, - encryptMessage, - decryptMessage, - authorizeDevice, - generateRandomString, - nodeKeyPairs, - devicePublicKeys, - generatePrivate, - getPublic, - /** - * Used for tests. - */ - killECCCryptoSubprocess() { - cryptoSubprocess.kill() - } -} diff --git a/utils/ECC/ECC.spec.js b/utils/ECC/ECC.spec.js deleted file mode 100644 index 5c4bff45..00000000 --- a/utils/ECC/ECC.spec.js +++ /dev/null @@ -1,147 +0,0 @@ -/** - * @format - */ -// @ts-check -const Path = require('path') -const Storage = require('node-persist') -const expect = require('expect') -const words = require('random-words') - -const { - authorizeDevice, - decryptMessage, - encryptMessage, - generateKeyPair, - isAuthorizedDevice, - killECCCryptoSubprocess, - generatePrivate, - getPublic -} = require('./ECC') - -const uuid = () => { - const arr = /** @type {string[]} */ (words({ exactly: 24 })) - return arr.join('-') -} - -const storageDirectory = Path.resolve(__dirname, `./.test-storage`) - -console.log(`Storage directory: ${storageDirectory}`) - -describe('ECC', () => { - describe('generateKeyPair()', () => { - it('generates a keypair', async () => { - expect.hasAssertions() - const pair = await generateKeyPair(uuid()) - - expect(pair.privateKey).toBeInstanceOf(Buffer) - expect(typeof pair.privateKeyBase64 === 'string').toBeTruthy() - expect(pair.publicKey).toBeInstanceOf(Buffer) - expect(typeof pair.publicKeyBase64 === 'string').toBeTruthy() - }) - it('returns the same pair for the same device', async () => { - expect.hasAssertions() - const id = uuid() - const pair = await generateKeyPair(id) - const pairAgain = await generateKeyPair(id) - - expect(pairAgain).toStrictEqual(pair) - }) - }) - - describe('authorizeDevice()/isAuthorizedDevice()', () => { - it('authorizes a device given its ID', async () => { - expect.hasAssertions() - await Storage.init({ - dir: storageDirectory - }) - const deviceId = uuid() - const pair = await generateKeyPair(deviceId) - await authorizeDevice({ deviceId, publicKey: pair.publicKeyBase64 }) - expect(isAuthorizedDevice({ deviceId })).toBeTruthy() - }) - }) - - describe('encryptMessage()/decryptMessage()', () => { - before(() => - Storage.init({ - dir: storageDirectory - }) - ) - it('throws if provided with an unauthorized device id when encrypting', async () => { - expect.hasAssertions() - const deviceId = uuid() - - try { - await encryptMessage({ - message: uuid(), - deviceId - }) - throw new Error('encryptMessage() did not throw') - } catch (_) { - expect(true).toBeTruthy() - } - }) - it('throws if provided with an unknown device id when decrypting', async () => { - expect.hasAssertions() - const deviceId = uuid() - - try { - await decryptMessage({ - deviceId, - encryptedMessage: { - ciphertext: uuid(), - ephemPublicKey: uuid(), - iv: uuid(), - mac: uuid(), - metadata: uuid() - } - }) - throw new Error('decryptMessage() did not throw') - } catch (_) { - expect(true).toBeTruthy() - } - }) - it('encrypts and decrypts messages when given a known device id', async () => { - expect.hasAssertions() - const deviceId = uuid() - - const pair = await generateKeyPair(deviceId) - - await authorizeDevice({ deviceId, publicKey: pair.publicKeyBase64 }) - - const message = 'Bitcoin fixes this' - - const encryptedMessage = await encryptMessage({ deviceId, message }) - - const decrypted = await decryptMessage({ - deviceId, - encryptedMessage - }) - - expect(decrypted).toEqual(message) - }) - }) - - describe('generatePrivate()', () => { - it('generates a private key', async () => { - expect.hasAssertions() - - const priv = await generatePrivate() - - expect(priv).toBeInstanceOf(Buffer) - }) - }) - - describe('getPublic()', () => { - it('derives a public key from a private key', async () => { - expect.hasAssertions() - - const priv = await generatePrivate() - const pub = await getPublic(priv) - - expect(pub).toBeInstanceOf(Buffer) - }) - }) - - after(killECCCryptoSubprocess) -}) diff --git a/utils/ECC/crypto.js b/utils/ECC/crypto.js deleted file mode 100644 index 7f17e6f8..00000000 --- a/utils/ECC/crypto.js +++ /dev/null @@ -1,146 +0,0 @@ -/** - * @format - */ -const { Buffer } = require('buffer') -const { fork } = require('child_process') - -const FieldError = require('../fieldError') - -const { invoke } = require('./subprocess') - -const cryptoSubprocess = fork('utils/ECC/subprocess') - -/** - * @typedef {object} EncryptedMessageBuffer - * @prop {Buffer} ciphertext - * @prop {Buffer} iv - * @prop {Buffer} mac - * @prop {Buffer} ephemPublicKey - * @prop {any?} metadata - */ - -/** - * @typedef {object} EncryptedMessageResponse - * @prop {string} ciphertext - * @prop {string} iv - * @prop {string} mac - * @prop {string} ephemPublicKey - * @prop {any?} metadata - */ - -const generateRandomString = async (length = 16) => { - if (length % 2 !== 0 || length < 2) { - throw new Error('Random string length must be an even number.') - } - - const res = await invoke('generateRandomString', [length], cryptoSubprocess) - - return res -} - -/** - * @param {string} value - */ -const convertUTF8ToBuffer = value => Buffer.from(value, 'utf-8') - -/** - * @param {string} value - */ -const convertBase64ToBuffer = value => Buffer.from(value, 'base64') - -/** - * @param {Buffer} buffer - */ -const convertBufferToBase64 = buffer => buffer.toString('base64') - -/** - * @param {Buffer | string} key - */ -const processKey = key => { - if (Buffer.isBuffer(key)) { - return key - } - const convertedKey = convertBase64ToBuffer(key) - return convertedKey -} - -/** - * @param {EncryptedMessageBuffer | EncryptedMessageResponse} encryptedMessage - * @returns {EncryptedMessageResponse} - */ -const convertToEncryptedMessageResponse = encryptedMessage => { - if ( - Buffer.isBuffer(encryptedMessage.ciphertext) && - Buffer.isBuffer(encryptedMessage.iv) && - Buffer.isBuffer(encryptedMessage.mac) && - Buffer.isBuffer(encryptedMessage.ephemPublicKey) - ) { - return { - ciphertext: convertBufferToBase64(encryptedMessage.ciphertext), - iv: convertBufferToBase64(encryptedMessage.iv), - mac: convertBufferToBase64(encryptedMessage.mac), - ephemPublicKey: convertBufferToBase64(encryptedMessage.ephemPublicKey), - metadata: encryptedMessage.metadata - } - } - - if (typeof encryptedMessage.ciphertext === 'string') { - // @ts-ignore - return encryptedMessage - } - - throw new FieldError({ - field: 'encryptedMessage', - message: 'Unknown encrypted message format' - }) -} - -/** - * @param {EncryptedMessageBuffer | EncryptedMessageResponse} encryptedMessage - * @returns {EncryptedMessageBuffer} - */ -const convertToEncryptedMessage = encryptedMessage => { - if ( - encryptedMessage.ciphertext instanceof Buffer && - encryptedMessage.iv instanceof Buffer && - encryptedMessage.mac instanceof Buffer && - encryptedMessage.ephemPublicKey instanceof Buffer - ) { - // @ts-ignore - return encryptedMessage - } - if ( - typeof encryptedMessage.ciphertext === 'string' && - typeof encryptedMessage.iv === 'string' && - typeof encryptedMessage.mac === 'string' && - typeof encryptedMessage.ephemPublicKey === 'string' - ) { - return { - ciphertext: convertBase64ToBuffer(encryptedMessage.ciphertext), - iv: convertBase64ToBuffer(encryptedMessage.iv), - mac: convertBase64ToBuffer(encryptedMessage.mac), - ephemPublicKey: convertBase64ToBuffer(encryptedMessage.ephemPublicKey), - metadata: encryptedMessage.metadata - } - } - throw new FieldError({ - field: 'encryptedMessage', - message: 'Unknown encrypted message format' - }) -} - -module.exports = { - generateRandomString, - convertUTF8ToBuffer, - convertBase64ToBuffer, - convertBufferToBase64, - convertToEncryptedMessage, - convertToEncryptedMessageResponse, - processKey, - /** - * Used for tests. - */ - killCryptoCryptoSubprocess() { - cryptoSubprocess.kill() - } -} diff --git a/utils/ECC/crypto.spec.js b/utils/ECC/crypto.spec.js deleted file mode 100644 index 1b9c3175..00000000 --- a/utils/ECC/crypto.spec.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @format - */ -// @ts-check -const expect = require('expect') - -const { - generateRandomString, - convertBase64ToBuffer, - convertBufferToBase64, - killCryptoCryptoSubprocess -} = require('./crypto') - -describe('crypto', () => { - describe('generateRandomString()', () => { - it('creates a random string of the specified length', async () => { - expect.hasAssertions() - const base = Math.ceil(Math.random() * 100) - const len = base % 2 !== 0 ? base + 1 : base - const result = await generateRandomString(len) - - expect(result.length).toEqual(len) - }) - }) - - describe('Buffer <> String <> Buffer', () => { - it('preserves values', async () => { - const rnd = await generateRandomString(24) - - const asBuffer = convertBase64ToBuffer(rnd) - - const asStringAgain = convertBufferToBase64(asBuffer) - - expect(asStringAgain).toEqual(rnd) - }) - }) - - after(killCryptoCryptoSubprocess) -}) diff --git a/utils/ECC/index.js b/utils/ECC/index.js deleted file mode 100644 index b31f01d1..00000000 --- a/utils/ECC/index.js +++ /dev/null @@ -1,8 +0,0 @@ -/** - * @format - */ -//@ts-check - -module.exports = require('./ECC') - -module.exports.convertToEncryptedMessage = require('./crypto').convertToEncryptedMessage diff --git a/utils/ECC/socket.js b/utils/ECC/socket.js deleted file mode 100644 index 58539a67..00000000 --- a/utils/ECC/socket.js +++ /dev/null @@ -1,208 +0,0 @@ -/** - * @format - */ -const Common = require('shock-common') -const logger = require('../../config/log') -const { safeParseJSON } = require('../JSON') -const ECC = require('./index') - -const nonEncryptedEvents = [ - 'ping', - 'disconnect', - 'IS_GUN_AUTH', - 'SET_LAST_SEEN_APP', - Common.Constants.ErrorCode.NOT_AUTH -] - -/** - * @typedef {import('../../services/gunDB/Mediator').SimpleSocket} SimpleSocket - * @typedef {import('../../services/gunDB/Mediator').Emission} Emission - * @typedef {import('../../services/gunDB/Mediator').EncryptedEmission} EncryptedEmission - * @typedef {import('../../services/gunDB/Mediator').EncryptedEmissionLegacy} EncryptedEmissionLegacy - * @typedef {import('../../services/gunDB/contact-api/SimpleGUN').ValidDataValue} ValidDataValue - * @typedef {(data: any, callback: (error?: any, data?: any) => void) => void} SocketOnListener - */ - -/** - * @param {string} eventName - */ -const isNonEncrypted = eventName => - nonEncryptedEvents.includes(eventName) || - process.env.SHOCK_ENCRYPTION_ECC === 'false' - -/** - * @param {SimpleSocket} socket - * @returns {(eventName: string, ...args: any[]) => Promise} - */ -const encryptedEmit = socket => async (eventName, ...args) => { - try { - if (isNonEncrypted(eventName)) { - return socket.emit(eventName, ...args) - } - - const deviceId = socket.handshake.auth.encryptionId - - if (!deviceId) { - throw { - field: 'deviceId', - message: 'Please specify a device ID' - } - } - - const authorized = ECC.isAuthorizedDevice({ deviceId }) - - if (!authorized) { - throw { - field: 'deviceId', - message: 'Please exchange keys with the API before using the socket' - } - } - - const encryptedArgs = await Promise.all( - args.map(async data => { - if (!data) { - return data - } - - const encryptedMessage = await ECC.encryptMessage({ - message: typeof data === 'object' ? JSON.stringify(data) : data, - deviceId - }) - - return encryptedMessage - }) - ) - - return socket.emit(eventName, ...encryptedArgs) - } catch (err) { - logger.error( - `[SOCKET] An error has occurred while encrypting an event (${eventName}):`, - err - ) - - return socket.emit('encryption:error', err) - } -} - -/** - * @param {SimpleSocket} socket - * @returns {(eventName: string, callback: SocketOnListener) => void} - */ -const encryptedOn = socket => (eventName, callback) => { - try { - if (isNonEncrypted(eventName)) { - socket.on(eventName, callback) - return - } - - const deviceId = socket.handshake.auth.encryptionId - - if (!deviceId) { - throw { - field: 'deviceId', - message: 'Please specify a device ID' - } - } - - const authorized = ECC.isAuthorizedDevice({ deviceId }) - - if (!authorized) { - throw { - field: 'deviceId', - message: 'Please exchange keys with the API before using the socket' - } - } - - socket.on(eventName, async (data, response) => { - try { - if (isNonEncrypted(eventName)) { - callback(data, response) - return - } - - if (data) { - const decryptedMessage = await ECC.decryptMessage({ - deviceId, - encryptedMessage: data - }) - - callback(safeParseJSON(decryptedMessage), response) - return - } - - callback(data, response) - } catch (err) { - logger.error( - `[SOCKET] An error has occurred while decrypting an event (${eventName}):`, - err - ) - - socket.emit('encryption:error', err) - } - }) - } catch (err) { - socket.emit('encryption:error', err) - } -} - -/** - * @param {SimpleSocket} socket - * @param {(error?: any, data?: any) => void} callback - * @returns {(...args: any[]) => Promise} - */ -const encryptedCallback = (socket, callback) => async (...args) => { - try { - if (process.env.SHOCK_ENCRYPTION_ECC === 'false') { - return callback(...args) - } - - const deviceId = socket.handshake.auth.encryptionId - - if (!deviceId) { - throw { - field: 'deviceId', - message: 'Please specify a device ID' - } - } - - const authorized = ECC.isAuthorizedDevice({ deviceId }) - - if (!authorized) { - throw { - field: 'deviceId', - message: 'Please exchange keys with the API before using the socket' - } - } - - const encryptedArgs = await Promise.all( - args.map(async data => { - if (!data) { - return data - } - - const encryptedMessage = await ECC.encryptMessage({ - message: typeof data === 'object' ? JSON.stringify(data) : data, - deviceId - }) - - return encryptedMessage - }) - ) - - return callback(...encryptedArgs) - } catch (err) { - logger.error( - `[SOCKET] An error has occurred while emitting an event response:`, - err - ) - - return socket.emit('encryption:error', err) - } -} - -module.exports = { - isNonEncrypted, - encryptedOn, - encryptedEmit, - encryptedCallback -} diff --git a/utils/ECC/subprocess.js b/utils/ECC/subprocess.js deleted file mode 100644 index 987ee279..00000000 --- a/utils/ECC/subprocess.js +++ /dev/null @@ -1,183 +0,0 @@ -/** - * @format - */ -const Crypto = require('crypto') -const ECCrypto = require('eccrypto') -const uuid = require('uuid/v1') -const { Buffer } = require('buffer') -const mapValues = require('lodash/mapValues') - -const logger = require('../../config/log') - -logger.info('crypto subprocess invoked') - -process.on('uncaughtException', e => { - logger.error('Uncaught exception inside crypto subprocess:') - logger.error(e) -}) - -process.on('unhandledRejection', e => { - logger.error('Unhandled rejection inside crypto subprocess:') - logger.error(e) -}) - -/** - * @typedef {'generateRandomString' | 'convertUTF8ToBuffer' - * | 'convertBase64ToBuffer' | 'convertBufferToBase64' | 'generatePrivate' - * | 'getPublic' | 'encrypt' | 'decrypt' - * } Method - */ - -/** - * @param {any} obj - * @returns {any} - */ -const processBufferAfterSerialization = obj => { - if (typeof obj === 'object' && obj !== null) { - if (obj.type === 'Buffer') { - return Buffer.from(obj.data) - } - return mapValues(obj, processBufferAfterSerialization) - } - return obj -} - -/** - * @typedef {object} Msg - * @prop {any[]} args - * @prop {string} id - * @prop {Method} method - */ - -/** - * @param {Msg} msg - */ -const handleMsg = async msg => { - if (typeof msg !== 'object' || msg === null) { - logger.error('Msg in crypto subprocess not an object') - } - - const { id, method } = msg - const args = msg.args.map(processBufferAfterSerialization) - - try { - if (method === 'generateRandomString') { - const [length] = args - - Crypto.randomBytes(length / 2, (err, buffer) => { - if (err) { - // @ts-expect-error - process.send({ - id, - err: err.message - }) - return - } - - const token = buffer.toString('hex') - // @ts-expect-error - process.send({ - id, - payload: token - }) - }) - } - if (method === 'convertUTF8ToBuffer') { - const [value] = args - - // @ts-expect-error - process.send({ - id, - payload: Buffer.from(value, 'utf8') - }) - } - if (method === 'convertBase64ToBuffer') { - const [value] = args - - // @ts-expect-error - process.send({ - id, - payload: Buffer.from(value, 'base64') - }) - } - if (method === 'convertBufferToBase64') { - const [buffer] = args - - // @ts-expect-error - process.send({ - id, - payload: buffer.toString('base64') - }) - } - if (method === 'generatePrivate') { - // @ts-expect-error - process.send({ - id, - payload: ECCrypto.generatePrivate() - }) - } - if (method === 'getPublic') { - const [privateKey] = args - // @ts-expect-error - process.send({ - id, - payload: ECCrypto.getPublic(privateKey) - }) - } - if (method === 'encrypt') { - const [processedPublicKey, messageBuffer] = args - // @ts-expect-error - process.send({ - id, - payload: await ECCrypto.encrypt(processedPublicKey, messageBuffer) - }) - } - if (method === 'decrypt') { - const [processedPrivateKey, encryptedMessage] = args - // @ts-expect-error - process.send({ - id, - payload: await ECCrypto.decrypt(processedPrivateKey, encryptedMessage) - }) - } - } catch (e) { - // @ts-expect-error - process.send({ - err: e.message - }) - } -} - -process.on('message', handleMsg) - -/** - * @param {Method} method - * @param {any[]} args - * @param {import('child_process').ChildProcess} cryptoSubprocess - * @returns {Promise} - */ -const invoke = (method, args, cryptoSubprocess) => - new Promise((res, rej) => { - const id = uuid() - /** @param {any} msg */ - const listener = msg => { - if (msg.id === id) { - cryptoSubprocess.off('message', listener) - if (msg.err) { - rej(new Error(msg.err)) - } else { - res(processBufferAfterSerialization(msg.payload)) - } - } - } - cryptoSubprocess.on('message', listener) - cryptoSubprocess.send({ - args, - id, - method - }) - }) - -module.exports = { - invoke -} diff --git a/utils/GunSmith/GunSmith.js b/utils/GunSmith/GunSmith.js deleted file mode 100644 index a13a7b3d..00000000 --- a/utils/GunSmith/GunSmith.js +++ /dev/null @@ -1,767 +0,0 @@ -/** - * @format - */ -/* eslint-disable no-use-before-define */ -/* eslint-disable func-style */ -// @ts-no-check TODO: Temporarily disabled TS checking due to new GunDB version -/// -/// -const uuid = require('uuid/v1') -const mapValues = require('lodash/mapValues') -const { fork } = require('child_process') - -const logger = require('../../config/log') - -const { mergePuts, isPopulated } = require('./misc') - -const gunUUID = () => { - // Copied from gun internals - let s = '' - let l = 24 // you are not going to make a 0 length random number, so no need to check type - const c = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXZabcdefghijklmnopqrstuvwxyz' - while (l > 0) { - s += c.charAt(Math.floor(Math.random() * c.length)) - l-- - } - return s -} - -/** - * Maps a path to `on()` listeners - * @type {Record|undefined>} - */ -const pathToListeners = {} - -/** - * Maps a path to `map().on()` listeners - * @type {Record|undefined>} - */ -const pathToMapListeners = {} - -/** @type {Record} */ -const idToLoadListener = {} - -/** - * Path to pending puts. Oldest to newest - * @type {Record} - */ -const pendingPuts = {} - -/** - * @param {Smith.GunMsg} msg - */ -const handleMsg = msg => { - if (msg.type === 'load') { - const { data, id, key } = msg - - const listener = idToLoadListener[id] - - if (listener) { - listener(data, key) - delete idToLoadListener[id] - } - } - if (msg.type === 'on') { - const { data, path } = msg - - // eslint-disable-next-line no-multi-assign - const listeners = - pathToListeners[path] || (pathToListeners[path] = new Set()) - - for (const l of listeners) { - l(data, path.split('>')[path.split('>').length - 1]) - } - } - if (msg.type === 'map.on') { - const { data, key, path } = msg - - // eslint-disable-next-line no-multi-assign - const listeners = - pathToMapListeners[path] || (pathToMapListeners[path] = new Set()) - - for (const l of listeners) { - l(data, key) - } - } - if (msg.type === 'put') { - const { ack, id, path } = msg - - const pendingPutsForPath = pendingPuts[path] || (pendingPuts[path] = []) - - const pendingPut = pendingPutsForPath.find(pp => pp.id === id) - const idx = pendingPutsForPath.findIndex(pp => pp.id === id) - - if (pendingPut) { - pendingPutsForPath.splice(idx, 1) - - if (pendingPut.cb) { - pendingPut.cb(ack) - } - } else { - logger.error( - `Could not find request for put message from gun subprocess. Data will be logged below.` - ) - console.log({ - msg, - pendingPut: pendingPut || 'No pending put found', - allPendingPuts: pendingPuts - }) - } - } - if (msg.type === 'multiPut') { - const { ack, ids, path } = msg - - const pendingPutsForPath = pendingPuts[path] || (pendingPuts[path] = []) - - const ackedPuts = pendingPutsForPath.filter(pp => ids.includes(pp.id)) - - pendingPuts[path] = pendingPuts[path].filter(pp => !ids.includes(pp.id)) - - ackedPuts.forEach(pp => { - if (pp.cb) { - pp.cb(ack) - } - }) - } -} - -/** @type {ReturnType} */ -// eslint-disable-next-line init-declarations -let currentGun - -let lastAlias = '' -let lastPass = '' -/** @type {GunT.UserPair|null} */ -let lastPair = null -/** @type {import('gun/types/gun/IGunConstructorOptions').IGunConstructorOptions} */ -let lastOpts = {} -let isAuthing = false - -/** - * @param {string} alias - * @param {string} pass - * @returns {Promise} - */ -const auth = (alias, pass) => { - logger.info(`Authing with ${alias}`) - if (isAuthing) { - throw new Error(`Double auth?`) - } - isAuthing = true - return new Promise((res, rej) => { - /** @type {Smith.SmithMsgAuth} */ - const msg = { - alias, - pass, - type: 'auth' - } - - /** @param {Smith.GunMsg} msg */ - const _cb = msg => { - if (msg.type === 'auth') { - logger.info(`Received ${msg.ack.sea ? 'ok' : 'bad'} auth reply.`) - currentGun.off('message', _cb) - - isAuthing = false - - const { ack } = msg - - if (ack.err) { - lastAlias = '' - lastPass = '' - lastPair = null - logger.info('Auth unsuccessful, cached credentials cleared.') - rej(new Error(ack.err)) - } else if (ack.sea) { - lastAlias = alias - lastPass = pass - lastPair = ack.sea - logger.info('Auth successful, credentials cached.') - res(ack.sea) - } else { - lastAlias = '' - lastPass = '' - lastPair = null - logger.info('Auth unsuccessful, cached credentials cleared.') - rej(new Error('Auth: ack.sea undefined')) - } - } - } - currentGun.on('message', _cb) - currentGun.send(msg) - logger.info('Sent auth message.') - }) -} - -const autoAuth = async () => { - if (!lastAlias || !lastPass) { - logger.info('No credentials cached, will not auto-auth') - return - } - logger.info('Credentials cached, will auth.') - await auth(lastAlias, lastPass) -} - -const flushPendingPuts = () => { - if (isAuthing || isForging) { - throw new Error('Tried to flush pending puts while authing or forging.') - } - const ids = mapValues(pendingPuts, pendingPutsForPath => - pendingPutsForPath.map(pp => pp.id) - ) - const writes = mapValues(pendingPuts, pendingPutsForPath => - pendingPutsForPath.map(pp => pp.data) - ) - const finalWrites = mapValues(writes, writesForPath => - mergePuts(writesForPath) - ) - const messages = Object.entries(ids).map(([path, ids]) => { - /** @type {Smith.SmithMsgMultiPut} */ - const msg = { - data: finalWrites[path], - ids, - path, - type: 'multiPut' - } - return msg - }) - currentGun.send(messages) - logger.info(`Sent ${messages.length} pending puts.`) -} - -let isForging = false - -/** @returns {Promise} */ -const isReady = () => - new Promise(res => { - if (isForging || isAuthing) { - setTimeout(() => { - isReady().then(res) - }, 1000) - } else { - res() - } - }) - -let procCounter = 0 - -let killed = false - -const forge = () => { - ;(async () => { - if (killed) { - throw new Error('Tried to forge after killing GunSmith') - } - logger.info(`Forging Gun # ${++procCounter}`) - if (isForging) { - throw new Error('Double forge?') - } - - /** Used only for logs. */ - const isReforge = !!currentGun - - logger.info(isReforge ? 'Will reforge' : 'Will forge') - - isForging = true - if (currentGun) { - currentGun.off('message', handleMsg) - currentGun.disconnect() - currentGun.kill() - logger.info('Destroyed current gun') - } - const newGun = fork('utils/GunSmith/gun.js') - currentGun = newGun - logger.info('Forged new gun') - - // currentGun.on('', e => { - // logger.info('event from subprocess') - // logger.info(e) - // }) - - currentGun.on('message', handleMsg) - - /** @type {Smith.SmithMsgInit} */ - const initMsg = { - // @ts-ignore TODO: Fix options typings - opts: lastOpts, - type: 'init' - } - await new Promise(res => { - currentGun.on('message', msg => { - if (typeof msg !== 'object') { - throw new Error(`msg.type !== object`) - } - - const message = /** @type {{type: string}} */ (msg) - - if (message.type === 'init') { - // @ts-ignore - res() - } - }) - currentGun.send(initMsg) - logger.info('Sent init msg') - }) - - logger.info('Received init reply') - - const lastGunListeners = Object.keys(pathToListeners).map(path => { - /** @type {Smith.SmithMsgOn} */ - const msg = { - path, - type: 'on' - } - return msg - }) - - if (lastGunListeners.length) { - currentGun.send(lastGunListeners) - - logger.info(`Sent ${lastGunListeners.length} pending on() listeners`) - } - - const lastGunMapListeners = Object.keys(pathToMapListeners).map(path => { - /** @type {Smith.SmithMsgMapOn} */ - const msg = { - path, - type: 'map.on' - } - return msg - }) - - if (lastGunMapListeners.length) { - currentGun.send(lastGunMapListeners) - - logger.info( - `Sent ${lastGunMapListeners.length} pending map().on() listeners` - ) - } - - logger.info( - isReforge - ? 'Finished reforging, will now auto-auth' - : 'Finished forging, will now auto-auth' - ) - - await autoAuth() - - // Eslint disable: This should be caught by a if (isForging) {throw} at the - // beginning of this function - - // eslint-disable-next-line require-atomic-updates - isForging = false - flushPendingPuts() - })() -} - -/** - * @param {string} path - * @param {boolean=} afterMap - * @returns {Smith.GunSmithNode} - */ -function createReplica(path, afterMap = false) { - /** @type {(GunT.Listener|GunT.LoadListener)[]} */ - const listenersForThisRef = [] - - return { - _: { - get get() { - const keys = path.split('>') - return keys[keys.length - 1] - }, - opt: { - // TODO - peers: {} - }, - put: { - // TODO - } - }, - back() { - throw new Error('Do not use back() on a GunSmith node.') - }, - get(key) { - if (afterMap) { - throw new Error( - 'Cannot call get() after map() on a GunSmith node, you should only call on() after map()' - ) - } - return createReplica(path + '>' + key) - }, - map() { - if (afterMap) { - throw new Error('Cannot call map() after map() on a GunSmith node') - } - return createReplica(path, true) - }, - off() { - for (const l of listenersForThisRef) { - // eslint-disable-next-line no-multi-assign - const listeners = - pathToListeners[path] || (pathToListeners[path] = new Set()) - - // eslint-disable-next-line no-multi-assign - const mapListeners = - pathToMapListeners[path] || (pathToMapListeners[path] = new Set()) - - // @ts-expect-error - listeners.delete(l) - // @ts-expect-error - mapListeners.delete(l) - } - }, - on(cb) { - listenersForThisRef.push(cb) - - if (afterMap) { - // eslint-disable-next-line no-multi-assign - const listeners = - pathToMapListeners[path] || (pathToMapListeners[path] = new Set()) - - listeners.add(cb) - - /** @type {Smith.SmithMsgMapOn} */ - const msg = { - path, - type: 'map.on' - } - isReady().then(() => { - currentGun.send(msg) - }) - } else { - // eslint-disable-next-line no-multi-assign - const listeners = - pathToListeners[path] || (pathToListeners[path] = new Set()) - - listeners.add(cb) - - /** @type {Smith.SmithMsgOn} */ - const msg = { - path, - type: 'on' - } - isReady().then(() => { - currentGun.send(msg) - }) - } - - return this - }, - once(cb, opts = { wait: 500 }) { - if (afterMap) { - throw new Error('Cannot call once() after map() on a GunSmith node') - } - // We could use this.on() but then we couldn't call .off() - const tmp = createReplica(path, afterMap) - - /** @type {GunT.ListenerData} */ - let lastVal = null - - tmp.on(data => { - lastVal = data - }) - - setTimeout(() => { - tmp.off() - const keys = path.split('>') - // eslint-disable-next-line no-unused-expressions - cb && cb(lastVal, keys[keys.length - 1]) - }, opts.wait) - - return this - }, - put(data, cb) { - const id = uuid() - - const pendingPutsForPath = pendingPuts[path] || (pendingPuts[path] = []) - - /** @type {Smith.PendingPut} */ - const pendingPut = { - cb: cb || (() => {}), - data, - id - } - - pendingPutsForPath.push(pendingPut) - - /** @type {Smith.SmithMsgPut} */ - const msg = { - data, - id, - path, - type: 'put' - } - isReady().then(() => { - currentGun.send(msg) - }) - return this - }, - set(data, cb) { - if (afterMap) { - throw new Error('Cannot call set() after map() on a GunSmith node') - } - - const id = gunUUID() - this.put( - { - [id]: data - }, - ack => { - // eslint-disable-next-line no-unused-expressions - cb && cb(ack) - } - ) - return this.get(id) - }, - user(pub) { - if (path !== '$root') { - throw new ReferenceError( - `Do not call user() on a non-root GunSmith node` - ) - } - if (!pub) { - return createUserReplica() - } - const replica = createReplica(pub) - // I don't know why Typescript insists on returning a UserGUNNode so here we go: - return { - ...replica, - /** @returns {GunT.UserSoul} */ - get _() { - throw new ReferenceError( - `Do not access _ on another user's graph (${pub.slice( - 0, - 8 - )}...${pub.slice(-8)})` - ) - }, - auth() { - throw new Error( - "Do not call auth() on another user's graph (gun.user(otherUserPub))" - ) - }, - create() { - throw new Error( - "Do not call create() on another user's graph (gun.user(otherUserPub))" - ) - }, - leave() { - throw new Error( - "Do not call leave() on another user's graph (gun.user(otherUserPub))" - ) - } - } - }, - then() { - return new Promise(res => { - this.once(data => { - res(data) - }) - }) - }, - specialOn(cb) { - let canaryPeep = false - - const checkCanary = () => - setTimeout(() => { - if (!canaryPeep) { - isReady() - .then(forge) - .then(isReady) - .then(checkCanary) - } - }, 30000) - - checkCanary() - return this.on((data, key) => { - canaryPeep = true - cb(data, key) - }) - }, - specialOnce(cb, _wait = 1000) { - this.once( - (data, key) => { - if (isPopulated(data) || _wait > 100000) { - cb(data, key) - } else { - isReady() - .then(forge) - .then(isReady) - .then(() => { - this.specialOnce(cb, _wait * 3) - }) - } - }, - { wait: _wait } - ) - return this - }, - specialThen() { - return new Promise((res, rej) => { - this.specialOnce(data => { - if (isPopulated(data)) { - res(data) - } else { - rej(new Error(`Could not fetch data at path ${path}`)) - } - }) - }) - }, - pPut(data) { - return new Promise((res, rej) => { - this.put(data, ack => { - if (ack.err) { - rej(new Error(ack.err)) - } else { - res() - } - }) - }) - }, - pSet(data) { - return new Promise((res, rej) => { - this.set(data, ack => { - if (ack.err) { - rej(new Error(ack.err)) - } else { - res() - } - }) - }) - } - } -} - -let userReplicaCalled = false - -/** - * @returns {Smith.UserSmithNode} - */ -function createUserReplica() { - if (userReplicaCalled) { - throw new Error('Please only call gun.user() (without a pub) once.') - } - userReplicaCalled = true - - const baseReplica = createReplica('$user') - - /** @type {Smith.UserSmithNode} */ - const completeReplica = { - ...baseReplica, - get _() { - return { - ...baseReplica._, - // TODO - sea: lastPair || { - epriv: '', - epub: '', - priv: '', - pub: '' - } - } - }, - get is() { - if (lastAlias && lastPair) { - return { - alias: lastAlias, - pub: lastPair.pub - } - } - return undefined - }, - auth(alias, pass, cb) { - auth(alias, pass) - .then(pair => { - cb({ - err: undefined, - sea: pair - }) - }) - .catch(e => { - cb({ - err: e.message, - sea: undefined - }) - }) - }, - create(alias, pass, cb) { - lastAlias = '' - lastPass = '' - lastPair = null - - /** @type {Smith.SmithMsgCreate} */ - const msg = { - alias, - pass, - type: 'create' - } - - /** @param {Smith.GunMsg} msg */ - const _cb = msg => { - if (msg.type === 'create') { - currentGun.off('message', _cb) - - const { ack } = msg - - if (ack.err) { - cb(ack) - } else if (ack.pub) { - lastAlias = alias - lastPass = pass - lastPair = msg.pair - cb(ack) - } else { - throw (new Error('Auth: ack.pub undefined')) - } - } - } - currentGun.on('message', _cb) - currentGun.send(msg) - }, - leave() { - lastAlias = '' - lastPass = '' - lastPair = null - - /** @type {Smith.SmithMsgLeave} */ - const msg = { - type: 'leave' - } - currentGun.send(msg) - } - } - - return completeReplica -} - -/** - * @param {import('gun/types/gun/IGunConstructorOptions').IGunConstructorOptions} opts - * @returns {Smith.GunSmithNode} - */ -const Gun = opts => { - lastOpts = opts - // forge() - - return createReplica('$root') -} - -module.exports = Gun - -module.exports.kill = () => { - if (currentGun) { - currentGun.send('bye') - currentGun.off('message', handleMsg) - currentGun.disconnect() - currentGun.kill() - // @ts-ignore - currentGun = null - killed = true - logger.info('Killed gunsmith.') - } -} - -module.exports._reforge = forge -module.exports._isReady = isReady -module.exports._getProcCounter = () => { - return procCounter -} diff --git a/utils/GunSmith/GunSmith.spec.js b/utils/GunSmith/GunSmith.spec.js deleted file mode 100644 index a73a0efb..00000000 --- a/utils/GunSmith/GunSmith.spec.js +++ /dev/null @@ -1,411 +0,0 @@ -/** - * @format - */ -// @ts-check -const Gun = require('./GunSmith') -const words = require('random-words') -const fs = require('fs') -const debounce = require('lodash/debounce') -const once = require('lodash/once') -const expect = require('expect') - -const logger = require('../../config/log') - -const { removeBuiltInGunProps } = require('./misc') - -if (!fs.existsSync('./test-radata')) { - fs.mkdirSync('./test-radata') -} - -const instance = Gun({ - axe: false, - multicast: false, - file: './test-radata/' + words({ exactly: 2 }).join('-') -}) - -const user = instance.user() -const alias = words({ exactly: 2 }).join('') -const pass = words({ exactly: 2 }).join('') - -/** - * @param {number} ms - */ -const delay = ms => new Promise(res => setTimeout(res, ms)) - -describe('gun smith', () => { - after(() => { - Gun.kill() - }) - - // ************************************************************************** - // These tests are long but we run them first to detect if the re-forging - // logic is flawed and affecting functionality. - // ************************************************************************** - - it('writes object items into sets and correctly populates item._.get with the newly created id', done => { - const node = instance.get(words()).get(words()) - - const obj = { - a: 1, - b: 'hello' - } - - const item = node.set(obj) - - node.get(item._.get).once(data => { - expect(removeBuiltInGunProps(data)).toEqual(obj) - done() - }) - }) - - it('provides an special once() that restarts gun until a value is fetched', done => { - const a = words() - const b = words() - const node = instance.get(a).get(b) - const value = words() - - node.specialOnce(data => { - expect(data).toEqual(value) - done() - }) - - setTimeout(() => { - node.put(value) - }, 30000) - }) - - it('provides an special then() that restarts gun until a value is fetched', async () => { - const a = words() - const b = words() - const node = instance.get(a).get(b) - const value = words() - - setTimeout(() => { - node.put(value) - }, 30000) - - const res = await node.specialThen() - - expect(res).toBe(value) - }) - - it('provides an special on() that restarts gun when a value has not been obtained in a determinate amount of time', done => { - const node = instance.get(words()).get(words()) - - const secondValue = words() - - const onceDone = once(done) - - node.specialOn( - debounce(data => { - if (data === secondValue) { - onceDone() - } - }) - ) - - setTimeout(() => { - node.put(secondValue) - }, 32000) - }) - - it('puts a true and reads it with once()', done => { - logger.info('puts a true and reads it with once()') - const a = words() - const b = words() - - instance - .get(a) - .get(b) - .put(true) - - instance - .get(a) - .get(b) - .once(val => { - expect(val).toBe(true) - done() - }) - }) - - it('puts a false and reads it with once()', done => { - const a = words() - const b = words() - - instance - .get(a) - .get(b) - .put(false, ack => { - if (ack.err) { - throw new Error(ack.err) - } else { - instance - .get(a) - .get(b) - .once(val => { - expect(val).toBe(false) - done() - }) - } - }) - }) - - it('puts numbers and reads them with once()', done => { - const a = words() - const b = words() - - instance - .get(a) - .get(b) - .put(5) - - instance - .get(a) - .get(b) - .once(val => { - expect(val).toBe(5) - done() - }) - }) - - it('puts strings and reads them with once()', done => { - const a = words() - const b = words() - const sentence = words({ exactly: 50 }).join(' ') - instance - .get(a) - .get(b) - .put(sentence) - - instance - .get(a) - .get(b) - .once(val => { - expect(val).toBe(sentence) - done() - }) - }) - - it('merges puts', async () => { - const a = { - a: 1 - } - const b = { - b: 1 - } - const c = { ...a, ...b } - - const node = instance.get('foo').get('bar') - - node.put(a) - node.put(b) - - const data = await node.then() - - if (typeof data !== 'object' || data === null) { - throw new Error('Data not an object') - } - expect(removeBuiltInGunProps(data)).toEqual(c) - }) - - it('writes primitive items into sets and correctly assigns the id to ._.get', done => { - const node = instance.get(words()).get(words()) - const item = node.set('hello') - - node.once(data => { - expect(removeBuiltInGunProps(data)).toEqual({ - [item._.get]: 'hello' - }) - done() - }) - }) - - // TODO: find out why this test fucks up the previous one if it runs before - // that one - it('maps over a primitive set', done => { - const node = instance.get(words()).get(words()) - - const items = words({ exactly: 50 }) - - const ids = items.map(i => node.set(i)._.get) - - let checked = 0 - - node.map().on((data, id) => { - expect(items).toContain(data) - expect(ids).toContain(id) - checked++ - if (checked === 50) { - done() - } - }) - }) - - it('maps over an object set', done => { - const node = instance.get(words()).get(words()) - - const items = words({ exactly: 50 }).map(w => ({ - word: w - })) - - const ids = items.map(i => node.set(i)._.get) - - let checked = 0 - - node.map().on((data, id) => { - expect(items).toContainEqual(removeBuiltInGunProps(data)) - expect(ids).toContain(id) - checked++ - if (checked === 50) { - done() - } - }) - }) - - it('offs `on()`s', async () => { - const node = instance.get(words()).get(words()) - - let called = false - - node.on(() => { - called = true - }) - - node.off() - - await node.pPut('return') - await delay(500) - expect(called).toBe(false) - }) - - it('offs `map().on()`s', async () => { - const node = instance.get(words()).get(words()) - - let called = false - - const iterateeNode = node.map() - - iterateeNode.on(() => { - called = true - }) - - iterateeNode.off() - - await node.pSet('return') - - await delay(500) - - expect(called).toBe(false) - }) - - it('provides an user node with create(), auth() and leave()', async () => { - const ack = await new Promise(res => user.create(alias, pass, res)) - expect(ack.err).toBeUndefined() - - const { pub } = ack - expect(pub).toBeTruthy() - expect(user.is?.pub).toEqual(pub) - - user.leave() - expect(user.is).toBeUndefined() - - /** @type {GunT.AuthAck} */ - const authAck = await new Promise(res => - user.auth(alias, pass, ack => res(ack)) - ) - expect(authAck.err).toBeUndefined() - expect(authAck.sea?.pub).toEqual(pub) - expect(user.is?.pub).toEqual(pub) - user.leave() - }) - - it('reliably provides authentication information across re-forges', async () => { - /** @type {GunT.AuthAck} */ - const authAck = await new Promise(res => - user.auth(alias, pass, ack => res(ack)) - ) - const pub = authAck.sea?.pub - expect(pub).toBeTruthy() - - Gun._reforge() - expect(user.is?.pub).toEqual(pub) - await Gun._isReady() - expect(user.is?.pub).toEqual(pub) - - user.leave() - }) - - it('provides thenables for values', async () => { - const a = words() - const b = words() - const node = instance.get(a).get(b) - const value = words() - - await new Promise((res, rej) => { - node.put(value, ack => { - if (ack.err) { - rej(new Error(ack.err)) - } else { - // @ts-ignore - res() - } - }) - }) - - const fetch = await instance - .get(a) - .get(b) - .then() - expect(fetch).toEqual(value) - }) - - it('provides an special thenable put()', async () => { - const a = words() - const b = words() - const node = instance.get(a).get(b) - const value = words() - - await node.pPut(value) - - const res = await node.then() - - expect(res).toBe(value) - }) - - it('on()s and handles object>primitive>object transitions', done => { - const a = { - one: 1 - } - const b = 'two' - const lastPut = { - three: 3 - } - const c = { ...a, ...lastPut } - - const node = instance.get(words()).get(words()) - - let checked = 0 - - node.on( - debounce(data => { - checked++ - if (checked === 1) { - expect(removeBuiltInGunProps(data)).toEqual(a) - } else if (checked === 2) { - expect(data).toEqual(b) - } else if (checked === 3) { - expect(removeBuiltInGunProps(data)).toEqual(c) - done() - } - }) - ) - - node.put(a) - setTimeout(() => { - node.put(b) - }, 800) - setTimeout(() => { - node.put(c) - }, 1200) - }) -}) diff --git a/utils/GunSmith/GunT.ts b/utils/GunSmith/GunT.ts deleted file mode 100644 index bd4102e8..00000000 --- a/utils/GunSmith/GunT.ts +++ /dev/null @@ -1,85 +0,0 @@ -/** - * @prettier - */ -namespace GunT { - export type Primitive = boolean | string | number - - export interface Data { - [K: string]: ValidDataValue - } - - export type ValidDataValue = Primitive | null | Data - - export interface Ack { - err: string | undefined - } - - type ListenerObjSoul = { - '#': string - } - - export type ListenerObj = Record< - string, - ListenerObjSoul | Primitive | null - > & { - _: ListenerObjSoul - } - - export type ListenerData = Primitive | null | ListenerObj | undefined - - interface OpenListenerDataObj { - [k: string]: OpenListenerData - } - - export type Listener = (data: ListenerData, key: string) => void - - export type Callback = (ack: Ack) => void - - export interface Peer { - url: string - id: string - wire?: { - readyState: number - } - } - - export interface Soul { - get: string - put: Primitive | null | object | undefined - opt: { - peers: Record - } - } - export type OpenListenerData = Primitive | null | OpenListenerDataObj - - export type OpenListener = (data: OpenListenerData, key: string) => void - - export type LoadListenerData = OpenListenerData - - export type LoadListener = (data: LoadListenerData, key: string) => void - - export interface CreateAck { - pub: string | undefined - err: string | undefined - } - - export type CreateCB = (ack: CreateAck) => void - - export interface AuthAck { - err: string | undefined - sea: UserPair | undefined - } - - export type AuthCB = (ack: AuthAck) => void - - export interface UserPair { - epriv: string - epub: string - priv: string - pub: string - } - - export interface UserSoul extends Soul { - sea: UserPair - } -} diff --git a/utils/GunSmith/Smith.ts b/utils/GunSmith/Smith.ts deleted file mode 100644 index 3ee8a655..00000000 --- a/utils/GunSmith/Smith.ts +++ /dev/null @@ -1,221 +0,0 @@ -/** - * @format - */ -/// -namespace Smith { - export interface GunSmithNode { - _: GunT.Soul - /** - * Used only inside the subprocess. - */ - back( - path: 'opt' - ): { - peers: Record< - string, - { - url: string - id: string - wire?: { - readyState: number - } - } - > - } - /** - * - */ - get(key: string): GunSmithNode - /** - * - */ - map(): GunSmithNode - /** - * - */ - off(): void - /** - * - */ - on(cb: GunT.Listener): void - /** - * - */ - once(cb?: GunT.Listener, opts?: { wait?: number }): void - /** - * A promise version of put(). - * @throws - */ - pPut(data: GunT.ValidDataValue): Promise - /** - * A promise version of set(). - * @throws - */ - pSet(data: GunT.ValidDataValue): Promise - /** - * - */ - put(data: GunT.ValidDataValue, cb?: GunT.Callback): void - /** - * - */ - set(data: GunT.ValidDataValue, cb?: GunT.Callback): GunSmithNode - /** - * Gun will be restarted to force replication of data - * if needed. - * @param cb - */ - specialOn(cb: GunT.Listener): void - /** - * Gun will be restarted to force replication of data - * if needed. - * @param cb - * @param _wait - */ - specialOnce(cb: GunT.Listener, _wait?: number): GunSmithNode - /** - * Gun will be restarted to force replication of data - * if needed. - */ - specialThen(): Promise - then(): Promise - user(): UserSmithNode - user(pub: string): GunSmithNode - } - - export interface UserSmithNode extends GunSmithNode { - _: GunT.UserSoul - auth(alias: string, pass: string, cb: GunT.AuthCB): void - is?: { - alias: string - pub: string - } - create(user: string, pass: string, cb: GunT.CreateCB): void - leave(): void - } - - export interface PendingPut { - cb: GunT.Callback - data: GunT.ValidDataValue - id: string - } - - export interface SmithMsgInit { - opts: Record - type: 'init' - } - - export interface SmithMsgAuth { - alias: string - pass: string - type: 'auth' - } - - export interface SmithMsgCreate { - alias: string - pass: string - type: 'create' - } - - export interface SmithMsgLeave { - type: 'leave' - } - - export interface SmithMsgOn { - path: string - type: 'on' - } - - export interface SmithMsgLoad { - id: string - path: string - type: 'load' - } - - export interface SmithMsgMapOn { - path: string - type: 'map.on' - } - - export interface SmithMsgPut { - id: string - data: GunT.ValidDataValue - path: string - type: 'put' - } - - export interface SmithMsgMultiPut { - ids: string[] - data: GunT.ValidDataValue - path: string - type: 'multiPut' - } - - export type SmithMsg = - | SmithMsgInit - | SmithMsgAuth - | SmithMsgCreate - | SmithMsgAuth - | SmithMsgOn - | SmithMsgLoad - | SmithMsgMapOn - | SmithMsgPut - | SmithMsgMultiPut - | BatchSmithMsg - - export type BatchSmithMsg = SmithMsg[] - - export interface GunMsgAuth { - ack: GunT.AuthAck - type: 'auth' - } - - export interface GunMsgCreate { - ack: GunT.CreateAck - pair: GunT.UserPair - type: 'create' - } - - export interface GunMsgOn { - data: GunT.ListenerData - path: string - type: 'on' - } - - export interface GunMsgMapOn { - data: GunT.ListenerData - path: string - key: string - type: 'map.on' - } - - export interface GunMsgLoad { - id: string - data: GunT.LoadListenerData - key: string - type: 'load' - } - - export interface GunMsgPut { - ack: GunT.Ack - id: string - path: string - type: 'put' - } - - export interface GunMsgMultiPut { - ack: GunT.Ack - ids: string[] - path: string - type: 'multiPut' - } - - export type GunMsg = - | GunMsgAuth - | GunMsgCreate - | GunMsgOn - | GunMsgMapOn - | GunMsgLoad - | GunMsgPut - | GunMsgMultiPut -} diff --git a/utils/GunSmith/gun.js b/utils/GunSmith/gun.js deleted file mode 100644 index 71a44a6a..00000000 --- a/utils/GunSmith/gun.js +++ /dev/null @@ -1,251 +0,0 @@ -/** - * @format - */ -// @ts-check -/// -/// -const Gun = require('gun') -require('gun/nts') -require('gun/lib/load') - -const logger = require('../../config/log') - -let dead = false - -/** - * @param {any} msg - */ -const sendMsg = msg => { - if (dead) { - return - } - if (process.send) { - process.send(msg) - } else { - logger.error( - 'Fatal error: Could not send a message from inside the gun process.' - ) - } -} - -logger.info('subprocess invoked') - -process.on('uncaughtException', e => { - logger.error('Uncaught exception inside Gun subprocess:') - logger.error(e) -}) - -process.on('unhandledRejection', e => { - logger.error('Unhandled rejection inside Gun subprocess:') - logger.error(e) -}) - -/** - * @type {Smith.GunSmithNode} - */ -// eslint-disable-next-line init-declarations -let gun - -/** - * @type {Smith.UserSmithNode} - */ -// eslint-disable-next-line init-declarations -let user - -/** - * @returns {Promise} - */ -const waitForAuth = async () => { - if (user.is && user.is.pub) { - return Promise.resolve() - } - - await new Promise(res => setTimeout(res, 1000)) - - return waitForAuth() -} - -/** - * @param {Smith.SmithMsg} msg - */ -const handleMsg = async msg => { - if (dead) { - logger.error('Dead sub-process received msg: ', msg) - return - } - // @ts-ignore - if (msg === 'bye') { - logger.info('KILLING') - dead = true - } - if (Array.isArray(msg)) { - msg.forEach(handleMsg) - return - } - if (msg.type === 'init') { - gun = /** @type {any} */ (new Gun(msg.opts)) - - // Force gun to connect to peers - gun - .get('foo') - .get('baz') - .once() - - let currentPeers = '' - setInterval(() => { - const newPeers = JSON.stringify( - Object.values(gun.back('opt').peers) - .filter(p => p.wire && p.wire.readyState) - .map(p => p.url) - ) - if (newPeers !== currentPeers) { - logger.info('Connected peers:', newPeers) - currentPeers = newPeers - } - }, 2000) - - setInterval(() => { - // Log regardless of change every 30 seconds - logger.info('Connected peers:', currentPeers) - }, 30000) - user = gun.user() - - sendMsg({ - type: 'init' - }) - } - if (msg.type === 'auth') { - const { alias, pass } = msg - user.auth(alias, pass, ack => { - /** @type {Smith.GunMsgAuth} */ - const msg = { - ack: { - err: ack.err, - sea: ack.sea - }, - type: 'auth' - } - sendMsg(msg) - }) - } - if (msg.type === 'create') { - const { alias, pass } = msg - user.create(alias, pass, ack => { - /** @type {Smith.GunMsgCreate} */ - const msg = { - ack: { - err: ack.err, - pub: ack.pub - }, - pair: user._.sea, - type: 'create' - } - sendMsg(msg) - }) - } - if (msg.type === 'on') { - const [root, ...keys] = msg.path.split('>') - - /** @type {Smith.GunSmithNode} */ - let node = - { - $root: gun, - $user: user - }[root] || gun.user(root) - - for (const key of keys) { - node = node.get(key) - } - node.on(data => { - /** @type {Smith.GunMsgOn} */ - const res = { - data, - path: msg.path, - type: 'on' - } - sendMsg(res) - }) - } - if (msg.type === 'map.on') { - const [root, ...keys] = msg.path.split('>') - - /** @type {Smith.GunSmithNode} */ - let node = - { - $root: gun, - $user: user - }[root] || gun.user(root) - - for (const key of keys) { - node = node.get(key) - } - node.map().on((data, key) => { - /** @type {Smith.GunMsgMapOn} */ - const res = { - data, - key, - path: msg.path, - type: 'map.on' - } - sendMsg(res) - }) - } - if (msg.type === 'put') { - const [root, ...keys] = msg.path.split('>') - if (root === '$user') { - await waitForAuth() - } - - /** @type {Smith.GunSmithNode} */ - let node = - { - $root: gun, - $user: user - }[root] || gun.user(root) - - for (const key of keys) { - node = node.get(key) - } - - node.put(msg.data, ack => { - /** @type {Smith.GunMsgPut} */ - const reply = { - ack: { - err: typeof ack.err === 'string' ? ack.err : undefined - }, - id: msg.id, - path: msg.path, - type: 'put' - } - sendMsg(reply) - }) - } - if (msg.type === 'multiPut') { - const [root, ...keys] = msg.path.split('>') - - /** @type {Smith.GunSmithNode} */ - let node = - { - $root: gun, - $user: user - }[root] || gun.user(root) - - for (const key of keys) { - node = node.get(key) - } - node.put(msg.data, ack => { - /** @type {Smith.GunMsgMultiPut} */ - const reply = { - ack: { - err: ack.err - }, - ids: msg.ids, - path: msg.path, - type: 'multiPut' - } - sendMsg(reply) - }) - } -} - -process.on('message', handleMsg) diff --git a/utils/GunSmith/index.js b/utils/GunSmith/index.js deleted file mode 100644 index e9024186..00000000 --- a/utils/GunSmith/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./GunSmith') \ No newline at end of file diff --git a/utils/GunSmith/misc.js b/utils/GunSmith/misc.js deleted file mode 100644 index ab3faaee..00000000 --- a/utils/GunSmith/misc.js +++ /dev/null @@ -1,78 +0,0 @@ -/** - * @format - */ -// @ts-check - -// TODO: Check if merge() is equivalent to what gun does. But it should be. -const merge = require('lodash/merge') - -/// - -/** - * @param {GunT.ValidDataValue[]} values - * @returns {GunT.ValidDataValue} - */ -const mergePuts = values => { - /** - * @type {GunT.ValidDataValue} - * @example - * x.put({ a: 1 }) - * x.put('yo') - * assertEquals(await x.then(), 'yo') - * x.put({ b: 2 }) - * assertEquals(await x.then(), { a: 1 , b: 2 }) - */ - const lastObjectValue = {} - - /** @type {GunT.ValidDataValue} */ - let finalResult = {} - - for (const val of values) { - if (typeof val === 'object' && val !== null) { - finalResult = {} - merge(lastObjectValue, val) - merge(finalResult, lastObjectValue) - } else { - finalResult = val - } - } - - return finalResult -} - -/** - * @param {any} data - * @returns {any} - */ -const removeBuiltInGunProps = data => { - if (typeof data === 'object' && data !== null) { - const o = { ...data } - delete o._ - delete o['#'] - return o - } - - console.log(data) - throw new TypeError( - 'Non object passed to removeBuiltInGunProps: ' + JSON.stringify(data) - ) -} - -/** - * @param {GunT.ListenerData} data - */ -const isPopulated = data => { - if (data === null || typeof data === 'undefined') { - return false - } - if (typeof data === 'object') { - return Object.keys(removeBuiltInGunProps(data)).length > 0 - } - return true -} - -module.exports = { - mergePuts, - removeBuiltInGunProps, - isPopulated -} diff --git a/utils/JSON.js b/utils/JSON.js deleted file mode 100644 index f630c14b..00000000 --- a/utils/JSON.js +++ /dev/null @@ -1,13 +0,0 @@ -/** @param {any} data */ -const safeParseJSON = (data) => { - try { - const parsedJSON = JSON.parse(data); - return parsedJSON; - } catch (err) { - return data; - } -}; - -module.exports = { - safeParseJSON -} \ No newline at end of file diff --git a/utils/colors.js b/utils/colors.js deleted file mode 100644 index 7c638bfd..00000000 --- a/utils/colors.js +++ /dev/null @@ -1,16 +0,0 @@ -const colors = require("colors/safe"); - -colors.setTheme({ - silly: "rainbow", - input: "grey", - verbose: "cyan", - prompt: "grey", - info: "green", - data: "grey", - help: "cyan", - warn: "yellow", - debug: "blue", - error: "red" -}); - -module.exports = colors; diff --git a/utils/fieldError.js b/utils/fieldError.js deleted file mode 100644 index b1ad3db8..00000000 --- a/utils/fieldError.js +++ /dev/null @@ -1,12 +0,0 @@ -class FieldError extends Error { - /** @param {any} error */ - constructor(error) { - super(); - this.message = (error && error.message) || "An unknown error has occurred"; - this.field = (error && error.field) || "unknown"; - this.name = (error && error.name); - this.stack = (error && error.stack); - } -} - -module.exports = FieldError \ No newline at end of file diff --git a/utils/fs.js b/utils/fs.js deleted file mode 100644 index b4cbee1c..00000000 --- a/utils/fs.js +++ /dev/null @@ -1,19 +0,0 @@ -const { promisify } = require("util"); -const FS = require("fs"); - -module.exports = { - /** - * @param {string} path - */ - access: path => - new Promise(resolve => { - FS.access(path, FS.constants.F_OK, err => { - resolve(!err); - }); - }), - exists: promisify(FS.exists), - readFile: promisify(FS.readFile), - writeFile: promisify(FS.writeFile), - readdir: promisify(FS.readdir), - unlink: promisify(FS.unlink) -}; diff --git a/utils/helpers.js b/utils/helpers.js deleted file mode 100644 index 9e08e671..00000000 --- a/utils/helpers.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * @format - */ - -/** - * @template T - * @typedef {(value: T) => Promise} AsyncFilterCallback - */ - -/** - * @template T - * @param {T[]} arr - * @param {AsyncFilterCallback} cb - * @returns {Promise} - */ -const asyncFilter = async (arr, cb) => { - const results = await Promise.all(arr.map(item => cb(item))) - - return arr.filter((_, i) => results[i]) -} - -const wait = (seconds = 0) => - new Promise(resolve => { - /** @type {NodeJS.Timeout} */ - const timer = setTimeout(() => resolve(timer), seconds * 1000) - }) - -module.exports = { - asyncFilter, - wait -} diff --git a/utils/helpers.spec.js b/utils/helpers.spec.js deleted file mode 100644 index 7a468051..00000000 --- a/utils/helpers.spec.js +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @format - */ -const expect = require('expect') - -const { asyncFilter } = require('./helpers') - -const numbers = [1, 2, 3, 4] -const odds = [1, 3] -const evens = [2, 4] - -describe('asyncFilter()', () => { - it('returns an empty array when given one', async () => { - expect.hasAssertions() - const result = await asyncFilter([], () => true) - - expect(result).toStrictEqual([]) - }) - - it('rejects', async () => { - expect.hasAssertions() - - const result = await asyncFilter(numbers, () => false) - - expect(result).toStrictEqual([]) - }) - - it('rejects via calling with the correct value', async () => { - expect.hasAssertions() - - const result = await asyncFilter(numbers, v => v % 2 !== 0) - - expect(result).toStrictEqual(odds) - }) - - it('filters via calling with the correct value', async () => { - expect.hasAssertions() - - const result = await asyncFilter(numbers, v => v % 2 === 0) - - expect(result).toStrictEqual(evens) - }) - - it('handles promises', async () => { - expect.hasAssertions() - - const result = await asyncFilter(numbers, v => Promise.resolve(v % 2 === 0)) - expect(result).toStrictEqual(evens) - }) -}) diff --git a/utils/index.js b/utils/index.js deleted file mode 100644 index 5b619eda..00000000 --- a/utils/index.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * @format - */ - -const { asyncFilter } = require('./helpers') - -/** - * @returns {string} - */ -const gunUUID = () => { - // Copied from gun internals - let s = '' - let l = 24 // you are not going to make a 0 length random number, so no need to check type - const c = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXZabcdefghijklmnopqrstuvwxyz' - while (l > 0) { - s += c.charAt(Math.floor(Math.random() * c.length)) - l-- - } - return s -} - -module.exports = { - asyncFilter, - gunUUID -} diff --git a/utils/lightningServices/channelRequests.js b/utils/lightningServices/channelRequests.js deleted file mode 100644 index 1c5db495..00000000 --- a/utils/lightningServices/channelRequests.js +++ /dev/null @@ -1,68 +0,0 @@ -const logger = require('../../config/log') -const fetch = require('node-fetch') -const Storage = require('node-persist') -const { listPeers, connectPeer,getInfo } = require('./v2') - -const handlerBaseUrl = "https://channels.shock.network:4444" - -module.exports = async () => { - logger.info("DOING CHANNEL INVITE THING: START") - /** - * @type string | undefined - */ - const invite = process.env.HOSTING_INVITE - if(!invite) { - logger.info("DOING CHANNEL INVITE THING: NVM NO INVITE") - return - } - try { - /** - * @type string[] - */ - const invites = await Storage.getItem('processedInvites') || [] - if(invites.includes(invite)){ - logger.info("DOING CHANNEL INVITE THING: INVITE PROCESSED ALREADY") - return - } - const me = await getInfo() - const {identity_pubkey} = me - //@ts-expect-error - const connectReq = await fetch(`${handlerBaseUrl}/connect`) - if(connectReq.status !== 200 ){ - logger.info("DOING CHANNEL INVITE THING: CONNECT FAILED") - return - } - const connJson = await connectReq.json() - const [uri] = connJson.uris - const [pub,host] = uri.split("@") - const peers = await listPeers() - if(peers.findIndex(peer => peer.pub_key === pub) === -1){ - await connectPeer(pub,host) - } - const channelReq = { - userPubKey:identity_pubkey, - invite, - lndTo:pub, - } - //@ts-expect-error - const res = await fetch(`${handlerBaseUrl}/channel`,{ - method:'POST', - headers: { - 'Content-Type': 'application/json' - }, - body:JSON.stringify(channelReq) - }) - if(res.status !== 200 ){ - logger.info("DOING CHANNEL INVITE THING: FAILED ") - return - } - invites.push(invite) - await Storage.setItem('processedInvites',invites) - logger.info("DOING CHANNEL INVITE THING: DONE!") - } catch(e){ - logger.error("error sending invite to channels handler") - logger.info("DOING CHANNEL INVITE THING: :(") - logger.error(e) - } - -} \ No newline at end of file diff --git a/utils/lightningServices/errors.js b/utils/lightningServices/errors.js deleted file mode 100644 index 23c316fa..00000000 --- a/utils/lightningServices/errors.js +++ /dev/null @@ -1,164 +0,0 @@ - -const LightningServices = require('./lightning-services') - -/** - * @typedef {{ - * code:number, - * details:string, - * message:string - * }} LNDError - */ - -/** - * @typedef {(err:LNDError,response:object)=>void} HealthListener - */ - -class LNDErrorManager { - - /** - * @type {boolean} - */ - _isCheckingHealth = false - - /** - * @type {string|null} - */ - _lndPub = null - - get lndPub() { - return this._lndPub - } - - /** - * @type {HealthListener[]} - */ - _healthListeners = [] - - //rejects if(err && err.code !== 12) - getAvailableService() { - - //require('shock-common').Utils.makePromise((res, rej) => ...) - return new Promise((res, rej) => { - if (!this._isCheckingHealth) { - this._isCheckingHealth = true - this.getInfo() - } - /** - * - * @param {LNDError} err - * @param {object} response - */ - const listener = (err, response) => { - if (err) { - if (err.details.includes("wallet not created") || err.details.includes("wallet locked")) { - res({ - service: 'walletUnlocker', - message: 'Wallet locked', - code: err.code, - walletStatus: 'locked', - success: true - }) - } else if (err.code === 14) { - rej({ - service: 'unknown', - message: - "Failed to connect to LND server, make sure it's up and running.", - code: 14, - walletStatus: 'unknown', - success: false - }) - } else if (err.code === 4) { - rej({ - service: 'unknown', - message: - "LND Timeout", - code: 4, - walletStatus: 'unknown', - success: false - }) - } else { - rej({ - service: 'lightning', - message: this.sanitizeLNDError(err), - code: err.code, - walletStatus: 'unlocked', - success: false - }) - } - } - - res({ - service: 'lightning', - message: response, - code: null, - walletStatus: 'unlocked', - success: true - }) - - } - this._healthListeners.push(listener) - }) - - } - - //private - getInfo() { - const { lightning } = LightningServices.services - /** - * - * @param {LNDError} err - * @param {{identity_pubkey:string}} response - */ - const callback = (err, response) => { - if (response && response.identity_pubkey) { - this._lndPub = response.identity_pubkey - } - this._healthListeners.forEach(l => { - l(err, response) - }) - this._healthListeners.length = 0 - this._isCheckingHealth = false - } - const deadline = Date.now() + 10000 - lightning.getInfo({}, { deadline }, callback) - } - - /** - * @param {LNDError} e - */ - handleError(e) { - return this.sanitizeLNDError(e) - } - - /** - * @param {LNDError} e - */ - // eslint-disable-next-line - sanitizeLNDError(e) { - let eMessage = '' - if (typeof e === 'string') { - eMessage = e - } else if (e.details) { - eMessage = e.details - } else if (e.message) { - eMessage = e.message - } - if (eMessage.toLowerCase().includes('unknown')) { - const splittedMessage = eMessage.split('UNKNOWN: ') - return splittedMessage.length > 1 - ? splittedMessage.slice(1).join('') - : splittedMessage.join('') - } - if (eMessage === '') { - return 'unknown LND error' - } - return eMessage - } - - -} - - -const lndErrorManager = new LNDErrorManager() - -module.exports = lndErrorManager \ No newline at end of file diff --git a/utils/lightningServices/index.js b/utils/lightningServices/index.js deleted file mode 100644 index a3555b28..00000000 --- a/utils/lightningServices/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lightning-services') \ No newline at end of file diff --git a/utils/lightningServices/lightning-services.js b/utils/lightningServices/lightning-services.js deleted file mode 100644 index 71ef98d9..00000000 --- a/utils/lightningServices/lightning-services.js +++ /dev/null @@ -1,155 +0,0 @@ -/** - * @format - */ -/** - * @typedef {import('commander').Command} Command - */ - -const FS = require('../../utils/fs') -const lnrpc = require('../../services/lnd/lightning') - -/** - * @typedef {object} Config - * @prop {boolean} useTLS - * @prop {number} serverPort - * @prop {string} serverHost - * @prop {string} lndHost - * @prop {string} lndCertPath - * @prop {string} macaroonPath - * @prop {string} lndProto - * @prop {string} routerProto - * @prop {string} invoicesProto - * @prop {string} walletUnlockerProto - */ - -class LightningServices { - /** - * @type {Config|null} - */ - _config = null - - /** - * @type {Config|null} - */ - _defaults = null - - /** - * @param {Config} newDefaults - */ - set defaults(newDefaults) { - this._defaults = newDefaults - } - - /** - * @param {Command} program - */ - setDefaults = program => { - /** - * @type {Config} - */ - const newDefaults = require('../../config/defaults')(program.mainnet) - - this.defaults = newDefaults - - this._config = { - ...newDefaults, - useTLS: program.usetls, - serverPort: program.serverport || newDefaults.serverPort, - serverHost: program.serverhost || newDefaults.serverHost, - lndHost: program.lndhost || newDefaults.lndHost, - lndCertPath: program.lndCertPath || newDefaults.lndCertPath, - macaroonPath: program.macaroonPath || newDefaults.macaroonPath - } - } - - isInitialized = () => { - return !!(this.lightning && this.walletUnlocker) - } - - get services() { - return { - lightning: this.lightning, - walletUnlocker: this.walletUnlocker, - router: this.router - } - } - - /** - * @returns {import('./types').Services} - */ - getServices() { - return this.services - } - - get servicesData() { - return this.lnServicesData - } - - /** - * @returns {Config} - */ - get servicesConfig() { - if (this._config) { - return this._config - } - - throw new Error( - 'Tried to access LightningServices.servicesConfig without setting defaults first.' - ) - } - - get config() { - if (this._config) { - return this._config - } - - throw new Error( - 'Tried to access LightningServices.config without setting defaults first.' - ) - } - - /** - * @returns {Config} - */ - get defaults() { - if (this._defaults) { - return this._defaults - } - - throw new Error( - 'Tried to access LightningServices.defaults without setting them first.' - ) - } - - init = async () => { - const { macaroonPath, lndHost, lndCertPath } = this.config - const macaroonExists = await FS.access(macaroonPath) - const lnServices = await lnrpc({ - lnrpcProtoPath: this.defaults.lndProto, - routerProtoPath: this.defaults.routerProto, - invoicesProtoPath: this.defaults.invoicesProto, - walletUnlockerProtoPath: this.defaults.walletUnlockerProto, - lndHost, - lndCertPath, - macaroonPath: macaroonExists ? macaroonPath : null - }) - if (!lnServices) { - throw new Error(`Could not init lnServices`) - } - const { lightning, walletUnlocker, router, invoices } = lnServices - this.lightning = lightning - this.walletUnlocker = walletUnlocker - this.router = router - this.invoices = invoices - this.lnServicesData = { - lndProto: this.defaults.lndProto, - lndHost, - lndCertPath, - macaroonPath: macaroonExists ? macaroonPath : null - } - } -} - -const lightningServices = new LightningServices() - -module.exports = lightningServices diff --git a/utils/lightningServices/types.ts b/utils/lightningServices/types.ts deleted file mode 100644 index fb180e22..00000000 --- a/utils/lightningServices/types.ts +++ /dev/null @@ -1,200 +0,0 @@ -/** - * @format - */ -import * as Common from 'shock-common' - -export interface PaymentV2 { - payment_hash: string - - creation_date: string - - payment_preimage: string - - value_sat: string - - value_msat: string - - payment_request: string - - status: 'UNKNOWN' | 'IN_FLIGHT' | 'SUCCEEDED' | 'FAILED' - - fee_sat: number - - fee_msat: number - - creation_time_ns: string - - payment_index: string - - failure_reason: - | 'FAILURE_REASON_NONE' - | 'FAILURE_REASON_TIMEOUT' - | 'FAILURE_REASON_NO_ROUTE' - | 'FAILURE_REASON_ERROR' - | 'FAILURE_REASON_INCORRECT_PAYMENT_DETAILS' - | 'FAILURE_REASON_INSUFFICIENT_BALANCE' -} - -enum FeatureBit { - DATALOSS_PROTECT_REQ = 0, - DATALOSS_PROTECT_OPT = 1, - INITIAL_ROUING_SYNC = 3, - UPFRONT_SHUTDOWN_SCRIPT_REQ = 4, - UPFRONT_SHUTDOWN_SCRIPT_OPT = 5, - GOSSIP_QUERIES_REQ = 6, - GOSSIP_QUERIES_OPT = 7, - TLV_ONION_REQ = 8, - TLV_ONION_OPT = 9, - EXT_GOSSIP_QUERIES_REQ = 10, - EXT_GOSSIP_QUERIES_OPT = 11, - STATIC_REMOTE_KEY_REQ = 12, - STATIC_REMOTE_KEY_OPT = 13, - PAYMENT_ADDR_REQ = 14, - PAYMENT_ADDR_OPT = 15, - MPP_REQ = 16, - MPP_OPT = 17 -} - -interface _SendPaymentV2Request { - dest: Buffer - /** - * Number of satoshis to send. The fields amt and amt_msat are mutually - * exclusive. - */ - amt: string - - /** - * The CLTV delta from the current height that should be used to set the - * timelock for the final hop. - */ - final_cltv_delta: number - - dest_features: FeatureBit[] - - dest_custom_records: Record - - /** - * The hash to use within the payment's HTLC. - */ - payment_hash: Buffer - - max_parts: number - - timeout_seconds: number - - no_inflight_updates: boolean - - payment_request: string - - fee_limit_sat: number -} - -export type SendPaymentV2Request = Partial<_SendPaymentV2Request> - -export interface SendPaymentKeysendParams { - amt: string - dest: string - feeLimit: number - finalCltvDelta?: number - maxParts?: number - timeoutSeconds?: number -} - -export interface SendPaymentInvoiceParams { - amt?: string - feeLimit: number - max_parts?: number - payment_request: string - timeoutSeconds?: number -} - -type StreamListener = (data: any) => void - -/** - * Caution: Not all methods return an stream. - */ -interface LightningStream { - on(ev: 'data' | 'end' | 'error' | 'status', listener: StreamListener): void -} - -type LightningCB = (err: Error, data: Record) => void - -type LightningMethod = ( - args: Record, - cb?: LightningCB -) => LightningStream - -/** - * Makes it easier for code calling services. - */ -export interface Services { - lightning: Record - walletUnlocker: Record - router: Record -} - -export interface ListChannelsReq { - active_only?: boolean - inactive_only?: boolean - public_only?: boolean - private_only?: boolean - /** - * Filters the response for channels with a target peer's pubkey. If peer is - * empty, all channels will be returned. - */ - peer?: Common.Bytes -} - -/** - * https://api.lightning.community/#pendingchannels - */ -export interface PendingChannelsRes { - /** - * The balance in satoshis encumbered in pending channels. - */ - total_limbo_balance: string - /** - * Channels pending opening. - */ - pending_open_channels: Common.PendingOpenChannel[] - /** - * Channels pending force closing. - */ - pending_force_closing_channels: Common.ForceClosedChannel[] - /** - * Channels waiting for closing tx to confirm. - */ - waiting_close_channels: Common.WaitingCloseChannel[] -} - -/** - * https://github.com/lightningnetwork/lnd/blob/daf7c8a85420fc67fffa18fa5f7d08c2040946e4/lnrpc/rpc.proto#L2948 - */ -export interface AddInvoiceRes { - /** - * - */ - r_hash: Common.Bytes - /** - * A bare-bones invoice for a payment within the Lightning Network. With the - * details of the invoice, the sender has all the data necessary to send a - * payment to the recipient. - */ - payment_request: string - /** - * The "add" index of this invoice. Each newly created invoice will increment - * this index making it monotonically increasing. Callers to the - * SubscribeInvoices call can use this to instantly get notified of all added - * invoices with an add_index greater than this one. - */ - add_index: string - /** - * The payment address of the generated invoice. This value should be used in - * all payments for this invoice as we require it for end to end security. - */ - payment_addr: Common.Bytes - /** - * Custom property, by us. - */ - liquidityCheck?: boolean -} diff --git a/utils/lightningServices/v2.js b/utils/lightningServices/v2.js deleted file mode 100644 index edcee251..00000000 --- a/utils/lightningServices/v2.js +++ /dev/null @@ -1,687 +0,0 @@ -/** - * @format - */ -const Crypto = require('crypto') -const logger = require('../../config/log') -const Common = require('shock-common') -const Ramda = require('ramda') - -const lightningServices = require('./lightning-services') -/** - * @typedef {import('./types').PaymentV2} PaymentV2 - * @typedef {import('./types').SendPaymentV2Request} SendPaymentV2Request - * @typedef {import('./types').SendPaymentInvoiceParams} SendPaymentInvoiceParams - * @typedef {import('./types').SendPaymentKeysendParams} SendPaymentKeysendParams - */ - -//https://github.com/lightningnetwork/lnd/blob/master/record/experimental.go#L5:2 -//might break in future updates -const KeySendType = 5482373484 -//https://api.lightning.community/#featurebit -const TLV_ONION_REQ = 8 - -/** - * @param {SendPaymentV2Request} sendPaymentRequest - * @returns {boolean} - */ -const isValidSendPaymentRequest = sendPaymentRequest => { - const { - amt, - dest, - dest_custom_records, - dest_features, - final_cltv_delta, - max_parts, - no_inflight_updates, - payment_hash, - timeout_seconds, - fee_limit_sat, - payment_request - } = sendPaymentRequest - - if (typeof amt !== 'undefined' && typeof amt !== 'string') { - return false - } - - if (typeof dest !== 'undefined' && !(dest instanceof Buffer)) { - return false - } - - if ( - typeof dest_custom_records !== 'undefined' && - typeof dest_custom_records !== 'object' - ) { - return false - } - - if ( - typeof dest_custom_records !== 'undefined' && - dest_custom_records === null - ) { - return false - } - - if ( - typeof dest_custom_records !== 'undefined' && - Object.keys(dest_custom_records).length === 0 - ) { - return false - } - - if (typeof dest_features !== 'undefined' && !Array.isArray(dest_features)) { - return false - } - - if (typeof dest_features !== 'undefined' && dest_features.length === 0) { - return false - } - - if ( - typeof final_cltv_delta !== 'undefined' && - typeof final_cltv_delta !== 'number' - ) { - return false - } - - if ( - typeof payment_hash !== 'undefined' && - !(payment_hash instanceof Buffer) - ) { - return false - } - - if (typeof max_parts !== 'undefined' && typeof max_parts !== 'number') { - return false - } - - if ( - typeof timeout_seconds !== 'undefined' && - typeof timeout_seconds !== 'number' - ) { - return false - } - - if ( - typeof no_inflight_updates !== 'undefined' && - typeof no_inflight_updates !== 'boolean' - ) { - return false - } - - if ( - typeof fee_limit_sat !== 'undefined' && - typeof fee_limit_sat !== 'number' - ) { - return false - } - - if ( - typeof payment_request !== 'undefined' && - typeof payment_request !== 'string' - ) { - return false - } - - return true -} - -/** - * @param {SendPaymentKeysendParams} sendPaymentKeysendParams - * @returns {boolean} - */ -const isValidSendPaymentKeysendParams = sendPaymentKeysendParams => { - const { - amt, - dest, - feeLimit, - finalCltvDelta, - maxParts, - timeoutSeconds - } = sendPaymentKeysendParams - - if (typeof amt !== 'string') { - return false - } - - if (typeof dest !== 'string') { - return false - } - - if (typeof feeLimit !== 'number') { - return false - } - - if ( - typeof finalCltvDelta !== 'undefined' && - typeof finalCltvDelta !== 'number' - ) { - return false - } - - if (typeof maxParts !== 'undefined' && typeof maxParts !== 'number') { - return false - } - - if ( - typeof timeoutSeconds !== 'undefined' && - typeof timeoutSeconds !== 'number' - ) { - return false - } - - return true -} - -/** - * @param {SendPaymentInvoiceParams} sendPaymentInvoiceParams - */ -const isValidSendPaymentInvoiceParams = sendPaymentInvoiceParams => { - const { - amt, - feeLimit, - max_parts, - payment_request, - timeoutSeconds - } = sendPaymentInvoiceParams - - // payment_request: string - // timeoutSeconds?: number - - if (typeof amt !== 'undefined' && typeof amt !== 'string') { - return false - } - - if (typeof feeLimit !== 'number') { - return false - } - - if (typeof max_parts !== 'undefined' && typeof max_parts !== 'number') { - return false - } - - if (typeof payment_request !== 'string') { - return false - } - - if ( - typeof timeoutSeconds !== 'undefined' && - typeof timeoutSeconds !== 'number' - ) { - return false - } - - return true -} - -/** - * @param {string} payReq - * @returns {Promise} - */ -const decodePayReq = payReq => - Common.Utils.makePromise((res, rej) => { - lightningServices.lightning.decodePayReq( - { pay_req: payReq }, - /** - * @param {{ message: any; }} err - * @param {any} paymentRequest - */ - (err, paymentRequest) => { - if (err) { - rej(new Error(err.message)) - } else { - res(paymentRequest) - } - } - ) - }) - -/** - * aklssjdklasd - * @param {SendPaymentV2Request} sendPaymentRequest - * @returns {Promise} - */ -const sendPaymentV2 = sendPaymentRequest => { - const { - services: { router } - } = lightningServices - - if (!isValidSendPaymentRequest(sendPaymentRequest)) { - throw new TypeError( - `Invalid SendPaymentRequest: ${JSON.stringify(sendPaymentRequest)}` - ) - } - - return Common.makePromise((res, rej) => { - const stream = router.sendPaymentV2(sendPaymentRequest) - - stream.on( - 'data', - /** - * @param {import("./types").PaymentV2} streamingPaymentV2 - */ streamingPaymentV2 => { - if (streamingPaymentV2.failure_reason !== 'FAILURE_REASON_NONE') { - rej(new Error(streamingPaymentV2.failure_reason)) - } else if (streamingPaymentV2.status === 'FAILED') { - rej(new Error(streamingPaymentV2.failure_reason)) - } else if (streamingPaymentV2.status === 'SUCCEEDED') { - res(streamingPaymentV2) - } else { - logger.info(`sendPaymentV2 -> status: ${streamingPaymentV2.status}`) - } - } - ) - - // @ts-expect-error - stream.on('status', status => { - logger.info('SendPaymentV2 Status:', status) - if (status === 'FAILED') { - rej(new Error('Status == FAILED')) - } - }) - - stream.on( - 'error', - /** - * @param {{ details: any; }} err - */ err => { - logger.error('SendPaymentV2 Error:', err) - - rej(new Error(err.details) || err) - } - ) - }) -} - -/** - * @param {SendPaymentKeysendParams} params - * @returns {Promise} - */ -const sendPaymentV2Keysend = params => { - const { - amt, - dest, - feeLimit, - finalCltvDelta, - maxParts, - timeoutSeconds - } = params - - if (!isValidSendPaymentKeysendParams(params)) { - throw new TypeError( - `Invalid SendPaymentKeysendParams: ${JSON.stringify(params)}` - ) - } - - const preimage = Crypto.randomBytes(32) - const r_hash = Crypto.createHash('sha256') - .update(preimage) - .digest() - - return sendPaymentV2({ - dest: Buffer.from(dest, 'hex'), - amt, - final_cltv_delta: finalCltvDelta, - dest_features: [TLV_ONION_REQ], - dest_custom_records: { - [KeySendType]: preimage - }, - payment_hash: r_hash, - max_parts: maxParts, - timeout_seconds: timeoutSeconds, - fee_limit_sat: feeLimit - }) -} - -/** - * @param {SendPaymentInvoiceParams} params - * @returns {Promise} - */ -const sendPaymentV2Invoice = params => { - const { - feeLimit, - payment_request, - amt, - max_parts = 3, - timeoutSeconds = 5 - } = params - - if (!isValidSendPaymentInvoiceParams(params)) { - throw new TypeError( - `Invalid SendPaymentInvoiceParams: ${JSON.stringify(params)}` - ) - } - - return sendPaymentV2({ - amt, - payment_request, - fee_limit_sat: feeLimit, - max_parts, - timeout_seconds: timeoutSeconds - }) -} - -/** - * @param {Common.APISchema.ListPaymentsRequest} req - * @throws {TypeError} - * @returns {Promise} - */ -const listPayments = req => { - return Common.Utils.makePromise((res, rej) => { - lightningServices.lightning.listPayments( - req, - /** - * @param {{ details: any; }} err - * @param {unknown} lpres - */ (err, lpres) => { - if (err) { - return rej(new Error(err.details || err)) - } - - if (!Common.APISchema.isListPaymentsResponse(lpres)) { - return rej(new TypeError(`Response from LND not in expected format.`)) - } - - /** @type {Common.APISchema.ListPaymentsResponseParsed} */ - // @ts-expect-error - const parsed = Ramda.evolve( - { - first_index_offset: x => Number(x), - last_index_offset: x => Number(x), - payments: x => x - }, - lpres - ) - - if (Common.APISchema.isListPaymentsResponseParsed(parsed)) { - return res(parsed) - } - - return rej(new TypeError(`could not parse response from LND`)) - } - ) - }) -} - -/** - * @param {0|1} type - * @returns {Promise} - */ -const newAddress = (type = 0) => { - const { lightning } = lightningServices.getServices() - - return Common.Utils.makePromise((res, rej) => { - lightning.newAddress({ type }, (err, response) => { - if (err) { - rej(new Error(err.message)) - } else { - res(response.address) - } - }) - }) -} - -/** - * @param {number} minConfs - * @param {number} maxConfs - * @returns {Promise} - */ -const listUnspent = (minConfs = 3, maxConfs = 6) => - Common.makePromise((res, rej) => { - const { lightning } = lightningServices.getServices() - - lightning.listUnspent( - { - min_confs: minConfs, - max_confs: maxConfs - }, - (err, unspent) => { - if (err) { - rej(new Error(err.message)) - } else { - res(unspent.utxos) - } - } - ) - }) - -/** - * @typedef {import('./types').ListChannelsReq} ListChannelsReq - */ - -/** - * @param {ListChannelsReq} req - * @returns {Promise} - */ -const listChannels = req => - Common.makePromise((res, rej) => { - const { lightning } = lightningServices.getServices() - - lightning.listChannels(req, (err, resp) => { - if (err) { - rej(new Error(err.message)) - } else { - res(resp.channels) - } - }) - }) - -/** - * https://api.lightning.community/#getchaninfo - * @param {string} chanID - * @returns {Promise} - */ -const getChanInfo = chanID => - Common.makePromise((res, rej) => { - const { lightning } = lightningServices.getServices() - - lightning.getChanInfo( - { - chan_id: chanID - }, - (err, resp) => { - if (err) { - rej(new Error(err.message)) - } else { - // Needs cast because typescript refuses to assign Record - // to an actual object :shrugs - res(/** @type {Common.ChannelEdge} */ (resp)) - } - } - ) - }) - -/** - * https://api.lightning.community/#listpeers - * @param {boolean=} latestError If true, only the last error that our peer sent - * us will be returned with the peer's information, rather than the full set of - * historic errors we have stored. - * @returns {Promise} - */ -const listPeers = latestError => - Common.makePromise((res, rej) => { - const { lightning } = lightningServices.getServices() - - lightning.listPeers( - { - latest_error: latestError - }, - (err, resp) => { - if (err) { - rej(new Error(err.message)) - } else { - res(resp.peers) - } - } - ) - }) - -/** - * @typedef {import('./types').PendingChannelsRes} PendingChannelsRes - */ - -/** - * @returns {Promise} - */ -const pendingChannels = () => - Common.makePromise((res, rej) => { - const { lightning } = lightningServices.getServices() - - lightning.pendingChannels({}, (err, resp) => { - if (err) { - rej(new Error(err.message)) - } else { - // Needs cast because typescript refuses to assign Record - // to an actual object :shrugs - res(/** @type {PendingChannelsRes} */ (resp)) - } - }) - }) - -/** - * @typedef {import('./types').AddInvoiceRes} AddInvoiceRes - */ -/** - * https://api.lightning.community/#addinvoice - * @param {number} value - * @param {string=} memo - * @param {boolean=} confidential Alias for `private`. - * @param {number=} expiry - * @returns {Promise} - */ -const addInvoice = (value, memo = '', confidential = true, expiry = 180) => - Common.makePromise((res, rej) => { - const { lightning } = lightningServices.getServices() - - lightning.addInvoice( - { - value, - memo, - private: confidential, - expiry - }, - (err, resp) => { - if (err) { - rej(new Error(err.message)) - } else { - // Needs cast because typescript refuses to assign Record - // to an actual object :shrugs - res(/** @type {AddInvoiceRes} */ (resp)) - } - } - ) - }) - -/** - * @typedef {object} lndErr - * @prop {string} reason - * @prop {number} code - * - */ -/** - * @param {(invoice:Common.Schema.InvoiceWhenListed & {r_hash:Buffer,payment_addr:Buffer}) => (boolean | undefined)} dataCb - * @param {(error:lndErr) => void} errorCb - */ -const subscribeInvoices = (dataCb, errorCb) => { - const { lightning } = lightningServices.getServices() - const stream = lightning.subscribeInvoices({}) - stream.on('data', invoice => { - const cancelStream = dataCb(invoice) - if (cancelStream) { - //@ts-expect-error - stream.cancel() - } - }) - stream.on('error', error => { - errorCb(error) - try { - //@ts-expect-error - stream.cancel() - } catch { - logger.info( - '[subscribeInvoices] tried to cancel an already canceled stream' - ) - } - }) -} - -/** - * @param {(tx:Common.Schema.ChainTransaction) => (boolean | undefined)} dataCb - * @param {(error:lndErr) => void} errorCb - */ -const subscribeTransactions = (dataCb, errorCb) => { - const { lightning } = lightningServices.getServices() - const stream = lightning.subscribeTransactions({}) - stream.on('data', transaction => { - const cancelStream = dataCb(transaction) - if (cancelStream) { - //@ts-expect-error - stream.cancel() - } - }) - stream.on('error', error => { - errorCb(error) - try { - //@ts-expect-error - stream.cancel() - } catch { - logger.info( - '[subscribeTransactions] tried to cancel an already canceled stream' - ) - } - }) -} - -const getInfo = () => - Common.makePromise((res, rej) => { - const { lightning } = lightningServices.getServices() - - lightning.getInfo({}, (err, resp) => { - if (err) { - rej(new Error(err.message)) - } else { - // Needs cast because typescript refuses to assign Record - // to an actual object :shrugs - res(resp) - } - }) - }) -/** - * - * @param {string} pubkey - * @param {string} host - * @returns - */ -const connectPeer = (pubkey, host) => - Common.makePromise((res, rej) => { - const { lightning } = lightningServices.getServices() - const connectRequest = { - addr: { pubkey, host }, - perm: true - } - lightning.connectPeer(connectRequest, (err, resp) => { - if (err) { - rej(new Error(err.message)) - } else { - // Needs cast because typescript refuses to assign Record - // to an actual object :shrugs - res(resp) - } - }) - }) -module.exports = { - sendPaymentV2Keysend, - sendPaymentV2Invoice, - listPayments, - decodePayReq, - newAddress, - listUnspent, - listChannels, - getChanInfo, - listPeers, - pendingChannels, - addInvoice, - subscribeInvoices, - subscribeTransactions, - getInfo, - connectPeer -} diff --git a/utils/paginate.js b/utils/paginate.js deleted file mode 100644 index 6f342f70..00000000 --- a/utils/paginate.js +++ /dev/null @@ -1,14 +0,0 @@ -const getListPage = ({ entries = [], itemsPerPage = 20, page = 1 }) => { - const totalPages = Math.ceil(entries.length / itemsPerPage); - const offset = (page - 1) * itemsPerPage; - const limit = page * itemsPerPage; - const paginatedContent = entries.slice(offset, limit); - return { - content: paginatedContent, - page, - totalPages, - totalItems: entries.length - }; -}; - -module.exports = getListPage; diff --git a/utils/protectedRoutes.js b/utils/protectedRoutes.js deleted file mode 100644 index f9413d1f..00000000 --- a/utils/protectedRoutes.js +++ /dev/null @@ -1,61 +0,0 @@ -module.exports = { - unprotectedRoutes: { - GET: { - '/healthz': true, - '/ping': true, - '/tunnel/status': true, - // Errors out when viewing an API page from the browser - '/favicon.ico': true, - '/api/lnd/connect': true, - '/api/lnd/wallet/status': true, - // - '/api/gunw': true, - '/api/subscribeStream': true, - '/': true, - '/api/accessInfo': true, - '/qrCodeGenerator': true - }, - POST: { - '/api/lnd/connect': true, - '/api/lnd/wallet': true, - '/api/lnd/wallet/existing': true, - '/api/lnd/unlock': true, - '/api/security/exchangeKeys': true, - '/api/encryption/exchange': true - }, - PUT: {}, - DELETE: {}, - // Preflight request (CORS) - get OPTIONS() { - return { - ...this.POST, - ...this.GET, - ...this.PUT, - ...this.DELETE - } - } - }, - sensitiveRoutes: { - GET: {}, - POST: { - '/api/lnd/connect': true, - '/api/lnd/wallet': true - }, - PUT: {}, - DELETE: {} - }, - nonEncryptedRoutes: [ - '/api/security/exchangeKeys', - '/api/encryption/exchange', - '/healthz', - '/ping', - '/tunnel/status', - '/api/lnd/wallet/status', - '/api/gun/auth', - '/api/subscribeStream', - '/', - '/api/accessInfo', - '/qrCodeGenerator', - '/gun' - ] -} diff --git a/utils/server-utils.js b/utils/server-utils.js deleted file mode 100644 index 9139bea5..00000000 --- a/utils/server-utils.js +++ /dev/null @@ -1,12 +0,0 @@ -module.exports = server => { - const module = {}; - - server.getURL = function getURL() { - const HTTPSPort = this.httpsPort === "443" ? "" : ":" + this.httpsPort; - const HTTPPort = this.serverPort === "80" ? "" : ":" + this.serverPort; - const URLPort = this.useTLS ? HTTPSPort : HTTPPort; - return `http${this.useTLS ? "s" : ""}://${this.serverHost}${URLPort}`; - }; - - return module; -};