diff --git a/electrum/lnurl.py b/electrum/lnurl.py index 67e942790..d6d1bcc8b 100644 --- a/electrum/lnurl.py +++ b/electrum/lnurl.py @@ -11,8 +11,9 @@ import urllib.parse import aiohttp.client_exceptions from aiohttp import ClientResponse -from electrum.segwit_addr import bech32_decode, Encoding, convertbits -from electrum.lnaddr import LnDecodeException +from electrum import segwit_addr +from electrum.segwit_addr import bech32_decode, Encoding, convertbits, bech32_encode +from electrum.lnaddr import LnDecodeException, LnEncodeException from electrum.network import Network from electrum.logging import get_logger @@ -45,6 +46,19 @@ def decode_lnurl(lnurl: str) -> str: return url +def encode_lnurl(url: str) -> str: + """Encode url to bech32 lnurl string.""" + try: + url = url.encode("utf-8") + except UnicodeError as e: + raise LnEncodeException("invalid url") from e + bech32_data = convertbits(url, 8, 5, True) + assert bech32_data + lnurl = bech32_encode( + encoding=segwit_addr.Encoding.BECH32, hrp="lnurl", data=bech32_data) + return lnurl.upper() + + def _is_url_safe_enough_for_lnurl(url: str) -> bool: u = urllib.parse.urlparse(url) if u.scheme.lower() == "https": diff --git a/electrum/tests/test_lnurl.py b/electrum/tests/test_lnurl.py index 48ef8a3a5..88c9238e2 100644 --- a/electrum/tests/test_lnurl.py +++ b/electrum/tests/test_lnurl.py @@ -9,4 +9,14 @@ class TestLnurl(TestCase): "LNURL1DP68GURN8GHJ7UM9WFMXJCM99E5K7TELWY7NXENRXVMRGDTZXSENJCM98PJNWXQ96S9" ) url = lnurl.decode_lnurl(LNURL) - self.assertTrue("https://service.io/?q=3fc3645b439ce8e7", url) + self.assertEqual("https://service.io/?q=3fc3645b439ce8e7", url) + + def test_encode(self): + lnurl_ = lnurl.encode_lnurl("https://jhoenicke.de/.well-known/lnurlp/mempool") + self.assertEqual( + "LNURL1DP68GURN8GHJ76NGDAJKU6TRDDJJUER99UH8WETVDSKKKMN0WAHZ7MRWW4EXCUP0D4JK6UR0DAKQHMHNX2", + lnurl_) + + def test_lightning_address_to_url(self): + url = lnurl.lightning_address_to_url("mempool@jhoenicke.de") + self.assertEqual("https://jhoenicke.de/.well-known/lnurlp/mempool", url)