diff --git a/lnbits/static/i18n/en.js b/lnbits/static/i18n/en.js index dba74f331..9f91bf608 100644 --- a/lnbits/static/i18n/en.js +++ b/lnbits/static/i18n/en.js @@ -849,9 +849,11 @@ window.localisation.en = { blockexplorer_public_api: 'Public API Access', blockexplorer_public_api_desc: 'Allow unauthenticated access to the block explorer API endpoints.', + electrum_compatible_server: 'Electrum compatible server', electrum_server_url: 'Electrum Server URL', - electrum_server_url_hint: - 'e.g. ssl://electrum.blockstream.info:50002 or tcp://localhost:50001', + electrum_server_url_hint: 'Choose a public Electrum server or enter your own.', + electrum_server_url_custom: 'Custom Electrum Server URL', + view_public_electrum_servers: 'View public Electrum servers', blockexplorer_network: 'Bitcoin Network', blockexplorer_network_hint: 'The network the Electrum server is connected to, used to render addresses correctly.', diff --git a/lnbits/static/js/components/admin/lnbits-admin-blockexplorer.js b/lnbits/static/js/components/admin/lnbits-admin-blockexplorer.js index f8d8a086f..3a5ac77ec 100644 --- a/lnbits/static/js/components/admin/lnbits-admin-blockexplorer.js +++ b/lnbits/static/js/components/admin/lnbits-admin-blockexplorer.js @@ -1,4 +1,40 @@ window.app.component('lnbits-admin-blockexplorer', { props: ['form-data'], - template: '#lnbits-admin-blockexplorer' + template: '#lnbits-admin-blockexplorer', + data() { + return { + electrumServers: [ + 'ssl://fulcrum.lnbits.com:443', + 'ssl://mainnet.nunchuk.io:52002', + 'ssl://fulcrum.grey.pw:50002', + 'ssl://electrum2.bluewallet.io:443', + 'ssl://electrum.acinq.co:50002', + 'ssl://electrum.blockstream.info:50002', + 'ssl://bitcoin.mullvad.net:5010' + ] + } + }, + computed: { + electrumServerOptions() { + return [...this.electrumServers, 'Custom'] + }, + electrumServerPreset: { + get() { + return this.electrumServers.includes( + this.formData.lnbits_blockexplorer_electrum_url + ) + ? this.formData.lnbits_blockexplorer_electrum_url + : 'Custom' + }, + set(value) { + if (value === 'Custom') { + if (this.electrumServerPreset !== 'Custom') { + this.formData.lnbits_blockexplorer_electrum_url = '' + } + return + } + this.formData.lnbits_blockexplorer_electrum_url = value + } + } + } }) diff --git a/lnbits/templates/components/admin/blockexplorer.vue b/lnbits/templates/components/admin/blockexplorer.vue index cd7f10e0d..a642fc2d9 100644 --- a/lnbits/templates/components/admin/blockexplorer.vue +++ b/lnbits/templates/components/admin/blockexplorer.vue @@ -46,12 +46,24 @@ +
+ +
-
+
+ +
+
@@ -64,6 +76,15 @@ :hint="$t('blockexplorer_network_hint')" >
+
+ + + +
diff --git a/lnbits/utils/electrum.py b/lnbits/utils/electrum.py index 7cf49472a..1c103a19d 100644 --- a/lnbits/utils/electrum.py +++ b/lnbits/utils/electrum.py @@ -763,7 +763,18 @@ class AddressTracker: for scripthash, address in list(subscribed.items()): if address not in still_wanted: del subscribed[scripthash] - await client.unsubscribe_scripthash(scripthash) + try: + await client.unsubscribe_scripthash(scripthash) + except ElectrumError: + # blockchain.scripthash.unsubscribe is part of the spec but + # many ElectrumX deployments don't implement it, returning + # "unknown method". This is expected and harmless: we've + # already dropped the scripthash from `subscribed` above, + # so if the server keeps pushing notifications for it + # anyway, on_status_change() looks it up, finds nothing, + # and drops them. Not logged since it fires on every + # untrack against these servers. + pass async def _wait_for_change_or_close(self, client: ElectrumClient) -> bool: """Waits until addresses change or the connection closes; returns True