Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions electrum/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -1400,6 +1400,7 @@ def add_global_options(parser):
group.add_argument("--testnet", action="store_true", dest="testnet", default=False, help="Use Testnet")
group.add_argument("--regtest", action="store_true", dest="regtest", default=False, help="Use Regtest")
group.add_argument("--simnet", action="store_true", dest="simnet", default=False, help="Use Simnet")
group.add_argument("--signet", action="store_true", dest="signet", default=False, help="Use Signet")
group.add_argument("-o", "--offline", action="store_true", dest="offline", default=False, help="Run offline")

def add_wallet_option(parser):
Expand Down
23 changes: 22 additions & 1 deletion electrum/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,13 @@ def rev_genesis_bytes(cls) -> bytes:

class BitcoinMainnet(AbstractNet):

NET_NAME = "mainnet"
TESTNET = False
WIF_PREFIX = 0x80
ADDRTYPE_P2PKH = 0
ADDRTYPE_P2SH = 5
SEGWIT_HRP = "bc"
BOLT11_HRP = SEGWIT_HRP
GENESIS = "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"
DEFAULT_PORTS = {'t': '50001', 's': '50002'}
DEFAULT_SERVERS = read_json('servers.json', {})
Expand Down Expand Up @@ -98,11 +100,13 @@ class BitcoinMainnet(AbstractNet):

class BitcoinTestnet(AbstractNet):

NET_NAME = "testnet"
TESTNET = True
WIF_PREFIX = 0xef
ADDRTYPE_P2PKH = 111
ADDRTYPE_P2SH = 196
SEGWIT_HRP = "tb"
BOLT11_HRP = SEGWIT_HRP
GENESIS = "000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943"
DEFAULT_PORTS = {'t': '51001', 's': '51002'}
DEFAULT_SERVERS = read_json('servers_testnet.json', {})
Expand Down Expand Up @@ -134,7 +138,9 @@ class BitcoinTestnet(AbstractNet):

class BitcoinRegtest(BitcoinTestnet):

NET_NAME = "regtest"
SEGWIT_HRP = "bcrt"
BOLT11_HRP = SEGWIT_HRP
GENESIS = "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"
DEFAULT_SERVERS = read_json('servers_regtest.json', {})
CHECKPOINTS = []
Expand All @@ -143,19 +149,35 @@ class BitcoinRegtest(BitcoinTestnet):

class BitcoinSimnet(BitcoinTestnet):

NET_NAME = "simnet"
WIF_PREFIX = 0x64
ADDRTYPE_P2PKH = 0x3f
ADDRTYPE_P2SH = 0x7b
SEGWIT_HRP = "sb"
BOLT11_HRP = SEGWIT_HRP
GENESIS = "683e86bd5c6d110d91b94b97137ba6bfe02dbbdb8e3dff722a669b5d69d77af6"
DEFAULT_SERVERS = read_json('servers_regtest.json', {})
CHECKPOINTS = []
LN_DNS_SEEDS = []


class BitcoinSignet(BitcoinTestnet):

NET_NAME = "signet"
BOLT11_HRP = "tbs"
GENESIS = "00000008819873e925422c1ff0f99f7cc9bbb232af63a077a480a3633bee1ef6"
DEFAULT_SERVERS = read_json('servers_signet.json', {})
CHECKPOINTS = []
LN_DNS_SEEDS = []


# don't import net directly, import the module instead (so that net is singleton)
net = BitcoinMainnet

def set_signet():
global net
net = BitcoinSignet

def set_simnet():
global net
net = BitcoinSimnet
Expand All @@ -168,7 +190,6 @@ def set_testnet():
global net
net = BitcoinTestnet


def set_regtest():
global net
net = BitcoinRegtest
4 changes: 3 additions & 1 deletion electrum/gui/qt/main_window.py
Original file line number Diff line number Diff line change
Expand Up @@ -540,7 +540,9 @@ def init_geometry(self):
self.setGeometry(100, 100, 840, 400)

def watching_only_changed(self):
name = "Electrum Testnet" if constants.net.TESTNET else "Electrum"
name = "Electrum"
if constants.net.TESTNET:
name += " " + constants.net.NET_NAME.capitalize()
title = '%s %s - %s' % (name, ELECTRUM_VERSION,
self.wallet.basename())
extra = [self.wallet.db.get('wallet_type', '?')]
Expand Down
6 changes: 6 additions & 0 deletions electrum/lnaddr.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,9 @@ def pull_tagged(stream):
return (CHARSET[tag], stream.read(length * 5), stream)

def lnencode(addr: 'LnAddr', privkey) -> str:
# see https://github.com/lightningnetwork/lightning-rfc/pull/844
if constants.net.NET_NAME == "signet":
addr.currency = constants.net.BOLT11_HRP
if addr.amount:
amount = addr.currency + shorten_amount(addr.amount)
else:
Expand Down Expand Up @@ -366,6 +369,9 @@ def serialize(self):
def lndecode(invoice: str, *, verbose=False, expected_hrp=None) -> LnAddr:
if expected_hrp is None:
expected_hrp = constants.net.SEGWIT_HRP
# see https://github.com/lightningnetwork/lightning-rfc/pull/844
if constants.net.NET_NAME == "signet":
expected_hrp = constants.net.BOLT11_HRP
decoded_bech32 = bech32_decode(invoice, ignore_long_length=True)
hrp = decoded_bech32.hrp
data = decoded_bech32.data
Expand Down
14 changes: 14 additions & 0 deletions electrum/servers_signet.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"127.0.0.1": {
"pruning": "-",
"s": "51002",
"t": "51001",
"version": "1.2"
},
"signet-electrumx.wakiyamap.dev": {
"pruning": "-",
"s": "50002",
"t": "50001",
"version": "1.4"
}
}
3 changes: 3 additions & 0 deletions electrum/simple_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,9 @@ def electrum_path(self):
elif self.get('simnet'):
path = os.path.join(path, 'simnet')
make_dir(path, allow_symlink=False)
elif self.get('signet'):
path = os.path.join(path, 'signet')
make_dir(path, allow_symlink=False)

self.logger.info(f"electrum directory {path}")
return path
Expand Down
10 changes: 8 additions & 2 deletions electrum/trampoline.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,11 +63,17 @@
'endurance': LNPeerAddr(host='34.250.234.192', port=9735, pubkey=bytes.fromhex('03933884aaf1d6b108397e5efe5c86bcf2d8ca8d2f700eda99db9214fc2712b134')),
}

TRAMPOLINE_NODES_SIGNET = {
'wakiyamap.dev': LNPeerAddr(host='signet-electrumx.wakiyamap.dev', port=9735, pubkey=bytes.fromhex('02dadf6c28f3284d591cd2a4189d1530c1ff82c07059ebea150a33ab76e7364b4a')),
}

def hardcoded_trampoline_nodes():
if constants.net in (constants.BitcoinMainnet,):
if constants.net.NET_NAME == "mainnet":
return TRAMPOLINE_NODES_MAINNET
if constants.net in (constants.BitcoinTestnet,):
if constants.net.NET_NAME == "testnet":
return TRAMPOLINE_NODES_TESTNET
if constants.net.NET_NAME == "signet":
return TRAMPOLINE_NODES_SIGNET
return {}

def trampolines_by_id():
Expand Down
19 changes: 18 additions & 1 deletion electrum/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -804,12 +804,29 @@ def time_difference(distance_in_time, include_seconds):
{'tx': 'tx/', 'addr': 'address/'}),
}

signet_block_explorers = {
'bc-2.jp': ('https://explorer.bc-2.jp/',
{'tx': 'tx/', 'addr': 'address/'}),
'mempool.space': ('https://mempool.space/signet/',
{'tx': 'tx/', 'addr': 'address/'}),
'bitcoinexplorer.org': ('https://signet.bitcoinexplorer.org/',
{'tx': 'tx/', 'addr': 'address/'}),
'wakiyamap.dev': ('https://signet-explorer.wakiyamap.dev/',
{'tx': 'tx/', 'addr': 'address/'}),
'system default': ('blockchain:/',
{'tx': 'tx/', 'addr': 'address/'}),
}

_block_explorer_default_api_loc = {'tx': 'tx/', 'addr': 'address/'}


def block_explorer_info():
from . import constants
return mainnet_block_explorers if not constants.net.TESTNET else testnet_block_explorers
if constants.net.NET_NAME == "testnet":
return testnet_block_explorers
elif constants.net.NET_NAME == "signet":
return signet_block_explorers
return mainnet_block_explorers


def block_explorer(config: 'SimpleConfig') -> Optional[str]:
Expand Down
2 changes: 2 additions & 0 deletions run_electrum
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,8 @@ def main():
constants.set_regtest()
elif config.get('simnet'):
constants.set_simnet()
elif config.get('signet'):
constants.set_signet()

cmdname = config.get('cmd')

Expand Down