Compare commits
No commits in common. "master" and "addTsTypes" have entirely different histories.
master
...
addTsTypes
@ -22,7 +22,6 @@ var decoded = lightningPayReq.decode('lnbc20m1pvjluezhp58yjmdan79s6qqdhdzgynm4zw
|
||||
{
|
||||
"coinType": "bitcoin",
|
||||
"complete": true,
|
||||
"millisatoshi": "2000000000",
|
||||
"satoshis": 2000000,
|
||||
"payeeNodeKey": "03e7156ae33b0a208d0744199163177e909e80176e55d97a2f221ede0f934dd9ad",
|
||||
"paymentRequest": "lnbc20m1pvjluezhp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqfppqw508d6qejxtdg4y5r3zarvary0c5xw7kepvrhrm9s57hejg0p662ur5j5cr03890fa7k2pypgttmh4897d3raaq85a293e9jpuqwl0rnfuwzam7yr8e690nd2ypcq9hlkdwdvycqa0qza8",
|
||||
@ -54,9 +53,6 @@ var decoded = lightningPayReq.decode('lnbc20m1pvjluezhp58yjmdan79s6qqdhdzgynm4zw
|
||||
*/
|
||||
```
|
||||
|
||||
### Warning
|
||||
The `"satoshis"` field will only be set if the invoice is for a whole number of satoshis. If it is in a fractional number of satoshis, the `"millisatoshis"` field must be used. 1000 millisatoshis is 1 satoshi.
|
||||
|
||||
### Encoding
|
||||
* MINIMUM NEED: `privateKey` and one `payment_hash` tag as well as one `description`
|
||||
* (`timestamp` defaults to current time, `description` defaults to empty string,
|
||||
|
||||
285
package-lock.json
generated
285
package-lock.json
generated
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "bolt11",
|
||||
"version": "1.2.6",
|
||||
"version": "1.2.2",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
@ -327,7 +327,7 @@
|
||||
"bn.js": {
|
||||
"version": "4.11.8",
|
||||
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
|
||||
"integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
|
||||
"integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8="
|
||||
},
|
||||
"brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
@ -480,9 +480,8 @@
|
||||
"dev": true
|
||||
},
|
||||
"coininfo": {
|
||||
"version": "4.5.0",
|
||||
"resolved": "https://registry.npmjs.org/coininfo/-/coininfo-4.5.0.tgz",
|
||||
"integrity": "sha512-9YnPekCDaFSJl/yG27dEkCbHF09CO3Cz38A2TMcFZRMcaCy2l38B2nQK/rdz8zLqOLVzzE/e0MpcWMxvyEncGA==",
|
||||
"version": "git+https://github.com/cryptocoinjs/coininfo.git#c7e003b2fc0db165b89e6f98f6d6360ad22616b2",
|
||||
"from": "git+https://github.com/cryptocoinjs/coininfo.git#c7e003b2fc0db165b89e6f98f6d6360ad22616b2",
|
||||
"requires": {
|
||||
"safe-buffer": "^5.1.1"
|
||||
}
|
||||
@ -502,13 +501,6 @@
|
||||
"integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=",
|
||||
"dev": true
|
||||
},
|
||||
"commander": {
|
||||
"version": "2.20.0",
|
||||
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
|
||||
"integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"concat-map": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
|
||||
@ -1128,26 +1120,6 @@
|
||||
"integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
|
||||
"dev": true
|
||||
},
|
||||
"handlebars": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz",
|
||||
"integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"neo-async": "^2.6.0",
|
||||
"optimist": "^0.6.1",
|
||||
"source-map": "^0.6.1",
|
||||
"uglify-js": "^3.1.4"
|
||||
},
|
||||
"dependencies": {
|
||||
"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
|
||||
}
|
||||
}
|
||||
},
|
||||
"has": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
|
||||
@ -1397,9 +1369,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"js-yaml": {
|
||||
"version": "3.13.1",
|
||||
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
|
||||
"integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
|
||||
"version": "3.12.0",
|
||||
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
|
||||
"integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"argparse": "^1.0.7",
|
||||
@ -1480,9 +1452,9 @@
|
||||
}
|
||||
},
|
||||
"lodash": {
|
||||
"version": "4.17.13",
|
||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.13.tgz",
|
||||
"integrity": "sha512-vm3/XWXfWtRua0FkUyEHBZy8kCPjErNBT9fJx8Zvs+U6zjqPbTUOpkaoum3O5uiA8sm+yNMHXfYkTUHFoMxFNA=="
|
||||
"version": "4.17.10",
|
||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
|
||||
"integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg=="
|
||||
},
|
||||
"loose-envify": {
|
||||
"version": "1.4.0",
|
||||
@ -1580,12 +1552,6 @@
|
||||
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
|
||||
"dev": true
|
||||
},
|
||||
"neo-async": {
|
||||
"version": "2.6.0",
|
||||
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz",
|
||||
"integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==",
|
||||
"dev": true
|
||||
},
|
||||
"normalize-package-data": {
|
||||
"version": "2.4.0",
|
||||
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
|
||||
@ -1631,6 +1597,23 @@
|
||||
"yargs-parser": "^9.0.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"align-text": {
|
||||
"version": "0.1.4",
|
||||
"resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
|
||||
"integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "^3.0.2",
|
||||
"longest": "^1.0.1",
|
||||
"repeat-string": "^1.5.2"
|
||||
}
|
||||
},
|
||||
"amdefine": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
|
||||
"integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
|
||||
"dev": true
|
||||
},
|
||||
"ansi-regex": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
|
||||
@ -1658,6 +1641,12 @@
|
||||
"integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
|
||||
"dev": true
|
||||
},
|
||||
"async": {
|
||||
"version": "1.5.2",
|
||||
"resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
|
||||
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
|
||||
"dev": true
|
||||
},
|
||||
"balanced-match": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
||||
@ -1702,6 +1691,45 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"camelcase": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
|
||||
"integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"center-align": {
|
||||
"version": "0.1.3",
|
||||
"resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
|
||||
"integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"align-text": "^0.1.3",
|
||||
"lazy-cache": "^1.0.3"
|
||||
}
|
||||
},
|
||||
"cliui": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
|
||||
"integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"center-align": "^0.1.1",
|
||||
"right-align": "^0.1.1",
|
||||
"wordwrap": "0.0.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"wordwrap": {
|
||||
"version": "0.0.2",
|
||||
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
|
||||
"integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"code-point-at": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
|
||||
@ -1879,6 +1907,29 @@
|
||||
"integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
|
||||
"dev": true
|
||||
},
|
||||
"handlebars": {
|
||||
"version": "4.0.11",
|
||||
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz",
|
||||
"integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"async": "^1.4.0",
|
||||
"optimist": "^0.6.1",
|
||||
"source-map": "^0.4.4",
|
||||
"uglify-js": "^2.6"
|
||||
},
|
||||
"dependencies": {
|
||||
"source-map": {
|
||||
"version": "0.4.4",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
|
||||
"integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"amdefine": ">=0.0.4"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"has-flag": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
|
||||
@ -1925,6 +1976,12 @@
|
||||
"integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
|
||||
"dev": true
|
||||
},
|
||||
"is-buffer": {
|
||||
"version": "1.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
|
||||
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
|
||||
"dev": true
|
||||
},
|
||||
"is-builtin-module": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
|
||||
@ -2014,6 +2071,22 @@
|
||||
"integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
|
||||
"dev": true
|
||||
},
|
||||
"kind-of": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
||||
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-buffer": "^1.1.5"
|
||||
}
|
||||
},
|
||||
"lazy-cache": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
|
||||
"integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"lcid": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
|
||||
@ -2041,6 +2114,12 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"longest": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
|
||||
"integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
|
||||
"dev": true
|
||||
},
|
||||
"lru-cache": {
|
||||
"version": "4.1.3",
|
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
|
||||
@ -2181,6 +2260,16 @@
|
||||
"wrappy": "1"
|
||||
}
|
||||
},
|
||||
"optimist": {
|
||||
"version": "0.6.1",
|
||||
"resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
|
||||
"integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"minimist": "~0.0.1",
|
||||
"wordwrap": "~0.0.2"
|
||||
}
|
||||
},
|
||||
"os-homedir": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
|
||||
@ -2255,6 +2344,12 @@
|
||||
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
|
||||
"dev": true
|
||||
},
|
||||
"repeat-string": {
|
||||
"version": "1.6.1",
|
||||
"resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
|
||||
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
|
||||
"dev": true
|
||||
},
|
||||
"require-directory": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
|
||||
@ -2273,6 +2368,16 @@
|
||||
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
|
||||
"dev": true
|
||||
},
|
||||
"right-align": {
|
||||
"version": "0.1.3",
|
||||
"resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
|
||||
"integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"align-text": "^0.1.1"
|
||||
}
|
||||
},
|
||||
"rimraf": {
|
||||
"version": "2.6.2",
|
||||
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
|
||||
@ -2321,6 +2426,13 @@
|
||||
"integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=",
|
||||
"dev": true
|
||||
},
|
||||
"source-map": {
|
||||
"version": "0.5.7",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
|
||||
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"spawn-wrap": {
|
||||
"version": "1.4.2",
|
||||
"resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz",
|
||||
@ -2479,6 +2591,40 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"uglify-js": {
|
||||
"version": "2.8.29",
|
||||
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
|
||||
"integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"source-map": "~0.5.1",
|
||||
"uglify-to-browserify": "~1.0.0",
|
||||
"yargs": "~3.10.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"yargs": {
|
||||
"version": "3.10.0",
|
||||
"resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
|
||||
"integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"camelcase": "^1.0.2",
|
||||
"cliui": "^2.1.0",
|
||||
"decamelize": "^1.0.0",
|
||||
"window-size": "0.1.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"uglify-to-browserify": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
|
||||
"integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"validate-npm-package-license": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz",
|
||||
@ -2504,6 +2650,19 @@
|
||||
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
|
||||
"dev": true
|
||||
},
|
||||
"window-size": {
|
||||
"version": "0.1.0",
|
||||
"resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
|
||||
"integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"wordwrap": {
|
||||
"version": "0.0.3",
|
||||
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
|
||||
"integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
|
||||
"dev": true
|
||||
},
|
||||
"wrap-ansi": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
|
||||
@ -2683,24 +2842,6 @@
|
||||
"mimic-fn": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"optimist": {
|
||||
"version": "0.6.1",
|
||||
"resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
|
||||
"integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"minimist": "~0.0.1",
|
||||
"wordwrap": "~0.0.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"wordwrap": {
|
||||
"version": "0.0.3",
|
||||
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
|
||||
"integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"optionator": {
|
||||
"version": "0.8.2",
|
||||
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
|
||||
@ -3475,26 +3616,6 @@
|
||||
"resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.12.0.tgz",
|
||||
"integrity": "sha512-fvnkvueAOFLhtAqDgIA/wMP21SMwS/NQESFKZuwVrj5m/Ew6eK2S0z0iB++cwtROPWDOhaT6OUfla8UwMw4Adg=="
|
||||
},
|
||||
"uglify-js": {
|
||||
"version": "3.5.4",
|
||||
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.4.tgz",
|
||||
"integrity": "sha512-GpKo28q/7Bm5BcX9vOu4S46FwisbPbAmkkqPnGIpKvKTM96I85N6XHQV+k4I6FA2wxgLhcsSyHoNhzucwCflvA==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"commander": "~2.20.0",
|
||||
"source-map": "~0.6.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"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,
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"uniq": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "bolt11",
|
||||
"version": "1.2.6",
|
||||
"version": "1.2.2",
|
||||
"description": "A library for encoding and decoding lightning network payment requests as defined in [BOLT #11](https://github.com/lightningnetwork/lightning-rfc/blob/master/11-payment-encoding.md).",
|
||||
"main": "payreq.js",
|
||||
"types": "payreq.d.ts",
|
||||
@ -41,8 +41,8 @@
|
||||
"bech32": "^1.1.2",
|
||||
"bitcoinjs-lib": "^3.3.1",
|
||||
"bn.js": "^4.11.8",
|
||||
"coininfo": "^4.5.0",
|
||||
"lodash": "^4.17.11",
|
||||
"coininfo": "git+https://github.com/cryptocoinjs/coininfo.git#c7e003b2fc0db165b89e6f98f6d6360ad22616b2",
|
||||
"lodash": "^4.17.4",
|
||||
"safe-buffer": "^5.1.1",
|
||||
"secp256k1": "^3.4.0"
|
||||
}
|
||||
|
||||
12
payreq.d.ts
vendored
12
payreq.d.ts
vendored
@ -1,4 +1,4 @@
|
||||
import BN from "bn.js";
|
||||
import * as BN from "bn.js";
|
||||
|
||||
type RoutingInfo = Array<{
|
||||
pubkey: string;
|
||||
@ -12,10 +12,6 @@ type FallbackAddress = {
|
||||
address: string;
|
||||
addressHash: string;
|
||||
};
|
||||
type Network = {
|
||||
[index: string]: any;
|
||||
bech32: string;
|
||||
};
|
||||
|
||||
// Start exports
|
||||
export declare type TagData = string | number | RoutingInfo | FallbackAddress;
|
||||
@ -25,8 +21,8 @@ export declare type PaymentRequestObject = {
|
||||
prefix?: string;
|
||||
wordsTemp?: string;
|
||||
coinType?: string;
|
||||
satoshis?: number | null;
|
||||
millisatoshis?: string | null;
|
||||
satoshis?: number;
|
||||
millisatoshis?: string;
|
||||
timestamp?: number;
|
||||
timestampString?: string;
|
||||
timeExpireDate?: number;
|
||||
@ -40,7 +36,7 @@ export declare type PaymentRequestObject = {
|
||||
}>;
|
||||
};
|
||||
export declare function encode(inputData: PaymentRequestObject, addDefaults?: boolean): PaymentRequestObject;
|
||||
export declare function decode(paymentRequest: string, network?: Network): PaymentRequestObject;
|
||||
export declare function decode(paymentRequest: string): PaymentRequestObject;
|
||||
export declare function sign(inputPayReqObj: PaymentRequestObject, inputPrivateKey: string | Buffer): PaymentRequestObject;
|
||||
export declare function satToHrp(satoshis: number | string): string;
|
||||
export declare function millisatToHrp(millisatoshis: number | string): string;
|
||||
|
||||
56
payreq.js
56
payreq.js
@ -95,20 +95,6 @@ const TAGPARSERS = {
|
||||
'3': routingInfoParser // for extra routing info (private etc.)
|
||||
}
|
||||
|
||||
const unknownTagName = 'unknownTag'
|
||||
|
||||
function unknownEncoder (data) {
|
||||
data.words = bech32.decode(data.words, Number.MAX_SAFE_INTEGER).words
|
||||
return data
|
||||
}
|
||||
|
||||
function getUnknownParser (tagCode) {
|
||||
return (words) => ({
|
||||
tagCode: parseInt(tagCode),
|
||||
words: bech32.encode('unknown', words, Number.MAX_SAFE_INTEGER)
|
||||
})
|
||||
}
|
||||
|
||||
function wordsToIntBE (words) {
|
||||
return words.reverse().reduce((total, item, index) => {
|
||||
return total + item * Math.pow(32, index)
|
||||
@ -640,25 +626,14 @@ function encode (inputData, addDefaults) {
|
||||
let tags = data.tags
|
||||
let tagWords = []
|
||||
tags.forEach(tag => {
|
||||
const possibleTagNames = Object.keys(TAGENCODERS)
|
||||
if (canReconstruct) possibleTagNames.push(unknownTagName)
|
||||
// check if the tagName exists in the encoders object, if not throw Error.
|
||||
if (possibleTagNames.indexOf(tag.tagName) === -1) {
|
||||
if (Object.keys(TAGENCODERS).indexOf(tag.tagName) === -1) {
|
||||
throw new Error('Unknown tag key: ' + tag.tagName)
|
||||
}
|
||||
|
||||
let words
|
||||
if (tag.tagName !== unknownTagName) {
|
||||
// each tag starts with 1 word code for the tag
|
||||
tagWords.push(TAGCODES[tag.tagName])
|
||||
|
||||
const encoder = TAGENCODERS[tag.tagName]
|
||||
words = encoder(tag.data)
|
||||
} else {
|
||||
let result = unknownEncoder(tag.data)
|
||||
tagWords.push(result.tagCode)
|
||||
words = result.words
|
||||
}
|
||||
// each tag starts with 1 word code for the tag
|
||||
tagWords.push(TAGCODES[tag.tagName])
|
||||
let encoder = TAGENCODERS[tag.tagName]
|
||||
let words = encoder(tag.data)
|
||||
// after the tag code, 2 words are used to store the length (in 5 bit words) of the tag data
|
||||
// (also left padded, most integers are left padded while buffers are right padded)
|
||||
tagWords = tagWords.concat([0].concat(intBEToWords(words.length)).slice(-2))
|
||||
@ -720,7 +695,7 @@ function encode (inputData, addDefaults) {
|
||||
|
||||
// decode will only have extra comments that aren't covered in encode comments.
|
||||
// also if anything is hard to read I'll comment.
|
||||
function decode (paymentRequest, network) {
|
||||
function decode (paymentRequest) {
|
||||
if (typeof paymentRequest !== 'string') throw new Error('Lightning Payment Request must be string')
|
||||
if (paymentRequest.slice(0, 2).toLowerCase() !== 'ln') throw new Error('Not a proper lightning payment request')
|
||||
let decoded = bech32.decode(paymentRequest, Number.MAX_SAFE_INTEGER)
|
||||
@ -755,16 +730,12 @@ function decode (paymentRequest, network) {
|
||||
throw new Error('Not a proper lightning payment request')
|
||||
}
|
||||
|
||||
let bech32Prefix = prefixMatches[1]
|
||||
let coinNetwork, coinType
|
||||
if (BECH32CODES[bech32Prefix]) {
|
||||
coinType = BECH32CODES[bech32Prefix]
|
||||
let coinType = prefixMatches[1]
|
||||
let coinNetwork
|
||||
if (BECH32CODES[coinType]) {
|
||||
coinType = BECH32CODES[coinType]
|
||||
coinNetwork = BITCOINJS_NETWORK_INFO[coinType]
|
||||
} else if (network && network.bech32) {
|
||||
coinType = 'unknown'
|
||||
coinNetwork = network
|
||||
}
|
||||
if (!coinNetwork || coinNetwork.bech32 !== bech32Prefix) {
|
||||
} else {
|
||||
throw new Error('Unknown coin bech32 prefix')
|
||||
}
|
||||
|
||||
@ -794,9 +765,8 @@ function decode (paymentRequest, network) {
|
||||
// we have no tag count to go on, so just keep hacking off words
|
||||
// until we have none.
|
||||
while (words.length > 0) {
|
||||
let tagCode = words[0].toString()
|
||||
tagName = TAGNAMES[tagCode] || unknownTagName
|
||||
parser = TAGPARSERS[tagCode] || getUnknownParser(tagCode)
|
||||
tagName = TAGNAMES[words[0].toString()]
|
||||
parser = TAGPARSERS[words[0].toString()]
|
||||
words = words.slice(1)
|
||||
|
||||
tagLength = wordsToIntBE(words.slice(0, 2))
|
||||
|
||||
@ -206,48 +206,3 @@ tape(`can decode upper case payment request`, (t) => {
|
||||
t.ok(decoded.complete === true)
|
||||
t.end()
|
||||
})
|
||||
|
||||
tape(`can decode and encode payment request containing unknown tags`, (t) => {
|
||||
const paymentRequest = 'lntb30m1pw2f2yspp5s59w4a0kjecw3zyexm7zur8l8' +
|
||||
'n4scw674w8sftjhwec33km882gsdpa2pshjmt9de6zq' +
|
||||
'un9w96k2um5ypmkjargypkh2mr5d9cxzun5ypeh2urs' +
|
||||
'dae8gxqruyqvzddp68gup69uhnzwfj9cejuvf3xshrw' +
|
||||
'de68qcrswf0d46kcarfwpshyaplw3skw0tdw4k8g6ts' +
|
||||
'v9e8gu2etcvsym36pdjpz04wm9nn96f9ntc3t3h5r08' +
|
||||
'pe9d62p3js5wt5rkurqnrl7zkj2fjpvl3rmn7wwazt8' +
|
||||
'0letwxlm22hngu8n88g7hsp542qpl'
|
||||
|
||||
const decoded = lnpayreq.decode(paymentRequest)
|
||||
t.ok(decoded.complete === true)
|
||||
|
||||
const encoded = lnpayreq.encode(decoded)
|
||||
t.same(encoded.paymentRequest, paymentRequest)
|
||||
|
||||
// make canReconstruct false
|
||||
// encoding unknown tags should fail if making a new request
|
||||
// if signature and recoveryFlag are present there are checks
|
||||
// to make sure that the data is what is signed
|
||||
// As long as it is impossible to create
|
||||
decoded.signature = undefined
|
||||
decoded.recoveryFlag = undefined
|
||||
|
||||
t.throws(() => {
|
||||
lnpayreq.encode(decoded)
|
||||
}, new RegExp('Unknown tag key: unknownTag'))
|
||||
|
||||
t.end()
|
||||
})
|
||||
|
||||
tape(`can decode unknown network payment request`, (t) => {
|
||||
const network = { bech32: 'sb' }
|
||||
let decoded = lnpayreq.decode(
|
||||
'lnsb1u1pwslkj8pp52u27w39645j24a0zfxnwytshxserjchdqt8nz8uwv9fp8wasxrhsdq' +
|
||||
'l2pkxz7tfdenjqum0w4hxggrgv4kxj7qcqzpgnvqq8t63nxmgha5945s633fdd3p5x9k889' +
|
||||
'g6p02qsghx4vrgqgr3xzz3hgld8r84ellwgz3teexvqzwlxj7lgkhl8xh2p7dstq0fgsspa' +
|
||||
'5ldq6',
|
||||
network
|
||||
)
|
||||
t.ok(decoded.complete === true)
|
||||
t.ok(decoded.coinType === 'unknown')
|
||||
t.end()
|
||||
})
|
||||
|
||||
Loading…
Reference in New Issue
Block a user