From ba9a578ec02a0da512d51c01fc71ce6f84631bad Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Mon, 17 Jun 2024 11:05:14 -0300 Subject: [PATCH 01/11] feat: add bolt11 dependency --- deno.json | 3 ++- deno.lock | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/deno.json b/deno.json index 18c88749..65fb94da 100644 --- a/deno.json +++ b/deno.json @@ -62,7 +62,8 @@ "type-fest": "npm:type-fest@^4.3.0", "unfurl.js": "npm:unfurl.js@^6.4.0", "zod": "npm:zod@^3.23.8", - "~/fixtures/": "./fixtures/" + "~/fixtures/": "./fixtures/", + "bolt11": "npm:bolt11@^1.4.1" }, "lint": { "include": ["src/", "scripts/"], diff --git a/deno.lock b/deno.lock index faca92e0..91671a0b 100644 --- a/deno.lock +++ b/deno.lock @@ -1375,6 +1375,7 @@ "npm:@isaacs/ttlcache@^1.4.1", "npm:@noble/secp256k1@^2.0.0", "npm:@scure/base@^1.1.6", + "npm:bolt11@^1.4.1", "npm:comlink@^4.4.1", "npm:entities@^4.5.0", "npm:fast-stable-stringify@^1.0.0", From d71eb4721292645a4f34748feb3eae05f398ba5d Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Mon, 17 Jun 2024 11:18:59 -0300 Subject: [PATCH 02/11] build(deno.lock): bolt11 dependencies --- deno.lock | 206 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 206 insertions(+) diff --git a/deno.lock b/deno.lock index 91671a0b..7ef55ccd 100644 --- a/deno.lock +++ b/deno.lock @@ -38,6 +38,7 @@ "npm:@scure/bip32@^1.4.0": "npm:@scure/bip32@1.4.0", "npm:@scure/bip39@^1.3.0": "npm:@scure/bip39@1.3.0", "npm:@types/node": "npm:@types/node@18.16.19", + "npm:bolt11": "npm:bolt11@1.4.1", "npm:comlink@^4.4.1": "npm:comlink@4.4.1", "npm:entities@^4.5.0": "npm:entities@4.5.0", "npm:fast-stable-stringify@^1.0.0": "npm:fast-stable-stringify@1.0.0", @@ -307,6 +308,12 @@ "@scure/base": "@scure/base@1.1.6" } }, + "@types/bn.js@4.11.6": { + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dependencies": { + "@types/node": "@types/node@18.16.19" + } + }, "@types/dompurify@3.0.5": { "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==", "dependencies": { @@ -345,16 +352,84 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dependencies": {} }, + "base-x@4.0.0": { + "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==", + "dependencies": {} + }, + "bech32@1.1.4": { + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", + "dependencies": {} + }, + "bech32@2.0.0": { + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==", + "dependencies": {} + }, + "bip174@2.1.1": { + "integrity": "sha512-mdFV5+/v0XyNYXjBS6CQPLo9ekCx4gtKZFnJm5PMto7Fs9hTTDpkkzOB7/FtluRI6JbUUAu+snTYfJRgHLZbZQ==", + "dependencies": {} + }, + "bitcoinjs-lib@6.1.6": { + "integrity": "sha512-Fk8+Vc+e2rMoDU5gXkW9tD+313rhkm5h6N9HfZxXvYU9LedttVvmXKTgd9k5rsQJjkSfsv6XRM8uhJv94SrvcA==", + "dependencies": { + "@noble/hashes": "@noble/hashes@1.4.0", + "bech32": "bech32@2.0.0", + "bip174": "bip174@2.1.1", + "bs58check": "bs58check@3.0.1", + "typeforce": "typeforce@1.18.0", + "varuint-bitcoin": "varuint-bitcoin@1.1.2" + } + }, + "bn.js@4.12.0": { + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dependencies": {} + }, + "bolt11@1.4.1": { + "integrity": "sha512-jR0Y+MO+CK2at1Cg5mltLJ+6tdOwNKoTS/DJOBDdzVkQ+R9D6UgZMayTWOsuzY7OgV1gEqlyT5Tzk6t6r4XcNQ==", + "dependencies": { + "@types/bn.js": "@types/bn.js@4.11.6", + "bech32": "bech32@1.1.4", + "bitcoinjs-lib": "bitcoinjs-lib@6.1.6", + "bn.js": "bn.js@4.12.0", + "create-hash": "create-hash@1.2.0", + "lodash": "lodash@4.17.21", + "safe-buffer": "safe-buffer@5.2.1", + "secp256k1": "secp256k1@4.0.3" + } + }, "braces@3.0.2": { "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { "fill-range": "fill-range@7.0.1" } }, + "brorand@1.1.0": { + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dependencies": {} + }, + "bs58@5.0.0": { + "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", + "dependencies": { + "base-x": "base-x@4.0.0" + } + }, + "bs58check@3.0.1": { + "integrity": "sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ==", + "dependencies": { + "@noble/hashes": "@noble/hashes@1.4.0", + "bs58": "bs58@5.0.0" + } + }, "chalk@5.3.0": { "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dependencies": {} }, + "cipher-base@1.0.4": { + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "inherits@2.0.4", + "safe-buffer": "safe-buffer@5.2.1" + } + }, "cli-cursor@4.0.0": { "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dependencies": { @@ -386,6 +461,16 @@ "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dependencies": {} }, + "create-hash@1.2.0": { + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "cipher-base@1.0.4", + "inherits": "inherits@2.0.4", + "md5.js": "md5.js@1.3.5", + "ripemd160": "ripemd160@2.0.2", + "sha.js": "sha.js@2.4.11" + } + }, "cross-spawn@7.0.3": { "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dependencies": { @@ -457,6 +542,18 @@ "domhandler": "domhandler@5.0.3" } }, + "elliptic@6.5.5": { + "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", + "dependencies": { + "bn.js": "bn.js@4.12.0", + "brorand": "brorand@1.1.0", + "hash.js": "hash.js@1.1.7", + "hmac-drbg": "hmac-drbg@1.0.1", + "inherits": "inherits@2.0.4", + "minimalistic-assert": "minimalistic-assert@1.0.1", + "minimalistic-crypto-utils": "minimalistic-crypto-utils@1.0.1" + } + }, "emoji-regex@10.3.0": { "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", "dependencies": {} @@ -513,10 +610,33 @@ "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dependencies": {} }, + "hash-base@3.1.0": { + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dependencies": { + "inherits": "inherits@2.0.4", + "readable-stream": "readable-stream@3.6.2", + "safe-buffer": "safe-buffer@5.2.1" + } + }, + "hash.js@1.1.7": { + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "inherits@2.0.4", + "minimalistic-assert": "minimalistic-assert@1.0.1" + } + }, "he@1.2.0": { "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dependencies": {} }, + "hmac-drbg@1.0.1": { + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dependencies": { + "hash.js": "hash.js@1.1.7", + "minimalistic-assert": "minimalistic-assert@1.0.1", + "minimalistic-crypto-utils": "minimalistic-crypto-utils@1.0.1" + } + }, "html-encoding-sniffer@4.0.0": { "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "dependencies": { @@ -562,6 +682,10 @@ "safer-buffer": "safer-buffer@2.1.2" } }, + "inherits@2.0.4": { + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dependencies": {} + }, "is-fullwidth-code-point@4.0.0": { "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dependencies": {} @@ -682,6 +806,10 @@ "wrap-ansi": "wrap-ansi@9.0.0" } }, + "lodash@4.17.21": { + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dependencies": {} + }, "log-update@6.0.0": { "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", "dependencies": { @@ -696,6 +824,14 @@ "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", "dependencies": {} }, + "md5.js@1.3.5": { + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "hash-base@3.1.0", + "inherits": "inherits@2.0.4", + "safe-buffer": "safe-buffer@5.2.1" + } + }, "merge-stream@2.0.0": { "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dependencies": {} @@ -725,6 +861,14 @@ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dependencies": {} }, + "minimalistic-assert@1.0.1": { + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dependencies": {} + }, + "minimalistic-crypto-utils@1.0.1": { + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dependencies": {} + }, "ms@2.1.2": { "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dependencies": {} @@ -733,12 +877,20 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dependencies": {} }, + "node-addon-api@2.0.2": { + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "dependencies": {} + }, "node-fetch@2.7.0": { "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dependencies": { "whatwg-url": "whatwg-url@5.0.0" } }, + "node-gyp-build@4.8.0": { + "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", + "dependencies": {} + }, "nostr-relaypool2@0.6.34": { "integrity": "sha512-e3FDh9w/wQkY513mvoJps1Hc/Y5wiWXeBM6MD+YKSyAg+px+/8uHSSHAuHhlavw7oOEOvEsIGlMDMc57DG3MOA==", "dependencies": { @@ -842,6 +994,14 @@ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dependencies": {} }, + "readable-stream@3.6.2": { + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "inherits@2.0.4", + "string_decoder": "string_decoder@1.3.0", + "util-deprecate": "util-deprecate@1.0.2" + } + }, "requires-port@1.0.0": { "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dependencies": {} @@ -857,10 +1017,21 @@ "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", "dependencies": {} }, + "ripemd160@2.0.2": { + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "hash-base@3.1.0", + "inherits": "inherits@2.0.4" + } + }, "rrweb-cssom@0.6.0": { "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", "dependencies": {} }, + "safe-buffer@5.2.1": { + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dependencies": {} + }, "safe-stable-stringify@2.4.3": { "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", "dependencies": {} @@ -875,6 +1046,21 @@ "xmlchars": "xmlchars@2.2.0" } }, + "secp256k1@4.0.3": { + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "dependencies": { + "elliptic": "elliptic@6.5.5", + "node-addon-api": "node-addon-api@2.0.2", + "node-gyp-build": "node-gyp-build@4.8.0" + } + }, + "sha.js@2.4.11": { + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "inherits@2.0.4", + "safe-buffer": "safe-buffer@5.2.1" + } + }, "shebang-command@2.0.0": { "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dependencies": { @@ -919,6 +1105,12 @@ "strip-ansi": "strip-ansi@7.1.0" } }, + "string_decoder@1.3.0": { + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "safe-buffer@5.2.1" + } + }, "strip-ansi@7.1.0": { "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dependencies": { @@ -976,6 +1168,10 @@ "integrity": "sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg==", "dependencies": {} }, + "typeforce@1.18.0": { + "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==", + "dependencies": {} + }, "unfurl.js@6.4.0": { "integrity": "sha512-DogJFWPkOWMcu2xPdpmbcsL+diOOJInD3/jXOv6saX1upnWmMK8ndAtDWUfJkuInqNI9yzADud4ID9T+9UeWCw==", "dependencies": { @@ -997,6 +1193,16 @@ "requires-port": "requires-port@1.0.0" } }, + "util-deprecate@1.0.2": { + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dependencies": {} + }, + "varuint-bitcoin@1.1.2": { + "integrity": "sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw==", + "dependencies": { + "safe-buffer": "safe-buffer@5.2.1" + } + }, "w3c-xmlserializer@5.0.0": { "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "dependencies": { From d33ecdc0f6294ed290fb27aedb5bef3960b1b5ae Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Mon, 17 Jun 2024 14:28:26 -0300 Subject: [PATCH 03/11] build: specify bolt11 version --- deno.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/deno.lock b/deno.lock index 7ef55ccd..e92f265c 100644 --- a/deno.lock +++ b/deno.lock @@ -39,6 +39,7 @@ "npm:@scure/bip39@^1.3.0": "npm:@scure/bip39@1.3.0", "npm:@types/node": "npm:@types/node@18.16.19", "npm:bolt11": "npm:bolt11@1.4.1", + "npm:bolt11@^1.4.1": "npm:bolt11@1.4.1", "npm:comlink@^4.4.1": "npm:comlink@4.4.1", "npm:entities@^4.5.0": "npm:entities@4.5.0", "npm:fast-stable-stringify@^1.0.0": "npm:fast-stable-stringify@1.0.0", From 82bf36f0646e7620e50ac12ebdeb95f2c399db53 Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Mon, 17 Jun 2024 14:38:04 -0300 Subject: [PATCH 04/11] feat(bolt11): create getAmount function --- src/utils/bolt11.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/utils/bolt11.ts diff --git a/src/utils/bolt11.ts b/src/utils/bolt11.ts new file mode 100644 index 00000000..3e7db690 --- /dev/null +++ b/src/utils/bolt11.ts @@ -0,0 +1,15 @@ +import bolt11 from 'bolt11'; + +/** Decodes the invoice and returns the amount in millisatoshis */ +function getAmount(invoice: string | undefined): string | undefined { + if (!invoice) return; + + try { + const decoded = bolt11.decode(invoice); + return decoded?.millisatoshis ?? undefined; + } catch { + return; + } +} + +export { getAmount }; From 2f49e94e4cc6d6d73e774df5ebc17dda57993139 Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Mon, 17 Jun 2024 14:50:07 -0300 Subject: [PATCH 05/11] test(bolt11): getAmount function --- src/utils/bolt11.test.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/utils/bolt11.test.ts diff --git a/src/utils/bolt11.test.ts b/src/utils/bolt11.test.ts new file mode 100644 index 00000000..9a9d1238 --- /dev/null +++ b/src/utils/bolt11.test.ts @@ -0,0 +1,19 @@ +import { assertEquals } from '@std/assert'; +import { getAmount } from '@/utils/bolt11.ts'; + +Deno.test('Invoice is invalid', () => { + assertEquals(getAmount('hello'), undefined); +}); + +Deno.test('Invoice is undefined', () => { + assertEquals(getAmount(undefined), undefined); +}); + +Deno.test('Amount is 200000', () => { + assertEquals( + getAmount( + 'lnbc2u1pn8qatypp5dweqaltlry2vgpxxyc0puxnc50335yznevj2g46wrhfm2694lhgqhp576ekte7lhhtsxdk6tfvkpyp8gdk2xccmuccdxwjd0fqdh34wfseqcqzzsxqyz5vqsp5n44zva7xndawg5l2r9d85v0tszwejtfzkc7v90d6c7d3nsdt0qds9qxpqysgqx2v2artsxmnfkpapdm9f5pahjs8etlpe7kcjue2kffhjg3jrtearstjvenr6lxzhpw3es4hpchzzeet7ul88elurfmvr9v94v0655rgpy7m7r5', + ), + '200000', + ); +}); From 7a29c349e892ced61dc33c884e7a1cf782ef62ff Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Mon, 17 Jun 2024 14:50:46 -0300 Subject: [PATCH 06/11] fix: get amount from zap receipt if not present in zap request --- src/controllers/api/statuses.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/controllers/api/statuses.ts b/src/controllers/api/statuses.ts index 7b9e82cd..7283b65d 100644 --- a/src/controllers/api/statuses.ts +++ b/src/controllers/api/statuses.ts @@ -21,6 +21,7 @@ import { addTag, deleteTag } from '@/utils/tags.ts'; import { asyncReplaceAll } from '@/utils/text.ts'; import { DittoEvent } from '@/interfaces/DittoEvent.ts'; import { accountFromPubkey, renderAccount } from '@/views/mastodon/accounts.ts'; +import { getAmount } from '@/utils/bolt11.ts'; const createStatusSchema = z.object({ in_reply_to_id: n.id().nullish(), @@ -548,10 +549,17 @@ const zappedByController: AppController = async (c) => { const amountSchema = z.coerce.number().int().nonnegative().catch(0); const events: DittoEvent[] = (await store.query([{ kinds: [9735], '#e': [id], limit: 100 }])).map((event) => { - const zapRequest = event.tags.find(([name]) => name === 'description')?.[1]; - if (!zapRequest) return; + const zapRequestString = event.tags.find(([name]) => name === 'description')?.[1]; + if (!zapRequestString) return; try { - return JSON.parse(zapRequest); + const zapRequest = JSON.parse(zapRequestString); + const amount = zapRequest?.tags.find(([name]: any) => name === 'amount')?.[1]; + if (!amount) { + const amount = getAmount(event?.tags.find(([name]) => name === 'bolt11')?.[1]); + if (!amount) return; + zapRequest.tags.push(['amount', amount]); + } + return zapRequest; } catch { return; } From c6425ad7fff9efcdd8c3879dfff819f144b45fae Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Mon, 17 Jun 2024 18:15:42 -0300 Subject: [PATCH 07/11] fix(bolt11): print error --- src/utils/bolt11.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/utils/bolt11.ts b/src/utils/bolt11.ts index 3e7db690..ba3dbe93 100644 --- a/src/utils/bolt11.ts +++ b/src/utils/bolt11.ts @@ -7,7 +7,8 @@ function getAmount(invoice: string | undefined): string | undefined { try { const decoded = bolt11.decode(invoice); return decoded?.millisatoshis ?? undefined; - } catch { + } catch (e) { + console.log(e); return; } } From b237432312a13957565c980ba07bac676112a8ce Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Mon, 17 Jun 2024 19:40:47 -0300 Subject: [PATCH 08/11] fix: change bolt11 dependency to light-bolt11-decoder --- deno.json | 2 +- deno.lock | 221 ++---------------------------------------------------- 2 files changed, 9 insertions(+), 214 deletions(-) diff --git a/deno.json b/deno.json index 65fb94da..9ae0f0f3 100644 --- a/deno.json +++ b/deno.json @@ -63,7 +63,7 @@ "unfurl.js": "npm:unfurl.js@^6.4.0", "zod": "npm:zod@^3.23.8", "~/fixtures/": "./fixtures/", - "bolt11": "npm:bolt11@^1.4.1" + "light-bolt11-decoder": "npm:light-bolt11-decoder" }, "lint": { "include": ["src/", "scripts/"], diff --git a/deno.lock b/deno.lock index e92f265c..0ece7f6e 100644 --- a/deno.lock +++ b/deno.lock @@ -37,9 +37,6 @@ "npm:@scure/base@^1.1.6": "npm:@scure/base@1.1.6", "npm:@scure/bip32@^1.4.0": "npm:@scure/bip32@1.4.0", "npm:@scure/bip39@^1.3.0": "npm:@scure/bip39@1.3.0", - "npm:@types/node": "npm:@types/node@18.16.19", - "npm:bolt11": "npm:bolt11@1.4.1", - "npm:bolt11@^1.4.1": "npm:bolt11@1.4.1", "npm:comlink@^4.4.1": "npm:comlink@4.4.1", "npm:entities@^4.5.0": "npm:entities@4.5.0", "npm:fast-stable-stringify@^1.0.0": "npm:fast-stable-stringify@1.0.0", @@ -49,6 +46,7 @@ "npm:kysely@0.27.3": "npm:kysely@0.27.3", "npm:kysely@^0.27.2": "npm:kysely@0.27.3", "npm:kysely@^0.27.3": "npm:kysely@0.27.3", + "npm:light-bolt11-decoder": "npm:light-bolt11-decoder@3.1.1", "npm:linkify-plugin-hashtag@^4.1.1": "npm:linkify-plugin-hashtag@4.1.3_linkifyjs@4.1.3", "npm:linkify-string@^4.1.1": "npm:linkify-string@4.1.3_linkifyjs@4.1.3", "npm:linkifyjs@^4.1.1": "npm:linkifyjs@4.1.3", @@ -309,22 +307,12 @@ "@scure/base": "@scure/base@1.1.6" } }, - "@types/bn.js@4.11.6": { - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dependencies": { - "@types/node": "@types/node@18.16.19" - } - }, "@types/dompurify@3.0.5": { "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==", "dependencies": { "@types/trusted-types": "@types/trusted-types@2.0.7" } }, - "@types/node@18.16.19": { - "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==", - "dependencies": {} - }, "@types/trusted-types@2.0.7": { "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", "dependencies": {} @@ -353,84 +341,16 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dependencies": {} }, - "base-x@4.0.0": { - "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==", - "dependencies": {} - }, - "bech32@1.1.4": { - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", - "dependencies": {} - }, - "bech32@2.0.0": { - "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==", - "dependencies": {} - }, - "bip174@2.1.1": { - "integrity": "sha512-mdFV5+/v0XyNYXjBS6CQPLo9ekCx4gtKZFnJm5PMto7Fs9hTTDpkkzOB7/FtluRI6JbUUAu+snTYfJRgHLZbZQ==", - "dependencies": {} - }, - "bitcoinjs-lib@6.1.6": { - "integrity": "sha512-Fk8+Vc+e2rMoDU5gXkW9tD+313rhkm5h6N9HfZxXvYU9LedttVvmXKTgd9k5rsQJjkSfsv6XRM8uhJv94SrvcA==", - "dependencies": { - "@noble/hashes": "@noble/hashes@1.4.0", - "bech32": "bech32@2.0.0", - "bip174": "bip174@2.1.1", - "bs58check": "bs58check@3.0.1", - "typeforce": "typeforce@1.18.0", - "varuint-bitcoin": "varuint-bitcoin@1.1.2" - } - }, - "bn.js@4.12.0": { - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dependencies": {} - }, - "bolt11@1.4.1": { - "integrity": "sha512-jR0Y+MO+CK2at1Cg5mltLJ+6tdOwNKoTS/DJOBDdzVkQ+R9D6UgZMayTWOsuzY7OgV1gEqlyT5Tzk6t6r4XcNQ==", - "dependencies": { - "@types/bn.js": "@types/bn.js@4.11.6", - "bech32": "bech32@1.1.4", - "bitcoinjs-lib": "bitcoinjs-lib@6.1.6", - "bn.js": "bn.js@4.12.0", - "create-hash": "create-hash@1.2.0", - "lodash": "lodash@4.17.21", - "safe-buffer": "safe-buffer@5.2.1", - "secp256k1": "secp256k1@4.0.3" - } - }, "braces@3.0.2": { "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { "fill-range": "fill-range@7.0.1" } }, - "brorand@1.1.0": { - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dependencies": {} - }, - "bs58@5.0.0": { - "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", - "dependencies": { - "base-x": "base-x@4.0.0" - } - }, - "bs58check@3.0.1": { - "integrity": "sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ==", - "dependencies": { - "@noble/hashes": "@noble/hashes@1.4.0", - "bs58": "bs58@5.0.0" - } - }, "chalk@5.3.0": { "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dependencies": {} }, - "cipher-base@1.0.4": { - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dependencies": { - "inherits": "inherits@2.0.4", - "safe-buffer": "safe-buffer@5.2.1" - } - }, "cli-cursor@4.0.0": { "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dependencies": { @@ -462,16 +382,6 @@ "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dependencies": {} }, - "create-hash@1.2.0": { - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dependencies": { - "cipher-base": "cipher-base@1.0.4", - "inherits": "inherits@2.0.4", - "md5.js": "md5.js@1.3.5", - "ripemd160": "ripemd160@2.0.2", - "sha.js": "sha.js@2.4.11" - } - }, "cross-spawn@7.0.3": { "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dependencies": { @@ -543,18 +453,6 @@ "domhandler": "domhandler@5.0.3" } }, - "elliptic@6.5.5": { - "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", - "dependencies": { - "bn.js": "bn.js@4.12.0", - "brorand": "brorand@1.1.0", - "hash.js": "hash.js@1.1.7", - "hmac-drbg": "hmac-drbg@1.0.1", - "inherits": "inherits@2.0.4", - "minimalistic-assert": "minimalistic-assert@1.0.1", - "minimalistic-crypto-utils": "minimalistic-crypto-utils@1.0.1" - } - }, "emoji-regex@10.3.0": { "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", "dependencies": {} @@ -611,33 +509,10 @@ "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dependencies": {} }, - "hash-base@3.1.0": { - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dependencies": { - "inherits": "inherits@2.0.4", - "readable-stream": "readable-stream@3.6.2", - "safe-buffer": "safe-buffer@5.2.1" - } - }, - "hash.js@1.1.7": { - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dependencies": { - "inherits": "inherits@2.0.4", - "minimalistic-assert": "minimalistic-assert@1.0.1" - } - }, "he@1.2.0": { "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dependencies": {} }, - "hmac-drbg@1.0.1": { - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dependencies": { - "hash.js": "hash.js@1.1.7", - "minimalistic-assert": "minimalistic-assert@1.0.1", - "minimalistic-crypto-utils": "minimalistic-crypto-utils@1.0.1" - } - }, "html-encoding-sniffer@4.0.0": { "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "dependencies": { @@ -683,10 +558,6 @@ "safer-buffer": "safer-buffer@2.1.2" } }, - "inherits@2.0.4": { - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dependencies": {} - }, "is-fullwidth-code-point@4.0.0": { "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dependencies": {} @@ -761,6 +632,12 @@ "integrity": "sha512-lG03Ru+XyOJFsjH3OMY6R/9U38IjDPfnOfDgO3ynhbDr+Dz8fak+X6L62vqu3iybQnj+lG84OttBuU9KY3L9kA==", "dependencies": {} }, + "light-bolt11-decoder@3.1.1": { + "integrity": "sha512-sLg/KCwYkgsHWkefWd6KqpCHrLFWWaXTOX3cf6yD2hAzL0SLpX+lFcaFK2spkjbgzG6hhijKfORDc9WoUHwX0A==", + "dependencies": { + "@scure/base": "@scure/base@1.1.1" + } + }, "lilconfig@3.0.0": { "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", "dependencies": {} @@ -807,10 +684,6 @@ "wrap-ansi": "wrap-ansi@9.0.0" } }, - "lodash@4.17.21": { - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dependencies": {} - }, "log-update@6.0.0": { "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", "dependencies": { @@ -825,14 +698,6 @@ "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", "dependencies": {} }, - "md5.js@1.3.5": { - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dependencies": { - "hash-base": "hash-base@3.1.0", - "inherits": "inherits@2.0.4", - "safe-buffer": "safe-buffer@5.2.1" - } - }, "merge-stream@2.0.0": { "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dependencies": {} @@ -862,14 +727,6 @@ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dependencies": {} }, - "minimalistic-assert@1.0.1": { - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dependencies": {} - }, - "minimalistic-crypto-utils@1.0.1": { - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "dependencies": {} - }, "ms@2.1.2": { "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dependencies": {} @@ -878,20 +735,12 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dependencies": {} }, - "node-addon-api@2.0.2": { - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "dependencies": {} - }, "node-fetch@2.7.0": { "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dependencies": { "whatwg-url": "whatwg-url@5.0.0" } }, - "node-gyp-build@4.8.0": { - "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", - "dependencies": {} - }, "nostr-relaypool2@0.6.34": { "integrity": "sha512-e3FDh9w/wQkY513mvoJps1Hc/Y5wiWXeBM6MD+YKSyAg+px+/8uHSSHAuHhlavw7oOEOvEsIGlMDMc57DG3MOA==", "dependencies": { @@ -995,14 +844,6 @@ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dependencies": {} }, - "readable-stream@3.6.2": { - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "inherits@2.0.4", - "string_decoder": "string_decoder@1.3.0", - "util-deprecate": "util-deprecate@1.0.2" - } - }, "requires-port@1.0.0": { "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dependencies": {} @@ -1018,21 +859,10 @@ "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", "dependencies": {} }, - "ripemd160@2.0.2": { - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dependencies": { - "hash-base": "hash-base@3.1.0", - "inherits": "inherits@2.0.4" - } - }, "rrweb-cssom@0.6.0": { "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", "dependencies": {} }, - "safe-buffer@5.2.1": { - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dependencies": {} - }, "safe-stable-stringify@2.4.3": { "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", "dependencies": {} @@ -1047,21 +877,6 @@ "xmlchars": "xmlchars@2.2.0" } }, - "secp256k1@4.0.3": { - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "dependencies": { - "elliptic": "elliptic@6.5.5", - "node-addon-api": "node-addon-api@2.0.2", - "node-gyp-build": "node-gyp-build@4.8.0" - } - }, - "sha.js@2.4.11": { - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dependencies": { - "inherits": "inherits@2.0.4", - "safe-buffer": "safe-buffer@5.2.1" - } - }, "shebang-command@2.0.0": { "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dependencies": { @@ -1106,12 +921,6 @@ "strip-ansi": "strip-ansi@7.1.0" } }, - "string_decoder@1.3.0": { - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "safe-buffer@5.2.1" - } - }, "strip-ansi@7.1.0": { "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dependencies": { @@ -1169,10 +978,6 @@ "integrity": "sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg==", "dependencies": {} }, - "typeforce@1.18.0": { - "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==", - "dependencies": {} - }, "unfurl.js@6.4.0": { "integrity": "sha512-DogJFWPkOWMcu2xPdpmbcsL+diOOJInD3/jXOv6saX1upnWmMK8ndAtDWUfJkuInqNI9yzADud4ID9T+9UeWCw==", "dependencies": { @@ -1194,16 +999,6 @@ "requires-port": "requires-port@1.0.0" } }, - "util-deprecate@1.0.2": { - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dependencies": {} - }, - "varuint-bitcoin@1.1.2": { - "integrity": "sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw==", - "dependencies": { - "safe-buffer": "safe-buffer@5.2.1" - } - }, "w3c-xmlserializer@5.0.0": { "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "dependencies": { @@ -1582,7 +1377,6 @@ "npm:@isaacs/ttlcache@^1.4.1", "npm:@noble/secp256k1@^2.0.0", "npm:@scure/base@^1.1.6", - "npm:bolt11@^1.4.1", "npm:comlink@^4.4.1", "npm:entities@^4.5.0", "npm:fast-stable-stringify@^1.0.0", @@ -1590,6 +1384,7 @@ "npm:iso-639-1@2.1.15", "npm:isomorphic-dompurify@^2.11.0", "npm:kysely@^0.27.3", + "npm:light-bolt11-decoder", "npm:linkify-plugin-hashtag@^4.1.1", "npm:linkify-string@^4.1.1", "npm:linkifyjs@^4.1.1", From 98565efa12a5e06533a7b81e5a6297ec81502e9a Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Mon, 17 Jun 2024 19:49:18 -0300 Subject: [PATCH 09/11] refactor(bolt11): get amount with new library --- src/utils/bolt11.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/utils/bolt11.ts b/src/utils/bolt11.ts index ba3dbe93..eef60684 100644 --- a/src/utils/bolt11.ts +++ b/src/utils/bolt11.ts @@ -1,14 +1,15 @@ -import bolt11 from 'bolt11'; +import bolt11 from 'light-bolt11-decoder'; /** Decodes the invoice and returns the amount in millisatoshis */ function getAmount(invoice: string | undefined): string | undefined { if (!invoice) return; try { - const decoded = bolt11.decode(invoice); - return decoded?.millisatoshis ?? undefined; - } catch (e) { - console.log(e); + const amount = (bolt11.decode(invoice).sections as { name: string; value: string }[]).find( + ({ name }) => name === 'amount', + )?.value; + return amount; + } catch { return; } } From bf017195a6fc132a932287578b58397f4158451d Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Mon, 17 Jun 2024 20:15:51 -0300 Subject: [PATCH 10/11] refactor: sort imports alphabetically --- src/controllers/api/statuses.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controllers/api/statuses.ts b/src/controllers/api/statuses.ts index 7283b65d..51842474 100644 --- a/src/controllers/api/statuses.ts +++ b/src/controllers/api/statuses.ts @@ -8,8 +8,9 @@ import { z } from 'zod'; import { type AppController } from '@/app.ts'; import { Conf } from '@/config.ts'; import { DittoDB } from '@/db/DittoDB.ts'; -import { getUnattachedMediaByIds } from '@/db/unattached-media.ts'; +import { getAmount } from '@/utils/bolt11.ts'; import { getAncestors, getAuthor, getDescendants, getEvent } from '@/queries.ts'; +import { getUnattachedMediaByIds } from '@/db/unattached-media.ts'; import { renderEventAccounts } from '@/views.ts'; import { renderReblog, renderStatus } from '@/views/mastodon/statuses.ts'; import { Storages } from '@/storages.ts'; @@ -21,7 +22,6 @@ import { addTag, deleteTag } from '@/utils/tags.ts'; import { asyncReplaceAll } from '@/utils/text.ts'; import { DittoEvent } from '@/interfaces/DittoEvent.ts'; import { accountFromPubkey, renderAccount } from '@/views/mastodon/accounts.ts'; -import { getAmount } from '@/utils/bolt11.ts'; const createStatusSchema = z.object({ in_reply_to_id: n.id().nullish(), From 8b67a057927ede183d6cacd4ef7ee5ee527381d8 Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Mon, 17 Jun 2024 21:07:27 -0300 Subject: [PATCH 11/11] refactor: parse zap request with zod --- src/controllers/api/statuses.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/controllers/api/statuses.ts b/src/controllers/api/statuses.ts index 51842474..28e0778a 100644 --- a/src/controllers/api/statuses.ts +++ b/src/controllers/api/statuses.ts @@ -548,11 +548,11 @@ const zappedByController: AppController = async (c) => { const store = await Storages.db(); const amountSchema = z.coerce.number().int().nonnegative().catch(0); - const events: DittoEvent[] = (await store.query([{ kinds: [9735], '#e': [id], limit: 100 }])).map((event) => { + const events = (await store.query([{ kinds: [9735], '#e': [id], limit: 100 }])).map((event) => { const zapRequestString = event.tags.find(([name]) => name === 'description')?.[1]; if (!zapRequestString) return; try { - const zapRequest = JSON.parse(zapRequestString); + const zapRequest = n.json().pipe(n.event()).parse(zapRequestString); const amount = zapRequest?.tags.find(([name]: any) => name === 'amount')?.[1]; if (!amount) { const amount = getAmount(event?.tags.find(([name]) => name === 'bolt11')?.[1]); @@ -563,7 +563,7 @@ const zappedByController: AppController = async (c) => { } catch { return; } - }).filter(Boolean); + }).filter(Boolean) as DittoEvent[]; await hydrateEvents({ events, store });