From e8a9351403620d7864116bfbbd228e18b936024a Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 21 May 2019 18:11:49 +0200 Subject: [PATCH] Initial rebase is done --- MANIFEST.in | 2 +- contrib/build-linux/appimage/build.sh | 4 +- contrib/build-wine/build-electrum-git.sh | 32 +- contrib/build-wine/deterministic.spec | 60 +- contrib/build-wine/electrum.nsi | 26 +- contrib/build-wine/prepare-wine.sh | 2 +- .../deterministic-build/check_submodules.sh | 4 +- contrib/make_download | 18 +- contrib/make_tgz | 6 +- contrib/osx/make_osx | 4 +- contrib/osx/osx.spec | 36 +- contrib/pull_locale | 8 +- contrib/push_locale | 9 +- electrum-xzc.desktop | 22 + electrum.desktop | 22 - electrum/base_wizard.py | 24 +- electrum/blockchain.py | 99 +- electrum/checkpoints.json | 1111 +------ electrum/checkpoints_testnet.json | 2886 +---------------- electrum/coins.py | 40 + electrum/commands.py | 12 +- electrum/constants.py | 31 +- electrum/contacts.py | 4 +- electrum/currencies.json | 908 +----- electrum/daemon.py | 4 +- electrum/{electrum => electrum-xzc} | 0 electrum/exchange_rate.py | 45 +- electrum/gui/icons/electrum-xzc.png | Bin 0 -> 9565 bytes electrum/gui/icons/electrum.png | Bin 24089 -> 0 bytes .../electrum/qr/SimpleScannerActivity.java | 4 +- electrum/gui/kivy/i18n.py | 2 +- electrum/gui/kivy/main.kv | 12 +- electrum/gui/kivy/main_window.py | 92 +- electrum/gui/kivy/nfc_scanner/__init__.py | 2 +- .../gui/kivy/nfc_scanner/scanner_android.py | 8 +- electrum/gui/kivy/tools/bitcoin_intent.xml | 2 +- electrum/gui/kivy/tools/buildozer.spec | 26 +- electrum/gui/kivy/uix/context_menu.py | 2 +- electrum/gui/kivy/uix/dialogs/__init__.py | 2 +- electrum/gui/kivy/uix/dialogs/addresses.py | 4 +- .../gui/kivy/uix/dialogs/bump_fee_dialog.py | 2 +- .../gui/kivy/uix/dialogs/crash_reporter.py | 6 +- electrum/gui/kivy/uix/dialogs/fee_dialog.py | 2 +- electrum/gui/kivy/uix/dialogs/fx_dialog.py | 2 +- .../gui/kivy/uix/dialogs/installwizard.py | 22 +- electrum/gui/kivy/uix/dialogs/invoices.py | 18 +- electrum/gui/kivy/uix/dialogs/label_dialog.py | 4 +- .../gui/kivy/uix/dialogs/nfc_transaction.py | 2 +- .../gui/kivy/uix/dialogs/password_dialog.py | 4 +- electrum/gui/kivy/uix/dialogs/qr_dialog.py | 2 +- electrum/gui/kivy/uix/dialogs/qr_scanner.py | 4 +- electrum/gui/kivy/uix/dialogs/question.py | 2 +- electrum/gui/kivy/uix/dialogs/requests.py | 18 +- electrum/gui/kivy/uix/dialogs/settings.py | 16 +- electrum/gui/kivy/uix/dialogs/tx_dialog.py | 12 +- electrum/gui/kivy/uix/dialogs/wallets.py | 2 +- electrum/gui/kivy/uix/screens.py | 26 +- electrum/gui/kivy/uix/ui_screens/about.kv | 4 +- electrum/gui/kivy/uix/ui_screens/history.kv | 6 +- electrum/gui/kivy/uix/ui_screens/receive.kv | 14 +- electrum/gui/kivy/uix/ui_screens/send.kv | 16 +- electrum/gui/kivy/uix/ui_screens/status.kv | 2 +- electrum/gui/qt/__init__.py | 20 +- electrum/gui/qt/address_dialog.py | 2 +- electrum/gui/qt/address_list.py | 12 +- electrum/gui/qt/amountedit.py | 2 +- electrum/gui/qt/console.py | 4 +- electrum/gui/qt/contact_list.py | 8 +- electrum/gui/qt/exception_window.py | 8 +- electrum/gui/qt/fee_slider.py | 2 +- electrum/gui/qt/history_list.py | 14 +- electrum/gui/qt/installwizard.py | 18 +- electrum/gui/qt/invoice_list.py | 4 +- electrum/gui/qt/main_window.py | 102 +- electrum/gui/qt/network_dialog.py | 10 +- electrum/gui/qt/password_dialog.py | 4 +- electrum/gui/qt/paytoedit.py | 14 +- electrum/gui/qt/qrcodewidget.py | 6 +- electrum/gui/qt/qrtextedit.py | 6 +- electrum/gui/qt/qrwindow.py | 4 +- electrum/gui/qt/request_list.py | 10 +- electrum/gui/qt/seed_dialog.py | 12 +- electrum/gui/qt/transaction_dialog.py | 16 +- electrum/gui/qt/update_checker.py | 12 +- electrum/gui/qt/util.py | 6 +- electrum/gui/qt/utxo_list.py | 2 +- electrum/gui/stdio.py | 20 +- electrum/gui/text.py | 20 +- electrum/i18n.py | 72 +- electrum/interface.py | 4 +- electrum/network.py | 4 +- electrum/paymentrequest.py | 10 +- electrum/plugin.py | 4 +- electrum/plugins/audio_modem/__init__.py | 2 +- electrum/plugins/audio_modem/qt.py | 8 +- electrum/plugins/coldcard/__init__.py | 2 +- electrum/plugins/coldcard/cmdline.py | 6 +- electrum/plugins/coldcard/coldcard.py | 20 +- electrum/plugins/coldcard/qt.py | 8 +- electrum/plugins/cosigner_pool/__init__.py | 2 +- electrum/plugins/cosigner_pool/qt.py | 20 +- electrum/plugins/digitalbitbox/__init__.py | 2 +- electrum/plugins/digitalbitbox/cmdline.py | 2 +- .../plugins/digitalbitbox/digitalbitbox.py | 28 +- electrum/plugins/digitalbitbox/qt.py | 6 +- electrum/plugins/email_requests/__init__.py | 2 +- electrum/plugins/email_requests/qt.py | 12 +- .../plugins/greenaddress_instant/__init__.py | 2 +- electrum/plugins/greenaddress_instant/qt.py | 6 +- electrum/plugins/hw_wallet/cmdline.py | 4 +- electrum/plugins/hw_wallet/plugin.py | 10 +- electrum/plugins/hw_wallet/qt.py | 14 +- electrum/plugins/keepkey/__init__.py | 2 +- electrum/plugins/keepkey/clientbase.py | 12 +- electrum/plugins/keepkey/cmdline.py | 2 +- electrum/plugins/keepkey/keepkey.py | 18 +- electrum/plugins/keepkey/qt.py | 10 +- electrum/plugins/labels/__init__.py | 2 +- electrum/plugins/labels/cmdline.py | 2 +- electrum/plugins/labels/kivy.py | 2 +- electrum/plugins/labels/labels.py | 10 +- electrum/plugins/labels/qt.py | 6 +- electrum/plugins/ledger/__init__.py | 2 +- electrum/plugins/ledger/auth2fa.py | 8 +- electrum/plugins/ledger/cmdline.py | 2 +- electrum/plugins/ledger/ledger.py | 22 +- electrum/plugins/ledger/qt.py | 8 +- electrum/plugins/revealer/__init__.py | 2 +- electrum/plugins/revealer/qt.py | 14 +- electrum/plugins/revealer/revealer.py | 4 +- electrum/plugins/safe_t/__init__.py | 2 +- electrum/plugins/safe_t/clientbase.py | 12 +- electrum/plugins/safe_t/cmdline.py | 2 +- electrum/plugins/safe_t/qt.py | 10 +- electrum/plugins/safe_t/safe_t.py | 20 +- electrum/plugins/safe_t/transport.py | 2 +- electrum/plugins/trezor/__init__.py | 2 +- electrum/plugins/trezor/clientbase.py | 14 +- electrum/plugins/trezor/cmdline.py | 2 +- electrum/plugins/trezor/qt.py | 8 +- electrum/plugins/trezor/trezor.py | 22 +- electrum/plugins/trustedcoin/__init__.py | 2 +- electrum/plugins/trustedcoin/cmdline.py | 4 +- electrum/plugins/trustedcoin/kivy.py | 4 +- electrum/plugins/trustedcoin/qt.py | 20 +- electrum/plugins/trustedcoin/trustedcoin.py | 28 +- electrum/plugins/virtualkeyboard/__init__.py | 2 +- electrum/plugins/virtualkeyboard/qt.py | 4 +- electrum/scripts/bip70.py | 6 +- electrum/scripts/block_headers.py | 4 +- electrum/scripts/estimate_fee.py | 4 +- electrum/scripts/get_history.py | 8 +- electrum/scripts/peers.py | 6 +- electrum/scripts/quick_start.py | 12 +- electrum/scripts/servers.py | 8 +- electrum/scripts/txradar.py | 4 +- electrum/scripts/watch_address.py | 6 +- electrum/servers.json | 391 +-- electrum/servers_testnet.json | 32 +- electrum/simple_config.py | 4 +- electrum/tests/__init__.py | 2 +- electrum/tests/test_bitcoin.py | 20 +- electrum/tests/test_blockchain.py | 8 +- electrum/tests/test_commands.py | 6 +- electrum/tests/test_dnssec.py | 2 +- electrum/tests/test_mnemonic.py | 12 +- electrum/tests/test_network.py | 12 +- electrum/tests/test_revealer.py | 2 +- electrum/tests/test_simple_config.py | 2 +- electrum/tests/test_storage_upgrade.py | 6 +- electrum/tests/test_transaction.py | 10 +- electrum/tests/test_util.py | 24 +- electrum/tests/test_wallet.py | 14 +- electrum/tests/test_wallet_vertical.py | 20 +- electrum/tests/test_x509.py | 2 +- electrum/transaction.py | 2 +- electrum/util.py | 78 +- electrum/wallet.py | 2 +- run_electrum | 30 +- setup.py | 30 +- 180 files changed, 1103 insertions(+), 6303 deletions(-) create mode 100644 electrum-xzc.desktop delete mode 100644 electrum.desktop create mode 100644 electrum/coins.py rename electrum/{electrum => electrum-xzc} (100%) create mode 100644 electrum/gui/icons/electrum-xzc.png delete mode 100644 electrum/gui/icons/electrum.png diff --git a/MANIFEST.in b/MANIFEST.in index 5c7667c6d257..9e1765824b5c 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,6 +1,6 @@ include LICENCE RELEASE-NOTES AUTHORS include README.rst -include electrum.desktop +include electrum-xzc.desktop include *.py include run_electrum include contrib/requirements/requirements.txt diff --git a/contrib/build-linux/appimage/build.sh b/contrib/build-linux/appimage/build.sh index 9a654df026e2..7ca307f36978 100755 --- a/contrib/build-linux/appimage/build.sh +++ b/contrib/build-linux/appimage/build.sh @@ -143,8 +143,8 @@ cp "/usr/lib/libzbar.so.0" "$APPDIR/usr/lib/libzbar.so.0" info "desktop integration." -cp "$PROJECT_ROOT/electrum.desktop" "$APPDIR/electrum.desktop" -cp "$PROJECT_ROOT/electrum/gui/icons/electrum.png" "$APPDIR/electrum.png" +cp "$PROJECT_ROOT/electrum-xzc.desktop" "$APPDIR/electrum-xzc.desktop" +cp "$PROJECT_ROOT/electrum_xzc/gui/icons/electrum-xzc.png" "$APPDIR/electrum-xzc.png" # add launcher diff --git a/contrib/build-wine/build-electrum-git.sh b/contrib/build-wine/build-electrum-git.sh index 438c28ce646d..94a190d23810 100755 --- a/contrib/build-wine/build-electrum-git.sh +++ b/contrib/build-wine/build-electrum-git.sh @@ -1,6 +1,6 @@ #!/bin/bash -NAME_ROOT=electrum +NAME_ROOT=electrum-xzc # These settings probably don't need any change export WINEPREFIX=/opt/wine64 @@ -19,24 +19,24 @@ here="$(dirname "$(readlink -e "$0")")" . "$CONTRIB"/build_tools_util.sh -pushd $WINEPREFIX/drive_c/electrum +pushd $WINEPREFIX/drive_c/electrum-xzc VERSION=`git describe --tags --dirty --always` info "Last commit: $VERSION" # Load electrum-locale for this release -git submodule update --init - -pushd ./contrib/deterministic-build/electrum-locale -if ! which msgfmt > /dev/null 2>&1; then - fail "Please install gettext" -fi -for i in ./locale/*; do - dir=$WINEPREFIX/drive_c/electrum/electrum/$i/LC_MESSAGES - mkdir -p $dir - msgfmt --output-file=$dir/electrum.mo $i/electrum.po || true -done -popd +#git submodule update --init +# +#pushd ./contrib/deterministic-build/electrum-locale +#if ! which msgfmt > /dev/null 2>&1; then +# fail "Please install gettext" +#fi +#for i in ./locale/*; do +# dir=$WINEPREFIX/drive_c/electrum/electrum/$i/LC_MESSAGES +# mkdir -p $dir +# msgfmt --output-file=$dir/electrum.mo $i/electrum.po || true +#done +#popd find -exec touch -d '2000-11-11T11:11:11+00:00' {} + popd @@ -47,7 +47,7 @@ $PYTHON -m pip install --no-warn-script-location -r "$CONTRIB"/deterministic-bui $PYTHON -m pip install --no-warn-script-location -r "$CONTRIB"/deterministic-build/requirements-hw.txt -pushd $WINEPREFIX/drive_c/electrum +pushd $WINEPREFIX/drive_c/electrum-xzc # see https://github.com/pypa/pip/issues/2195 -- pip makes a copy of the entire directory info "Pip installing Electrum. This might take a long time if the project folder is large." $PYTHON -m pip install --no-warn-script-location . @@ -70,7 +70,7 @@ info "building NSIS installer" wine "$WINEPREFIX/drive_c/Program Files (x86)/NSIS/makensis.exe" /DPRODUCT_VERSION=$VERSION electrum.nsi cd dist -mv electrum-setup.exe $NAME_ROOT-$VERSION-setup.exe +mv electrum-xzc-setup.exe $NAME_ROOT-$VERSION-setup.exe cd .. info "Padding binaries to 8-byte boundaries, and fixing COFF image checksum in PE header" diff --git a/contrib/build-wine/deterministic.spec b/contrib/build-wine/deterministic.spec index 3ed9f52c59a0..69d60dd07e0a 100644 --- a/contrib/build-wine/deterministic.spec +++ b/contrib/build-wine/deterministic.spec @@ -12,7 +12,7 @@ else: PYHOME = 'c:/python3' -home = 'C:\\electrum\\' +home = 'C:\\electrum-xzc\\' # see https://github.com/pyinstaller/pyinstaller/issues/2005 hiddenimports = [] @@ -38,12 +38,12 @@ binaries += [b for b in collect_dynamic_libs('PyQt5') if 'qwindowsvista' in b[0] binaries += [('C:/tmp/libsecp256k1.dll', '.')] datas = [ - (home+'electrum/*.json', 'electrum'), - (home+'electrum/wordlist/english.txt', 'electrum/wordlist'), - (home+'electrum/locale', 'electrum/locale'), - (home+'electrum/plugins', 'electrum/plugins'), + (home+'electrum_xzc/*.json', 'electrum_xzc'), + (home+'electrum_xzc/wordlist/english.txt', 'electrum_xzc/wordlist'), + (home+'electrum_xzc/locale', 'electrum_xzc/locale'), + (home+'electrum_xzc/plugins', 'electrum_xzc/plugins'), ('C:\\Program Files (x86)\\ZBar\\bin\\', '.'), - (home+'electrum/gui/icons', 'electrum/gui/icons'), + (home+'electrum_xzc/gui/icons', 'electrum_xzc/gui/icons'), ] datas += collect_data_files('trezorlib') datas += collect_data_files('safetlib') @@ -53,22 +53,22 @@ datas += collect_data_files('ckcc') # We don't put these files in to actually include them in the script but to make the Analysis method scan them for imports a = Analysis([home+'run_electrum', - home+'electrum/gui/qt/main_window.py', - home+'electrum/gui/text.py', - home+'electrum/util.py', - home+'electrum/wallet.py', - home+'electrum/simple_config.py', - home+'electrum/bitcoin.py', - home+'electrum/dnssec.py', - home+'electrum/commands.py', - home+'electrum/plugins/cosigner_pool/qt.py', - home+'electrum/plugins/email_requests/qt.py', - home+'electrum/plugins/trezor/qt.py', - home+'electrum/plugins/safe_t/client.py', - home+'electrum/plugins/safe_t/qt.py', - home+'electrum/plugins/keepkey/qt.py', - home+'electrum/plugins/ledger/qt.py', - home+'electrum/plugins/coldcard/qt.py', + home+'electrum_xzc/gui/qt/main_window.py', + home+'electrum_xzc/gui/text.py', + home+'electrum_xzc/util.py', + home+'electrum_xzc/wallet.py', + home+'electrum_xzc/simple_config.py', + home+'electrum_xzc/bitcoin.py', + home+'electrum_xzc/dnssec.py', + home+'electrum_xzc/commands.py', + home+'electrum_xzc/plugins/cosigner_pool/qt.py', + home+'electrum_xzc/plugins/email_requests/qt.py', + home+'electrum_xzc/plugins/trezor/qt.py', + home+'electrum_xzc/plugins/safe_t/client.py', + home+'electrum_xzc/plugins/safe_t/qt.py', + home+'electrum_xzc/plugins/keepkey/qt.py', + home+'electrum_xzc/plugins/ledger/qt.py', + home+'electrum_xzc/plugins/coldcard/qt.py', #home+'packages/requests/utils.py' ], binaries=binaries, @@ -116,11 +116,11 @@ exe_standalone = EXE( a.scripts, a.binaries, a.datas, - name=os.path.join('build\\pyi.win32\\electrum', cmdline_name + ".exe"), + name=os.path.join('build\\pyi.win32\\electrum-xzc', cmdline_name + ".exe"), debug=False, strip=None, upx=False, - icon=home+'electrum/gui/icons/electrum.ico', + icon=home+'electrum_xzc/gui/icons/electrum.ico', console=False) # console=True makes an annoying black box pop up, but it does make Electrum output command line commands, with this turned off no output will be given but commands can still be used @@ -129,11 +129,11 @@ exe_portable = EXE( a.scripts, a.binaries, a.datas + [ ('is_portable', 'README.md', 'DATA' ) ], - name=os.path.join('build\\pyi.win32\\electrum', cmdline_name + "-portable.exe"), + name=os.path.join('build\\pyi.win32\\electrum-xzc', cmdline_name + "-portable.exe"), debug=False, strip=None, upx=False, - icon=home+'electrum/gui/icons/electrum.ico', + icon=home+'electrum_xzc/gui/icons/electrum.ico', console=False) ##### @@ -143,11 +143,11 @@ exe_dependent = EXE( pyz, a.scripts, exclude_binaries=True, - name=os.path.join('build\\pyi.win32\\electrum', cmdline_name), + name=os.path.join('build\\pyi.win32\\electrum-xzc', cmdline_name), debug=False, strip=None, upx=False, - icon=home+'electrum/gui/icons/electrum.ico', + icon=home+'electrum_xzc/gui/icons/electrum.ico', console=False) coll = COLLECT( @@ -158,6 +158,6 @@ coll = COLLECT( strip=None, upx=True, debug=False, - icon=home+'electrum/gui/icons/electrum.ico', + icon=home+'electrum_xzc/gui/icons/electrum.ico', console=False, - name=os.path.join('dist', 'electrum')) + name=os.path.join('dist', 'electrum-xzc')) diff --git a/contrib/build-wine/electrum.nsi b/contrib/build-wine/electrum.nsi index 1946c7749178..c76b75a13215 100644 --- a/contrib/build-wine/electrum.nsi +++ b/contrib/build-wine/electrum.nsi @@ -6,8 +6,8 @@ ;-------------------------------- ;Variables - !define PRODUCT_NAME "Electrum" - !define PRODUCT_WEB_SITE "https://github.com/spesmilo/electrum" + !define PRODUCT_NAME "Electrum-XZC" + !define PRODUCT_WEB_SITE "https://github.com/zcoinofficial/electrum-xzc" !define PRODUCT_PUBLISHER "Electrum Technologies GmbH" !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" @@ -16,7 +16,7 @@ ;Name and file Name "${PRODUCT_NAME}" - OutFile "dist/electrum-setup.exe" + OutFile "dist/electrum-xzc-setup.exe" ;Default installation folder InstallDir "$PROGRAMFILES\${PRODUCT_NAME}" @@ -72,7 +72,7 @@ !define MUI_ABORTWARNING !define MUI_ABORTWARNING_TEXT "Are you sure you wish to abort the installation of ${PRODUCT_NAME}?" - !define MUI_ICON "c:\electrum\electrum\gui\icons\electrum.ico" + !define MUI_ICON "c:\electrum-xzc\electrum_xzc\gui\icons\electrum.ico" ;-------------------------------- ;Pages @@ -110,8 +110,8 @@ Section Delete "$SMPROGRAMS\${PRODUCT_NAME}\*.*" ;Files to pack into the installer - File /r "dist\electrum\*.*" - File "c:\electrum\electrum\gui\icons\electrum.ico" + File /r "dist\electrum-xzc\*.*" + File "c:\electrum-xzc\electrum_xzc\gui\icons\electrum.ico" ;Store installation folder WriteRegStr HKCU "Software\${PRODUCT_NAME}" "" $INSTDIR @@ -128,15 +128,15 @@ Section DetailPrint "Creating start-menu items..." CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}" CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall.lnk" "$INSTDIR\Uninstall.exe" "" "$INSTDIR\Uninstall.exe" 0 - CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\electrum-${PRODUCT_VERSION}.exe" "" "$INSTDIR\electrum-${PRODUCT_VERSION}.exe" 0 - CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME} Testnet.lnk" "$INSTDIR\electrum-${PRODUCT_VERSION}.exe" "--testnet" "$INSTDIR\electrum-${PRODUCT_VERSION}.exe" 0 + CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\electrum-xzc-${PRODUCT_VERSION}.exe" "" "$INSTDIR\electrum-xzc-${PRODUCT_VERSION}.exe" 0 + CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME} Testnet.lnk" "$INSTDIR\electrum-xzc-${PRODUCT_VERSION}.exe" "--testnet" "$INSTDIR\electrum-xzc-${PRODUCT_VERSION}.exe" 0 ;Links bitcoin: URI's to Electrum - WriteRegStr HKCU "Software\Classes\bitcoin" "" "URL:bitcoin Protocol" - WriteRegStr HKCU "Software\Classes\bitcoin" "URL Protocol" "" - WriteRegStr HKCU "Software\Classes\bitcoin" "DefaultIcon" "$\"$INSTDIR\electrum.ico, 0$\"" - WriteRegStr HKCU "Software\Classes\bitcoin\shell\open\command" "" "$\"$INSTDIR\electrum-${PRODUCT_VERSION}.exe$\" $\"%1$\"" + WriteRegStr HKCU "Software\Classes\zcoin" "" "URL:zcoin Protocol" + WriteRegStr HKCU "Software\Classes\zcoin" "URL Protocol" "" + WriteRegStr HKCU "Software\Classes\zcoin" "DefaultIcon" "$\"$INSTDIR\electrum.ico, 0$\"" + WriteRegStr HKCU "Software\Classes\zcoin\shell\open\command" "" "$\"$INSTDIR\electrum-xzc-${PRODUCT_VERSION}.exe$\" $\"%1$\"" ;Adds an uninstaller possibility to Windows Uninstall or change a program section WriteRegStr HKCU "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" @@ -167,7 +167,7 @@ Section "Uninstall" Delete "$SMPROGRAMS\${PRODUCT_NAME}\*.*" RMDir "$SMPROGRAMS\${PRODUCT_NAME}" - DeleteRegKey HKCU "Software\Classes\bitcoin" + DeleteRegKey HKCU "Software\Classes\zcoin" DeleteRegKey HKCU "Software\${PRODUCT_NAME}" DeleteRegKey HKCU "${PRODUCT_UNINST_KEY}" SectionEnd diff --git a/contrib/build-wine/prepare-wine.sh b/contrib/build-wine/prepare-wine.sh index e4b8c873b521..aa78b6742e3a 100755 --- a/contrib/build-wine/prepare-wine.sh +++ b/contrib/build-wine/prepare-wine.sh @@ -84,7 +84,7 @@ info "Building PyInstaller." # we build our own PyInstaller boot loader as the default one has high # anti-virus false positives ( - cd "$WINEPREFIX/drive_c/electrum" + cd "$WINEPREFIX/drive_c/electrum-xzc" ELECTRUM_COMMIT_HASH=$(git rev-parse HEAD) cd "$CACHEDIR" rm -rf pyinstaller diff --git a/contrib/deterministic-build/check_submodules.sh b/contrib/deterministic-build/check_submodules.sh index c8df3a10b83f..545887bfbd1b 100755 --- a/contrib/deterministic-build/check_submodules.sh +++ b/contrib/deterministic-build/check_submodules.sh @@ -20,9 +20,9 @@ fail=0 if [ $(date +%s -d "2 weeks ago") -gt $(get_git_mtime "contrib/deterministic-build/electrum-locale/") ]; then - echo "Last update from electrum-locale is older than 2 weeks."\ + echo "Last update from electrum_xzc-locale is older than 2 weeks."\ "Please update it to incorporate the latest translations from crowdin." fail=1 fi -exit ${fail} \ No newline at end of file +exit ${fail} diff --git a/contrib/make_download b/contrib/make_download index bafc8912ecd1..8590a11c33e3 100755 --- a/contrib/make_download +++ b/contrib/make_download @@ -3,7 +3,7 @@ import re import os import sys -from electrum.version import ELECTRUM_VERSION, APK_VERSION +from electrum_xzc.version import ELECTRUM_VERSION, APK_VERSION print("version", ELECTRUM_VERSION) dirname = sys.argv[1] @@ -23,18 +23,18 @@ string = string.replace("##VERSION_ANDROID##", version_android) string = string.replace("##VERSION_APK##", APK_VERSION) files = { - 'tgz': "Electrum-%s.tar.gz" % version, - 'appimage': "electrum-%s-x86_64.AppImage" % version, - 'zip': "Electrum-%s.zip" % version, - 'mac': "electrum-%s.dmg" % version_mac, - 'win': "electrum-%s.exe" % version_win, - 'win_setup': "electrum-%s-setup.exe" % version_win, - 'win_portable': "electrum-%s-portable.exe" % version_win, + 'tgz': "Electrum-XZC-%s.tar.gz" % version, + 'appimage': "electrum-xzc-%s-x86_64.AppImage" % version, + 'zip': "Electrum-XZC-%s.zip" % version, + 'mac': "electrum-xzc-%s.dmg" % version_mac, + 'win': "electrum-xzc-%s.exe" % version_win, + 'win_setup': "electrum-xzc-%s-setup.exe" % version_win, + 'win_portable': "electrum-xzc-%s-portable.exe" % version_win, } for k, n in files.items(): path = "dist/%s"%n - link = "https://download.electrum.org/%s/%s"%(version,n) + link = "https://download.electrum-xzc.org/%s"%n if not os.path.exists(path): os.system("wget -q %s -O %s" % (link, path)) if not os.path.getsize(path): diff --git a/contrib/make_tgz b/contrib/make_tgz index 4505d2c2ecd6..3b5e59dc3e78 100755 --- a/contrib/make_tgz +++ b/contrib/make_tgz @@ -5,7 +5,7 @@ set -e CONTRIB="$(dirname "$(readlink -e "$0")")" ROOT_FOLDER="$CONTRIB"/.. PACKAGES="$ROOT_FOLDER"/packages/ -LOCALE="$ROOT_FOLDER"/electrum/locale/ +LOCALE="$ROOT_FOLDER"/electrum_xzc/locale/ if [ ! -d "$PACKAGES" ]; then echo "Run make_packages first!" @@ -22,10 +22,10 @@ git submodule update --init exit 1 fi for i in ./locale/*; do - dir="$ROOT_FOLDER"/electrum/$i/LC_MESSAGES + dir="$ROOT_FOLDER"/electrum-xzc/$i/LC_MESSAGES mkdir -p $dir msgfmt --output-file=$dir/electrum.mo $i/electrum.po || true - cp $i/electrum.po "$ROOT_FOLDER"/electrum/$i/electrum.po + cp $i/electrum.po "$ROOT_FOLDER"/electrum-xzc/$i/electrum.po done ) diff --git a/contrib/osx/make_osx b/contrib/osx/make_osx index 0cd74d971e3e..9a43e88c357e 100755 --- a/contrib/osx/make_osx +++ b/contrib/osx/make_osx @@ -3,7 +3,7 @@ # Parameterize PYTHON_VERSION=3.6.4 BUILDDIR=/tmp/electrum-build -PACKAGE=Electrum +PACKAGE=Electrum-XZC GIT_REPO=https://github.com/spesmilo/electrum LIBSECP_VERSION="b408c6a8b287003d1ade5709e6f7bc3c7f1d5be7" @@ -17,7 +17,7 @@ src_dir=$(dirname "$0") cd $src_dir/../.. export PYTHONHASHSEED=22 -VERSION=`git describe --tags --dirty --always` +VERSION=`git describe --tags --always` which brew > /dev/null 2>&1 || fail "Please install brew from https://brew.sh/ to continue" which xcodebuild > /dev/null 2>&1 || fail "Please install Xcode and xcode command line tools to continue" diff --git a/contrib/osx/osx.spec b/contrib/osx/osx.spec index 45c02f837d7f..3fb77fa31b0c 100644 --- a/contrib/osx/osx.spec +++ b/contrib/osx/osx.spec @@ -4,8 +4,8 @@ from PyInstaller.utils.hooks import collect_data_files, collect_submodules, coll import sys, os -PACKAGE='Electrum' -PYPKG='electrum' +PACKAGE='Electrum-XZC' +PYPKG='electrum_xzc' MAIN_SCRIPT='run_electrum' ICONS_FILE=PYPKG + '/gui/icons/electrum.icns' APP_SIGN = os.environ.get('APP_SIGN', '') @@ -97,22 +97,22 @@ binaries += [b for b in collect_dynamic_libs('PyQt5') if 'macstyle' in b[0]] # We don't put these files in to actually include them in the script but to make the Analysis method scan them for imports a = Analysis([electrum+ MAIN_SCRIPT, - electrum+'electrum/gui/qt/main_window.py', - electrum+'electrum/gui/text.py', - electrum+'electrum/util.py', - electrum+'electrum/wallet.py', - electrum+'electrum/simple_config.py', - electrum+'electrum/bitcoin.py', - electrum+'electrum/dnssec.py', - electrum+'electrum/commands.py', - electrum+'electrum/plugins/cosigner_pool/qt.py', - electrum+'electrum/plugins/email_requests/qt.py', - electrum+'electrum/plugins/trezor/qt.py', - electrum+'electrum/plugins/safe_t/client.py', - electrum+'electrum/plugins/safe_t/qt.py', - electrum+'electrum/plugins/keepkey/qt.py', - electrum+'electrum/plugins/ledger/qt.py', - electrum+'electrum/plugins/coldcard/qt.py', + electrum+'electrum_xzc/gui/qt/main_window.py', + electrum+'electrum_xzc/gui/text.py', + electrum+'electrum_xzc/util.py', + electrum+'electrum_xzc/wallet.py', + electrum+'electrum_xzc/simple_config.py', + electrum+'electrum_xzc/bitcoin.py', + electrum+'electrum_xzc/dnssec.py', + electrum+'electrum_xzc/commands.py', + electrum+'electrum_xzc/plugins/cosigner_pool/qt.py', + electrum+'electrum_xzc/plugins/email_requests/qt.py', + electrum+'electrum_xzc/plugins/trezor/qt.py', + electrum+'electrum_xzc/plugins/safe_t/client.py', + electrum+'electrum_xzc/plugins/safe_t/qt.py', + electrum+'electrum_xzc/plugins/keepkey/qt.py', + electrum+'electrum_xzc/plugins/ledger/qt.py', + electrum+'electrum_xzc/plugins/coldcard/qt.py', ], binaries=binaries, datas=datas, diff --git a/contrib/pull_locale b/contrib/pull_locale index 4b187504abbd..0efa8c99f0b8 100755 --- a/contrib/pull_locale +++ b/contrib/pull_locale @@ -13,7 +13,7 @@ except ImportError as e: os.chdir(os.path.dirname(os.path.realpath(__file__))) os.chdir('..') -cmd = "find electrum -type f -name '*.py' -o -name '*.kv'" +cmd = "find electrum-xzc -type f -name '*.py' -o -name '*.kv'" files = subprocess.check_output(cmd, shell=True) @@ -23,9 +23,9 @@ with open("app.fil", "wb") as f: print("Found {} files to translate".format(len(files.splitlines()))) # Generate fresh translation template -if not os.path.exists('electrum/locale'): - os.mkdir('electrum/locale') -cmd = 'xgettext -s --from-code UTF-8 --language Python --no-wrap -f app.fil --output=electrum/locale/messages.pot' +if not os.path.exists('electrum-xzc/locale'): + os.mkdir('electrum-xzc/locale') +cmd = 'xgettext -s --from-code UTF-8 --language Python --no-wrap -f app.fil --output=electrum-xzc/locale/messages.pot' print('Generate template') os.system(cmd) diff --git a/contrib/push_locale b/contrib/push_locale index 01106cf7f38c..56e267368408 100755 --- a/contrib/push_locale +++ b/contrib/push_locale @@ -13,7 +13,7 @@ except ImportError as e: os.chdir(os.path.dirname(os.path.realpath(__file__))) os.chdir('..') -cmd = "find electrum -type f -name '*.py' -o -name '*.kv'" +cmd = "find electrum-xzc -type f -name '*.py' -o -name '*.kv'" files = subprocess.check_output(cmd, shell=True) @@ -23,9 +23,9 @@ with open("app.fil", "wb") as f: print("Found {} files to translate".format(len(files.splitlines()))) # Generate fresh translation template -if not os.path.exists('electrum/locale'): - os.mkdir('electrum/locale') -cmd = 'xgettext -s --from-code UTF-8 --language Python --no-wrap -f app.fil --output=electrum/locale/messages.pot' +if not os.path.exists('electrum-xzc/locale'): + os.mkdir('electrum-xzc/locale') +cmd = 'xgettext -s --from-code UTF-8 --language Python --no-wrap -f app.fil --output=electrum-xzc/locale/messages.pot' print('Generate template') os.system(cmd) @@ -56,4 +56,3 @@ if crowdin_api_key: print('Build translations') response = requests.request('GET', 'https://api.crowdin.com/api/project/' + crowdin_identifier + '/export?key=' + crowdin_api_key) print("", "export:", "-" * 20, response.text, "-" * 20, sep="\n") - diff --git a/electrum-xzc.desktop b/electrum-xzc.desktop new file mode 100644 index 000000000000..432eb53a57b9 --- /dev/null +++ b/electrum-xzc.desktop @@ -0,0 +1,22 @@ +# If you want Electrum to appear in a Linux app launcher ("start menu"), install this by doing: +# sudo desktop-file-install electrum-xzc.desktop + +[Desktop Entry] +Comment=Lightweight Zcoin Client +Exec=sh -c "PATH=\"\\$HOME/.local/bin:\\$PATH\"; electrum-xzc %u" +GenericName[en_US]=Zcoin Wallet +GenericName=Zcoin Wallet +Icon=electrum-xzc +Name[en_US]=Electrum Zcoin Wallet +Name=Electrum Zcoin Wallet +Categories=Finance;Network; +StartupNotify=true +StartupWMClass=electrum-zxc +Terminal=false +Type=Application +MimeType=x-scheme-handler/bitcoin; +Actions=Testnet; + +[Desktop Action Testnet] +Exec=sh -c "PATH=\"\\$HOME/.local/bin:\\$PATH\"; electrum-xzc --testnet %u" +Name=Testnet mode diff --git a/electrum.desktop b/electrum.desktop deleted file mode 100644 index e40106716580..000000000000 --- a/electrum.desktop +++ /dev/null @@ -1,22 +0,0 @@ -# If you want Electrum to appear in a Linux app launcher ("start menu"), install this by doing: -# sudo desktop-file-install electrum.desktop - -[Desktop Entry] -Comment=Lightweight Bitcoin Client -Exec=sh -c "PATH=\"\\$HOME/.local/bin:\\$PATH\"; electrum %u" -GenericName[en_US]=Bitcoin Wallet -GenericName=Bitcoin Wallet -Icon=electrum -Name[en_US]=Electrum Bitcoin Wallet -Name=Electrum Bitcoin Wallet -Categories=Finance;Network; -StartupNotify=true -StartupWMClass=electrum -Terminal=false -Type=Application -MimeType=x-scheme-handler/bitcoin; -Actions=Testnet; - -[Desktop Action Testnet] -Exec=sh -c "PATH=\"\\$HOME/.local/bin:\\$PATH\"; electrum --testnet %u" -Name=Testnet mode diff --git a/electrum/base_wizard.py b/electrum/base_wizard.py index f907dab40258..630415d2a3ed 100644 --- a/electrum/base_wizard.py +++ b/electrum/base_wizard.py @@ -129,9 +129,9 @@ def new(self): ]) wallet_kinds = [ ('standard', _("Standard wallet")), - ('2fa', _("Wallet with two-factor authentication")), +# ('2fa', _("Wallet with two-factor authentication")), ('multisig', _("Multi-signature wallet")), - ('imported', _("Import Bitcoin addresses or private keys")), + ('imported', _("Import Zcoin addresses or private keys")), ] choices = [pair for pair in wallet_kinds if pair[0] in wallet_types] self.choice_dialog(title=title, message=message, choices=choices, run_next=self.on_wallet_type) @@ -203,8 +203,8 @@ def choose_keystore(self): def import_addresses_or_keys(self): v = lambda x: keystore.is_address_list(x) or keystore.is_private_key_list(x, raise_on_error=True) - title = _("Import Bitcoin Addresses") - message = _("Enter a list of Bitcoin addresses (this will create a watching-only wallet), or a list of private keys.") + title = _("Import Zcoin Addresses") + message = _("Enter a list of Zcoin addresses (this will create a watching-only wallet), or a list of private keys.") self.add_xpub_dialog(title=title, message=message, run_next=self.on_import, is_valid=v, allow_multi=True, show_wif_help=True) @@ -387,16 +387,16 @@ def derivation_and_script_type_dialog(self, f): # For segwit, a custom path is used, as there is no standard at all. default_choice_idx = 2 choices = [ - ('standard', 'legacy multisig (p2sh)', "m/45'/0"), - ('p2wsh-p2sh', 'p2sh-segwit multisig (p2wsh-p2sh)', purpose48_derivation(0, xtype='p2wsh-p2sh')), - ('p2wsh', 'native segwit multisig (p2wsh)', purpose48_derivation(0, xtype='p2wsh')), + ('standard', 'legacy multisig (p2sh)', "m/44'/136'/0'"), + #('p2wsh-p2sh', 'p2sh-segwit multisig (p2wsh-p2sh)', purpose48_derivation(0, xtype='p2wsh-p2sh')), + #('p2wsh', 'native segwit multisig (p2wsh)', purpose48_derivation(0, xtype='p2wsh')), ] else: default_choice_idx = 2 choices = [ - ('standard', 'legacy (p2pkh)', bip44_derivation(0, bip43_purpose=44)), - ('p2wpkh-p2sh', 'p2sh-segwit (p2wpkh-p2sh)', bip44_derivation(0, bip43_purpose=49)), - ('p2wpkh', 'native segwit (p2wpkh)', bip44_derivation(0, bip43_purpose=84)), + ('standard', 'BIP44', bip44_derivation(0, bip43_purpose=44)), + #('p2wpkh-p2sh', 'p2sh-segwit (p2wpkh-p2sh)', bip44_derivation(0, bip43_purpose=49)), + #('p2wpkh', 'native segwit (p2wpkh)', bip44_derivation(0, bip43_purpose=84)), ] while True: try: @@ -610,7 +610,9 @@ def choose_seed_type(self, message=None, choices=None): ('create_segwit_seed', _('Segwit')), ('create_standard_seed', _('Legacy')), ] - self.choice_dialog(title=title, message=message, choices=choices, run_next=self.run) + #self.choice_dialog(title=title, message=message, choices=choices, run_next=self.run) + out = ('create_standard_seed',) + self.run(*out) def create_segwit_seed(self): self.create_seed('segwit') def create_standard_seed(self): self.create_seed('standard') diff --git a/electrum/blockchain.py b/electrum/blockchain.py index 5f7c36cd7655..cde6ade0e370 100644 --- a/electrum/blockchain.py +++ b/electrum/blockchain.py @@ -35,7 +35,6 @@ _logger = get_logger(__name__) -HEADER_SIZE = 80 # bytes MAX_TARGET = 0x00000000FFFF0000000000000000000000000000000000000000000000000000 @@ -52,12 +51,14 @@ def serialize_header(header_dict: dict) -> str: + int_to_hex(int(header_dict['timestamp']), 4) \ + int_to_hex(int(header_dict['bits']), 4) \ + int_to_hex(int(header_dict['nonce']), 4) + if len(header_dict['addendum']) > 0: + s += bh2u(header_dict['addendum']) return s def deserialize_header(s: bytes, height: int) -> dict: if not s: raise InvalidHeader('Invalid header: {}'.format(s)) - if len(s) != HEADER_SIZE: + if not constants.net.COIN.check_header_size(s): raise InvalidHeader('Invalid header length: {}'.format(len(s))) hex_to_int = lambda s: int.from_bytes(s, byteorder='little') h = {} @@ -68,6 +69,9 @@ def deserialize_header(s: bytes, height: int) -> dict: h['bits'] = hex_to_int(s[72:76]) h['nonce'] = hex_to_int(s[76:80]) h['block_height'] = height + h['addendum'] = [] + if len(s) > constants.net.COIN.PRE_MTP_HEADER_SIZE: + h['addendum'] = s[constants.net.COIN.PRE_MTP_HEADER_SIZE:len(s)] return h def hash_header(header: dict) -> str: @@ -135,7 +139,11 @@ def instantiate_chain(filename): forkpoint_hash=first_hash, prev_hash=prev_hash) # consistency checks - h = b.read_header(b.forkpoint) + try: + h = b.read_header(b.forkpoint) + except: + delete_chain(filename, "Cannot read the fork") + return; if first_hash != hash_header(h): delete_chain(filename, "incorrect first hash for chain") return @@ -278,7 +286,15 @@ def size(self) -> int: @with_lock def update_size(self) -> None: p = self.path() - self._size = os.path.getsize(p)//HEADER_SIZE if os.path.exists(p) else 0 + if os.path.exists(p): + fileSize = os.path.getsize(p) + preMtpSize = constants.net.COIN.static_header_offset(constants.net.COIN.PRE_MTP_BLOCKS) + if fileSize > preMtpSize: + self._size = constants.net.COIN.PRE_MTP_BLOCKS + (fileSize - preMtpSize) // constants.net.COIN.MTP_HEADER_SIZE + else: + self._size = fileSize // constants.net.COIN.PRE_MTP_HEADER_SIZE + else: + self._size = 0 @classmethod def verify_header(cls, header: dict, prev_hash: str, target: int, expected_header_hash: str=None) -> None: @@ -287,7 +303,7 @@ def verify_header(cls, header: dict, prev_hash: str, target: int, expected_heade raise Exception("hash mismatches with expected: {} vs {}".format(expected_header_hash, _hash)) if prev_hash != header.get('prev_block_hash'): raise Exception("prev hash mismatch: %s vs %s" % (prev_hash, header.get('prev_block_hash'))) - if constants.net.TESTNET: + if constants.net.TESTNET or True: return bits = cls.target_to_bits(target) if bits != header.get('bits'): @@ -297,20 +313,25 @@ def verify_header(cls, header: dict, prev_hash: str, target: int, expected_heade raise Exception(f"insufficient proof of work: {block_hash_as_num} vs target {target}") def verify_chunk(self, index: int, data: bytes) -> None: - num = len(data) // HEADER_SIZE - start_height = index * 2016 + CHUNK_SIZE = 2016 + start_height = index * CHUNK_SIZE prev_hash = self.get_hash(start_height - 1) target = self.get_target(index-1) - for i in range(num): + i = 0 + dataHandled = 0 + while dataHandled < len(data): height = start_height + i try: expected_header_hash = self.get_hash(height) except MissingHeader: expected_header_hash = None - raw_header = data[i*HEADER_SIZE : (i+1)*HEADER_SIZE] - header = deserialize_header(raw_header, index*2016 + i) + headerSize = constants.net.COIN.get_header_size(data[dataHandled : dataHandled + constants.net.COIN.PRE_MTP_HEADER_SIZE]) + raw_header = data[dataHandled : dataHandled + headerSize] + header = deserialize_header(raw_header, index*CHUNK_SIZE + i) self.verify_header(header, prev_hash, target, expected_header_hash) prev_hash = hash_header(header) + i += 1 + dataHandled += headerSize @with_lock def path(self): @@ -335,8 +356,7 @@ def save_chunk(self, index: int, chunk: bytes): main_chain.save_chunk(index, chunk) return - delta_height = (index * 2016 - self.forkpoint) - delta_bytes = delta_height * HEADER_SIZE + delta_bytes = constants.net.COIN.static_header_offset(index * 2016) - constants.net.COIN.static_header_offset(self.forkpoint) # if this chunk contains our forkpoint, only save the part after forkpoint # (the part before is the responsibility of the parent) if delta_bytes < 0: @@ -389,14 +409,14 @@ def _swap_with_parent(self) -> bool: assert forkpoint > parent.forkpoint, (f"forkpoint of parent chain ({parent.forkpoint}) " f"should be at lower height than children's ({forkpoint})") with open(parent.path(), 'rb') as f: - f.seek((forkpoint - parent.forkpoint)*HEADER_SIZE) - parent_data = f.read(parent_branch_size*HEADER_SIZE) + f.seek( constants.net.COIN.static_header_offset(forkpoint) - constants.net.COIN.static_header_offset(parent.forkpoint) ) + parent_data = f.read(constants.net.COIN.static_header_offset(parent_branch_size)) self.write(parent_data, 0) - parent.write(my_data, (forkpoint - parent.forkpoint)*HEADER_SIZE) + parent.write(my_data, constants.net.COIN.static_header_offset(forkpoint) - constants.net.COIN.static_header_offset(parent.forkpoint) ) # swap parameters self.parent, parent.parent = parent.parent, self # type: Optional[Blockchain], Optional[Blockchain] self.forkpoint, parent.forkpoint = parent.forkpoint, self.forkpoint - self._forkpoint_hash, parent._forkpoint_hash = parent._forkpoint_hash, hash_raw_header(bh2u(parent_data[:HEADER_SIZE])) + self._forkpoint_hash, parent._forkpoint_hash = parent._forkpoint_hash, hash_raw_header(bh2u(parent_data[:constants.net.COIN.get_header_size_height(parent.forkpoint + parent.size() - 1)])) self._prev_hash, parent._prev_hash = parent._prev_hash, self._prev_hash # parent's new name os.replace(child_old_name, parent.path()) @@ -425,7 +445,7 @@ def write(self, data: bytes, offset: int, truncate: bool=True) -> None: filename = self.path() self.assert_headers_file_available(filename) with open(filename, 'rb+') as f: - if truncate and offset != self._size * HEADER_SIZE: + if truncate and offset != constants.net.COIN.static_header_offset(self._size): f.seek(offset) f.truncate() f.seek(offset) @@ -436,12 +456,11 @@ def write(self, data: bytes, offset: int, truncate: bool=True) -> None: @with_lock def save_header(self, header: dict) -> None: - delta = header.get('block_height') - self.forkpoint + assert self.size() == header.get('block_height') - self.forkpoint + delta = constants.net.COIN.static_header_offset(header.get('block_height')) - constants.net.COIN.static_header_offset(self.forkpoint) data = bfh(serialize_header(header)) # headers are only _appended_ to the end: - assert delta == self.size(), (delta, self.size()) - assert len(data) == HEADER_SIZE - self.write(data, delta*HEADER_SIZE) + self.write(data, delta) self.swap_with_parent() @with_lock @@ -452,15 +471,18 @@ def read_header(self, height: int) -> Optional[dict]: return self.parent.read_header(height) if height > self.height(): return - delta = height - self.forkpoint + delta = constants.net.COIN.static_header_offset(height) - constants.net.COIN.static_header_offset(self.forkpoint) name = self.path() self.assert_headers_file_available(name) with open(name, 'rb') as f: - f.seek(delta * HEADER_SIZE) - h = f.read(HEADER_SIZE) - if len(h) < HEADER_SIZE: + f.seek(delta) + hdrSz = constants.net.COIN.get_header_size_height(height) + h = f.read(hdrSz) + if len(h) == 0: + raise MissingHeader('Header is missing') + if len(h) < hdrSz: raise Exception('Expected to read a full header. This was only {} bytes'.format(len(h))) - if h == bytes([0])*HEADER_SIZE: + if h == bytes([0])*hdrSz: return None return deserialize_header(h, height) @@ -517,8 +539,8 @@ def get_target(self, index: int) -> int: @classmethod def bits_to_target(cls, bits: int) -> int: bitsN = (bits >> 24) & 0xff - if not (0x03 <= bitsN <= 0x1d): - raise Exception("First part of bits should be in [0x03, 0x1d]") + if not (0x03 <= bitsN <= 0x1e): + raise Exception("First part of bits should be in [0x03, 0x1e]") bitsBase = bits & 0xffffff if not (0x8000 <= bitsBase <= 0x7fffff): raise Exception("Second part of bits should be in [0x8000, 0x7fffff]") @@ -614,6 +636,27 @@ def get_checkpoints(self): cp.append((h, target)) return cp + def store_raw_header(self, header:bytes, height:int): + file_name = os.path.join(self.raw_dir, str(height)) + with open(file_name, 'wb+') as f: + f.write(header) + f.close() + + def get_hash_raw_header(self, height: int): + if height == -1: + return '0000000000000000000000000000000000000000000000000000000000000000' + elif height == 0: + return bitcoin.NetworkConstants.GENESIS + else: + file_name = os.path.join(self.raw_dir, str(height)) + if not os.path.isfile(file_name): + raise "Raw file header for {} not found".format(height) + + raw_header = bytes() + with open(file_name, 'rb+') as f: + raw_header = f.read() + return hash_encode(Hash(raw_header)) + def check_header(header: dict) -> Optional[Blockchain]: if type(header) is not dict: diff --git a/electrum/checkpoints.json b/electrum/checkpoints.json index 12e5ebcf129d..fe51488c7066 100644 --- a/electrum/checkpoints.json +++ b/electrum/checkpoints.json @@ -1,1110 +1 @@ -[ - [ - "00000000693067b0e6b440bc51450b9f3850561b07f6d3c021c54fbd6abb9763", - 26959535291011309493156476344723991336010898738574164086137773096960 - ], - [ - "00000000f037ad09d0b05ee66b8c1da83030abaf909d2b1bf519c3c7d2cd3fdf", - 26959535291011309493156476344723991336010898738574164086137773096960 - ], - [ - "000000006ce8b5f16fcedde13acbc9641baa1c67734f177d770a4069c06c9de8", - 26959535291011309493156476344723991336010898738574164086137773096960 - ], - [ - "00000000563298de120522b5ae17da21aaae02eee2d7fcb5be65d9224dbd601c", - 26959535291011309493156476344723991336010898738574164086137773096960 - ], - [ - "000000009b0a4b2833b4a0aa61171ee75b8eb301ac45a18713795a72e461a946", - 26959535291011309493156476344723991336010898738574164086137773096960 - ], - [ - "00000000fa8a7363e8f6fdc88ec55edf264c9c7b31268c26e497a4587c750584", - 26959535291011309493156476344723991336010898738574164086137773096960 - ], - [ - "000000008ac55b5cd76a5c176f2457f0e9df5ff1c719d939f1022712b1ba2092", - 26959535291011309493156476344723991336010898738574164086137773096960 - ], - [ - "000000007f0c796631f00f542c0b402d638d3518bc208f8c9e5d29d2f169c084", - 26959535291011309493156476344723991336010898738574164086137773096960 - ], - [ - "00000000ffb062296c9d4eb5f87bbf905d30669d26eab6bced341bd3f1dba5fd", - 26959535291011309493156476344723991336010898738574164086137773096960 - ], - [ - "0000000074c108842c3ec2252bba62db4050bf0dddfee3ddaa5f847076b8822f", - 26959535291011309493156476344723991336010898738574164086137773096960 - ], - [ - "0000000067dc2f84a73fbf5d3c70678ce4a1496ef3a62c557bc79cbdd1d49f22", - 26959535291011309493156476344723991336010898738574164086137773096960 - ], - [ - "00000000dbf06f47c0624262ecb197bccf6bdaaabc2d973708ac401ac8955acc", - 26959535291011309493156476344723991336010898738574164086137773096960 - ], - [ - "000000009260fe30ec89ef367122f429dcc59f61735760f2b2288f2e854f04ac", - 26959535291011309493156476344723991336010898738574164086137773096960 - ], - [ - "00000000f9f1a700898c4e0671af6efd441eaf339ba075a5c5c7b0949473c80b", - 26959535291011309493156476344723991336010898738574164086137773096960 - ], - [ - "000000005107662c86452e7365f32f8ffdc70d8d87aa6f78630a79f7d77fbfe6", - 26959535291011309493156476344723991336010898738574164086137773096960 - ], - [ - "00000000984f962134a7291e3693075ae03e521f0ee33378ec30a334d860034b", - 22791060871177364286867400663010583169263383106957897897309909286912 - ], - [ - "000000005e36047e39452a7beaaa6721048ac408a3e75bb60a8b0008713653ce", - 20657664212610420653213483117824978239553266057163961604478437687296 - ], - [ - "00000000128d789579ffbec00203a371cbb39cee27df35d951fd66e62ed59258", - 20055820920770189543295303139304627292355830414308479769458683936768 - ], - [ - "000000008dde642fb80481bb5e1671cb04c6716de5b7f783aa3388456d5c8a85", - 14823939180767414932263578623363531361763221729526512593941781544960 - ], - [ - "000000008135b689ad1557d4e148a8b9e58e2c4a67240fc87962abb69710231a", - 10665477591887247494381404907447500979192021944764506987270680608768 - ], - [ - "00000000308496ef3e4f9fa542a772df637b4aaf1dcce404424611feacfc09e7", - 7129927859545590787920041835044506526699926406309469412482969763840 - ], - [ - "000000001a2e0c63d7d012003c9173acfd04ccd6372027718979228c461b5ed5", - 5949911473257063494842414979623989957440207170696926280907451531264 - ], - [ - "000000002e0c0ac26ccde91b51ab018576b3a126b413e9f6f787b36637f1b174", - 5905492491837656485645884063467495540781288435542782321354050895872 - ], - [ - "00000000103226f85fe2b68795f087dcec345e523363f18017e60b5c94175355", - 4430143390146946405787502162943966061454423600514874825749833973760 - ], - [ - "000000001ae6f66fd4de47f8d6f357e798943bbfc4f39ebf14b0975fab059173", - 3447600406241317909690675945127070282093452846402311540118831235072 - ], - [ - "000000000a3f22690162744d3bc0b674c92e661a25afb3d2ac8b39b27ac14373", - 2351604382534916182160036119666703740669209516522695514729880748032 - ], - [ - "0000000006dc436c3c515a97446af858c1203a501c85d26c4a30afa380aba4a1", - 2098151686442211199940455690614286210348997571531298297574806519808 - ], - [ - "000000000943fe1680ffcc498ce50790ff8e842a8af2c157664e4fbc1cb7cb46", - 2275790652544821279950241890112140030244814501479017131553197129728 - ], - [ - "000000000847b2144376c1fb057ea1d5a027d5a6004277ed4c72422e93df04e9", - 1622203955679450683159610732218403647246163922223729367236739072000 - ], - [ - "00000000094505954deb1d31382b86d0510fd280a34143400b1856a4d52b4c93", - 1551048739079662593758612650769536967206480773659027300489594142720 - ], - [ - "000000000109272cecb3f7e98ac12cf149fa8a1b2aaab248e1b006b0dc595a3a", - 1389323280429349294447518501872137680563441219958739463959193059328 - ], - [ - "0000000009e6aa0fe39b790625ffeb18a2d6ff5060a5bd14e699e83c54109977", - 1147152896345386682952518188670047452875537662186691235300769792000 - ], - [ - "0000000000d14af55c4eae0121184919baba2deb8bf89c3af6b8e4c4f35c8e4e", - 594007861936424273334637371358095438347537381057796937154824241152 - ], - [ - "0000000003dfbfa2b33707e691ab2ab7cda7503be2c2cce43d1b21cd1cc757fb", - 148501965484106068333659342839523859586884345264449234288706060288 - ], - [ - "0000000000c169d181d66d242901f70d006f3e088c1ae9cacb88b94b8266e9c3", - 110393429764504113949181711819653188468070301266890302199533928448 - ], - [ - "000000000009f7d1439d6a2fc1a456db8e843674275bf0133fc7b43b5f45b96e", - 76554528428498296726819074079132986384157750623812250673757552640 - ], - [ - "000000000011b8a8fad7973548b50f6d4b2ba1690f7487c374e43248c576354f", - 52678642966898219212816601311127992435882858542187514726849708032 - ], - [ - "000000000077e856b6cc475d9cf784119811214c9cac8d7b674ec24faa7c2c0c", - 43246870766561725070861386869077695524372774526710079316876591104 - ], - [ - "00000000004cbb474f2cbf3a65f690efa09804512af3351ba3a0888c806c6625", - 37817516728945957090904676150631917288430706594442690521085247488 - ], - [ - "0000000000235b1ec6656d8e91f3dde3b6ab9ad7e75b332e4da9355ce60d860e", - 29373101246077110899697012205905070265841442578602225419818106880 - ], - [ - "00000000002a153a2c95a8e5493db93086b0e3fe590b636a5871ace57523ef93", - 20444488966645742314409346972440253478913291170842138088329707520 - ], - [ - "00000000000e9550e084908cf91a4e8b74f9f1315d1bc4020709f9e7f261bb18", - 19563849255781403323327768731100757126732627316116500830377476096 - ], - [ - "00000000002c2cfef3bb85b463d3fcd39b73a6d3d5ae11c1e2a8113e3794f28d", - 12545026348036226200394850922278603223904369245268262607334146048 - ], - [ - "00000000000fa92b757ee29674aa97e98a49ba3ad340d2baa94155d71648dfe1", - 8719867261221084516486306056196045840260667577454435863762042880 - ], - [ - "0000000000030571601dbc8e13d00d45004eee6ea8b6ab3cdfb38d2546fee21c", - 5942996718418989293499865695368015163438891473576991811912597504 - ], - [ - "00000000000bb6adef42e63082b20fd2b1dc1b324c51973512a4c31f29a9986e", - 3926013280397599483741094494745234959951218212740030386090803200 - ], - [ - "000000000000765094788a98dbb8adac30d248b7129b59b1441ee2b7ef9e332f", - 3337321571246095014985518819479127172783474909736415373333364736 - ], - [ - "00000000000431a0aa9625f82975709f3c6f4f64d04c559512af051599872084", - 2200419182034594781720344474937177839165432393990533906392154112 - ], - [ - "00000000000292b850b8f8578e6b4d03cbb4a78ada44afbb4d2f80a16490e8f9", - 1861311314983800126815643622927230076368334845814253369901973504 - ], - [ - "0000000000025afe84e27423011af25f777e5a94545dbd00fd04bebe9050f7dd", - 1653206561150525499452195696179626311675293455763937233695932416 - ], - [ - "0000000000000e389cccae2a40437be574fd806909e24136711e7f8bce671d65", - 1462200632444444190489436459820840230299714881944341127503020032 - ], - [ - "0000000000030510bf6bc1649726cf2e6e4010c64a2c8fd3fde5dc92535ca40e", - 1224744150896501443874292381730317417444978877835711165914677248 - ], - [ - "00000000000082648057f14fc835779c6ce46a407bafb2e5c2ac1d20d9f4e822", - 1036989760889350435547200084292752907272941324136347429599444992 - ], - [ - "000000000000f38accd6b22959010471a6d9f159d43bf2a9d4c53c220201254e", - 739430030225080220618328322475016688484025266646974337550123008 - ], - [ - "0000000000004ed7a73133678b5eb883cd8882bf14dfb26c104ae0c3f94cf4ee", - 484975157177710342494716926626447514974484083994735770500857856 - ], - [ - "00000000000037bb3ff4cf649a1757d4028ecc10f893529b4a2214792c981f96", - 353833947722011807976659613996792948209273674048993161457434624 - ], - [ - "0000000000008008f46559fe7f181e9dc0648f213472a1e576e8bf506b88f22f", - 390843739553851677760235428436025349398613161749553108945469440 - ], - [ - "000000000000691d0c2444db713bf6c088844cc95a37cdc55cc269bb0a31d8c8", - 327394795212563108599383268946242257264650552916910648089116672 - ], - [ - "00000000000071153b0afcc64a425f8442c29749610797119e732dd4b723f675", - 291935447509363748964474894494542149680088347011133317125767168 - ], - [ - "000000000000a384acb522e4e5935ad2bc31366ecf1f16f1f11023e967ef033d", - 245823858161213192073337185391658632187400443916100519594033152 - ], - [ - "0000000000002e532093d43e901292121fb7c6583caf2d13b666fe7e194b4a97", - 171262555713783851185422181139260521316022447660158187451973632 - ], - [ - "00000000000033e435c4bbddc7eb255146aa7f18e61a832983af3a9ee5dd144d", - 110438984653392107399822606842181601255647711092336854093004800 - ], - [ - "00000000000028ff4b0bd45f0e3e713f91fa1821d28a276a1a1f32f786662f13", - 61993465896324436412959469550829248888675813063783317791309824 - ], - [ - "0000000000001ef9c75318e116a607af4de68fb4f67c788677ee6779fb5fa0d5", - 47525089675259291211422247200069659468817014361857087365971968 - ], - [ - "0000000000000e6e98694ccb8247aad63aaa1e2bec5a7be14329407e4cea6223", - 30742228348699538311994447367921718297595975288392383715082240 - ], - [ - "000000000000000a2153574b2523a6d1844c3cb82d085e2575846dd8c5d4ebb4", - 19547336162709893274575855467812492508787617050928192350584832 - ], - [ - "00000000000002a92c1b1ffb2a8388979cf30798e312335ae2a1b922927ee83d", - 17248274092338559882155796390905381469049315669915374897332224 - ], - [ - "00000000000004d54b1422ce733922e7672a4e2ecc86dcf96c0de06565cddaa6", - 15943936487596784557029840069157210316687734428242467413295104 - ], - [ - "00000000000009dd91ae96cbbf67af42340b0bc715b3606aa725f630b470262d", - 14273467308195657992975774342458504496649432985410431166185472 - ], - [ - "00000000000007d33d78522fa95bdcd4a25072aeac844cbe9b6bc5d0cc885d0a", - 14930233597189143322113827544414041000381079823613435714732032 - ], - [ - "00000000000003dd57f5dd1228f68390b586700063225d26bac972bd120546d2", - 15164766714763258952996988973449124317842091658872414191747072 - ], - [ - "000000000000076bdeca878b47c392f51fbda543b1e69612cf7d305deb537604", - 15357836632983707094928406965317628870031114888441593128288256 - ], - [ - "00000000000008eb1bb7e18d9dfe62210d761cbf114d59ca08e4f638b8563e30", - 15958672964717750944291813934170287689797412223641384931819520 - ], - [ - "00000000000001b0d8d885e4d77d7c51e8f1fdaba68f229ac04d191915845f09", - 18362361570655080300849714079315004638119732162003921272832000 - ], - [ - "000000000000081baa3a716d5f9ab072c9fc3b798900234c9be23ab02a287c30", - 22401652017447755518156310839596703571934659990690572544245760 - ], - [ - "00000000000005b88d0224b9b0d4b65d3de9a61d93609bb91c9297440f1c4657", - 22607619418140130980719672680045705126213018528712048676700160 - ], - [ - "000000000000027d6a6870403fa43a650b7d9a6e61243f375a79ea935ad9ef1f", - 24717289559589094364468373797949472355802981654048927838633984 - ], - [ - "0000000000000810a3490b86e4f302f6557f9621c5c8620c2b09ec8f0cf72794", - 23340814324747679919001773364939281849550099124416593832968192 - ], - [ - "000000000000073833bca8d0ea909fde717e251576b7b3ccaaa58ad5d39eed60", - 23242391331131109072962566885467580392541369223033474166816768 - ], - [ - "000000000000031b7fd2ed1f28ff74e969aa891297706c38bd2e1d3bc48183c4", - 21554562042243053719921017803645315870071034703425342074257408 - ], - [ - "0000000000000b0738bcba382983811d40b531f2e68cd57126092755f1be4ba6", - 20615546854515052444405957679617344022137222968655050411343872 - ], - [ - "000000000000000664cbfd5e3fa497c07614c33a0934b83e01fbe980634a9aa4", - 19540887421473929614259883543522244007742949396702043752628224 - ], - [ - "000000000000021eb520df39289a70e40c59822a8c47924dc4940e7d0c1455c4", - 19588382523276445241758125434587686389961661359576757951266816 - ], - [ - "0000000000000275e0c41b11bc250fe887c5e60c8ebaaa449f5c28c67133d496", - 18009299117968233362105684657812007807160912568078774269116416 - ], - [ - "000000000000097fb0fdbeee0cee7e8f4e1a4ef8fad49f3d549624b0d47abed0", - 17993483763986497389087426516491816616385967180337839494660096 - ], - [ - "000000000000053f199ae19d34365277e534f978ea2f6c69cd4757a4fc099af5", - 16574638092431222848464934504874974361824393751455373256032256 - ], - [ - "0000000000000217b2e7b4f61682d24b9357d62ad29f27ed45ea2a32dc1f32f6", - 17085559845791583266730740536950670241169412424878408752693248 - ], - [ - "000000000000039c1d77acd4702393f48ca61983c64fc0209ade141c694b2359", - 17870687961287995446644888885900316642120964851955511819501568 - ], - [ - "0000000000000ae53f0c78330f6c2fbece2752909bc3742823e4fab29c5fd2b0", - 15554707140145502641228553657813466188995512591033787398225920 - ], - [ - "00000000000004b4d72b8631a85ec7d226dc696f1913ba1bf735b7c8dec207b8", - 16944226977030767532657500340718760127019357828074148225613824 - ], - [ - "00000000000006e06735bffb7d2f215dcadd8311fc33f4a46661fdca3dc0560e", - 17028747171100603034973679895960153979114298528140818252824576 - ], - [ - "000000000000055fc0110d4a38ffb338eabc30c8b0aef355d4643d21b5b6a860", - 15614535766060906942258863525753414259523988166363835227176960 - ], - [ - "000000000000081b69cb4de006c14084c4861f0e4a140c37200117a738733fe8", - 15392654931672180089790308609774483894682932641297604569726976 - ], - [ - "00000000000009920770f2d40b5b6a8aba33d969b855c91b0f56e3db9c27e41a", - 14444739009842829731785903206212823051010663269705670545375232 - ], - [ - "0000000000000791dd1cb7a684a54c72ccde51f459fff0fc3e6e051641b1e941", - 13237058963854547748734324548161076199478283141947127217782784 - ], - [ - "000000000000019da474a1a598b5cf28534b7fd9b214eed0f36c67c203a9b449", - 12305424274651356593961118223415860240572779254789271782948864 - ], - [ - "000000000000074333e888bac730f9772b65e4cc9d07edb122c6e3c6606bc8ab", - 11046080738989403765716562970384822165842244193743674858799104 - ], - [ - "000000000000067080669115c445f378f3dec19787558d0e03263b9dec5d7720", - 10007073282210984973971337419529346944295676968729147521105920 - ], - [ - "0000000000000304760bf583f4ac241c5ffe77312fa213634eba252c720530f1", - 9412783771427520201810837309176674245361798887059324066070528 - ], - [ - "000000000000041fb61665c8a31b8b5c3ae8fe81903ea81530c979d5094e6f9d", - 8825801199382903987726989797449454220615414953524072026210304 - ], - [ - "000000000000022fc7f2a5c87b2bab742d71c4eb662d572df33f18193d6abf0e", - 8774971387283464186072960143252932765613148614319486309236736 - ], - [ - "000000000000013c6d43ba38bc5f24e699515b9d78602694112fefdc64606640", - 8158785580212107593904235970576336449063725988071903546310656 - ], - [ - "00000000000001665176b9a810fddf27cca60dfcfd80bf113289fcc8ffed0284", - 8002789794116287035234223109988652176644807295346590313611264 - ], - [ - "00000000000002dc6ef80f56a00f1091471d942ce9bfb656ebdab4ea0b77eb0b", - 7839560629067579481152758851432818444879208153964570478641152 - ], - [ - "00000000000002a1fa5546ec48ca88b9e5710e2c6d895bb3675004fdacd6ab13", - 7999430563890709006856701613305138698914315019190763857641472 - ], - [ - "00000000000000f517517c11e649b98feca7da84ae44fb643de5a86798fe3c31", - 9047927233058169382412882048952728634925849476849852060008448 - ], - [ - "0000000000000299cab92a923348acf9251f656bcbacdb641fd0a66d895a6e8f", - 8296391419817537486273948666838217011279219811331013552898048 - ], - [ - "000000000000027508b977f72c3a0f06f1f36e311ad079536630661880934501", - 9081029136740872581753422344739175313292014241889017867010048 - ], - [ - "00000000000001925959229452cc6fbfef0104ebed7ccd6f584f2439c5dd1f1b", - 8230751570811169734692743946971314968326461977249645504495616 - ], - [ - "00000000000003b34ca89509da5f558af468c194afaa8d458bbeb07c50cc7c74", - 7384127474250891166670391848516180960454656786677558849568768 - ], - [ - "0000000000000076559e314ab0c86cc552e34fd79488415d3d17f6ea3c01adb3", - 6172230000534146257480611019445716458048957888854766248787968 - ], - [ - "000000000000003a58043252cdc30ed2f37fb17e6ef1658324b1478f16c1463b", - 5561365017980676031428107027647386014985059524839404952616960 - ], - [ - "000000000000011babf767e60240658195b693711c217d7da0d9215ccab45333", - 4026319404534786334009451711043898716884778820756489262596096 - ], - [ - "000000000000027579d28fb480ccad8e2516d1219d4c1919e3fd4fc0c882955d", - 3513558656525386849113615662535622466519417660386833443323904 - ], - [ - "0000000000000074546fe07f80ba15fc81897ec56a5535de727df9fda9dab500", - 3004083578955603829930099910053556479043735076695139267117056 - ], - [ - "00000000000000b6c55833b80c07894f4c4d3bb686e5ddbc1b1d162e22752ca3", - 2675541054922611112919804040984964595022815308724929898217472 - ], - [ - "00000000000001326f2f970753122e35bfdf3358d046ddf5ea22e57f5d82b00d", - 2409843108029446766213067266805752590003732794677225687351296 - ], - [ - "00000000000000641084745613912464ff73c974bafd0bf6dd306295f019d306", - 2218268905456883731807407021635746739577921454491297946533888 - ], - [ - "000000000000011ae105ddb1a5bbac6931a6578d95c201525f3a945276a64559", - 1727551573307299192250197436766000536509732237655131060961280 - ], - [ - "00000000000000d9b66fee19af89eaaf3f3933d1acd2617924c107f0abbe0a41", - 1394031503757574068227953656553224448260418805016069352194048 - ], - [ - "0000000000000011956d42670c2f75eeb344ac0657a806775998e2c58fa4b157", - 1263610003247723462826224891154624535497729630761756072607744 - ], - [ - "00000000000000959b1ea990368fd16d494e68ee13bd7245ddd9cdfba3330100", - 1030450001678223668360152541055867895065240185756254103142400 - ], - [ - "0000000000000091f86b1e423e24fe358c72db181cfcc2738c85f2f51871a960", - 862513010327976103705811440432628413487564277790886242287616 - ], - [ - "0000000000000055e146e473b49fe656a1f2f4b8c33e72b80acc18f84d9fcc26", - 720982641204331278205950312227594303241470815982254303477760 - ], - [ - "000000000000004f6a191a3261274735292bc30a1f79f23a143e4ee7dd2f64c1", - 530591525189316709998942710962548491505413142398652303540224 - ], - [ - "000000000000005327c8e714272803c60277333362e74ec88b9ffab5410c2358", - 410030579894253754102159787320079652501746816512444002729984 - ], - [ - "0000000000000002e2a62b8705564c38d6a746fc8e971a450a69989152b5ee97", - 310118479516817784682897231521434079438159381558537557639168 - ], - [ - "00000000000000202bf3ff30109538bfd9b5075c6438ab5ef64ebe2cf9b61404", - 239366800071949252578530950352093786414793290792735831228416 - ], - [ - "000000000000001c997105893f5991cb45765ff856b6e503f8466cb22cdd330a", - 181156297885756721946540202079438048595571151633323613224960 - ], - [ - "0000000000000010c13ce182a3d8fc6748b75640447eb360d7739a5fe984ffc1", - 142431093377788751676361246670241704468765375727695350988800 - ], - [ - "000000000000000bbb49db68b79ecc8393376d78272d237bb612288af64c1de8", - 100696259189502783924473792493100546893980348528488767029248 - ], - [ - "0000000000000001bbfd0973c367d30eef2416d9e94bdddea53bccf541a4858f", - 68962778243821519216393853205209897734463141354237780295680 - ], - [ - "0000000000000004ee5b6ace996ab746f1e6dd952cdbc74c0b4f8b9ac51c7335", - 52765641310467331636297188681879886184148735229489015947264 - ], - [ - "0000000000000002f2f23b515085d0c9f37a2824304ccb7ca1546a48548d0dac", - 44233472386696495417387091608220539804351405166731810832384 - ], - [ - "00000000000000045590c3fdeca1753d148a87614a70fa0897a17f90bb321654", - 38110290672195532365762668664552282566878756832852091863040 - ], - [ - "0000000000000002b704edc0bf1435fe2116040b547adb1bc2d196eb81779834", - 29679649578007061283718812081441644170496168236939550392320 - ], - [ - "00000000000000038cc59dc6dd68ae0fbe2ded8a3de65dbd9a2f9a36d26772df", - 22829202948393929850749706076701368331072452018388575715328 - ], - [ - "0000000000000000a979bc50075e7cdf0da5274f7314910b2d798b1aeaf6543f", - 19005913916847449503306572434028937600915626422125897711616 - ], - [ - "0000000000000001dd8e548c8cf5b77cde6e5631cd542e39f42c41952e5e7085", - 15065005852539512185984435657022720640916062598235628240896 - ], - [ - "0000000000000002513542a461de351a5a94f96b4bcd3e324a48d2d71b403fe0", - 12288698618318346282960995223961541766142764336009759948800 - ], - [ - "000000000000000150cc07163e78d599a7e56c0d1040641bffb382705ac17df0", - 10284386012808371892335572105827331142617405906583881252864 - ], - [ - "00000000000000009051d83d276dad5c547612f67c2907acf6a143039bddb1bb", - 8614444778121073626993210829679478604092861119379437256704 - ], - [ - "00000000000000000b83d3947d2790ab0bcbbb61eba1eb8d8f0f0eb3e9d461e0", - 7065379129219572345353864175298106702426244380437224882176 - ], - [ - "00000000000000005a4fbbaeffee6d52fa329dd8c559f90c9b30264c46ad33fd", - 6343094824615218102798845742064326605321937397913065881600 - ], - [ - "00000000000000006b6834bae83e895a78c5026a8c8141388040d90506cf3148", - 5384518863803604621895699676581808210968416076987222720512 - ], - [ - "0000000000000000bf3c066c9acdb008e7fff3672f1391b35c8877b76b9e295e", - 4405349994161605759458363322921957536960017949107037405184 - ], - [ - "00000000000000006bcf448b771c8f4db4e2ca653474e3b29504ec08422b3fba", - 3863038134637689339706803268689141874606936642244315185152 - ], - [ - "000000000000000098686ab04cc22fec77e4fa2d76d5a3cc0eb8cbf4ed800cdc", - 3369574570478873127315415525946742317481702644901195284480 - ], - [ - "000000000000000036cc637d80982595b1fa30f877efe8904965e6fd70aeae1a", - 3045099693687311168583241534842989903432036285033490677760 - ], - [ - "00000000000000000ee9b585e0a707347d7c80f3a905f48fa32d448917335366", - 2578448441038522347123624842639328775756428679710156783616 - ], - [ - "00000000000000000401800189014bad6a3ca1af029e19b362d6ef3c5425a8dc", - 2293149852232440455888971398133692017055281498246925516800 - ], - [ - "00000000000000001b44d4645ac00773be676f3de8a8bff1a5fdd1fb04d2b3b2", - 2002553378451099534811946324256852041059202347552707969024 - ], - [ - "00000000000000003ff2a53152ee98910d7383c0177459ad258c4b2d2c4d4610", - 1602972750958019380418919163663316163747908621623690788864 - ], - [ - "00000000000000001bb242c9463b511b9e6a99a6d48bd783acb070ca27861c2b", - 1555090122338762644529309082074529684497336694348804259840 - ], - [ - "000000000000000019d43247356b848a7ef8b1c786d8c833b76e382608cb59e9", - 1438882362326364789097016808333128944459434864174551793664 - ], - [ - "00000000000000003711b624fbde8c77d4c7e25334cfa8bc176b7248ca67b24b", - 1366448002777625511026173062127977611952455397852592472064 - ], - [ - "0000000000000000092c1f996e0b6d07fd0e73dfe6409a5c2adc1206e997c3a2", - 1130631509982695295834811811892052032638591596239280668672 - ], - [ - "000000000000000020ce180d66df9d3c28aee9fcec7896071ec67091a9753283", - 982897592923314645728937741958820396011314229953349812224 - ], - [ - "000000000000000018d37d53ae02e13634eefb8d9246253e99c1bdf65ac293ea", - 903780639904017349860452775965599807564731663176966340608 - ], - [ - "00000000000000001607d1a21507dea1c0e5f398daf94d35fb7e0a3238f96a0f", - 777796486219054632155478957346406689849105796561635377152 - ], - [ - "00000000000000001acae244523061f650ddab9c3271d13c0cd86071ae6e8a5f", - 770217816864616291160628694313702426464491250746461782016 - ], - [ - "0000000000000000104430189dba1219b0e3dd90824e8c2271609aca5b71250f", - 749174812297985386116525053725808178560617045558724395008 - ], - [ - "00000000000000001aa260733b6d8f8faa2092af35e55973278bb17f8eaeca6b", - 680733321990486529407107157001552378184394215934016880640 - ], - [ - "000000000000000009925ad5866a9cb3a1d83d9399137bccc7b5470b38b1db2b", - 668970595596618687654683311252875969389523722950049529856 - ], - [ - "00000000000000001133acacb92e43e24af63a487923361a4a98c87a5550dffe", - 673862533877092685902494685124943911912916060357898797056 - ], - [ - "000000000000000018c66b4a76ca69204e24ee069da9368c7a9883adb36c24af", - 683252062220249508849116041812776958610205092831121375232 - ], - [ - "000000000000000010b13aed220b96c35ccd5f07125b51308db976eefcd718f9", - 663358803453687177159928221638562617962497973903752691712 - ], - [ - "0000000000000000031b14ece1cfda0e23774e473cd2676834f73155e4f46a2b", - 613111582105360026820898034285227810088764320248934432768 - ], - [ - "000000000000000010bfa427c8d305d861ab5ee4776d87d6d911f5fb3045c754", - 653202279051259096361833571150520065936493508031976308736 - ], - [ - "000000000000000005d1e9e192a43a19e2fbd933ffb27df2623187ad5ce10adc", - 606439838822957553646521558653356639834299145437709336576 - ], - [ - "00000000000000000f9e30784bd647e91f6923263a674c9c5c18084fe79a41f8", - 577485176368838834686684127480472050622611986764206702592 - ], - [ - "00000000000000000036d3e1c36e4b959a3e4ad6376ce9ae65961e60350c86e8", - 568436119447114618883887501211268589217582000336195813376 - ], - [ - "00000000000000000b3ec9df7aebc319bb12491ba651337f9b3541e78446eca8", - 577075114085443079269506210404847846798089003835028668416 - ], - [ - "000000000000000012d24ce222e3c81d4c148f2bce88f752c0dba184c3bc6844", - 545227566982404669720599751103563308707559049533419683840 - ], - [ - "000000000000000000c4ccbdd98c267bd16bda12b63b648c47af3ac51c1cc574", - 566251116039239425785056264238964437451875594947144974336 - ], - [ - "00000000000000000056bfec1dca8e82710f411af64b1d3b04a2d2364a81993f", - 565860883410058976058672534759150528155363303710710038528 - ], - [ - "00000000000000001275d1cadce690546f74f77f6d4a6190e2137a8a819946f6", - 552364745922238091561919045022000637317595931246011088896 - ], - [ - "000000000000000003816ae80c6413b84cbee2f639ba497ab5872ec9711eb256", - 566500670366816952120145379831520408210047884740723212288 - ], - [ - "00000000000000000d92953224570f521b09553194da1ca3c4b31a09a238f4f6", - 542528489142608155505707877213460200687386787807972294656 - ], - [ - "000000000000000006721943f23cfacf20c17c2ad6ea4e902af36b01f92e3c06", - 545717322027080804612101478705745866012577831152301113344 - ], - [ - "0000000000000000031d9af2fe38cc02410361fb213181fdb667c74e210d54c4", - 527827980769521817826567786138322798799309668948178370560 - ], - [ - "0000000000000000142e8a13ef6994961655c8e86aece3f0abebd2ee05473e75", - 515692606534173891771672037645739723025219384908133171200 - ], - [ - "00000000000000000c7a8db37a746d6637ef6a6eab28735608fd715ee2f394e7", - 511567664312971151375333957573881285830542480898837708800 - ], - [ - "000000000000000007854877c66c71a49af40d20f2d6f817becfe4d66d5e5a81", - 496889230460615059653870414954457230681194245244172894208 - ], - [ - "000000000000000005ce1d2d10aeb9def4d38233e859d98a4a168ea3fa36687a", - 473325989086544548323169648982069700877697035484407005184 - ], - [ - "000000000000000007c71decfe74855ad99dc2aa4a2e713165db5a8d6da5f32a", - 454358737757395076722955683517864397151243915416267915264 - ], - [ - "000000000000000008ce4f34161be6760569877c685e37ebebce3546ea42a767", - 443316987659242217350916733941384923365365929826941140992 - ], - [ - "0000000000000000086233f4843682eb47bacb58930a5577fbfd5c9ebd57ddf9", - 442802913227320896234856097023585967110900073490544590848 - ], - [ - "000000000000000010a904eee4fc763c6b88d378884f368fd652f63c1af71580", - 433057199397126884276233483897801969646324654385408245760 - ], - [ - "00000000000000000c114754749d622d4fa2f78c84d7147c345b2b99a8e83d2e", - 409419129139225030716120689261979366152221060879441985536 - ], - [ - "000000000000000000a5039e32cc9a89aeffbde1391e8bc9ae9724127904f01d", - 370716507988397359530778284103407727265240291588416995328 - ], - [ - "000000000000000003b0b73d9b3259c318cca48a6335b5d64545583f7f3773fa", - 340818253309165415058055171484606858815006633875327680512 - ], - [ - "00000000000000000198bcc5bd65fd0ccd1c7e3b49e0170ea80296cbfee05042", - 288495652867775987986282369150900282132304927019642126336 - ], - [ - "00000000000000000a60f379d3dc1413491f360809a97cbb02c81442c613dce7", - 259524902203633530447121351815377152077137395840706412544 - ], - [ - "0000000000000000038973a5f8ba8cdc7e371dcc8f4b24337ef695f24b962907", - 237834253647442358407456603145452341381064939329604812800 - ], - [ - "000000000000000004b8ec471974913d052a3af7dc2a8c6f01c2ac2f3d1f7b19", - 224600391397450328424792273873642383828872941895338164224 - ], - [ - "0000000000000000075d572eef1c4210adc7abf4e40986d7f0a80003853bfec4", - 187067719845325692996306936867878122094522982476155977728 - ], - [ - "0000000000000000074f9edbfc07648dc74392ba8248f0983ffea63431b3bc20", - 164898540577033087399552264895286015147022701908103004160 - ], - [ - "000000000000000003c4a4d9c62b3a7f4893afe14eef8a6a377229d23ad4b1ea", - 170169861298531990750482624090969781281789404909188153344 - ], - [ - "00000000000000000404b6939e6c35a5448386e5d58f318c82ce2fefb7d73e47", - 162900609378736249874251099581569547607832255884553093120 - ], - [ - "0000000000000000034656c96781091b5fbc799c881ea85b41cba0b88128eff7", - 161578008857017275969393492955354620126364423170461532160 - ], - [ - "0000000000000000045645e2acd740a88d2b3a09369e9f0f80d5376e4b6c5189", - 150883090635422687830679296233896712896447026244773478400 - ], - [ - "00000000000000000381e6a138308c6547d6fe3eb3437250ffefdebbf71eefd1", - 150899178845446426410002882396535253739927398750206558208 - ], - [ - "0000000000000000012100ddbb2102e65fb1ebbf104ead754a4110abffc4b8bc", - 138784382553152119468195441786396823230753870240366460928 - ], - [ - "0000000000000000046f56e59b9b1293b5e7c1587aa6d29c4f3f79b98cf22ee6", - 135262935280049154152065372885142255350817451144176992256 - ], - [ - "000000000000000001bd1c291e91f4476f93454d4542d2ed7e44fc86902c93bb", - 137505556928474480767543871928291413858290772017802117120 - ], - [ - "000000000000000001c37a483375ff6fd6ed7c5b79d80167b027a8fdb0721dcd", - 128713911367130082233924624261304605948946745676720504832 - ], - [ - "0000000000000000051804b4c2da5298c4573386bf1d4242bf0e26a49ec32e42", - 126333978716874242627475052620752087219210710628817698816 - ], - [ - "0000000000000000034bff7888f1f7294311f0199322f77c1457018c875bd9e1", - 126278605342839049377710151409810132688161986656629424128 - ], - [ - "00000000000000000506b43c9283ccbc40f583e0c734e4a8af2ce6a4262c6221", - 133533639774706835230353390473157702360903922769486413824 - ], - [ - "000000000000000003937068e19a0750a33978050f019d2b60f430e3da707db9", - 124022888639743237872084547350559836284832548627419234304 - ], - [ - "000000000000000002e2f6ec3c9eb965aa706c788da7dede201b6b4b8fae3971", - 122123731568103772089607259872577666017242529148853813248 - ], - [ - "000000000000000000b3076636b13562bb4315f895bcb324e0c962763c2196b1", - 119378259820331825692479928211144812308894309500762193920 - ], - [ - "00000000000000000025b8961d1d0cfba33b0205ec10b3ce541618e352b0bbd5", - 111759931157462873316041289986819959868258380300102402048 - ], - [ - "00000000000000000421d58b78b9f063a4b20e181d55c9c79082f9e4b8b30925", - 104283029085035157753191385936387396702868516379761311744 - ], - [ - "0000000000000000027fd968d41741f31c73c4a3b304472da0165245278e2ea3", - 106299667504289830835845558415962632664710558339861315584 - ], - [ - "00000000000000000364a23184b8a2c009d13172094421c22e4d9bc85dcf90a5", - 105881374043672627773432318187360570734220873198601240576 - ], - [ - "0000000000000000042a2ed4a504424060407825d774a54f2e148fa769ee72ff", - 95668727978371040303278646201741713440261619517174579200 - ], - [ - "0000000000000000025f769f13f2806fed19d9948b1a7ef19048177789afc5d3", - 94012390634764280055243391736606357298689315295029362688 - ], - [ - "000000000000000000b3ff31d54e9e83515ee18360c7dc59e30697d083c745ff", - 86923102180582917240747796162767475850640519180006195200 - ], - [ - "0000000000000000021ecdcb2368ce66c23efd8bd8ab6a88a8bb70571c6e67f0", - 84861566431029438820446406485131195674434646972185968640 - ], - [ - "000000000000000001972cb33b862b27c1dc3f3a723f7d1cfd69aebe0409126c", - 80022382513656536844370512820784980102919810105407963136 - ], - [ - "000000000000000000cb26d2b1018d80670ccc41d89c7da92175bd6b00f27a3e", - 68605739707508652902977299640495787127103841947617329152 - ], - [ - "00000000000000000276deb4022f66cacd929c690cd6b4f7e740836b614b21f4", - 63859343606086615291372321518809062931940920926127783936 - ], - [ - "000000000000000000587912ced677698c86eec8b1d70144dccb1c6b0bad0f17", - 61163258921643354765656928775243357859392914550528409600 - ], - [ - "0000000000000000009f989a246ac4221ebdced8ccebae9b8d5c83b69bb5e7c8", - 58509826700983959310706392369835644790490546910263246848 - ], - [ - "000000000000000000038bed8b89c4e82c13076dd64dc5f7a349c39d3921d607", - 56672777602924507578641088682504585686103825941044133888 - ], - [ - "00000000000000000122f47d580700a3a5b4b6cb46669a36e4fa974c720ab6cd", - 53958359841942568206719748916397287559357255547625668608 - ], - [ - "00000000000000000172ad9ea56a90bdfed0f364a902500e9ff4d74f000ced99", - 51764751112426770751506128647798102319231116027761786880 - ], - [ - "00000000000000000201d7429db233c7055e9699c5bfb57b167ca8d0c710dc71", - 51649140486907347007064544362790913467244253139882213376 - ], - [ - "000000000000000000c0549b2a8adbefbf6c909f61fdc4d6087c44a549cf8201", - 48144529712666433692552181910809237167694270386587828224 - ], - [ - "0000000000000000015b6789cdc5dc13766f58b38f16d5b35bf79ce4b040f7fd", - 45240046586752885057924289339576851866807485277820420096 - ], - [ - "0000000000000000013a31b29f845d97465bff53f901027f8ab4b1a2f59118a8", - 39718797393257298660757754408019939605415460564426031104 - ], - [ - "00000000000000000088cdeaa7389a7de9f09e3a28b3647630fea3bd1b107134", - 37880625861940376795251270290737354395669643839013912576 - ], - [ - "000000000000000001389446206ebcd378c32cd00b4920a8a1ba7b540ca7d699", - 38043004539854389433075372490391464304285496568268718080 - ], - [ - "000000000000000000f41e2b7f056b6edef47477d0d0f5833d5d4a047151f2dc", - 33509870757351677175294676059494700127350769223450230784 - ], - [ - "0000000000000000010e0373719b7538e713e47d8d7189826dce4264d85a79b8", - 31340207270661909233492904963194738468218672502370467840 - ], - [ - "00000000000000000053e2d10bd703ad5b7787614965711d6170b69b133aa366", - 29201223626342991605750065618903157022235193117232857088 - ], - [ - "000000000000000000cbeff0b533f8e1189cf09dfbebf57a8ebe349362811b80", - 30353962581764818649842367179120467226026534727449575424 - ], - [ - "000000000000000000d0ad638ad61e7c4c3113618b8b26b2044347c00c042278", - 29217311836366730185073651781541697865715565622665936896 - ], - [ - "000000000000000000a7bda943639876a2d7a8caf4cac45678fb237d59c28ba1", - 24433127148609864747615599184820261456796420809345204224 - ], - [ - "000000000000000000fb6c6a307c8363e923873499ba6299597769c10a438e61", - 23988269434232535193761088780698748366141469438183997440 - ], - [ - "0000000000000000006f408147ffbcaa0fb1dcf1f199c527ffdaf159d86e5cd9", - 22526487188587264742197108840494583820145762956159746048 - ], - [ - "000000000000000000e3be3cf7343d7792c0d47d3c39ddb9ceaf19961e9eeab4", - 18556440756915402760741928101946749165024073301499052032 - ], - [ - "000000000000000000b3fb09d6def197657e20f9c1d5e9680cfcac1e1f9aa269", - 19758940920085072387393228723348383373068660102939017216 - ], - [ - "000000000000000000bfe71f044145e1b42fdfb3a523ee2a215e80fa6afc2a98", - 20014481558369106100835306608979160026489460596213284864 - ], - [ - "000000000000000000cee3bff56ee49c0f96d1cbd17fa17dc6f84b3f48aed765", - 16946123176864917983795071264823963343174695083267063808 - ], - [ - "00000000000000000089ef13654974b8896b0b0909dd9ae8e350b8a8a7807ce3", - 14392961660539521116256653268419249019684881662910398464 - ], - [ - "0000000000000000003105a067417c318dab31e25ae1583fa2b27be226945fdd", - 13960450711994363030255127593764523087979983609872252928 - ], - [ - "000000000000000000720da39f66f29337b9a29223e1ce05fd5ee57bb72a9223", - 12101157559014734955774763823279522156034099347349045248 - ], - [ - "0000000000000000006a8957cbd52c2038861514f106f7f9f76392d5cb83fd4c", - 10356793971791534424976101420669664288187918308140384256 - ], - [ - "0000000000000000006b68e55432541794388c94fe9e805652038e7b3cac0681", - 9378292318569022964986206758839123913433917663832178688 - ], - [ - "00000000000000000001c9deea9f0302eadb1250df1ad53da802dfb40d47face", - 8964447668935855171055978546867850348456065181232922624 - ], - [ - "00000000000000000013aaa8778111530a626a3fe57e4e6f4a878c92669b04d1", - 8192878571041388924351625416816775770172128369752145920 - ], - [ - "0000000000000000002f67aa98789b98304a32e54bffbb34c8693eb0acac4c30", - 7786052052270684126234611299412205796254663675224260608 - ], - [ - "0000000000000000002e5f072398ee27b25b6cdcf69051bcdbbece417093c979", - 7678459224733657715202292429397298472913633233275453440 - ], - [ - "00000000000000000028d7447c20ade2053bbaf49e8a16eb5fb1bc74335d0d18", - 7021961458254440109762706424650140438182306270565892096 - ], - [ - "00000000000000000042d89446b9043387be2d4c09aa9e9524176c5754616510", - 6702918573828378664524678433037841287557455508299317248 - ], - [ - "00000000000000000018ec4d369bab2c13174834a02138decea7c85685d46bd6", - 6505870154073602347674948421782035713149324747260035072 - ], - [ - "0000000000000000000d4a6c2237c6c46b963b17f60d9c850c4915518deb6678", - 6259542822111302646229226565336702507884435252736688128 - ], - [ - "00000000000000000031adb986da21237ce06b57ae5390b7f0f890ab8e21b66a", - 5456617206587901877414813377199700077413780408546361344 - ], - [ - "000000000000000000031df41201cd3789559333cd9529f99834a805014c9b13", - 5309609141393698345581459330931267317315649121846034432 - ], - [ - "00000000000000000020c68bfc8de14bc9dd2d6cf45161a67e0c6455cf28cfd8", - 5026314587016750785722693470327208449351582469580652544 - ], - [ - "00000000000000000009dce52e227d46a6bdf38a8c1f2e88c6044893289c2bf0", - 5205879062684137510961952799929229129995569309608312832 - ], - [ - "0000000000000000002eca92f4e44dcf144115851689ace0ff4ce271792f16fe", - 4531442825108320403104334767545311437480985430866264064 - ], - [ - "00000000000000000000943de85f4495f053ff55f27d135edc61c27990c2eec5", - 4219470685603665866184576203153693664105230070242607104 - ], - [ - "0000000000000000001d9d48d93793aaa85b5f6d17c176d4ef905c7e7112b1cf", - 4007526641161212986792514236082843733160766044725313536 - ], - [ - "0000000000000000001877e616b546d1ba5cf9e8b8edd9eba480a4fbb9f02bce", - 3840827764407250199942201944063224491938810378873470976 - ], - [ - "00000000000000000025eb2c783f2f29d68ab4260f4b0248450c0038debc7ba4", - 3769176185135465353474348091454476000617158630021529600 - ], - [ - "0000000000000000000c61b8a7779dcc46e88ca343b9a3fcc6763917fe3b87e2", - 3616317728887026217259424694800679959591344645351669760 - ], - [ - "00000000000000000003dba9fedba6a0b92b640167eeda0d41485a3c85ac4ac6", - 3753318892370425056811838111019504329853891761930240000 - ], - [ - "0000000000000000001ac75bed7eb6169255893f99de28f24e3e0e57b6f7db7b", - 3752507758961706405692235065937346792777982719368888320 - ], - [ - "0000000000000000000e5796e9c5cdc8a8a2de84fd17287d7dfe89074de31766", - 4052052750044136275098507698196378011637603685579620352 - ], - [ - "00000000000000000015fe695e8d2e5ed3a7de81d3818ef43a444e1ee7b3ace2", - 4774638159061819979596346127394133648234752261950013440 - ], - [ - "00000000000000000015a08d0a60237487070fe0d956d5fb5fd9d21ad6d7b2d3", - 5279534360700703025330663904443631645337169341976674304 - ], - [ - "00000000000000000008f4f64baaa9b28d4476f2a000c459df492d5664320b12", - 4798269179035823348880781507454323228379569035237392384 - ], - [ - "00000000000000000028a69d9498c46b2b073752133e3e9e585965e7dab55065", - 4581847093576588582947343450056030606262879232408420352 - ] -] \ No newline at end of file +[] diff --git a/electrum/checkpoints_testnet.json b/electrum/checkpoints_testnet.json index ae6f825cef58..0d4f101c7a37 100644 --- a/electrum/checkpoints_testnet.json +++ b/electrum/checkpoints_testnet.json @@ -1,2886 +1,2 @@ [ - [ - "00000000864b744c5025331036aa4a16e9ed1cbb362908c625272150fa059b29", - 0 - ], - [ - "000000002e9ccffc999166ccf8d72129e1b2e9c754f6c90ad2f77cab0d9fb4c7", - 0 - ], - [ - "0000000009b9f0436a9c733e2c9a9d9c8fe3475d383bdc1beb7bfa995f90be70", - 0 - ], - [ - "000000000a9c9c79f246042b9e2819822287f2be7cd6487aecf7afab6a88bed5", - 0 - ], - [ - "000000003a7002e1247b0008cba36cd46f57cd7ce56ac9d9dc5644265064df09", - 0 - ], - [ - "00000000061e01e82afff6e7aaea4eb841b78cc0eed3af11f6706b14471fa9c8", - 0 - ], - [ - "000000003911e011ae2459e44d4581ac69ba703fb26e1421529bd326c538f12d", - 0 - ], - [ - "000000000a5984d6c73396fe40de392935f5fc2a8e48eedf38034ce0a3178a60", - 0 - ], - [ - "000000000786bdc642fa54c0a791d58b732ed5676516fffaeca04492be97c243", - 0 - ], - [ - "000000001359c49f9618f3ee69afbd1b3196f1832acc47557d42256fcc6b7f48", - 0 - ], - [ - "00000000270dde98d582af35dff5aed02087dad8529dc5c808c67573d6dabaf4", - 0 - ], - [ - "00000000425c160908c215c4adf998771a2d1c472051bc58320696f3a5eb0644", - 0 - ], - [ - "0000000006a5976471986377805d4a148d8822bb7f458138c83f167d197817c9", - 0 - ], - [ - "000000000318394ea17038ef369f3cccc79b3d7dfda957af6c8cd4a471ffa814", - 0 - ], - [ - "000000000ad4f9d0b8e86871478cc849f7bc42fb108ebec50e4a795afc284926", - 0 - ], - [ - "000000000207e63e68f2a7a4c067135883d726fd65e3620142fb9bdf50cce1f6", - 0 - ], - [ - "00000000003b426d2c12ee66b2eedb4dcc05d5e158685b222240d31e43687762", - 0 - ], - [ - "00000000017cf6ee86e3d483f9a978ded72be1fa5af37d287a71c5dfb87cdd83", - 0 - ], - [ - "00000000004b1d9fe16fc0c72cfa0395c98a3e460cd2affb8640e28bca295a4a", - 0 - ], - [ - "0000000046d191b09f7726e4f8bfaffed6c30734afbf1f95e6bddbe0b07d9e88", - 0 - ], - [ - "0000000082cec8200e9ea055c2991bf74560eb7e7140691ea53e7828dbdc9553", - 0 - ], - [ - "000000003775b96d6b362d4804afe2d9c3cf3cbb46a45c3ccc377c94e83edd23", - 0 - ], - [ - "00000000037835a92404acb2f18768a49d4f93685ead30aad6bb3b073f411e02", - 0 - ], - [ - "0000000006cf75d17706d1f62e6b08e6ba5facfde38a8920b7d808a6b6781ff2", - 0 - ], - [ - "0000000003dff257cdae43703fcd0ca91fda0970f5fc04258b4608fb1942a6f6", - 0 - ], - [ - "0000000000532d97d18867658e08c789f627535652382147e33bf8626d4131bc", - 0 - ], - [ - "000000000266dfb79bb11dedd0ae748505863ab3ab731269cd71a2c2fbd159b3", - 0 - ], - [ - "00000000349ff0119d5c0dd8ffad8bf41cd6126a88416148b81fa4dcaebc42e1", - 0 - ], - [ - "000000003c61939b4799eeea4335218d30de9b1071605126d719dce0f0d14810", - 0 - ], - [ - "000000003d9284570ed648d2b12ad24046ac8b9abcf05c4e9813ea110490cf73", - 0 - ], - [ - "0000000001360b66e6dc0ccfbd75356034e721ae55c3d5c71a58be5d281c252b", - 0 - ], - [ - "000000000c114f42504916bfb2ee26ed8307b3f7f74226c1cfe1f5302ec23d26", - 0 - ], - [ - "0000000007acac3fcf97b4ca81821263b704364adaa2736fce0a0722bfed4f8d", - 0 - ], - [ - "00000000059768ef7731d27f9c2be48c6e16d7cb56680625f08ff25ead504280", - 0 - ], - [ - "000000000351c8908f1f52518ce4bd251b896ca3fbccb69a2607db6624bafcfc", - 0 - ], - [ - "0000000068d7ccae048e212e9e2ecb4d944f583b4490df4fbf654b4915597052", - 0 - ], - [ - "000000000e2aaa36417187233ff55325473bd5b7a164b358da60c96d1920fd77", - 0 - ], - [ - "000000001eb11ef6dbe0647bc87a8d218f6e59c2b9690f17edcf0dbd39cd0308", - 0 - ], - [ - "00000000022e7855e24cc3fff67ce093242434a8ffa45882333a0f08a40aad9c", - 0 - ], - [ - "000000000210130ff4e3186258c09a8463c1e196f5c5432b4c7b6954e907bf63", - 0 - ], - [ - "0000000000e01372ede322bf88ee5ed8a46dd4fd8df832eca16180263fc8b1ef", - 0 - ], - [ - "00000000a0701896e26d5d884834b267512e0af52c92edc4bccf1c5c803d3c4f", - 0 - ], - [ - "00000000869fc8d9ac1588f3e5bdfd60253e9824083800b7794010e0e9c6b6fe", - 0 - ], - [ - "000000001d43b3165ec30736f28f0761600b092686f861db23ec38f2d92b0ec6", - 0 - ], - [ - "000000000ef4092da8c2056e5933de0e1530194c3ad941a9b393fbb26f98862e", - 0 - ], - [ - "0000000001e3fed39f70023909f962bea146b03bc8e94e5d19d7da93123f4f64", - 0 - ], - [ - "0000000000b4b8c877bbe3cde97649845290bb78999ecff4621b9bf2ab16aa2e", - 0 - ], - [ - "00000000006095ba3b4742883a0ec427a3fd685ffb65b987ea77ebfedea7da82", - 0 - ], - [ - "000000000168f0a76a6068a34fc042553aff4aa63b906028f28c2a4c327328e1", - 0 - ], - [ - "0000000000af10f3079b4989ac4ff0baaecab38220510cdae9672d6922e93919", - 0 - ], - [ - "0000000000312791ada0f6a4c5eaf2a1cd57cd06f5970a8ab49923817b862c35", - 0 - ], - [ - "000000000055f3d4f45c4d199d9c230cb2cfeb68c8e934cfd061bd616358655a", - 0 - ], - [ - "000000000036b6129bb5a786bfdd75cb4b932f7dcae9da469d3ba35096f1e821", - 0 - ], - [ - "00000000002fbccf271c13e486673251ecd7951ecc12ee73c4390e0ff09e9b59", - 0 - ], - [ - "0000000000314e297a81bf002fc40eb391d8883ea45ee4e782385aa0fdba6452", - 0 - ], - [ - "00000000d3c473819ec3b3c268f7b555df22772e407bc8f246a47cfc579ec61f", - 0 - ], - [ - "0000000075a438fda6bdb391263d0a2a6e8e68edd9dd8f70fe5734eab9351eb8", - 0 - ], - [ - "0000000017ebae0a2bec50008b4a4ea8839798cbd9ff228e76aba087d0ff1736", - 0 - ], - [ - "000000000800466ba31c0bbc12b125f16d05ed27788de045e25d6f093817d29c", - 0 - ], - [ - "00000000002163c41f2264f202e611aeb9ba6c0a3ee95cd8e5e7e571edc64edf", - 0 - ], - [ - "0000000000de9882d417786fce8c755cfaad17f40cda744d4badedfe5e414e31", - 0 - ], - [ - "00000000002af352cf41f60a5ebf033bf7e4967c0597cee706ba877b795aefb4", - 0 - ], - [ - "0000000000009ca0030f1dd0b09cc628f2d4d278c87b20781a1b136dc395debf", - 0 - ], - [ - "00000000ffd27370a76d06a0da0e3805f47e35e2cf584d73d2c5ecaa2e525642", - 0 - ], - [ - "00000000720da6910aa75099baa020cb8db37e1dc19cdff66152225b7609c23a", - 0 - ], - [ - "000000000a5c2cc704bce5e8527ce91bac7430c659624ecd86e6a1bb9b697962", - 0 - ], - [ - "00000000084273545134e9a06483c8fab00c2b0628056bb1967f310c74a971bc", - 0 - ], - [ - "0000000002f66f4da52804647b1c3e1f89d17bdb05e9cd4ebbd922007c773f21", - 0 - ], - [ - "00000000c46146c9d0a67a354b3f82947e52670a3bded6d8513ab34a68ae18bd", - 0 - ], - [ - "000000002f61c429d7dbe7bde75796086efe574998766806138710a2d6001eba", - 0 - ], - [ - "0000000001daf3e3e78a57df2c2d2ddd14093d10515925e75c818bec3bbd30c2", - 0 - ], - [ - "0000000002e133a7427a9aac6ceca969b27507c14111a45512cdf8f52a436de0", - 0 - ], - [ - "0000000000f7c4374d458666740de1d0e8c55229a209ced7c38e38708781487c", - 0 - ], - [ - "000000000035bb9ea329ba30b83eeb4ea6f57c2fe703b97f9b879f21e22643e0", - 0 - ], - [ - "00000000001220503e0aaee266bca85de09ce97b0091f24972d1ad1c8afe8609", - 0 - ], - [ - "000000000010a614c60457f8d2ae2bb826d037f52113252888fadda8ed773c9c", - 0 - ], - [ - "00000000585a8b882ecff8aa8434feeac4ef199ca669bd81ed473e37f0bb4528", - 0 - ], - [ - "000000009504ffdb5fe82ad88218fb5e75a8bc185247e30e22d23b9fd9b7f282", - 0 - ], - [ - "000000000ddec7d73bcd653168d82e34cf5746e006bccda8a9c031c3289b9568", - 0 - ], - [ - "000000000cb6620ee4e8cb8b6b4d51251e5961f7ae2e83538ab3a4fef3bcc773", - 0 - ], - [ - "000000000239224a0841738513c1eda712b73266ea958aa75f44a3985ebfab82", - 0 - ], - [ - "00000000002630c7c3586fcc19079300403c54dc293bcfdf8a9981f85a5c31bc", - 0 - ], - [ - "000000000028d8c34f44e51fd71f5401094a983f6566e6d08ce86ec5d1bd639c", - 0 - ], - [ - "00000000000dca95f1828adc3c37b4625f60aeb35a6614a4358322b7a6bc2f7d", - 0 - ], - [ - "00000000d72ec84fda18959ddc474d1a31a3a13b1d94695136c4810af8c01a0b", - 0 - ], - [ - "00000000327c29604996eb7f0a208160969ee4408a1cad277a956334f94e0f35", - 0 - ], - [ - "000000000e1bd41d009c1910fcfee7bf1cc1adb04b0b7a632ac36c1092f01bb7", - 0 - ], - [ - "000000000201a5afed48b9d095b949229e9882ef8bc96767be3097c87264dfb6", - 0 - ], - [ - "00000000003f28e8f3f9c80b1269bb0aa3b57501c12458550ef04fd43aca6a33", - 0 - ], - [ - "000000000029e09fc14e38a6a0103c8c67383f41af7d76998055682525f4ca89", - 0 - ], - [ - "00000000285ce297602995582ba5d32d583d618a6a92643566e25dd36cf2b7ab", - 0 - ], - [ - "00000000657045fa54fac52b8480dc84bd4c418940ba63679f4bd6add6a39962", - 0 - ], - [ - "0000000017b7bb58be05a47ff7c4ead27db750813d6bcf3f99cbcc35324cf445", - 0 - ], - [ - "00000000003a310e39b6df17f17450496b4f5c1593399bfa1ab8b4d39bac9b25", - 0 - ], - [ - "00000000000bfbc5294f003548a9636ebbcea3ba42577821266317676fbc363c", - 0 - ], - [ - "000000002329351dd70c24da2eea5ac19f65b6053c4611aa4eb93bcc2783c57e", - 0 - ], - [ - "000000004ce02f1005aa6fa4d158c6e4fce95ab053d88ae74881dd080c24e057", - 0 - ], - [ - "0000000000fdaaa54cdaade8cfb75245de0747c60c0307ad11be9fe154535565", - 0 - ], - [ - "0000000003dc49f7472f960eedb4fb2d1ccc8b0530ca6c75ed2bba9718b6f297", - 0 - ], - [ - "00000000014ca604d769d4b99fff03ae3ac84d1e8eb991c5dac7c3cd4d9e68ee", - 0 - ], - [ - "0000000000190ab8ecef3a3d5583563851672d81a4d4d952b8cf3bd503c655e5", - 0 - ], - [ - "00000000001204d263b607987fab11e1c19c94b7e3e674cc73cc2fb7b05fbf07", - 0 - ], - [ - "0000000000141e8d7f7ac359a8ae58e35ce6010c25ddd6f1881f41c0b939332e", - 0 - ], - [ - "00000000946344dd06ef5ddd13fb74f20c475daf911ff4e3f1dcdf64c330e274", - 0 - ], - [ - "00000000ec77a7892e48b85bcbaf404d16d7fc93747d7e9e3ba6195a9b6f1525", - 0 - ], - [ - "0000000018a305c04dea8e93e423ce9569872e0ec5af49d23a0e3872b0ad6297", - 0 - ], - [ - "00000000055e32c5f8a86c9a712eeb6440bbf9810ae6da12d0cea2493138a885", - 0 - ], - [ - "0000000001913fcbe67badbce4234e86e35a1ea867ecd69814b5f5ab039b7d4b", - 0 - ], - [ - "00000000002c71fe4403aee704720ceafd21f9f8c9c97a8bfbd25bb46223aa40", - 0 - ], - [ - "0000000000343a42da0c811836d0785c272591facd816f0e7fdcfb1109d8f9a8", - 0 - ], - [ - "00000000000309b182608b3eea7fafd0d72e3c79a0a3a9cda03cde3947e332e1", - 0 - ], - [ - "00000000000204cc04e421c3958a64d7bc024a474ce792d42ab5b48a5a6f3927", - 0 - ], - [ - "000000005eaa010e7255bd37e0b00780575074a74d889e17c4dbc578f917348d", - 0 - ], - [ - "00000000a0d425f62d9196c069286dc6635ded9d027de40070d397e45bd63e0e", - 0 - ], - [ - "000000003355fd37068ce2d5d2a94ef964eeb9b687f21f4a00850a3e6cc4a71f", - 0 - ], - [ - "000000000ca9148dabe9424cd8c96860c90d836ab25970a3e91856764e2e640c", - 0 - ], - [ - "0000000000bde23f829dde8edef35436be4b8978da21fd2c3a8100ef5334e3cc", - 0 - ], - [ - "000000000028bb26f1427fbfabeae65d55a9e59e18230713e40f0f7c9c2dee12", - 0 - ], - [ - "00000000002ac05422d254e597ee6b5e0f8be9b3e2f887486442d720c7766919", - 0 - ], - [ - "00000000000e36d0b6f187dd9601b1d1dcd987c3e0f6a081ffd039c7c5e32462", - 0 - ], - [ - "0000000000048d7b1f2a2a11fda34a5cfeea067ab03e482931e5a0f463f438ba", - 0 - ], - [ - "00000000f780ab88c8a4f4247573a749fbb087a4e3fb6a7d29926de8a9ab3462", - 0 - ], - [ - "000000000313bbe6a940e6a8c40ba091aa1ebbaad135bbbff3ed8ae07cf574d2", - 0 - ], - [ - "000000001d4ab29721aa2722482562670a0d71dc1eb73231c5dafb64756b04e8", - 0 - ], - [ - "0000000006588bcbdec38d19962b96cf0352cbf1b90f3379cc6787d018cdb96d", - 0 - ], - [ - "000000000022e79539a21ac24f9daa2cbddf2bb4a3125f88a5efc20d13ea856b", - 0 - ], - [ - "0000000000dd284b7fee584cc578a10fbe57e8efe6bf6ebacb23c0ac5d46cdf7", - 0 - ], - [ - "00000000001451143787f411c93d5506065c3fb597966f2fd7a4a5c078ee6aa2", - 0 - ], - [ - "00000000000ca977394af1e414dc1f9d83efa007f7226e11d3a00f59a1fdfad1", - 0 - ], - [ - "0000000000011f8caa80580e7a796bbce5b84e60731bf48e03c6ff5c6bba868e", - 0 - ], - [ - "000000000001705beb1376af1af08b437acef6befbe7d3b60c5fbaf6bb7f38c9", - 0 - ], - [ - "000000000000c838f1f45422d93ca9b5838368a37423efa8439ee24b2bf247a2", - 0 - ], - [ - "00000000000111ad857d31d07fdc8b32d17af2522c18bdaccfef449b29d17362", - 0 - ], - [ - "000000000000312a7718fc616b0ecfdbf6066f71ec1a4a8c43f50f02f61cc398", - 0 - ], - [ - "0000000000007d232b217a59b804ef67091c5720a5460c2c16bf97b97a24801e", - 0 - ], - [ - "000000000000177235c33695aced585685b4c500eb76e72caad02e17503900eb", - 0 - ], - [ - "00000000000037f5c5890da7a8e2acd2b0669ad7db648ac43140c637a1c81637", - 0 - ], - [ - "0000000000002123904063f223bc35135c426a4f9a0b74c1907e837b810f0321", - 0 - ], - [ - "0000000000000961db809da357d91a9341170fafef9f24896d8730bd05cf3f96", - 0 - ], - [ - "000000000d2e8fcd05eb874e98cfc3a6e239f6974950e6f50b0487513ecab760", - 0 - ], - [ - "00000000017e362508c8db23fae0431eaed708d9db13e48fd5d318066bf6733f", - 0 - ], - [ - "000000000011b2bc4fe36f90b7ba5a62f974db250bfdc285b70c71148023c7e3", - 0 - ], - [ - "000000000001be28570b378dd5dd2eb3aa495c229913b6757fe8900dfa3cce99", - 0 - ], - [ - "0000000000242bd0bb16d0a5324e0b4b5a83697dabb3b4a059084557478e50b9", - 0 - ], - [ - "0000000000d8ce69d18da32ed52e503d6b5ad48d970b90545f956b2d2af2edf6", - 0 - ], - [ - "0000000000366655bf0cb3dd0cd7801e0adbd26b5b441b77a9e3642597effb00", - 0 - ], - [ - "00000000000dc7aa00d4607ca8374d40d1187f1c084b620edb45fc39bc8d2db8", - 0 - ], - [ - "000000000003baf60d9c6e70a765cf517f66a124509191188e9547ad09edf68b", - 0 - ], - [ - "000000000000e0f476893b8fb4d37e855353075fde73dbc1fe181cc956349f19", - 0 - ], - [ - "00000000000032ed16b7de758abadf4a4fb2df7a101ff275c51f29e1555a89a5", - 0 - ], - [ - "0000000000000a564d03f0f2fe20f6fb5f038d931f732d817641cd7fff3b0acd", - 0 - ], - [ - "000000000000011aa4d0fdcea8d4ca85cd5d548e322e2b6abd17f8444be855c5", - 0 - ], - [ - "0000000000000610588540267a0eb544531047d4c8af0f21fca7cd3d96205cfc", - 0 - ], - [ - "00000000000002770dab5e14843149df8f76b8dc8458ed3ed2ed8a14a6e2e564", - 0 - ], - [ - "00000000000006b70ebc9f75bd32f466602cbd4b86c3c2d2379059542bb8bec6", - 0 - ], - [ - "00000000000000ef579af389fa7674f98a2371063fa8b218c5ca0ad94e21b896", - 0 - ], - [ - "000000000000021b6108dc988f9153383f9501ab9001109aa87902ddd4c8a4d1", - 0 - ], - [ - "000000000000022c02ff22bc0af5201f0e1a14a75879c494731e4fbf999218c8", - 0 - ], - [ - "000000000000032651c988edc1ccd08e82b888cbb8135e24a958ac0c0b640d5d", - 0 - ], - [ - "000000000000015aefdfa0790bed326c38c358c07aac0674f5b2e771258b8df3", - 0 - ], - [ - "00000000000000822e1534c86afef911b67d3fa20cf2b12d93d20d64005f54d7", - 0 - ], - [ - "00000000000000338b871276768c923b1c603fd6150bd054c2287e532e61de7f", - 0 - ], - [ - "00000000000002d0af52c0cae894bf836b61137ace2bd7500abd13a584c02741", - 0 - ], - [ - "000000006f8443a458f38d8731821c07a2fda0ecdbb1cf797f541844d468ce0c", - 0 - ], - [ - "0000000000b6fbd8b4e227f5514979a61d8b0b918d2adc154e585ca926386704", - 0 - ], - [ - "000000000f4f5e49b10278e27d9dee15b92f9d4a257138a206831e0c00188767", - 0 - ], - [ - "0000000002c7e9769bd8ae9906fc5682e937b5c31ab5b5b86e4d70af2c15a95c", - 0 - ], - [ - "0000000000f68a1db8cd387e0a2f93f45149fe1ee4a230bb386313bdd42058e8", - 0 - ], - [ - "0000000000f0f65c360c8f0f9853ad1142f16675dc1175d61afdbef977776b25", - 0 - ], - [ - "000000000004f734e634156511cbef7dfefebdf317e7488aa6c2562572d7ecb7", - 0 - ], - [ - "0000000000002a46a7a16787e8317dc567ae26816324c2035be0186ba54d5cb8", - 0 - ], - [ - "000000000001a593e6f01875b77e270163538d88452779bb557df7c2607c28e0", - 0 - ], - [ - "0000000000004f24cfafa10bd50a452535f64be577a6161e51c7c71542f654c4", - 0 - ], - [ - "00000000597cce73e84b63f08cfcb9b01f5e7621752d8c8e08fabbd6ab5c0dd5", - 0 - ], - [ - "000000007cad379df01247771fff471bc99faea1b86218602f45ab13efc5e9f6", - 0 - ], - [ - "000000000d6085aab25892be49c49d6c0a3949befdc3ddce2faa46b104e1e804", - 0 - ], - [ - "0000000002be5996786b42d6a229093896aea9966b1854ea261e01e84da1f420", - 0 - ], - [ - "00000000002684b72056e270b115d80b12b2f68eac7412355287226aecd9b5e0", - 0 - ], - [ - "0000000079ea27efb24366c87856a9e371c56fcbd59d09d3164a5c2fc15fcbca", - 0 - ], - [ - "000000001694120525dba4548ca54087544da1fbefa51c38f0208d683418825d", - 0 - ], - [ - "000000000693e80d372938f3553151ab9d0a9a6922182591c701df739dc9a502", - 0 - ], - [ - "0000000002950d9cb23c8511937811910b712f73d448e6fdc2e39e029b86848b", - 0 - ], - [ - "000000000091c40056c6a48f33db17764af89c01f62ae653aa5e494146164cee", - 0 - ], - [ - "00000000001f373c47e1a39af4e1ebcd8c88411ec49d6bd520c2781564070971", - 0 - ], - [ - "00000000000809ca4b2170c57958709b867095b1972d80a2ee55359fbd0940fe", - 0 - ], - [ - "0000000000038e7bd66fc3308447b1370dbdd0661c427c512bdbc641ff360fb2", - 0 - ], - [ - "000000009a3325df76e2de1fc1970cc2f241fa8a41da9ad745a0d9666d9ff51d", - 0 - ], - [ - "000000003176e92ff837bf43a48a995c1a321b166475f586ffb4b962e0254a4a", - 0 - ], - [ - "0000000001ae3292e81ca3859b75bccd5bff825cd9f496efd085160c716ed05e", - 0 - ], - [ - "00000000033bdac4f0d36bb912fba28bb5caa54d1b611759a10f79ff3c969cf2", - 0 - ], - [ - "00000000004c6db7fa0e2c9f08693abfeb128c5827b511a5c46c623a103b416b", - 0 - ], - [ - "00000000003d87f48bb95e9431760d0c5f4f93c77d02fce9dd1673e9f5b01029", - 0 - ], - [ - "00000000000e214fc3d8b97571eb75d248ca29f8e25a584c33de8488ceee72b0", - 0 - ], - [ - "00000000000133269b7159b828700d02de770a8cbd91f3d166e6bbc95d8e0dfc", - 0 - ], - [ - "000000000000cc92e2dd933a08f7fd87f84451627982fb66583587858217c059", - 0 - ], - [ - "00000000000030708136c20c4c8216314005b3cb5c551ded33b26cf64d2ff47d", - 0 - ], - [ - "00000000c472a1341d479ed02f31b699e448c035049a7092670b38f4ec6121f0", - 0 - ], - [ - "000000000a358834d6eed41b9b7161a338aba53828111414cdea7552ed15548a", - 0 - ], - [ - "000000000e13e77372daea775c8358916e57ed11835899c14e5140ed9be11089", - 0 - ], - [ - "00000000008252cd0931f94b2465bd4f93e4bfeec6697962c5b034cf3d12cf7c", - 0 - ], - [ - "00000000019812cd6cde3a43831234be71e68118be24a80161349b8b327acb5b", - 0 - ], - [ - "00000000005865499f301adfb59f8380743e4c3b3ab220ca4eb97dc6628df626", - 0 - ], - [ - "000000000015f77e1e61329560a4378eb401fa5bf0ef90b0a014a4d7857ca7a8", - 0 - ], - [ - "00000000e9cbcbb625e8a463ba8e7f14be46ba9538ffe93338784ccad3d992e8", - 0 - ], - [ - "000000000fb27169efcc2873cfaac223ebb91cc5e1e5ad7e9a312d42bedf7c42", - 0 - ], - [ - "000000000c9c96d62ebfbf3fa4003f1d46d175140ab084dee17e8125fa40f24a", - 0 - ], - [ - "000000000311e3a766b1ab2064b68a344a561eb496d595126808ffb166c71cc1", - 0 - ], - [ - "00000000677568c82262ac3a4ca3f909bdfb0b35145ad490fa3fbdc719d06b91", - 0 - ], - [ - "000000000ee77ba9ab657e51fd9140f5c9b46731d9341e98188f929c97d04746", - 0 - ], - [ - "0000000008a67eb9c91a6d74168f3f385270fa942ea00bdd31924d1b6ea11148", - 0 - ], - [ - "00000000017f93c9e0026e90d579e18c83b4a8557f0c00e9b85ab164cf4466c5", - 0 - ], - [ - "0000000000994efa379235c03711a8e6b29895d928b5fde96cb01c02374c0602", - 0 - ], - [ - "00000000b3be9f23c943d71d7c7dbdf6dd672d77a712f6c83e9796a85e4379f2", - 0 - ], - [ - "000000000713e1089b0b2bdcba462b740c9396f822f1c73e090713978a7f1314", - 0 - ], - [ - "0000000002fc44d358401a7ac9ce4ddcb17f3cbac08e40242e755e60ab2292ed", - 0 - ], - [ - "00000000021ef2c04fd30be7049f73b9a8353ac96a467dd5f0b9c1457be1bc5e", - 0 - ], - [ - "000000000023b95b440ccbbdcb914172cf675cd15d6111bd7f5a436a4925d36e", - 0 - ], - [ - "00000000001983521dbffd1b742a6d4b5dfda3f46579fbbdd83a2ebf9a039bec", - 0 - ], - [ - "0000000000044d53dbea312432e68fa90dc2148946f613216dbdeec86f6a67c1", - 0 - ], - [ - "00000000000107667692f12d21a55a72ff1dce828f96872e36c35bfbae475a8d", - 0 - ], - [ - "000000000000252d1d0c01744ec25af801ef7c57e2581c95295070b6a8a85bd5", - 0 - ], - [ - "000000001c1da54e16dc06158677024d9e74bff39bfaec83434ac33673fcc251", - 0 - ], - [ - "00000000b4d0c6ae86bfdf7ba4c205fc3e6b3b6d63836b85e30e9d8bac922301", - 0 - ], - [ - "000000002b16179cb022bf678bd847dd6fc1908d0df04abf0c7874981eb33ee7", - 0 - ], - [ - "000000000e6783554aae41856424d184dc4fa061f40676efd107e6f933a25641", - 0 - ], - [ - "00000000005ae4acbab519895b4b523d97a09e381c9e4b044e642f73b8c0f1b0", - 0 - ], - [ - "000000000010372b59c9595d947064804b75ab21868dd075a3842ab7d2df6181", - 0 - ], - [ - "00000000002f9f587ea304093be049d3142ac0c92f9c68928a4f82d12b929b69", - 0 - ], - [ - "000000000005d4cae51b3c76dc3c61bed0c265c4f228c0c4d1d3d147146c34eb", - 0 - ], - [ - "000000000001a5b6c0e0a0b485a490cb52ccdf9b22596656039b51545bb07be5", - 0 - ], - [ - "000000000000d723d0976338edf55d08edab995dd6283cbb688855f0dca6e8f5", - 0 - ], - [ - "00000000bfebfae90208a82c7fa06c0f61674dbf1e4f9162e370656c38d611bb", - 0 - ], - [ - "000000000c91cd144b2a92ab5024c87f70cc1d76a4a7f26a82a98c5aaad62850", - 0 - ], - [ - "00000000077c8114eb5cfb69c3924c699d0c70334360dd1daa95db0db4816953", - 0 - ], - [ - "000000000348a6443e091db8f68e88a10afad7c6e3e5392247902c4b4feade43", - 0 - ], - [ - "0000000000d63b70351e05829ad8a56336521b361b0d50eb7ea1f5b46c25b00a", - 0 - ], - [ - "00000000004658603163f0ede572120a1bbfce8d313aa282ae54d2ffd9fe9079", - 0 - ], - [ - "0000000000048063b410c793db34856f23acfb19a0ce72f5997fa572773378c8", - 0 - ], - [ - "00000000000228fb6e587fa593ff8b4764064bba8bfc2f43ba5b1f12af33d04a", - 0 - ], - [ - "00000000000082e3ddb75c0ea2a98922b1556ce10346f9bb0cedd97ccb3fdf62", - 0 - ], - [ - "00000000000005571b54d4886b44b81c21dfbefa554cd7c23430e5aeff6b5ae2", - 0 - ], - [ - "00000000306a603ca1a0d961e08e103a9f13f3615163c3373d1bd2a67cadc2a7", - 0 - ], - [ - "00000000195d93ba7ae19832b622de86ebdadf3c78f1751ef2b2e9b0e3a530d8", - 0 - ], - [ - "0000000000476d0d00cbc68bb20b4893f0e608b02a1e029b8c6c73e169c49e69", - 0 - ], - [ - "000000000051348044bc10fc05960c244c3ccd3b3b6c145ffd9958a1c8bc0215", - 0 - ], - [ - "0000000001e4df369203badca9aedc28c240d592b12d284ce0b0463fc7537c09", - 0 - ], - [ - "000000000091cc1ccd448b0ec9185618a84dea96f52477cfb9b9ca2b60cebe83", - 0 - ], - [ - "000000000024a50299c0ef0c6dec9c64336b6cf5c1a1b0013e22fd4fcee1d7d1", - 0 - ], - [ - "00000000000349248c1df06c3783d1270cd97ce7f605b9036fca0fdc2f0fbb96", - 0 - ], - [ - "000000000001afe6793e7427a3d780876d26eb7f2ded92563f991bf7302aea69", - 0 - ], - [ - "0000000000007148006e139e24d9fccc307661c9a0cbcd1af983487c2f0780c9", - 0 - ], - [ - "0000000000002734722a341984738177a3f6f264291424e4984f2128d921bf29", - 0 - ], - [ - "000000000109b02caaa95e49a477757a41a42daed40e92f54fa09e63f5538cd2", - 0 - ], - [ - "000000009a11c7ff8b8fa7fbff5a04c25906f701ab5bd67195736f9ccc839ab9", - 0 - ], - [ - "000000002b1d77f8e0cd60af1c62ef6d381e8905665b15a7fbc546d0c1a45e18", - 0 - ], - [ - "0000000002588cb017de9e2f23cea7edc5082f1b3faec890f9252d556efeac40", - 0 - ], - [ - "00000000008b07f177adc24a4b1a64d2dbcfbcc903ba861d493e11d6b33af7dc", - 0 - ], - [ - "0000000000bab8db5020aa8e052165275e8eb3e7c843533246bf6e4c8374757e", - 0 - ], - [ - "0000000000138488fdca8bfc327e6dbd6c72c5f1dc5868d9c0ea886665b9b56b", - 0 - ], - [ - "0000000000094021fc954efbf08be667fef1b817e8715d4093a561fc30264aa7", - 0 - ], - [ - "000000000000e8183e64072db79adfc6c09b650c4178001be3fade4050b06005", - 0 - ], - [ - "0000000000004c93e8661c75974cd191c68dd66999da4f70d039c0ba4a12b970", - 0 - ], - [ - "00000000000021c675b3ec404bb996f5e68f9eeceeac6946e5a6822987824d33", - 0 - ], - [ - "0000000000000ad85684d30f25d1ec34638f099df2f33b418a07307c68fe3c2d", - 0 - ], - [ - "000000000009c6add76ac42a1942c4ce74d25d1b8975d4e3ac8932185e785a44", - 0 - ], - [ - "000000001e7d828d354716881683eb6fb5caec5d91afce298e4e3bcee9574924", - 0 - ], - [ - "000000000a0e438ab203d8fd3e56100f2f14759f704bff6c699df0bb4e9aad64", - 0 - ], - [ - "000000000b7d5c2895df8bc1fdf5d31e0f663564cb5cff3b18642c44a71b6248", - 0 - ], - [ - "000000000193209ecd92fce00a75975446423d94a325ed525c15d5ab921da273", - 0 - ], - [ - "000000000020835bdc30ac67efdbc785d15186914bc14e86387f97450df46418", - 0 - ], - [ - "00000000000c9078321f0030214c75e170b01ec664d39bab1b1e48460a54eb63", - 0 - ], - [ - "00000000000ac68b63d486ade190dc9108eb3730d25e7537649fe21c30e0121f", - 0 - ], - [ - "000000000002a94dfc5f4b677b251a7a7647dbb99c0803df8658222227fe3e3f", - 0 - ], - [ - "000000000000b076bbef0e50593b1595ffb3d571e7ad95dbdf06dca8824ef7f3", - 0 - ], - [ - "000000000000167075c8bcd24233d25cd268271c0e8fcb6f301ee1b6f6ff0341", - 0 - ], - [ - "00000000013107aa587bcf12ac445330ff0325d73c5253f7e6a49ed8c50257bb", - 0 - ], - [ - "00000000090ff53d49c9ffd51511af8d5cba2038a8e25e3b17186b1bc941f43d", - 0 - ], - [ - "000000000d9e704d5607f77f8983cc56069571a3761d5bd5da55f05ec5d8e844", - 0 - ], - [ - "0000000002b2b4c0950fb6390f0ae860840e84eb0a82e5e8a9bc37c14bbf43b0", - 0 - ], - [ - "0000000000be10137a2434dce1d97850b768ce878c1c80ec905f6e9f21e65fa7", - 0 - ], - [ - "00000000005cd966f80183d4c048e63a5c14f649298dfd261d989d9e3c026bf4", - 0 - ], - [ - "00000000000e8f30e55006a4082380c4b1a372b7ad919d3a9b0a52fe5ee881d3", - 0 - ], - [ - "0000000000018c70a4c27bdba237ad19ebae5d3ca23f1394ccc746d73669a1c4", - 0 - ], - [ - "0000000000022acc8432c883953227786f7a6560aeaf0176d232c8affa5b25b4", - 0 - ], - [ - "0000000000001854e95b28b4efcb2cfeb08c76d8cf1fb03f2055b3fb758f3a1c", - 0 - ], - [ - "000000000000187080c2c39f5a3ea8be72ac4d3ec0d16b21cd34f1541bef23be", - 0 - ], - [ - "0000000000001593766a3c63b524f658ec7690df467cc7bbcebbdb56385500d4", - 0 - ], - [ - "00000000000012d6966dc51a41f2c617192169ec8418405e164ba83b9f7ecdfe", - 0 - ], - [ - "0000000000001d0c7d0a2605e127b00448b71e756ad96625116ab8ca18f74900", - 0 - ], - [ - "000000000009cb439ea49282d257595ad1f7602856c16cc26fff423f7783c792", - 0 - ], - [ - "0000000000889282b98336c994d7420a639221e0484b511227fd616d78dbd028", - 0 - ], - [ - "000000000071a4a2ad6767864bd21239c74c9912a40ca9fd3b209e21b66460d9", - 0 - ], - [ - "0000000000f3ed2c3c9a7c3a7291e859cecba8cf9243d23a4892e6be8ea9b70f", - 0 - ], - [ - "00000000006a4258ffdff8b7f6f4f685ce18c6eb1d7a1cf501ca9e02fcb7620a", - 0 - ], - [ - "00000000004af78f1a109d1267a9c24d69c6a4b30fea49f0efa6c8834cf394f9", - 0 - ], - [ - "0000000000193bf3efbb145747198470a81b2cd33c991057676742d5c22a64b2", - 0 - ], - [ - "000000000006b436798c7e4a8c3bdbf054a66707feee5a18ce9ca57eb95bb48a", - 0 - ], - [ - "0000000000001db50c7caa3a02ea4f173343f958f334a8bf3f8638add9e69b34", - 0 - ], - [ - "0000000000003c621629cc0bcec5968d61d2e42c6673de4d46555118ad5001d8", - 0 - ], - [ - "0000000000001262bef2918265f6dd4534013a4650444054fb4f5e490c5ed57b", - 0 - ], - [ - "0000000000000120ceee972d70cc84430006645997c7337976c673bd75cbef2b", - 0 - ], - [ - "00000000ba16134dc0c418a116b97ad5deccd6bf6e3daa028a8a6a80d7823faf", - 0 - ], - [ - "00000000a1a00d6d6fe0660e63402a5a7c7248589211594d37fd800456ce84b6", - 0 - ], - [ - "00000000394766cec78f962c29aaa715b66e3ad34e1f2323dba45e087cb3b395", - 0 - ], - [ - "0000000008b15a3020676f5e084210ecc05f646885eca1cf6a10e9ae9e3995cc", - 0 - ], - [ - "0000000002cf7eb98abe784f6e516670a88b9028a6faabfd099a364c2dc5c42b", - 0 - ], - [ - "000000000054015fec337a9ee43eea501d2292f031f5bc1f09758d20f5cd3135", - 0 - ], - [ - "0000000000068d24d31a9f1192d848155a2f90939627bc456c9a337135a923fa", - 0 - ], - [ - "000000000006262bd09358258edcc455f9ba46b7f9d6e69d0f6b9da89488a4a5", - 0 - ], - [ - "000000000002327bf77ae67961463ea98a78dab06c24ac7d58b1727c5f856626", - 0 - ], - [ - "0000000000006672235c1606fbacd7861b16b267d203b4d687708eeb1fc25e6d", - 0 - ], - [ - "000000000000ac0c9a39a47313a8715f125c46d6ea8be8741b99b1db4a8aae47", - 0 - ], - [ - "0000000000007e93f6578e7856aae0ecf6341e1312664d9e1d812ff254c37ae6", - 0 - ], - [ - "0000000000002a980acdb1443926875e7d4a57859b2b45ce3fa92c7716319f62", - 0 - ], - [ - "0000000000683bfd82c63514bc58a80daf699a6bcd040bb2a499540baf52463d", - 0 - ], - [ - "00000000373e6262928d7a6cac965b294aef35f90b72c85100ef91501775e06a", - 0 - ], - [ - "0000000000f7bc44061b65c62d4d7747138df127dd2a30f583c3ebb66a25c7a4", - 0 - ], - [ - "000000000212a71c38d0e13ab7c5646c949d4b7ca23afedbe351a43b7607043b", - 0 - ], - [ - "0000000000a836e88f76ee5dcca1e884572f32f4460a3b024280738d76e98ced", - 0 - ], - [ - "0000000000413f6c1b1c9841961636bb3290f2410ba0731f3522c4ff3faa2e0e", - 0 - ], - [ - "0000000000082336107412226110ab2a53016d4faad4deec048828507a300248", - 0 - ], - [ - "000000000000a91e7a3f35a23f01621dd051e314da617714991467131808d3bf", - 0 - ], - [ - "000000000000cd6576950f6f238227c3ba7f62405ed1bf3af4878c6dc1b04635", - 0 - ], - [ - "0000000000674099e9741e44da03e9531402a2607a19a65660b57470340828db", - 0 - ], - [ - "0000000030c4744001ae85f9e6b46ed0664449927b86b8fbf25b22b851d23671", - 0 - ], - [ - "00000000002f5095ad1a12eb9eedf88ce1e7268368461b6b4e10051148f436cb", - 0 - ], - [ - "000000000057d3e2a77eadb8b9613cb839ab02a96094dd5d0a6d1f09026c3936", - 0 - ], - [ - "00000000004e0a28be887d6ed037cd9102cbbda7d6c9e584ba51f2c2dce96232", - 0 - ], - [ - "0000000000211346d8099f7ecea72481c4cd45591f5e0d7e347725ac2162f142", - 0 - ], - [ - "0000000000199ae9fc06c5acee766db6033b86f76c266cadefe1461c611c2198", - 0 - ], - [ - "00000000004c9e5748558d4f5a75bc824171e3b958152dfd6844330f1e907f8c", - 0 - ], - [ - "0000000000137addf1521361dad1ee007eb9e6dd4eb8441492ebfaa3c240d556", - 0 - ], - [ - "000000000054d4c77bb7964e5327c35760d87b890ea336aec5ecdeb783350738", - 0 - ], - [ - "00000000006b7b06d04818e97a4df66164b471912f88d9cd02de4af6c8bbe74f", - 0 - ], - [ - "0000000000380fa9858e3e90335c061a3776a26bee1e8b6851de33ec63670782", - 0 - ], - [ - "00000000000842598b03fb79ce7386e9f9181a02dcf1effc8f70d3ff7368ccd5", - 0 - ], - [ - "000000000003d3475edecd733fc7b82432882d9c9f1350a98ef8921b87db4dec", - 0 - ], - [ - "00000000000000e330a8d57a38dbcc0b0a5dc7a4210f231b8082b9be5f9e4bce", - 0 - ], - [ - "000000000000218ff87fd50cfba2fd04203a78d2600cb2c4dcb039d803426e19", - 0 - ], - [ - "00000000007c96e6e3ed3146260348ac79ea7dc2ec2ae6bf8dc203400a37721d", - 0 - ], - [ - "000000005abaa10bf7260470c28ba32f1755b4cfd3734aad580681e39a9605a5", - 0 - ], - [ - "00000000005e77c226e6fffccafa56055e68f0ea0a30101e6a243ab9b3e07db0", - 0 - ], - [ - "0000000000e989fe27f85b89c1e852d7bc94b09033cc6c8b32fbbbd9383a9ae1", - 0 - ], - [ - "000000000091a1e962438583146293ef34156962445ffc5e81e4d0fe327d37ac", - 0 - ], - [ - "0000000000477978a6903217e2817d10e99bdfedb4f8bc396b96fd5b0b93b522", - 0 - ], - [ - "00000000000bfd9e5f13a9c03c48e8b58a937cf1ae2849160f1ca11f8fcced3c", - 0 - ], - [ - "00000000000158dd3c31b6379887b4353ef2898c03b7ce55458fcd57cb6f0639", - 0 - ], - [ - "00000000000029d7009eb56b9d38366005576b82a9b59fc845522a34ad36a38a", - 0 - ], - [ - "0000000000e6e207a82b8ad7136352204bb8e9ccfcd25885a715d3c65cbee997", - 0 - ], - [ - "0000000000fadc4429f50fc534ccac4db5e51a313df25034d6c5c25f7e83448c", - 0 - ], - [ - "000000000019c58defcfdab6c6ab9497685e61118effda4c2613bf44be19fcbd", - 0 - ], - [ - "000000000006cf444d846093c5045d42ddc0986ca805f261476d0fd2eb474c39", - 0 - ], - [ - "0000000000d0856a3d6a1e5b1ac7e388cc029bd8410b3b1489598974fe470568", - 0 - ], - [ - "00000000003d9aae63ed532b78082ca5386211e22410fd24ebd5318d1a4cd1da", - 0 - ], - [ - "00000000000345003879f86021a6d5e3fe93813246818c145947b7e225691177", - 0 - ], - [ - "00000000000175393730cde3e49de7af2b81ae736eee005a9f9c4a1e878c52ec", - 0 - ], - [ - "00000000000087a8c621c879aec2a897258632d6aa631b9a38ba4d564e08682a", - 0 - ], - [ - "0000000000002ea641b2975935bd9caf337b51ac9f9bb90a54f6ea6ee5d3112b", - 0 - ], - [ - "0000000000000c544f9b6a8cbab6d25caf949875622bf75139234850b10affe1", - 0 - ], - [ - "0000000000000f66fc4e37232a29f3389c493863a980d58a1d570eddd5268999", - 0 - ], - [ - "00000000001213fe2bbb8aacb1fc14983586e09db964151cb507956a81b35f25", - 0 - ], - [ - "0000000000ba82c2160602ddc1913bc4c133ad0af8848e014367c84110d00e05", - 0 - ], - [ - "0000000000b7a98b364b1cf9521275a915c7a1b3a0f0c052c7d8efb620ec0870", - 0 - ], - [ - "000000000047dc62db23540ab4aee43e54812aedb623a2a158aa3244fc784722", - 0 - ], - [ - "00000000005291002da10e53c3855882251a6e5a425b5e639ef9be3bd05767ca", - 0 - ], - [ - "00000000005ffbcbc0d9b380584bdc78050a6f0c3582b4c9c5103a150cbc71f5", - 0 - ], - [ - "00000000000a7a69cc06b0a68b27a8fa5d29727ec3b6db8d32d61cf7489b5ff3", - 0 - ], - [ - "000000000007212eb8c49758d98cefaa6098da2b877a6055be341f5f7c0ad301", - 0 - ], - [ - "000000000068d1099d8cf3f43f6d164f2925b1d52ede75640cc65ca020e1de1c", - 0 - ], - [ - "0000000008d5ddef4468a4414bd08184c2eba0ec536b85a743b1091828a6a884", - 0 - ], - [ - "000000000acae40db93b589783b0cde70b98552955cb3c12f08de1b417d9008d", - 0 - ], - [ - "000000000066a51eaa3a54036f338719da3d5779180c0bc3787b533410de90e5", - 0 - ], - [ - "00000000008b521677a6e897950aac69640e52efb01b7af10bba3820ecd09a89", - 0 - ], - [ - "00000000001823f0e399311cab0fcf57403e094feebf99b22030bafd2004da87", - 0 - ], - [ - "00000000000bf821c2abf5bcd00ca96439ddf5b0b593be5601145fda5338efdc", - 0 - ], - [ - "000000000003f4fd19b2af0141289177014ecc6dce6ea8fb50bab93d4a291095", - 0 - ], - [ - "00000000000011842d892a02e55ca594caddc9f3cea1979ddffefc070eda8498", - 0 - ], - [ - "000000000000208aa0259d20f51c0e7b8895e18a93aea79af9b3832e710ef134", - 0 - ], - [ - "00000000000007218f849e72dee1f7fb6fcf36f3b6745c6468187ed2ed13287f", - 0 - ], - [ - "00000000000f79f656cae641c2b74554c6ecd673c0c7550671c4c2af940661b3", - 0 - ], - [ - "0000000000199b4d178c05fd1c3154c9a4632eadc7bfc734c4522176c977ce8a", - 0 - ], - [ - "00000000085d0682d481635cb2e6de2e4d9884589455a86194f0b222f9acb3c6", - 0 - ], - [ - "00000000015972a5a6786a14b009bf582c4bbf7b9854591dd8d26f82b43ddaef", - 0 - ], - [ - "000000000064bf72b7bdbfcbe96dbbd0efcaf7aa94c0f92cb4e6662819468fe4", - 0 - ], - [ - "00000000003df36b7962bb4ad62266c462382eddc93f4bfeac464b95f7a89ee9", - 0 - ], - [ - "000000000006516d3a9f424eb61db5dfb85aeee29708b78c65d24827bd926263", - 0 - ], - [ - "000000000001c1709fe1b294712638db356e89155650f6fbecde79ec47a92af7", - 0 - ], - [ - "000000000000dfc23251344b593c16c28cd195abcb337519d7bc82175721a033", - 0 - ], - [ - "0000000000000aae2dd2bf0b8581d137fcfa3d9c4cadbe3ef3834d7cae4268c0", - 0 - ], - [ - "000000000000092a5baff3d9a5ae87689b2afe668e71bac3b342c7d383f0060f", - 0 - ], - [ - "00000000000fa906eeff7d2e126698d88b8cda01d32ea2c039c26984daaa17a3", - 0 - ], - [ - "00000000002d4315e5bdc2bcfdb245b914130764a50943a2b2e02ea3acf5c47b", - 0 - ], - [ - "0000000000fc2bc9bb83e04cbe922d64719295bfef6320027725402306bcf1a0", - 0 - ], - [ - "000000000142690e7c334b97612746d6db208e6153bdfa8479d86d1b575feacd", - 0 - ], - [ - "0000000000629a7820e8cdbbed18dcfe16c992152badc745ca73b9b34e53fb0d", - 0 - ], - [ - "000000000023c2e9dbf3fe03248e40f4ec3fb2dc81ac573d5a6a4f490c701877", - 0 - ], - [ - "000000000013658a43b6d1c4be95fa36e32d3edf80716de3a8f7e98858016adb", - 0 - ], - [ - "000000000007c847295d8c4b6da9d8a64b57c3a2307e64387bf8882b9d35d6de", - 0 - ], - [ - "0000000000032bf90b823332af80bd2ea18f411f081c7dca8f2fe79d9215526b", - 0 - ], - [ - "000000000000001bc0655da6f24c6952e811006897a0c6dd8b6bd94f178636c8", - 0 - ], - [ - "0000000000001e1d09b15393190cf686e25488db7fcbc2f1ebacc8165fe6e3a0", - 0 - ], - [ - "00000000000cc79ae066badb4157def4067057cefd705bf87f1d832845a7ab36", - 0 - ], - [ - "000000000014408398244b94b4eff6b54875802ede6df2d1d21915333a195719", - 0 - ], - [ - "0000000000114135a1bc757110c05162fa649b694db9569be117e34832c87257", - 0 - ], - [ - "00000000009b15fb2bcee1af904989ba0761e4cddc6b3ee214c0bb07dac6211f", - 0 - ], - [ - "000000000012be506dde2c54adf355bdb41a457b0abec436202a3be73f0b052c", - 0 - ], - [ - "00000000000963760ceb5fc65570650d494805e05c9d753f3ea6d44247ad3d08", - 0 - ], - [ - "00000000000bfec54977673f68b6fe5f088398e697d778fa7987f8bab6a70825", - 0 - ], - [ - "000000000000e7f428bb413c17032c0031af0d26133ba93f744a5a0c16cf7e1a", - 0 - ], - [ - "00000000000036bc80378323c6eaff8ab350b6d89955f602960cb7c93d2feb4c", - 0 - ], - [ - "00000000000f0d5edcaeba823db17f366be49a80d91d15b77747c2e017b8c20a", - 0 - ], - [ - "00000000001ff8fd57798082ab5a7452ada211e1c3be38745155505601498829", - 0 - ], - [ - "000000000020f960b535eac585e5810ad64f158c1142f0eecd925c8058172933", - 0 - ], - [ - "0000000000067bd89409368d221507a160e5c45972eeb01efe210054fe8e7d85", - 0 - ], - [ - "00000000003521f2d5ea3232d4835ca6c6bae083ba90458f67d4cd765ce93b09", - 0 - ], - [ - "000000000005ab3ff3a0c484eff7b571fb78ce27d93f77a480074232e5ce0c1d", - 0 - ], - [ - "00000000001048c9eca7cc1cbb86946c04498052071f7e7c775bba565ada337c", - 0 - ], - [ - "00000000000154caacde41be616f924d7d478812148242fba85605eefec9ac61", - 0 - ], - [ - "000000000000c34f75bd6f338c0206a31a8d5021cc2ded51e88a6ef4fe686d10", - 0 - ], - [ - "0000000000001e0581d86c49a6ca14ba88639ef908abb09210b57989e06b1a1f", - 0 - ], - [ - "0000000000d0e6dc0bf830b50bde3e400e16ec4f772f92a55390e62d4aa73af3", - 0 - ], - [ - "00000000069c2501a2f32cc69af72a602ff674438ae04dd05516f72a71b9ab26", - 0 - ], - [ - "0000000000c926b38954550c9b8d363ff058c2eb135eebdb3e640cfa67df803d", - 0 - ], - [ - "000000000011e9ad9c18e9e2095c3662af5be1e918dff653758583aa45dc8197", - 0 - ], - [ - "0000000000f311624ff4dcdf07400d0d2fec8b16b14c1c16babc377a2d85ad21", - 0 - ], - [ - "00000000002e455cabfdc2a8955e8ddfe717b12efe5b80937b0c0ad6ac977fc5", - 0 - ], - [ - "00000000000fed8889a22339b340f599ac7908e790bfc3cfca9b78078a52d228", - 0 - ], - [ - "0000000000012ca4492956b3f859b00e5db14b54d422cd95c68c7150743db365", - 0 - ], - [ - "0000000000004c58e8f7bac59eb4a036764a4d8e0da51c0290858ab14fb72481", - 0 - ], - [ - "0000000000002f60bc99563ff5b4b800c176fe8bde95e8f968fd6b53d74c9cef", - 0 - ], - [ - "0000000000000bffd10a3fb0b5b86d8b2561f39d07f8a4c41dfa08e3e49b7db5", - 0 - ], - [ - "00000000000006a296be9cd8fd4e3145c146863adbe08b71831abb8a869d032c", - 0 - ], - [ - "0000000000000c557f496e82891039ff22e277bd604be6e2e8b95e519bee91f9", - 0 - ], - [ - "0000000000399b30d2111c4bf3051c1f7f2f35bba7ff290d92393341ae47df55", - 0 - ], - [ - "000000001f88733439e4e8d3c474504aed62037faa16f3845b4c671f69732e26", - 0 - ], - [ - "0000000018aa2f93d2ab76a7e2f1bf5b565b4a1b0ececb6ee46490984f6c0d4b", - 0 - ], - [ - "0000000005e22674fcf65ce7be896a0557205ab26d1f76d73a717f5f14a6d6ad", - 0 - ], - [ - "0000000000223d866b324c097973210f8fc715c9535908359d61d8e1ab2f0100", - 0 - ], - [ - "00000000002b321fd6452ab43849bd7a781953ec4485554e0fdc579f2a52c90a", - 0 - ], - [ - "0000000000173132748c51b5754b0341232325bd118455bf3c8d25164d3eb92a", - 0 - ], - [ - "00000000000143158cdea5fbb9453bbe1a7a900e6feba1e2193e4f5c106d9fba", - 0 - ], - [ - "0000000000014677751456af5630025b3d9921a4eafb4d36a06498f0c6a84c56", - 0 - ], - [ - "000000000000243976cf2d30ecd3cb1fd0b805fba4da92d2758f78e1c6f8ae92", - 0 - ], - [ - "0000000000001323db1ab3f247bcb1e92592004b43e4bed0966ed09f675cf269", - 0 - ], - [ - "000000000000017a410c22c4b6caf710f5ccf005d644caf276ea8626a538798d", - 0 - ], - [ - "0000000000170b2b1374e3a0dfdce2fbc5e302e1e0e9fb419dc057c9959902d1", - 0 - ], - [ - "000000000015b4fad4d929630487680cda2d3aada138c58cc08241ef6dd4ab09", - 0 - ], - [ - "00000000000abebab869f1620843d413a3d9e06dc7d9f5201a414d547ace1f99", - 0 - ], - [ - "00000000000b0bdaf05c2fe8b12ebd2372f49d8eabcfbccdadd68b5e5b7c9565", - 0 - ], - [ - "00000000000ca1af42ee1be2c8895d94f39dab5fcdbe0b4b4065f4be534e7294", - 0 - ], - [ - "000000000069d0cc8c0452bf86cff87db05232f801a162acab2d080d6e4e9ea9", - 0 - ], - [ - "000000000019c7f7685f5bdc3afbb5e978cb3f4f70fea7b2b410139741303b53", - 0 - ], - [ - "00000000000d3874ce21db78f4d1883ad9ae8b26c1d7c13f3d723ff85629d595", - 0 - ], - [ - "0000000000033f87c25275ff72b58630d8da90221f2c84bcbd77c8e615709f8b", - 0 - ], - [ - "000000000000dc72adaaae6483eb6737de7d21b3a24b2426330e80b078ceaed1", - 0 - ], - [ - "00000000000002fb1337228db02ac464565271f22f045c1b6ee5e449f057a829", - 0 - ], - [ - "00000000000001902376ff640d3088899af0819dbd15f602156a13ac2fc8e94e", - 0 - ], - [ - "000000000000007ee49761a1c8284a3b8acefa39e37e455be4773d648e2db794", - 0 - ], - [ - "00000000000005b4d495a77f57018dbc72bf47993d494349329a3c653f04ab93", - 0 - ], - [ - "000000000000009dcb3ae6d68828e2f5ccfd58780abb260354e74484106f81ce", - 0 - ], - [ - "00000000a3ceb118021fb42d39be52db951c6f852bb9a241046e972706f7329a", - 0 - ], - [ - "00000000574e8e1c27fa54c77b4e7cd1b79de070f0d3ad5b383206ab9777d983", - 0 - ], - [ - "0000000039d562f640c1743421d53e7e04c3e8ba222c339fff6f3d25b1d4a7fe", - 0 - ], - [ - "000000000001cb1559d55c697871e18d5c26800f77fb11587241bfbec3b15e26", - 0 - ], - [ - "000000000006e01a93090319756c7ca826ef655feb0cc2ef9abcc59d67de5e5b", - 0 - ], - [ - "000000000000a81aaf5a4c013032638a077af6aad8bc449d74daef8ad3a74419", - 0 - ], - [ - "00000000000087d0574963c1582f2161298e2de5e48f74566291ef9afc2be24a", - 0 - ], - [ - "0000000000033251e71c347cd663945fb68efe82a8c6666c0b41e93f1c46658d", - 0 - ], - [ - "000000000000f592857e6f0e4711b5b93fdf95f2b21a5963bde15be750a07908", - 0 - ], - [ - "0000000000004353c8426e18b942a5012934ddac8322b86d6ab98ed7c0ee86ed", - 0 - ], - [ - "00000000004f027845b699f42e7d0d30c530e99524c5f97186ce6a250a5fac42", - 0 - ], - [ - "000000002fc6407edc060df90785082834867331e6746a43ed34a26fbdc5df64", - 0 - ], - [ - "0000000000048733007c91ea3665bd4e1653b10799e3f43abee0fe830ffbb3ad", - 0 - ], - [ - "0000000000025a9b1c5afceba0c78c4b0320797acdc1ad50b4e040f148fbff7f", - 0 - ], - [ - "00000000007ca6d026d27387edc1c5570de41c61bacbcb1dad2c0f300b49e637", - 0 - ], - [ - "00000000000258f683a77ad509da82a4fab24188fdb4b4690e212c50794a9abb", - 0 - ], - [ - "0000000000015111bce7b6ac13c930484e14e31e13e43355cb4d63c8f1782440", - 0 - ], - [ - "000000000001ca074fdecac7749d95f28f10c83a7e13787fd865bfbe505382bc", - 0 - ], - [ - "0000000000001c11a6505dd44ab405fdc07ddfc015f3c1166a5d9352ab58b52c", - 0 - ], - [ - "0000000000000c83f7f8e1cab4efa08d6c68c4555fb6ab542e01b87edd8f56ac", - 0 - ], - [ - "00000000000009561d0ceba15388573d2a994aff24512ec3ed7d7881aa0997dd", - 0 - ], - [ - "00000000007dc7cfbbb94db1fbc076a70a1252fd595686b4d75b2ea77ed6ee9e", - 0 - ], - [ - "00000000000251feb68a8c90852f73aeb29ebda191038737b7edd37c9475f4ac", - 0 - ], - [ - "0000000000013f9a97045ea9047654e514951288911b2c3986787c27bab49106", - 0 - ], - [ - "0000000006e8c37735c61f22bec69f4cb7eba03172349e7012b7704652f3e83a", - 0 - ], - [ - "0000000001f341add5657043d8e50e53ba079fe24966a2668f904be5579c84b9", - 0 - ], - [ - "000000000029a6275cd477d77939424bd183c2f1308a9912f45aa7cc9ed13b56", - 0 - ], - [ - "00000000000a0336239e5e1faedf5bd2eedf38c9a5ba34a832356aea70aeb102", - 0 - ], - [ - "000000000003c1a2b25093a64eb624055f6a3a26e18b8e7ea2d9382ec7a3609a", - 0 - ], - [ - "000000000001bd89bf7e8740ce22adfa6e8793bd1716a647e558ed1742ee8329", - 0 - ], - [ - "0000000000001320421f1bb2c94000e11a621f581fc277c0e2911c3b89f680bd", - 0 - ], - [ - "000000000054ce90a949f5ae2d43c4ace599668c6ccbc50620f6d5705922ea7c", - 0 - ], - [ - "00000000200d16fea4857e6b73169cc593421a57971acdbcaf87a31d7d8d72c8", - 0 - ], - [ - "0000000000e75602181c88f713b91c49de291ed878be305d25b75c0ec5fbe942", - 0 - ], - [ - "000000000081f8169c3c3665f20351dc0fe499612ae232ec0b55858a8e5dc6e9", - 0 - ], - [ - "0000000000d7ad232e7593fb435d125343b8113bbdb3705ab58ac0e18c26cc79", - 0 - ], - [ - "0000000000076df615d887e33193ca2dc0f2fc0e70744512c95da6242e9b1a81", - 0 - ], - [ - "0000000000084a62093d1929843e74456686429b698a7ea9b1901c1565779f58", - 0 - ], - [ - "00000000000251d1da01e9de9fcaf3ca3a64bff78a5faf51a8e697dfab6b5e4b", - 0 - ], - [ - "000000000000609a8798996b1f1fe0b66060a628eadc380d0d369a2318c2d0ec", - 0 - ], - [ - "00000000000014770aeab044a022e86d888a6ede75b6474022c71aead3a1db74", - 0 - ], - [ - "00000000000004101d04ebc90ade5d4b911aa13c038ecf25e9887d877203ddb8", - 0 - ], - [ - "000000007c700410b61eb7ff1aaccbfc3a79e4e4484ad7a2b0eda4d91dc4b613", - 0 - ], - [ - "00000000055ff438a031413ee042fd3c0a2b69be98690542806ff123b7988024", - 0 - ], - [ - "000000002eca5f9f2c3b656d2550662fdee4c95da133eade51a5cae653bc69fe", - 0 - ], - [ - "000000000c679b76ccf0c5b943095fdee8fa466311edbea2c4a05f9430ffef3f", - 0 - ], - [ - "00000000007c6f494e32d5d9de58fa008a770fdc0a7b4a141be5b7c2de3ab970", - 0 - ], - [ - "0000000000d5dcd5a26c8ad29c1293e70401e2f90d8288469df3816b8cc6d4aa", - 0 - ], - [ - "00000000000d754d94f36cacbfb620710672afb1558499cabe17ca62c54a7d3a", - 0 - ], - [ - "000000000004096bb78fba714b130f7f1f929e2803c75a7a85619f7a2b86567f", - 0 - ], - [ - "0000000000020e686c38d44c35896df35f9f1b7723a82a826a5e2393c25ef68c", - 0 - ], - [ - "000000000000504f9af6885c0cb6484109ea205a956c8efae9557a1f5b9233da", - 0 - ], - [ - "0000000000000e8746e52e4320ec17e66434a3936a3825f7046fe874e92275fb", - 0 - ], - [ - "0000000000000f48d818a9a026270c9f733f629959bea25192596d59874b1ce2", - 0 - ], - [ - "00000000eaa9214cb05b241828a1cfb0c4209fb7ea64429815d61f7c1d98939e", - 0 - ], - [ - "000000001f7f915a6002cce4edd5cba392307f3a199a520ee8937327a9135162", - 0 - ], - [ - "0000000009674ee0c606d687bdcddf8e023462927e2902b3381bc4bb862a7397", - 0 - ], - [ - "0000000001f3f3528c083a4b11eb2f04d8bbeca92b57f05d8282909bde78bc77", - 0 - ], - [ - "000000000131917ac459aefb91774dbb42caeca497afc0cfd1766e0338cc7f88", - 0 - ], - [ - "000000000027634444081e1289354cb50034a506bb306a2ac1d8280683771c5c", - 0 - ], - [ - "000000000017a852acff78fbee573329d45bb8b121e9f6fc1e4f687bb3778ada", - 0 - ], - [ - "000000000006789e1a00eca982fb2827f680b254c4a0ecb005af4464f3585a02", - 0 - ], - [ - "0000000000015d2e9f54b1e9419d6b32ce68ae626cdd7f2a1954f22ca39ae0fa", - 0 - ], - [ - "0000000000002f7893bc169165ed9fefb434b6201103f23cc84a747a68ff8797", - 0 - ], - [ - "00000000000008471ccf356a18dd48aa12506ef0b6162cb8f98a8d8bb0465902", - 0 - ], - [ - "0000000000000596f00b9db53c4111bcde16f3781471c5307af1a996e34ec20a", - 0 - ], - [ - "000000000000007b5d2406f64f5f5833c063a6906552e815e603140c00bca951", - 0 - ], - [ - "0000000093ca5d935740a1b25f10ce092fd777c2bb521f3156619389ae78931e", - 0 - ], - [ - "00000000292f3a48559527341f72400a0f8a783aebcaae5bfa0e390dfaa5286b", - 0 - ], - [ - "000000001e852ed7ddf0108d1fce0f4f686f43c8c1b85bcb12c43e564dc7630e", - 0 - ], - [ - "000000000c4bea8fb1e7f3a1f3e6c6b3f71388c0ec7eef3de381853767e89f87", - 0 - ], - [ - "00000000029ef31a21711b55c4300efa38ace0b706091e373f48285286f2c578", - 0 - ], - [ - "0000000000979060786bb008f193d3917e28667bb1b28329f3adadc172e4cce7", - 0 - ], - [ - "000000000019030ceb98013b1627517b45b04ee055ef445813bbebaa25fa1ed3", - 0 - ], - [ - "00000000000adf202247bb794fc9a3c82cd8767143f1e6ed5f60940ee18b09a8", - 0 - ], - [ - "000000000000b19061e2481d8be6183b3d881b0d58601072d2a32729435f6af3", - 0 - ], - [ - "0000000000007a6d34f59b29e8d4da53e51e3414acd18527466d064945fe19fc", - 0 - ], - [ - "0000000000002e66ca213a2c3e9eb5fa62de29feb83880a0bd29f90fca8ad199", - 0 - ], - [ - "0000000000000b4ca10aa100728d0928f37db5296303db1b74ffe29e4a17b6cd", - 0 - ], - [ - "0000000000000143309f6b19567955743775f61f8dc6932c0b46cf5fb11c6c72", - 0 - ], - [ - "00000000000000b04d5409b3ac60cc18c0b9a3d58b303594635a8f75a9d2abd5", - 0 - ], - [ - "000000000000040a2699f62a552703a278608248c2ce823f4cd8845376e9a371", - 0 - ], - [ - "00000000000005cfcb850db7e83d4963994f958bae9b1de1483f5aeb3d449925", - 0 - ], - [ - "00000000000190f80220e70c1481153671a7c90fd856988c183ab0e3d9313df8", - 0 - ], - [ - "000000009374563a06178641d06776f66554c2a094b5319f0801fe35cef72ccf", - 0 - ], - [ - "00000000003e4e6e5e8e4a89e7de50eed104d4a49d2992ff101b6740beec7cb5", - 0 - ], - [ - "0000000000618cd377d14aaa441cbdb92527894f98da316eca81664f8ab5488d", - 0 - ], - [ - "00000000000d977ab2897885fee712f58612fce8c10ffbe9400326fe3429b77b", - 0 - ], - [ - "00000000000c3575b487dd0f938c5bc744fa65ca4ca3a9c981b8bda903ec110b", - 0 - ], - [ - "0000000000247ac689595ed8d62678bfe53e5af13c0f5455e558f5e6bb375c16", - 0 - ], - [ - "0000000000093d175376aa621176511f335a48f824b66d998e8082f85134a48b", - 0 - ], - [ - "000000000000c0c0448fe922f2c737946297d35f2c25ad7cc223e11bbe58e1f8", - 0 - ], - [ - "00000000000016abe4e7c10ddb658bb089b2ef3b1de3f3329097cf679eedf2b5", - 0 - ], - [ - "000000000000242757cea5b68c52b83dd8c2eb9257492074fc69dfa30bd4cbf4", - 0 - ], - [ - "00000000000006813f3dd7726a509fbe3101835db155dfd35d44aeae6aedb316", - 0 - ], - [ - "000000000000053cc4f39cff1c8cee1aff7e289a85dee84164d2d981afc8f17a", - 0 - ], - [ - "00000000000000789724805cf1d37ef689acf52c47a460507f540d5e5ca79bfa", - 0 - ], - [ - "00000000000003d71618bb8952887f65540270a5e54d6246b9419e08831b5e4e", - 0 - ], - [ - "0000000000000251a513a33eadfad67c015f6e3b291dfd0ae1cc4bb3a43006dc", - 0 - ], - [ - "00000000968009e3f8d6e6071e7def68298307717a9af6c2d44986deaae297d5", - 0 - ], - [ - "0000000062bcacb734df83bbfa3e1b9a8dfa570ecffb6c29eaaf8e9498cccd30", - 0 - ], - [ - "000000001d4618c0931bd3c25ee592c35341f30ff3b549a671f637b3c26ef414", - 0 - ], - [ - "000000000418b329df96a004f1b652ad06a7ca295f9f2e711c412d00493f5a86", - 0 - ], - [ - "000000000302bfb88e9027237d023c4b969e106c9a7a23a84103776de7880836", - 0 - ], - [ - "000000000069b9f7d9134fd93c8b7e3af8b26bbcbb5553af02fb6ed644d7fca5", - 0 - ], - [ - "00000000000411ec444240ee91e2777ad18b80dee854e3e838e32209e84774fa", - 0 - ], - [ - "0000000000007c73f322eba4dee5463305227c7e1a8139f1b7b296444f265052", - 0 - ], - [ - "00000000000129adf0f9c0242aedbb9d87935d67ee4ddea758c00344d4b6a29e", - 0 - ], - [ - "000000000000343594e671158b6e1b4b6499f6ad66e2aeabf1f6d295d3dba850", - 0 - ], - [ - "000000000000320f0d5c22ba22b588b97a0e02273034bcd53669b1c8c4eeda1b", - 0 - ], - [ - "0000000000001e8cdb2d98471a5c60bdbddbe644b9ad08e17a97b3a7dce1e332", - 0 - ], - [ - "0000000000000026c9994ccdd027e86f51a2e36812f754bd855a7f9b1ca56511", - 0 - ], - [ - "00000000000002746a820a2c08b35b8d0493c4b5d468fcc971b9c88003e84849", - 0 - ], - [ - "000000000002949f844e92645df73ce9c093e5aac0d962a0fa13eb076eec835c", - 0 - ], - [ - "00000000000156fbda67468ae2863993b98a41227c420246e4bc4e68c84df0e8", - 0 - ], - [ - "000000000003b43c6c807122c8dd10e2a0cffbf72946f41c97c1ab82d416f74d", - 0 - ], - [ - "000000000004e0635c2438b1b649007e5d424b3de846299a8db53049ebf4da0c", - 0 - ], - [ - "00000000000258e4b79e3cca2ab7d12b35ba77fc491572f2e794f0a10f5236d9", - 0 - ], - [ - "0000000000f5816875d9fece105e499b0467b8fb23ea973c48d828a235acdebd", - 0 - ], - [ - "000000000001353bbaec810af7a4c74b4964ae072361c0889ed6d59cf16db6fd", - 0 - ], - [ - "00000000000b354d8c389473670ca6bed7e3dffa069f270d35ec9dad810af141", - 0 - ], - [ - "000000000002fa1f39e7cd8730fa08085ba2b532146ad1ef3b400a13e835ca36", - 0 - ], - [ - "000000000000d2c7943eee59652a9783bff27e474a92ec206c5c6e3cdd58d0d7", - 0 - ], - [ - "00000000000036034181b4d9a84a97490b49fbee4262b9cfb25a7bfc9c0eec9f", - 0 - ], - [ - "00000000000007deb59381cce692f152fc902732d96a7e7d463bc83915b37c0a", - 0 - ], - [ - "00000000ea7d32833462c0f72ade0cae4766e6065caa4e510331929c56d16632", - 0 - ], - [ - "000000000068fce0ddd370d4c8f9129a7bc7843e75fc57666202d3b90239e269", - 0 - ], - [ - "0000000026b4a2212c9c9493f8bd9d5331cab6d8eda8ee017410e58a783ca069", - 0 - ], - [ - "0000000009535ea2dc7e83c31cd17f1db1bb78b0a678fc0610844273de143bf5", - 0 - ], - [ - "00000000008607cbd5baca91d5b8b82ee965aace335744a3e21578af22bee8ba", - 0 - ], - [ - "000000000030dcedae0f5e98c4e176f9569ce76c4d4135bb028fc3144ef381d9", - 0 - ], - [ - "0000000000297c3f0e3fa85731222ba934a955bf513247a72a33c74c498cadbe", - 0 - ], - [ - "0000000000020a0d4a1e8120cbdb486e758b58919c9df12e0edc8ca1f2795e94", - 0 - ], - [ - "000000000000078773afc9023182bfb6534a60158672e6bc6e8aa5052854da80", - 0 - ], - [ - "00000000000102ecdd67800807d9e137357805b9bbf8a439ed86bde5b19fbeb7", - 0 - ], - [ - "0000000000005c3d2e3c7ee737c67ab465533acb233e0df902c1525fc11c3a55", - 0 - ], - [ - "0000000000001a77771650cdbbceff87caa4461391ba6a4ddc9815b5b0ab47b0", - 0 - ], - [ - "000000000000071ec390bbd28fa2a84e52ab5b32901d0723d22646b04ae01dc3", - 0 - ], - [ - "00000000000005c3ec3194f710c6f26ee736d59cc935ddfa574440f39846433a", - 0 - ], - [ - "00000000000001cc3df6924591939269d61ead563b9eb68402a2ca01d7ff99e2", - 0 - ], - [ - "000000008c778b3554ceaf3a13a856acbfe46b5750fb86fd92ba30651c2852f4", - 0 - ], - [ - "00000000107ca31f75f8ea76073dda3c33330b2706c1ec20c3ec240e853b65c5", - 0 - ], - [ - "0000000006ba99b08e7f2869ce113e2ad7464891de7b4cfa96f330d706a2da46", - 0 - ], - [ - "000000000f31036bd51b2818f6dfb90ada9be5019abf55fb15694b181e269865", - 0 - ], - [ - "00000000004fcc101bc47eb7a379b9f608d5c00ac04d2d0ea165ae2937070796", - 0 - ], - [ - "000000000044d5ca3eda838edef0df7e69e1934047f8482822ce58ff7a18466d", - 0 - ], - [ - "000000000029bdfb157be6d400c4dd3370d98afdd8cd3db6f1ada8c19bbf4650", - 0 - ], - [ - "000000000005e9699ad8035caa4f73af781ac2040c87b8aa77459b3607209aa8", - 0 - ], - [ - "000000000001c0ba033f7d85beeaa167c9bde0e192240653a7ff6d9b81679842", - 0 - ], - [ - "0000000000000e0176111f29e800b49c7b8c7226dbbf4df715f1a4f06bcaaa49", - 0 - ], - [ - "00000000ac3bb2cf42192e9053f5384355228a2b3d70b4ece4d45773a5d5ddd2", - 0 - ], - [ - "000000000f29f7b60842b1044b2db7998e9bcbd92f8ec6fe8d159c6d582f1f1a", - 0 - ], - [ - "00000000352f86bc5f9760961a25de009940508bb2cd0b37f378fbc87dc97eef", - 0 - ], - [ - "000000000e9b3086008679ed57f59857f64c3954368ba1088117dbf88d5839cd", - 0 - ], - [ - "000000000015324bd8fed0e61b62bd1d6c663b862cb98ea03c494a92e4a8d0af", - 0 - ], - [ - "000000000020475a181b7a084b341860a72fc0c1fdfcc13a85adeb0471444b0f", - 0 - ], - [ - "0000000000031905c508a975707b74f24e733880382775ee0e6250666473e1d8", - 0 - ], - [ - "000000000000ca38b15d2ea33a6eef505a9c661540a18882f79ba9a3c575a9bd", - 0 - ], - [ - "000000000002739979a7a89fa279303b6606885e750b19e91ed637d7f222b392", - 0 - ], - [ - "00000000000091e935fc266facc2c92759d5468a39aee5be6b76b519a9bc7567", - 0 - ], - [ - "00000000000006e339938254208203b67c3c400f703fc29535fc646699e36e58", - 0 - ], - [ - "00000000000008f6f1d1150d77f93a7f1baa24b65ceb471b1825b2e92ca6997c", - 0 - ], - [ - "000000000000004894e1edcc5421dbcec77d47c5c50bf27b2cff3f1c242c9eb3", - 0 - ], - [ - "000000000000054e97fb5e1a8bd7900f7c329385895761aaa40d11b3c75b0c8e", - 0 - ], - [ - "0000000000000600f4bcc5a89527eede43d1d3342dc12eee1371ab534b0102dc", - 0 - ], - [ - "00000000d1ad5c3ef8c3bb4610b34c264e4ca1ea51c4c8bac18b215e7dc96948", - 0 - ], - [ - "0000000062f6a07ae11f9724b8ba9dc2b7348ffd02b59edd3cd2bf387fab9723", - 0 - ], - [ - "000000000014e4c97c9b09ff20203213f3336b0927fd19d214cef1f544756e39", - 0 - ], - [ - "0000000000d004681880e127aed3fa73255a2e75c2e5c8580cd555526614b294", - 0 - ], - [ - "000000000008093189bba28d40662d6964afc1c0fc9b5c1681bbe32e8bee6c0b", - 0 - ], - [ - "00000000002df10cf8165b2204ef4db6721c8c2119d60463b040fbc81c266bbf", - 0 - ], - [ - "00000000000c28c789e7cd9800b98c1dd32e2dda54048116ff47ed856a14acfb", - 0 - ], - [ - "000000000003e8e7755d9b8299b28c71d9f0e18909f25bc9f3eeec3464ece1dd", - 0 - ], - [ - "0000000000004b95a0103abe2cb97806caca76f6922d9c5df003cf4a467df822", - 0 - ], - [ - "0000000000005f12d2ab72bfa715860444c281265ef77e09dc2d041ce89506c0", - 0 - ], - [ - "00000000000016eeedb3f367daaee93334188db877fb01cd0282b990f60812b3", - 0 - ], - [ - "00000000000001daf3bd8306b6f6899af8aa656d87ac2aa37d493fdcb0cb3000", - 0 - ], - [ - "0000000000000390b86892ad0bed9b520783056961cad7362ace8049aa00471c", - 0 - ], - [ - "00000000000002105d01b4de7d3e3ada9c757a239151d50b5dd193e3951a23cc", - 0 - ], - [ - "00000000000002362fa802df308201a4b1fff2fd8a91892915a46f5d54098ff4", - 0 - ], - [ - "00000000000004fb8aa6c6aecb64b9d8d7e691a6cd56fad69fc5278b9e8d98cb", - 0 - ], - [ - "00000000000000ce3bd9752b2508ddae1ee71332e905163a3c0d7e10b8c472f7", - 0 - ], - [ - "00000000000002d0d8520982f15a45d4a405334c61886b6d13d95843386af647", - 0 - ], - [ - "00000000cafd25502ad67d5d409edfc98f5bbd3173e86e085c69658d58da5f70", - 0 - ], - [ - "00000000b01e0675317a29a07731ea092fa029016a40ed8bb4fc17cde50eda05", - 0 - ], - [ - "000000002676805396ed2883ccc8ad401aa0a974627559fbae2416ba5c54999c", - 0 - ], - [ - "0000000000030ab759158f3d425824228dc5c91f32db91d404bee29ee3a41878", - 0 - ], - [ - "00000000000da1c8040ec08e7490fb201ca1fb3571f29c0efd3351ae197d3017", - 0 - ], - [ - "000000000004e3cba890c16ffc7d1c019d4ab88afa39315164e1b08b8e6a9330", - 0 - ], - [ - "00000000000bdcfb630b43977be44529e54daa02d199014a0967deac669bd060", - 0 - ], - [ - "000000000007254038f9c621d6df0d9fbd90b5697e4170cd6090daaf579f3790", - 0 - ], - [ - "000000000002263e27ea1cec943632bf469a28b067f0bfde3b9a6b48540981b4", - 0 - ], - [ - "000000000000f194a8d17e683d17f222d23a9032f034d4dc4497263fd785dfa0", - 0 - ], - [ - "00000000000036e359b7b07044e3cd5b132a3c72501a0f3f9ccde167f5316bba", - 0 - ], - [ - "0000000000000b10e98a90e0fd1ffbf7d5fc5a76e8e6e960c6fb158711af6f48", - 0 - ], - [ - "0000000000000104e1e4303b8dae78389bb4e6c38f3eb3fe42aec6464bd5c397", - 0 - ], - [ - "00000000000000bde368a635921f5ad25aeb4b784651de24d624cf20c27691c7", - 0 - ], - [ - "0000000081a626a33cff134e7e56dc0f0a67b1735c96256774885d5d095807c0", - 0 - ], - [ - "0000000055d357cdf39130eb767f416101e79025515906bea528f43cb6446920", - 0 - ], - [ - "0000000012558b30f9c1a156fd80b02451e8dfcc7fe0350fb4adeeb84951a0a6", - 0 - ], - [ - "000000000001a4868924fc7cca0334ffc4dd49c07fb841c1da059a7c219bdf95", - 0 - ], - [ - "00000000000010086bd2bba88c71b08cfc7e24183d610a2803e6d382049d52c0", - 0 - ], - [ - "0000000000018c83992fe05d820b097228de93787e3f59e65cb89ad4c385e364", - 0 - ], - [ - "00000000000023ab80324770ff4c6802d09e5e1e7de78d2a8e64783904d47f19", - 0 - ], - [ - "000000000000287fa294ea557835d8c98bfe94c4d8b18d5b10f1b62d68957113", - 0 - ], - [ - "000000000001d842f5a0dff13820ba1e151fd8c886e28e648a0be41f3a3f1cb3", - 0 - ], - [ - "000000000000906854973b2ec51409f0b78b25b074eef3f0dbb31e1060c07c3d", - 0 - ], - [ - "00000000000009e694e22b97a4757bffef74f0ccd832398b3e815171636e3a85", - 0 - ], - [ - "0000000000000594b95678610bd47671b1142eb575d1c1d4a0073f69a71a3c65", - 0 - ], - [ - "00000000000002ac6d5c058c9932f350aeef84f6e334f4e01b40be4db537f8c2", - 0 - ], - [ - "00000000000000c9a91d8277c58eab3bfda59d3068142dd54216129e5597ccbd", - 0 - ], - [ - "0000000000000051bff2f64c9078fb346d6a2a209ba5c3ffa0048c6b7027e47f", - 0 - ], - [ - "000000000000df3c366a105ce9ed82a4917c9e19f0736493894feaba2542c7cd", - 0 - ], - [ - "0000000000007c8006959f91675b2dbf6264a1172279c826ae7f561b70e88b12", - 0 - ], - [ - "0000000000015ab3720de7669e8731c84c392aae3509d937b8d883c304e0ca86", - 0 - ], - [ - "0000000000016d7156ee43da389020fb5d30f05e11498c54f7e324561d6a6039", - 0 - ], - [ - "0000000000009c9592f83d63fe39839080ced253e1d71c52bce576f823b7722a", - 0 - ], - [ - "00000000003dee6b438ddf51b831fbedb9d2ee91644aaf5866e3a85c740b3a99", - 0 - ], - [ - "00000000000155f5594d8a3ade605d1504ee9a6f6389f1c4516e974698ebb9e4", - 0 - ], - [ - "000000000001e21adfc306bf4aa2ad90e3c2aa4a43263d1bbdc70bf9f1593416", - 0 - ], - [ - "0000000000008218e84ba7d9850a5c12b77ec5d1348e7cbdfdcb86f8fe929682", - 0 - ], - [ - "00000000000054fb41b42b30fff1738104c3edca6dab47c75e4d3565bc4b9e34", - 0 - ], - [ - "0000000000002763b825c315ba35959dcc1bd8114627949ede769ac2eece8248", - 0 - ], - [ - "00000000000007437044da0baed38a28e2991c6a527f495e91739a8d9c35acbb", - 0 - ], - [ - "000000000000032d74ad8eb0a0be6b39b8e095bd9ca8537da93aae15087aafaf", - 0 - ], - [ - "000000000000006d4025181f5b54cca6d730cc26313817c6529ba9ed62cc83b3", - 0 - ], - [ - "000000001c3ad81ffea0b74d356b6886fd3381506b7c568f96c88a78815ede09", - 0 - ], - [ - "000000000140739d224af1254712d8c4e9fb9082b381baf22c628e459157ce49", - 0 - ], - [ - "000000000306491c835f1a03c8d1e17645435296d3593dacba8ab1a7d9341d38", - 0 - ], - [ - "000000000002b383618b228eb8e4cfcf269ba647b91ac6d60ddd070295709ad1", - 0 - ], - [ - "000000000000c90fc724a76407b4405032474fc8d1649817f7ad238b96856c6a", - 0 - ], - [ - "0000000000002d5a62b323a5f213152dd84e2f415a3c6c28043c0ccaaddb3229", - 0 - ], - [ - "0000000000008c086a21457ba523b682356c760538000a480650cd667a29647a", - 0 - ], - [ - "00000000000007c586d36266aa83d8cc702aa29f31e3cc01c6eeac5a0f5f9887", - 0 - ], - [ - "0000000000013bf175e35603f24758bf8d40b1f5c266e707e3ba4de6fae43a7f", - 0 - ], - [ - "00000000000096841c486983a4333afb2525549abe57e7263723b9782e9cfef1", - 0 - ], - [ - "00000000000012dfd7c4e1f40a1dd4833da2d010a33fc65c053871884146c941", - 0 - ], - [ - "0000000000000b47eb6bc8c6562b5a30cefcf81623a37f6f61cc7497a530eb33", - 0 - ], - [ - "0000000000000021ca4558aeb796f900e581c029d751f89e1a69ae9ba9f6ebb3", - 0 - ], - [ - "00000000000000a5bf9029aebb1956200304ffee31bc09f1323ae412d81fa2b2", - 0 - ], - [ - "0000000000000046f38ada53de3346d8191f69c8f3c0ba9e1950f5bf291989c4", - 0 - ], - [ - "00000000658b5a572ea407ac49a1dccf85d67d0adfc5f613b17fa3fff1d99d51", - 0 - ], - [ - "000000005d6be9ae758c520b0061feee99cd0a231f982cc074e4d0ced1f96952", - 0 - ], - [ - "0000000001aa4671747707d329a94c398c04aaf2268e551ac5d6a7f29ffd4acd", - 0 - ], - [ - "0000000004b441b97963463faca7a933469fabfa3e7b243621159e445e5c192a", - 0 - ], - [ - "0000000002ce8842113bc875330fa77f3b984a90806a5ec0bb73321fef3c76c6", - 0 - ], - [ - "0000000000019761bf9a1c6f679b880e9fb45b3f6dc1accdbdcfce01368c9377", - 0 - ], - [ - "0000000000008a069efd1a7923557be3d9584d307b2555dc0a56d66e74e083e1", - 0 - ], - [ - "000000000001c14cec52030659ef7d45318ca574f1633ef69e9c8c9bd7e45289", - 0 - ], - [ - "0000000000009cfccb8a27f66f1d9ff40c9d47449f78d82fee2465daca582ab7", - 0 - ], - [ - "0000000000007f30cfae7fbb8ff965f70d500b98be202b1dd57ea418500c922d", - 0 - ], - [ - "0000000000002cbd2dbab4352fe4979e0d5afc47f21ef575ae0e3bb620a5478a", - 0 - ], - [ - "000000000000017a872a5c7a15b3cb6e1ecf9e009759848b85c19ca6e7bd16d2", - 0 - ], - [ - "00000000000001ade79216032b49854c966a1061fd3f8c6c56a0d38d0024629e", - 0 - ], - [ - "0000000000000090b8dfe4dde9f9f8d675642db97b3649bd147f60d1fc64cd76", - 0 - ], - [ - "0000000000000109ed5f0d6fc387ad1bc45db1e522f76adce131067fc64440ec", - 0 - ], - [ - "000000000000003105650f0b8e7b4cb466cd32ff5608f59906879aff5cad64a7", - 0 - ], - [ - "0000000000000113d4262419a8aa3a4fe928c0ea81893a2d2ffee5258b2085d8", - 0 - ], - [ - "00000000000000f15b8a196b1c3568d14b5a7856da2fef7a7f5548266582ff28", - 0 - ], - [ - "0000000000000034fb9e91c8b5f7147bd1a4f089d19a266d183df6f8497d1dff", - 0 - ], - [ - "000000000000005e51ad800c9e8ab11abb4b945f5ea86b120fa140c8af6301e0", - 0 - ] -] \ No newline at end of file +] diff --git a/electrum/coins.py b/electrum/coins.py new file mode 100644 index 000000000000..d750aaf646e3 --- /dev/null +++ b/electrum/coins.py @@ -0,0 +1,40 @@ +import sys + +class Coin(object): + @classmethod + def static_header_offset(cls, height): + raise Exception('Not implemented') + + +class Zcoin(Coin): + PRE_MTP_BLOCKS = 117564 + PRE_MTP_HEADER_SIZE = 80 + MTP_HEADER_SIZE = 180 + + @classmethod + def static_header_offset(cls, height): + if height >= cls.PRE_MTP_BLOCKS: + return cls.PRE_MTP_HEADER_SIZE * cls.PRE_MTP_BLOCKS + cls.MTP_HEADER_SIZE * (height - cls.PRE_MTP_BLOCKS) + return cls.PRE_MTP_HEADER_SIZE * height + + def get_header_size(self, header: bytes): + hex_to_int = lambda s: int.from_bytes(s, byteorder='little') + if hex_to_int(header[0:4]) & 0x1000: + return self.MTP_HEADER_SIZE + return self.PRE_MTP_HEADER_SIZE + + @classmethod + def get_header_size_height(cls, height: int): + return cls.MTP_HEADER_SIZE if height >= cls.PRE_MTP_BLOCKS else cls.PRE_MTP_HEADER_SIZE + + def check_header_size(self, header: bytes): + size = self.get_header_size(header) + if len(header) == self.PRE_MTP_HEADER_SIZE: + return True + if len(header) == size: + return True + return False + + +class ZcoinTestnet(Zcoin): + PRE_MTP_BLOCKS = 420 diff --git a/electrum/commands.py b/electrum/commands.py index 4defc0523c6e..e441bb7b6f7c 100644 --- a/electrum/commands.py +++ b/electrum/commands.py @@ -777,8 +777,8 @@ def eval_bool(x: str) -> bool: param_descriptions = { 'privkey': 'Private key. Type \'?\' to get a prompt.', - 'destination': 'Bitcoin address, contact or alias', - 'address': 'Bitcoin address', + 'destination': 'Zcoin address, contact or alias', + 'address': 'Zcoin address', 'seed': 'Seed phrase', 'txid': 'Transaction ID', 'pos': 'Position', @@ -788,8 +788,8 @@ def eval_bool(x: str) -> bool: 'pubkey': 'Public key', 'message': 'Clear text message. Use quotes if it contains spaces.', 'encrypted': 'Encrypted message', - 'amount': 'Amount to be sent (in BTC). Type \'!\' to send the maximum available.', - 'requested_amount': 'Requested amount (in BTC).', + 'amount': 'Amount to be sent (in XZC). Type \'!\' to send the maximum available.', + 'requested_amount': 'Requested amount (in XZC).', 'outputs': 'list of ["address", amount]', 'redeem_script': 'redeem script (hexadecimal)', } @@ -866,10 +866,10 @@ def eval_bool(x: str) -> bool: 'requests_dir': 'directory where a bip70 file will be written.', 'ssl_privkey': 'Path to your SSL private key, needed to sign the request.', 'ssl_chain': 'Chain of SSL certificates, needed for signed requests. Put your certificate at the top and the root CA at the end', - 'url_rewrite': 'Parameters passed to str.replace(), in order to create the r= part of bitcoin: URIs. Example: \"(\'file:///var/www/\',\'https://electrum.org/\')\"', + 'url_rewrite': 'Parameters passed to str.replace(), in order to create the r= part of zcoin: URIs. Example: \"(\'file:///var/www/\',\'https://electrum.org/\')\"', }, 'listrequests':{ - 'url_rewrite': 'Parameters passed to str.replace(), in order to create the r= part of bitcoin: URIs. Example: \"(\'file:///var/www/\',\'https://electrum.org/\')\"', + 'url_rewrite': 'Parameters passed to str.replace(), in order to create the r= part of zcoin: URIs. Example: \"(\'file:///var/www/\',\'https://electrum.org/\')\"', } } diff --git a/electrum/constants.py b/electrum/constants.py index 26504312c86b..3ab08a968d34 100644 --- a/electrum/constants.py +++ b/electrum/constants.py @@ -25,7 +25,7 @@ import os import json - +from . import coins from .util import inv_dict @@ -39,8 +39,8 @@ def read_json(filename, default): return r -GIT_REPO_URL = "https://github.com/spesmilo/electrum" -GIT_REPO_ISSUES_URL = "https://github.com/spesmilo/electrum/issues" +GIT_REPO_URL = "https://github.com/zcoinofficial/electrum-xzc" +GIT_REPO_ISSUES_URL = "https://github.com/zcoinofficial/electrum-xzc/issues" class AbstractNet: @@ -53,11 +53,11 @@ def max_checkpoint(cls) -> int: class BitcoinMainnet(AbstractNet): TESTNET = False - WIF_PREFIX = 0x80 - ADDRTYPE_P2PKH = 0 - ADDRTYPE_P2SH = 5 - SEGWIT_HRP = "bc" - GENESIS = "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f" + WIF_PREFIX = 210 + ADDRTYPE_P2PKH = 82 # 0x52 + ADDRTYPE_P2SH = 7 # 0x07 + SEGWIT_HRP = "xzc" + GENESIS = "4381deb85b1b2c9843c222944b616d997516dcbd6a964e1eaf0def0830695233" DEFAULT_PORTS = {'t': '50001', 's': '50002'} DEFAULT_SERVERS = read_json('servers.json', {}) CHECKPOINTS = read_json('checkpoints.json', []) @@ -77,18 +77,18 @@ class BitcoinMainnet(AbstractNet): 'p2wpkh': 0x04b24746, # zpub 'p2wsh': 0x02aa7ed3, # Zpub } + BIP44_COIN_TYPE = 136 + COIN = coins.Zcoin() XPUB_HEADERS_INV = inv_dict(XPUB_HEADERS) - BIP44_COIN_TYPE = 0 - class BitcoinTestnet(AbstractNet): TESTNET = True - WIF_PREFIX = 0xef - ADDRTYPE_P2PKH = 111 - ADDRTYPE_P2SH = 196 - SEGWIT_HRP = "tb" - GENESIS = "000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943" + WIF_PREFIX = 185 + ADDRTYPE_P2PKH = 65 + ADDRTYPE_P2SH = 178 + SEGWIT_HRP = "txzc" + GENESIS = "1e3487fdb1a7d46dac3e8f3e58339c6eff54abf6aef353485f3ed64250a35e89" DEFAULT_PORTS = {'t': '51001', 's': '51002'} DEFAULT_SERVERS = read_json('servers_testnet.json', {}) CHECKPOINTS = read_json('checkpoints_testnet.json', []) @@ -110,6 +110,7 @@ class BitcoinTestnet(AbstractNet): } XPUB_HEADERS_INV = inv_dict(XPUB_HEADERS) BIP44_COIN_TYPE = 1 + COIN = coins.ZcoinTestnet() class BitcoinRegtest(BitcoinTestnet): diff --git a/electrum/contacts.py b/electrum/contacts.py index 6914b122536c..baee1e4c45f8 100644 --- a/electrum/contacts.py +++ b/electrum/contacts.py @@ -93,7 +93,7 @@ def resolve(self, k): 'type': 'openalias', 'validated': validated } - raise Exception("Invalid Bitcoin address or alias", k) + raise Exception("Invalid Zcoin address or alias", k) def resolve_openalias(self, url): # support email-style addresses, per the OA standard @@ -103,7 +103,7 @@ def resolve_openalias(self, url): except DNSException as e: self.logger.info(f'Error resolving openalias: {repr(e)}') return None - prefix = 'btc' + prefix = 'xzc' for record in records: string = to_string(record.strings[0], 'utf8') if string.startswith('oa1:' + prefix): diff --git a/electrum/currencies.json b/electrum/currencies.json index 657072befd76..39867508ab94 100644 --- a/electrum/currencies.json +++ b/electrum/currencies.json @@ -1,898 +1,12 @@ { - "BitFlyer": [ - "JPY" - ], - "BitPay": [ - "AED", - "AFN", - "ALL", - "AMD", - "ANG", - "AOA", - "ARS", - "AUD", - "AWG", - "AZN", - "BAM", - "BBD", - "BCH", - "BDT", - "BGN", - "BHD", - "BIF", - "BMD", - "BND", - "BOB", - "BRL", - "BSD", - "BTC", - "BTN", - "BWP", - "BZD", - "CAD", - "CDF", - "CHF", - "CLF", - "CLP", - "CNY", - "COP", - "CRC", - "CUP", - "CVE", - "CZK", - "DJF", - "DKK", - "DOP", - "DZD", - "EGP", - "ETB", - "EUR", - "FJD", - "FKP", - "GBP", - "GEL", - "GHS", - "GIP", - "GMD", - "GNF", - "GTQ", - "GYD", - "HKD", - "HNL", - "HRK", - "HTG", - "HUF", - "IDR", - "ILS", - "INR", - "IQD", - "IRR", - "ISK", - "JEP", - "JMD", - "JOD", - "JPY", - "KES", - "KGS", - "KHR", - "KMF", - "KPW", - "KRW", - "KWD", - "KYD", - "KZT", - "LAK", - "LBP", - "LKR", - "LRD", - "LSL", - "LYD", - "MAD", - "MDL", - "MGA", - "MKD", - "MMK", - "MNT", - "MOP", - "MRU", - "MUR", - "MVR", - "MWK", - "MXN", - "MYR", - "MZN", - "NAD", - "NGN", - "NIO", - "NOK", - "NPR", - "NZD", - "OMR", - "PAB", - "PAX", - "PEN", - "PGK", - "PHP", - "PKR", - "PLN", - "PYG", - "QAR", - "RON", - "RSD", - "RUB", - "RWF", - "SAR", - "SBD", - "SCR", - "SDG", - "SEK", - "SGD", - "SHP", - "SLL", - "SOS", - "SRD", - "STN", - "SVC", - "SYP", - "SZL", - "THB", - "TJS", - "TMT", - "TND", - "TOP", - "TRY", - "TTD", - "TWD", - "TZS", - "UAH", - "UGX", - "USD", - "UYU", - "UZS", - "VEF", - "VES", - "VND", - "VUV", - "WST", - "XAF", - "XAG", - "XAU", - "XCD", - "XOF", - "XPF", - "YER", - "ZAR", - "ZMW", - "ZWL" - ], - "BitStamp": [ - "USD", - "EUR" - ], - "Bitbank": [ - "JPY" - ], - "BitcoinAverage": [ - "AED", - "AFN", - "ALL", - "AMD", - "ANG", - "AOA", - "ARS", - "AUD", - "AWG", - "AZN", - "BAM", - "BBD", - "BDT", - "BGN", - "BHD", - "BIF", - "BMD", - "BND", - "BOB", - "BRL", - "BSD", - "BTN", - "BWP", - "BYN", - "BZD", - "CAD", - "CDF", - "CHF", - "CLF", - "CLP", - "CNH", - "CNY", - "COP", - "CRC", - "CUC", - "CUP", - "CVE", - "CZK", - "DJF", - "DKK", - "DOP", - "DZD", - "EGP", - "ERN", - "ETB", - "EUR", - "FJD", - "FKP", - "GBP", - "GEL", - "GGP", - "GHS", - "GIP", - "GMD", - "GNF", - "GTQ", - "GYD", - "HKD", - "HNL", - "HRK", - "HTG", - "HUF", - "IDR", - "ILS", - "IMP", - "INR", - "IQD", - "IRR", - "ISK", - "JEP", - "JMD", - "JOD", - "JPY", - "KES", - "KGS", - "KHR", - "KMF", - "KPW", - "KRW", - "KWD", - "KYD", - "KZT", - "LAK", - "LBP", - "LKR", - "LRD", - "LSL", - "LYD", - "MAD", - "MDL", - "MGA", - "MKD", - "MMK", - "MNT", - "MOP", - "MRO", - "MUR", - "MVR", - "MWK", - "MXN", - "MYR", - "MZN", - "NAD", - "NGN", - "NIO", - "NOK", - "NPR", - "NZD", - "OMR", - "PAB", - "PEN", - "PGK", - "PHP", - "PKR", - "PLN", - "PYG", - "QAR", - "RON", - "RSD", - "RUB", - "RWF", - "SAR", - "SBD", - "SCR", - "SDG", - "SEK", - "SGD", - "SHP", - "SLL", - "SOS", - "SRD", - "SSP", - "STD", - "SVC", - "SYP", - "SZL", - "THB", - "TJS", - "TMT", - "TND", - "TOP", - "TRY", - "TTD", - "TWD", - "TZS", - "UAH", - "UGX", - "USD", - "UYU", - "UZS", - "VES", - "VND", - "VUV", - "WST", - "XAF", - "XAG", - "XAU", - "XCD", - "XDR", - "XOF", - "XPD", - "XPF", - "XPT", - "YER", - "ZAR", - "ZMW", - "ZWL" - ], - "BitcoinVenezuela": [ - "ARS", - "ETH", - "EUR", - "LTC", - "USD", - "VEF", - "XMR" - ], - "Bitcointoyou": [ - "BRL" - ], - "Bitmarket": [ - "PLN" - ], - "Bitso": [ - "MXN" - ], - "Bitvalor": [ - "BRL" - ], - "BlockchainInfo": [ - "AUD", - "BRL", - "CAD", - "CHF", - "CLP", - "CNY", - "DKK", - "EUR", - "GBP", - "HKD", - "INR", - "ISK", - "JPY", - "KRW", - "NZD", - "PLN", - "RUB", - "SEK", - "SGD", - "THB", - "TWD", - "USD" - ], - "Bylls": [ - "CAD" - ], - "CoinCap": [ - "USD" - ], - "CoinDesk": [ - "AED", - "AFN", - "ALL", - "AMD", - "ANG", - "AOA", - "ARS", - "AUD", - "AWG", - "AZN", - "BAM", - "BBD", - "BDT", - "BGN", - "BHD", - "BIF", - "BMD", - "BND", - "BOB", - "BRL", - "BSD", - "BTC", - "BTN", - "BWP", - "BYR", - "BZD", - "CAD", - "CDF", - "CHF", - "CLF", - "CLP", - "CNY", - "COP", - "CRC", - "CUP", - "CVE", - "CZK", - "DJF", - "DKK", - "DOP", - "DZD", - "EEK", - "EGP", - "ERN", - "ETB", - "EUR", - "FJD", - "FKP", - "GBP", - "GEL", - "GHS", - "GIP", - "GMD", - "GNF", - "GTQ", - "GYD", - "HKD", - "HNL", - "HRK", - "HTG", - "HUF", - "IDR", - "ILS", - "INR", - "IQD", - "IRR", - "ISK", - "JEP", - "JMD", - "JOD", - "JPY", - "KES", - "KGS", - "KHR", - "KMF", - "KPW", - "KRW", - "KWD", - "KYD", - "KZT", - "LAK", - "LBP", - "LKR", - "LRD", - "LSL", - "LTL", - "LVL", - "LYD", - "MAD", - "MDL", - "MGA", - "MKD", - "MMK", - "MNT", - "MOP", - "MRO", - "MTL", - "MUR", - "MVR", - "MWK", - "MXN", - "MYR", - "MZN", - "NAD", - "NGN", - "NIO", - "NOK", - "NPR", - "NZD", - "OMR", - "PAB", - "PEN", - "PGK", - "PHP", - "PKR", - "PLN", - "PYG", - "QAR", - "RON", - "RSD", - "RUB", - "RWF", - "SAR", - "SBD", - "SCR", - "SDG", - "SEK", - "SGD", - "SHP", - "SLL", - "SOS", - "SRD", - "STD", - "SVC", - "SYP", - "SZL", - "THB", - "TJS", - "TMT", - "TND", - "TOP", - "TRY", - "TTD", - "TWD", - "TZS", - "UAH", - "UGX", - "USD", - "UYU", - "UZS", - "VEF", - "VND", - "VUV", - "WST", - "XAF", - "XAG", - "XAU", - "XBT", - "XCD", - "XDR", - "XOF", - "XPF", - "YER", - "ZAR", - "ZMK", - "ZMW", - "ZWL" - ], - "CoinGecko": [ - "AED", - "ARS", - "AUD", - "BCH", - "BDT", - "BHD", - "BMD", - "BNB", - "BRL", - "BTC", - "CAD", - "CHF", - "CLP", - "CNY", - "CZK", - "DKK", - "EOS", - "ETH", - "EUR", - "GBP", - "HKD", - "HUF", - "IDR", - "ILS", - "INR", - "JPY", - "KRW", - "KWD", - "LKR", - "LTC", - "MMK", - "MXN", - "MYR", - "NOK", - "NZD", - "PHP", - "PKR", - "PLN", - "RUB", - "SAR", - "SEK", - "SGD", - "THB", - "TRY", - "TWD", - "USD", - "VEF", - "VND", - "XAG", - "XAU", - "XDR", - "XLM", - "XRP", - "ZAR" - ], - "Coinbase": [ - "AED", - "AFN", - "ALL", - "AMD", - "ANG", - "AOA", - "ARS", - "AUD", - "AWG", - "AZN", - "BAM", - "BAT", - "BBD", - "BCH", - "BDT", - "BGN", - "BHD", - "BIF", - "BMD", - "BND", - "BOB", - "BRL", - "BSD", - "BSV", - "BTC", - "BTN", - "BWP", - "BYN", - "BYR", - "BZD", - "CAD", - "CDF", - "CHF", - "CLF", - "CLP", - "CNH", - "CNY", - "COP", - "CRC", - "CUC", - "CVE", - "CZK", - "DJF", - "DKK", - "DOP", - "DZD", - "EEK", - "EGP", - "ERN", - "ETB", - "ETC", - "ETH", - "EUR", - "FJD", - "FKP", - "GBP", - "GEL", - "GGP", - "GHS", - "GIP", - "GMD", - "GNF", - "GTQ", - "GYD", - "HKD", - "HNL", - "HRK", - "HTG", - "HUF", - "IDR", - "ILS", - "IMP", - "INR", - "IQD", - "ISK", - "JEP", - "JMD", - "JOD", - "JPY", - "KES", - "KGS", - "KHR", - "KMF", - "KRW", - "KWD", - "KYD", - "KZT", - "LAK", - "LBP", - "LKR", - "LRD", - "LSL", - "LTC", - "LTL", - "LVL", - "LYD", - "MAD", - "MDL", - "MGA", - "MKD", - "MMK", - "MNT", - "MOP", - "MRO", - "MTL", - "MUR", - "MVR", - "MWK", - "MXN", - "MYR", - "MZN", - "NAD", - "NGN", - "NIO", - "NOK", - "NPR", - "NZD", - "OMR", - "PAB", - "PEN", - "PGK", - "PHP", - "PKR", - "PLN", - "PYG", - "QAR", - "RON", - "RSD", - "RUB", - "RWF", - "SAR", - "SBD", - "SCR", - "SEK", - "SGD", - "SHP", - "SLL", - "SOS", - "SRD", - "SSP", - "STD", - "SVC", - "SZL", - "THB", - "TJS", - "TMT", - "TND", - "TOP", - "TRY", - "TTD", - "TWD", - "TZS", - "UAH", - "UGX", - "USD", - "UYU", - "UZS", - "VEF", - "VND", - "VUV", - "WST", - "XAF", - "XAG", - "XAU", - "XCD", - "XDR", - "XOF", - "XPD", - "XPF", - "XPT", - "YER", - "ZAR", - "ZEC", - "ZMK", - "ZMW", - "ZRX", - "ZWL" - ], - "Kraken": [ - "CAD", - "EUR", - "GBP", - "JPY", - "USD" - ], - "LocalBitcoins": [ - "AED", - "ARS", - "AUD", - "BAM", - "BDT", - "BGN", - "BOB", - "BRL", - "BWP", - "BYN", - "CAD", - "CHF", - "CLP", - "CNY", - "COP", - "CRC", - "CZK", - "DKK", - "DOP", - "EGP", - "ETH", - "EUR", - "GBP", - "GEL", - "GHS", - "GTQ", - "HKD", - "HNL", - "HRK", - "HUF", - "IDR", - "ILS", - "INR", - "IRR", - "JOD", - "JPY", - "KES", - "KRW", - "KZT", - "LKR", - "LTC", - "MAD", - "MXN", - "MYR", - "NGN", - "NOK", - "NZD", - "OMR", - "PAB", - "PEN", - "PHP", - "PKR", - "PLN", - "QAR", - "RON", - "RSD", - "RUB", - "RWF", - "SAR", - "SEK", - "SGD", - "SZL", - "THB", - "TRY", - "TTD", - "TWD", - "TZS", - "UAH", - "UGX", - "USD", - "UYU", - "VES", - "VND", - "XAF", - "XMR", - "XRP", - "ZAR" - ], - "MercadoBitcoin": [ - "BRL" - ], - "NegocieCoins": [ - "BRL" - ], - "TheRockTrading": [ - "EUR" - ], - "Zaif": [ - "JPY" - ], - "itBit": [] -} \ No newline at end of file + "CryptoCompare": [ + "USD", + "EUR", + "THB", + "BTC", + "ETH" + ], + "TDAX": [ + "THB" + ] +} diff --git a/electrum/daemon.py b/electrum/daemon.py index dbe6dff9a9c3..17bbdef033b8 100644 --- a/electrum/daemon.py +++ b/electrum/daemon.py @@ -300,7 +300,7 @@ def run_cmdline(self, config_options): path = standardize_path(path) wallet = self.wallets.get(path) if wallet is None: - return {'error': 'Wallet "%s" is not loaded. Use "electrum daemon load_wallet"'%os.path.basename(path) } + return {'error': 'Wallet "%s" is not loaded. Use "electrum-xzc daemon load_wallet"'%os.path.basename(path) } else: wallet = None # arguments passed to function @@ -345,7 +345,7 @@ def init_gui(self, config, plugins): gui_name = config.get('gui', 'qt') if gui_name in ['lite', 'classic']: gui_name = 'qt' - gui = __import__('electrum.gui.' + gui_name, fromlist=['electrum']) + gui = __import__('electrum_xzc.gui.' + gui_name, fromlist=['electrum_xzc']) self.gui = gui.ElectrumGui(config, self, plugins) try: self.gui.main() diff --git a/electrum/electrum b/electrum/electrum-xzc similarity index 100% rename from electrum/electrum rename to electrum/electrum-xzc diff --git a/electrum/exchange_rate.py b/electrum/exchange_rate.py index d19a7dcd0148..66ef0402cd81 100644 --- a/electrum/exchange_rate.py +++ b/electrum/exchange_rate.py @@ -23,7 +23,7 @@ DEFAULT_ENABLED = False DEFAULT_CURRENCY = "EUR" -DEFAULT_EXCHANGE = "CoinGecko" # default exchange should ideally provide historical rates +DEFAULT_EXCHANGE = "CryptoCompare" # default exchange should ideally provide historical rates # See https://en.wikipedia.org/wiki/ISO_4217 @@ -32,7 +32,8 @@ 'JOD': 3, 'JPY': 0, 'KMF': 0, 'KRW': 0, 'KWD': 3, 'LYD': 3, 'MGA': 1, 'MRO': 1, 'OMR': 3, 'PYG': 0, 'RWF': 0, 'TND': 3, 'UGX': 0, 'UYI': 0, 'VND': 0, - 'VUV': 0, 'XAF': 0, 'XAU': 4, 'XOF': 0, 'XPF': 0} + 'VUV': 0, 'XAF': 0, 'XAU': 4, 'XOF': 0, 'XPF': 0, + 'BTC': 5, 'ETH': 4} class ExchangeBase(Logger): @@ -142,13 +143,37 @@ async def get_currencies(self): return sorted([str(a) for (a, b) in rates.items() if b is not None and len(a)==3]) +class CryptoCompare(ExchangeBase): + + async def get_rates(self,ccy): + json = await self.get_json('min-api.cryptocompare.com', '/data/price?fsym=XZC&tsyms=USD,EUR,THB,BTC,ETH') + return {'USD': Decimal(json['USD']), 'EUR': Decimal(json['EUR']), 'THB': Decimal(json['THB']), 'BTC': Decimal(json['BTC']), 'ETH': Decimal(json['ETH'])} + + def history_ccys(self): + return ['USD', 'EUR', 'THB', 'BTC', 'ETH'] + + async def request_history(self, ccy): + query = '/data/histoday?fsym=XZC&tsym=%s&limit=2000&aggregate=1' % ccy + json = await self.get_json('min-api.cryptocompare.com', query) + history = json['Data'] + return dict([(time.strftime('%Y-%m-%d', time.localtime(t['time'])), t['close']) + for t in history]) + + +class TDAX(ExchangeBase): + + async def get_rates(self,ccy): + json = await self.get_json('api.tdax.com', '/marketcap') + return {'THB': Decimal(json['XZC_THB']['avg24hr'])} + + class BitcoinAverage(ExchangeBase): # note: historical rates used to be freely available # but this is no longer the case. see #5188 async def get_rates(self, ccy): json = await self.get_json('apiv2.bitcoinaverage.com', '/indices/global/ticker/short') - return dict([(r.replace("BTC", ""), Decimal(json[r]['last'])) + return dict([(r.replace("XZC", ""), Decimal(json[r]['last'])) for r in json if r != 'timestamp']) @@ -163,8 +188,8 @@ class BitcoinVenezuela(ExchangeBase): async def get_rates(self, ccy): json = await self.get_json('api.bitcoinvenezuela.com', '/') - rates = [(r, json['BTC'][r]) for r in json['BTC'] - if json['BTC'][r] is not None] # Giving NULL for LTC + rates = [(r, json['XZC'][r]) for r in json['XZC'] + if json['XZC'][r] is not None] # Giving NULL for LTC return dict(rates) def history_ccys(self): @@ -172,8 +197,8 @@ def history_ccys(self): async def request_history(self, ccy): json = await self.get_json('api.bitcoinvenezuela.com', - "/historical/index.php?coin=BTC") - return json[ccy +'_BTC'] + "/historical/index.php?coin=XZC") + return json[ccy +'_XZC'] class Bitbank(ExchangeBase): @@ -248,7 +273,7 @@ class Coinbase(ExchangeBase): async def get_rates(self, ccy): json = await self.get_json('api.coinbase.com', - '/v2/exchange-rates?currency=BTC') + '/v2/exchange-rates?currency=XZC') return {ccy: Decimal(rate) for (ccy, rate) in json["data"]["rates"].items()} @@ -333,7 +358,7 @@ class Kraken(ExchangeBase): async def get_rates(self, ccy): ccys = ['EUR', 'USD', 'CAD', 'GBP', 'JPY'] - pairs = ['XBT%s' % c for c in ccys] + pairs = ['XZC%s' % c for c in ccys] json = await self.get_json('api.kraken.com', '/0/public/Ticker?pair=%s' % ','.join(pairs)) return dict((k[-3:], Decimal(float(v['c'][0]))) @@ -388,7 +413,7 @@ async def request_history(self, ccy): class Zaif(ExchangeBase): async def get_rates(self, ccy): - json = await self.get_json('api.zaif.jp', '/api/1/last_price/btc_jpy') + json = await self.get_json('api.zaif.jp', '/api/1/last_price/xzc_jpy') return {'JPY': Decimal(json['last_price'])} diff --git a/electrum/gui/icons/electrum-xzc.png b/electrum/gui/icons/electrum-xzc.png new file mode 100644 index 0000000000000000000000000000000000000000..7e38614fd8ea709ed9050b117830a3d6077b2e35 GIT binary patch literal 9565 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 literal 0 HcmV?d00001 diff --git a/electrum/gui/icons/electrum.png b/electrum/gui/icons/electrum.png deleted file mode 100644 index 2ab3260e042b6b9891a9148589c33f4c0e87a628..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24089 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 14: - domain = "org.electrum" + domain = "org.electrum_xzc" stype = "externalType" extRecord = NdefRecord.createExternal(domain, stype, data) else: # Creating the NdefRecord manually: extRecord = NdefRecord( NdefRecord.TNF_EXTERNAL_TYPE, - "org.electrum:externalType", + "org.electrum_xzc:externalType", '', data) return extRecord @@ -213,7 +213,7 @@ def _nfc_enable_ndef_exchange(self, data): # Create record ndef_record = NdefRecord( NdefRecord.TNF_MIME_MEDIA, - 'org.electrum.kivy', '', data) + 'org.electrum_xzc.kivy', '', data) # Create message ndef_message = NdefMessage([ndef_record]) diff --git a/electrum/gui/kivy/tools/bitcoin_intent.xml b/electrum/gui/kivy/tools/bitcoin_intent.xml index f433f72c1ef8..b0e66c27628e 100644 --- a/electrum/gui/kivy/tools/bitcoin_intent.xml +++ b/electrum/gui/kivy/tools/bitcoin_intent.xml @@ -3,5 +3,5 @@ - + diff --git a/electrum/gui/kivy/tools/buildozer.spec b/electrum/gui/kivy/tools/buildozer.spec index 6016506debfd..54dad6fc71a1 100644 --- a/electrum/gui/kivy/tools/buildozer.spec +++ b/electrum/gui/kivy/tools/buildozer.spec @@ -1,13 +1,13 @@ [app] # (str) Title of your application -title = Electrum +title = Electrum-XZC # (str) Package name -package.name = Electrum +package.name = Electrum_XZC # (str) Package domain (needed for android/ios packaging) -package.domain = org.electrum +package.domain = org.electrum_xzc # (str) Source code where the main.py live source.dir = . @@ -20,16 +20,16 @@ source.exclude_exts = spec # (list) List of directory to exclude (let empty to not exclude anything) source.exclude_dirs = bin, build, dist, contrib, - electrum/tests, - electrum/gui/qt, - electrum/gui/kivy/tools, - electrum/gui/kivy/theming/light + electrum_xzc/tests, + electrum_xzc/gui/qt, + electrum_xzc/gui/kivy/tools, + electrum_xzc/gui/kivy/theming/light # (list) List of exclusions using pattern matching source.exclude_patterns = Makefile,setup* # (str) Application versioning (method 1) version.regex = APK_VERSION = '(.*)' -version.filename = %(source.dir)s/electrum/version.py +version.filename = %(source.dir)s/electrum_xzc/version.py # (str) Application versioning (method 2) #version = 1.9.8 @@ -46,10 +46,10 @@ requirements = # (str) Presplash of the application #presplash.filename = %(source.dir)s/gui/kivy/theming/splash.png -presplash.filename = %(source.dir)s/electrum/gui/icons/electrum_presplash.png +presplash.filename = %(source.dir)s/electrum_xzc/gui/icons/electrum_presplash.png # (str) Icon of the application -icon.filename = %(source.dir)s/electrum/gui/icons/electrum_launcher.png +icon.filename = %(source.dir)s/electrum_xzc/gui/icons/electrum_launcher.png # (str) Supported orientation (one of landscape, portrait or all) orientation = portrait @@ -101,11 +101,11 @@ android.sdk_path = /opt/android/android-sdk # (list) List of Java files to add to the android project (can be java or a # directory containing the files) -android.add_src = electrum/gui/kivy/data/java-classes/ +android.add_src = electrum_xzc/gui/kivy/data/java-classes/ android.gradle_dependencies = me.dm7.barcodescanner:zxing:1.9.8 -android.add_activities = org.electrum.qr.SimpleScannerActivity +android.add_activities = org.electrum_xzc.qr.SimpleScannerActivity # (str) python-for-android branch to use, if not master, useful to try # not yet merged features. @@ -119,7 +119,7 @@ android.add_activities = org.electrum.qr.SimpleScannerActivity #android.ouya.icon.filename = %(source.dir)s/data/ouya_icon.png # (str) XML file to include as an intent filters in tag -android.manifest.intent_filters = electrum/gui/kivy/tools/bitcoin_intent.xml +android.manifest.intent_filters = electrum_xzc/gui/kivy/tools/bitcoin_intent.xml # (str) launchMode to set for the main activity android.manifest.launch_mode = singleTask diff --git a/electrum/gui/kivy/uix/context_menu.py b/electrum/gui/kivy/uix/context_menu.py index af63108b0922..400cd0cdcdc7 100644 --- a/electrum/gui/kivy/uix/context_menu.py +++ b/electrum/gui/kivy/uix/context_menu.py @@ -8,7 +8,7 @@ from kivy.factory import Factory from kivy.clock import Clock -from electrum.gui.kivy.i18n import _ +from electrum_xzc.gui.kivy.i18n import _ Builder.load_string(''' diff --git a/electrum/gui/kivy/uix/dialogs/__init__.py b/electrum/gui/kivy/uix/dialogs/__init__.py index 352675a373e0..13ba19684f0e 100644 --- a/electrum/gui/kivy/uix/dialogs/__init__.py +++ b/electrum/gui/kivy/uix/dialogs/__init__.py @@ -6,7 +6,7 @@ from kivy.uix.recycleview import RecycleView from kivy.uix.boxlayout import BoxLayout -from electrum.gui.kivy.i18n import _ +from electrum_xzc.gui.kivy.i18n import _ diff --git a/electrum/gui/kivy/uix/dialogs/addresses.py b/electrum/gui/kivy/uix/dialogs/addresses.py index b1fc40cd000b..7d26337030b2 100644 --- a/electrum/gui/kivy/uix/dialogs/addresses.py +++ b/electrum/gui/kivy/uix/dialogs/addresses.py @@ -98,8 +98,8 @@ ''') -from electrum.gui.kivy.i18n import _ -from electrum.gui.kivy.uix.context_menu import ContextMenu +from electrum_xzc.gui.kivy.i18n import _ +from electrum_xzc.gui.kivy.uix.context_menu import ContextMenu class AddressesDialog(Factory.Popup): diff --git a/electrum/gui/kivy/uix/dialogs/bump_fee_dialog.py b/electrum/gui/kivy/uix/dialogs/bump_fee_dialog.py index 21f3ca2b7068..0d467376f23d 100644 --- a/electrum/gui/kivy/uix/dialogs/bump_fee_dialog.py +++ b/electrum/gui/kivy/uix/dialogs/bump_fee_dialog.py @@ -3,7 +3,7 @@ from kivy.properties import ObjectProperty from kivy.lang import Builder -from electrum.gui.kivy.i18n import _ +from electrum_xzc.gui.kivy.i18n import _ Builder.load_string(''' diff --git a/electrum/gui/kivy/uix/dialogs/crash_reporter.py b/electrum/gui/kivy/uix/dialogs/crash_reporter.py index f8c087d93493..ea541a6139f3 100644 --- a/electrum/gui/kivy/uix/dialogs/crash_reporter.py +++ b/electrum/gui/kivy/uix/dialogs/crash_reporter.py @@ -10,10 +10,10 @@ from kivy.uix.label import Label from kivy.utils import platform -from electrum.gui.kivy.i18n import _ +from electrum_xzc.gui.kivy.i18n import _ -from electrum.base_crash_reporter import BaseCrashReporter -from electrum.logging import Logger +from electrum_xzc.base_crash_reporter import BaseCrashReporter +from electrum_xzc.logging import Logger Builder.load_string(''' diff --git a/electrum/gui/kivy/uix/dialogs/fee_dialog.py b/electrum/gui/kivy/uix/dialogs/fee_dialog.py index 7c6293973ad1..8a211473b8e3 100644 --- a/electrum/gui/kivy/uix/dialogs/fee_dialog.py +++ b/electrum/gui/kivy/uix/dialogs/fee_dialog.py @@ -3,7 +3,7 @@ from kivy.properties import ObjectProperty from kivy.lang import Builder -from electrum.gui.kivy.i18n import _ +from electrum_xzc.gui.kivy.i18n import _ Builder.load_string(''' diff --git a/electrum/gui/kivy/uix/dialogs/fx_dialog.py b/electrum/gui/kivy/uix/dialogs/fx_dialog.py index 4d4a99d5ddd4..c354cfa71442 100644 --- a/electrum/gui/kivy/uix/dialogs/fx_dialog.py +++ b/electrum/gui/kivy/uix/dialogs/fx_dialog.py @@ -79,7 +79,7 @@ from kivy.uix.widget import Widget from kivy.clock import Clock -from electrum.gui.kivy.i18n import _ +from electrum_xzc.gui.kivy.i18n import _ from functools import partial class FxDialog(Factory.Popup): diff --git a/electrum/gui/kivy/uix/dialogs/installwizard.py b/electrum/gui/kivy/uix/dialogs/installwizard.py index 5f7ae0c7ba7e..6f660c01b1d5 100644 --- a/electrum/gui/kivy/uix/dialogs/installwizard.py +++ b/electrum/gui/kivy/uix/dialogs/installwizard.py @@ -15,8 +15,8 @@ from kivy.clock import Clock from kivy.utils import platform -from electrum.base_wizard import BaseWizard -from electrum.util import is_valid_email +from electrum_xzc.base_wizard import BaseWizard +from electrum_xzc.util import is_valid_email from . import EventsDialog @@ -31,7 +31,7 @@ Builder.load_string(''' #:import Window kivy.core.window.Window -#:import _ electrum.gui.kivy.i18n._ +#:import _ electrum_xzc.gui.kivy.i18n._ @@ -41,8 +41,8 @@ background_color: (1, 1, 1, 1) if self.focus else (0.454, 0.698, 0.909, 1) foreground_color: (0.31, 0.31, 0.31, 1) if self.focus else (0.835, 0.909, 0.972, 1) hint_text_color: self.foreground_color - background_active: 'atlas://electrum/gui/kivy/theming/light/create_act_text_active' - background_normal: 'atlas://electrum/gui/kivy/theming/light/create_act_text_active' + background_active: 'atlas://electrum_xzc/gui/kivy/theming/light/create_act_text_active' + background_normal: 'atlas://electrum_xzc/gui/kivy/theming/light/create_act_text_active' size_hint_y: None height: '48sp' @@ -91,7 +91,7 @@ size_hint: 1, None height: self.texture_size[1] if self.opacity else 0 font_size: '33sp' - font_name: 'electrum/gui/kivy/data/fonts/tron/Tr2n.ttf' + font_name: 'electrum_xzc/gui/kivy/data/fonts/tron/Tr2n.ttf' GridLayout: cols: 1 id: crcontent @@ -300,7 +300,7 @@ font_size: '18dp' text_size: self.width - dp(24), self.height - dp(12) color: .1, .1, .1, 1 - background_normal: 'atlas://electrum/gui/kivy/theming/light/white_bg_round_top' + background_normal: 'atlas://electrum_xzc/gui/kivy/theming/light/white_bg_round_top' background_down: self.background_normal size_hint_y: None @@ -446,7 +446,7 @@ id: scan height: '48sp' on_release: root.scan_xpub() - icon: 'atlas://electrum/gui/kivy/theming/light/camera' + icon: 'atlas://electrum_xzc/gui/kivy/theming/light/camera' size_hint: 1, None WizardButton: text: _('Paste') @@ -758,8 +758,8 @@ class RestoreSeedDialog(WizardDialog): def __init__(self, wizard, **kwargs): super(RestoreSeedDialog, self).__init__(wizard, **kwargs) self._test = kwargs['test'] - from electrum.mnemonic import Mnemonic - from electrum.old_mnemonic import words as old_wordlist + from electrum_xzc.mnemonic import Mnemonic + from electrum_xzc.old_mnemonic import words as old_wordlist self.words = set(Mnemonic('en').wordlist).union(set(old_wordlist)) self.ids.text_input_seed.text = test_seed if is_test else '' self.message = _('Please type your seed phrase using the virtual keyboard.') @@ -970,7 +970,7 @@ def protected_on_finished(): app = App.get_running_app() app.show_info_bubble( - text=msg, icon='atlas://electrum/gui/kivy/theming/light/important', + text=msg, icon='atlas://electrum_xzc/gui/kivy/theming/light/important', pos=Window.center, width='200sp', arrow_pos=None, modal=True) t = threading.Thread(target = target) t.start() diff --git a/electrum/gui/kivy/uix/dialogs/invoices.py b/electrum/gui/kivy/uix/dialogs/invoices.py index 4fb986df1038..b73efc2a14e3 100644 --- a/electrum/gui/kivy/uix/dialogs/invoices.py +++ b/electrum/gui/kivy/uix/dialogs/invoices.py @@ -17,7 +17,7 @@ amount: '' status: '' date: '' - icon: 'atlas://electrum/gui/kivy/theming/light/important' + icon: 'atlas://electrum_xzc/gui/kivy/theming/light/important' Image: id: icon source: root.icon @@ -76,10 +76,10 @@ ''') from kivy.properties import BooleanProperty -from electrum.gui.kivy.i18n import _ -from electrum.util import format_time -from electrum.paymentrequest import PR_UNPAID, PR_PAID, PR_UNKNOWN, PR_EXPIRED -from electrum.gui.kivy.uix.context_menu import ContextMenu +from electrum_xzc.gui.kivy.i18n import _ +from electrum_xzc.util import format_time +from electrum_xzc.paymentrequest import PR_UNPAID, PR_PAID, PR_UNKNOWN, PR_EXPIRED +from electrum_xzc.gui.kivy.uix.context_menu import ContextMenu invoice_text = { PR_UNPAID:_('Pending'), @@ -88,10 +88,10 @@ PR_EXPIRED:_('Expired') } pr_icon = { - PR_UNPAID: 'atlas://electrum/gui/kivy/theming/light/important', - PR_UNKNOWN: 'atlas://electrum/gui/kivy/theming/light/important', - PR_PAID: 'atlas://electrum/gui/kivy/theming/light/confirmed', - PR_EXPIRED: 'atlas://electrum/gui/kivy/theming/light/close' + PR_UNPAID: 'atlas://electrum_xzc/gui/kivy/theming/light/important', + PR_UNKNOWN: 'atlas://electrum_xzc/gui/kivy/theming/light/important', + PR_PAID: 'atlas://electrum_xzc/gui/kivy/theming/light/confirmed', + PR_EXPIRED: 'atlas://electrum_xzc/gui/kivy/theming/light/close' } diff --git a/electrum/gui/kivy/uix/dialogs/label_dialog.py b/electrum/gui/kivy/uix/dialogs/label_dialog.py index 974cd0667a8c..f847f08f2bad 100644 --- a/electrum/gui/kivy/uix/dialogs/label_dialog.py +++ b/electrum/gui/kivy/uix/dialogs/label_dialog.py @@ -21,8 +21,8 @@ pos_hint: {'center_y':.5} text:'' multiline: False - background_normal: 'atlas://electrum/gui/kivy/theming/light/tab_btn' - background_active: 'atlas://electrum/gui/kivy/theming/light/textinput_active' + background_normal: 'atlas://electrum_xzc/gui/kivy/theming/light/tab_btn' + background_active: 'atlas://electrum_xzc/gui/kivy/theming/light/textinput_active' hint_text_color: self.foreground_color foreground_color: 1, 1, 1, 1 font_size: '16dp' diff --git a/electrum/gui/kivy/uix/dialogs/nfc_transaction.py b/electrum/gui/kivy/uix/dialogs/nfc_transaction.py index 981f208c4dfc..1b91289ad889 100644 --- a/electrum/gui/kivy/uix/dialogs/nfc_transaction.py +++ b/electrum/gui/kivy/uix/dialogs/nfc_transaction.py @@ -12,7 +12,7 @@ def __init__(self, **kwargs): # Delayed Init global NFCSCanner if NFCSCanner is None: - from electrum.gui.kivy.nfc_scanner import NFCScanner + from electrum_xzc.gui.kivy.nfc_scanner import NFCScanner self.scanner = NFCSCanner super(NFCTransactionDialog, self).__init__(**kwargs) diff --git a/electrum/gui/kivy/uix/dialogs/password_dialog.py b/electrum/gui/kivy/uix/dialogs/password_dialog.py index 665ab136e6df..6ae7b6f1ace3 100644 --- a/electrum/gui/kivy/uix/dialogs/password_dialog.py +++ b/electrum/gui/kivy/uix/dialogs/password_dialog.py @@ -5,8 +5,8 @@ from decimal import Decimal from kivy.clock import Clock -from electrum.util import InvalidPassword -from electrum.gui.kivy.i18n import _ +from electrum_xzc.util import InvalidPassword +from electrum_xzc.gui.kivy.i18n import _ Builder.load_string(''' diff --git a/electrum/gui/kivy/uix/dialogs/qr_dialog.py b/electrum/gui/kivy/uix/dialogs/qr_dialog.py index 0685dfa9d58f..096f70430bff 100644 --- a/electrum/gui/kivy/uix/dialogs/qr_dialog.py +++ b/electrum/gui/kivy/uix/dialogs/qr_dialog.py @@ -4,7 +4,7 @@ from kivy.app import App from kivy.clock import Clock -from electrum.gui.kivy.i18n import _ +from electrum_xzc.gui.kivy.i18n import _ Builder.load_string(''' diff --git a/electrum/gui/kivy/uix/dialogs/qr_scanner.py b/electrum/gui/kivy/uix/dialogs/qr_scanner.py index 8a565f0195fe..3cc5a9b633b8 100644 --- a/electrum/gui/kivy/uix/dialogs/qr_scanner.py +++ b/electrum/gui/kivy/uix/dialogs/qr_scanner.py @@ -2,7 +2,7 @@ from kivy.factory import Factory from kivy.lang import Builder -Factory.register('QRScanner', module='electrum.gui.kivy.qr_scanner') +Factory.register('QRScanner', module='electrum_xzc.gui.kivy.qr_scanner') class QrScannerDialog(Factory.AnimatedPopup): @@ -33,7 +33,7 @@ def on_complete(self, x): #separator_color: .89, .89, .89, 1 #separator_height: '1.2dp' #title_color: .437, .437, .437, 1 - #background: 'atlas://electrum/gui/kivy/theming/light/dialog' + #background: 'atlas://electrum_xzc/gui/kivy/theming/light/dialog' on_activate: qrscr.start() qrscr.size = self.size diff --git a/electrum/gui/kivy/uix/dialogs/question.py b/electrum/gui/kivy/uix/dialogs/question.py index 4b5e085fa9af..4ecf52bf70b5 100644 --- a/electrum/gui/kivy/uix/dialogs/question.py +++ b/electrum/gui/kivy/uix/dialogs/question.py @@ -6,7 +6,7 @@ from kivy.uix.label import Label from kivy.uix.widget import Widget -from electrum.gui.kivy.i18n import _ +from electrum_xzc.gui.kivy.i18n import _ Builder.load_string(''' diff --git a/electrum/gui/kivy/uix/dialogs/requests.py b/electrum/gui/kivy/uix/dialogs/requests.py index 5aadae0d0f14..564a04358cdf 100644 --- a/electrum/gui/kivy/uix/dialogs/requests.py +++ b/electrum/gui/kivy/uix/dialogs/requests.py @@ -17,7 +17,7 @@ amount: '' status: '' date: '' - icon: 'atlas://electrum/gui/kivy/theming/light/important' + icon: 'atlas://electrum_xzc/gui/kivy/theming/light/important' Image: id: icon source: root.icon @@ -74,16 +74,16 @@ ''') from kivy.properties import BooleanProperty -from electrum.gui.kivy.i18n import _ -from electrum.util import format_time -from electrum.paymentrequest import PR_UNPAID, PR_PAID, PR_UNKNOWN, PR_EXPIRED -from electrum.gui.kivy.uix.context_menu import ContextMenu +from electrum_xzc.gui.kivy.i18n import _ +from electrum_xzc.util import format_time +from electrum_xzc.paymentrequest import PR_UNPAID, PR_PAID, PR_UNKNOWN, PR_EXPIRED +from electrum_xzc.gui.kivy.uix.context_menu import ContextMenu pr_icon = { - PR_UNPAID: 'atlas://electrum/gui/kivy/theming/light/important', - PR_UNKNOWN: 'atlas://electrum/gui/kivy/theming/light/important', - PR_PAID: 'atlas://electrum/gui/kivy/theming/light/confirmed', - PR_EXPIRED: 'atlas://electrum/gui/kivy/theming/light/close' + PR_UNPAID: 'atlas://electrum_xzc/gui/kivy/theming/light/important', + PR_UNKNOWN: 'atlas://electrum_xzc/gui/kivy/theming/light/important', + PR_PAID: 'atlas://electrum_xzc/gui/kivy/theming/light/confirmed', + PR_EXPIRED: 'atlas://electrum_xzc/gui/kivy/theming/light/close' } request_text = { PR_UNPAID: _('Pending'), diff --git a/electrum/gui/kivy/uix/dialogs/settings.py b/electrum/gui/kivy/uix/dialogs/settings.py index dddd501be4b9..58dac8dc7b01 100644 --- a/electrum/gui/kivy/uix/dialogs/settings.py +++ b/electrum/gui/kivy/uix/dialogs/settings.py @@ -3,17 +3,17 @@ from kivy.properties import ObjectProperty from kivy.lang import Builder -from electrum.util import base_units_list -from electrum.i18n import languages -from electrum.gui.kivy.i18n import _ -from electrum.plugin import run_hook -from electrum import coinchooser +from electrum_xzc.util import base_units_list +from electrum_xzc.i18n import languages +from electrum_xzc.gui.kivy.i18n import _ +from electrum_xzc.plugin import run_hook +from electrum_xzc import coinchooser from .choice_dialog import ChoiceDialog Builder.load_string(''' #:import partial functools.partial -#:import _ electrum.gui.kivy.i18n._ +#:import _ electrum_xzc.gui.kivy.i18n._ id: settings @@ -44,7 +44,7 @@ SettingsItem: bu: app.base_unit title: _('Denomination') + ': ' + self.bu - description: _("Base unit for Bitcoin amounts.") + description: _("Base unit for Zcoin amounts.") action: partial(root.unit_dialog, self) CardSeparator SettingsItem: @@ -178,7 +178,7 @@ def callback(popup): net_params = net_params._replace(proxy=proxy) network.run_from_another_thread(network.set_parameters(net_params)) item.status = self.proxy_status() - popup = Builder.load_file('electrum/gui/kivy/uix/ui_screens/proxy.kv') + popup = Builder.load_file('electrum_xzc/gui/kivy/uix/ui_screens/proxy.kv') popup.ids.mode.text = proxy.get('mode') if proxy else 'None' popup.ids.host.text = proxy.get('host') if proxy else '' popup.ids.port.text = proxy.get('port') if proxy else '' diff --git a/electrum/gui/kivy/uix/dialogs/tx_dialog.py b/electrum/gui/kivy/uix/dialogs/tx_dialog.py index d65571f8e6d7..014ccd3a7c1e 100644 --- a/electrum/gui/kivy/uix/dialogs/tx_dialog.py +++ b/electrum/gui/kivy/uix/dialogs/tx_dialog.py @@ -11,11 +11,11 @@ from kivy.uix.button import Button from .question import Question -from electrum.gui.kivy.i18n import _ +from electrum_xzc.gui.kivy.i18n import _ -from electrum.util import InvalidPassword -from electrum.address_synchronizer import TX_HEIGHT_LOCAL -from electrum.wallet import CannotBumpFee +from electrum_xzc.util import InvalidPassword +from electrum_xzc.address_synchronizer import TX_HEIGHT_LOCAL +from electrum_xzc.wallet import CannotBumpFee Builder.load_string(''' @@ -96,7 +96,7 @@ IconButton: size_hint: 0.5, None height: '48dp' - icon: 'atlas://electrum/gui/kivy/theming/light/qrcode' + icon: 'atlas://electrum_xzc/gui/kivy/theming/light/qrcode' on_release: root.show_qr() Button: size_hint: 0.5, None @@ -247,7 +247,7 @@ def do_broadcast(self): self.app.broadcast(self.tx) def show_qr(self): - from electrum.bitcoin import base_encode, bfh + from electrum_xzc.bitcoin import base_encode, bfh raw_tx = str(self.tx) text = bfh(raw_tx) text = base_encode(text, base=43) diff --git a/electrum/gui/kivy/uix/dialogs/wallets.py b/electrum/gui/kivy/uix/dialogs/wallets.py index d7b0469bf551..6e4dfec78325 100644 --- a/electrum/gui/kivy/uix/dialogs/wallets.py +++ b/electrum/gui/kivy/uix/dialogs/wallets.py @@ -5,7 +5,7 @@ from kivy.properties import ObjectProperty from kivy.lang import Builder -from electrum.util import base_units +from electrum_xzc.util import base_units from ...i18n import _ from .label_dialog import LabelDialog diff --git a/electrum/gui/kivy/uix/screens.py b/electrum/gui/kivy/uix/screens.py index 093a982fb41a..b9fbbb1de8a1 100644 --- a/electrum/gui/kivy/uix/screens.py +++ b/electrum/gui/kivy/uix/screens.py @@ -18,19 +18,19 @@ from kivy.factory import Factory from kivy.utils import platform -from electrum.util import profiler, parse_URI, format_time, InvalidPassword, NotEnoughFunds, Fiat -from electrum import bitcoin -from electrum.transaction import TxOutput, Transaction, tx_from_str -from electrum.util import send_exception_to_crash_reporter, parse_URI, InvalidBitcoinURI -from electrum.paymentrequest import PR_UNPAID, PR_PAID, PR_UNKNOWN, PR_EXPIRED -from electrum.plugin import run_hook -from electrum.wallet import InternalAddressCorruption -from electrum import simple_config +from electrum_xzc.util import profiler, parse_URI, format_time, InvalidPassword, NotEnoughFunds, Fiat +from electrum_xzc import bitcoin +from electrum_xzc.transaction import TxOutput, Transaction, tx_from_str +from electrum_xzc.util import send_exception_to_crash_reporter, parse_URI, InvalidBitcoinURI +from electrum_xzc.paymentrequest import PR_UNPAID, PR_PAID, PR_UNKNOWN, PR_EXPIRED +from electrum_xzc.plugin import run_hook +from electrum_xzc.wallet import InternalAddressCorruption +from electrum_xzc import simple_config from .context_menu import ContextMenu -from electrum.gui.kivy.i18n import _ +from electrum_xzc.gui.kivy.i18n import _ class HistoryRecycleView(RecycleView): pass @@ -64,7 +64,7 @@ def update(self): @profiler def load_screen(self): - self.screen = Builder.load_file('electrum/gui/kivy/uix/ui_screens/' + self.kvname + '.kv') + self.screen = Builder.load_file('electrum_xzc/gui/kivy/uix/ui_screens/' + self.kvname + '.kv') self.add_widget(self.screen) self.loaded = True self.update() @@ -136,7 +136,7 @@ def callback(text): def get_card(self, tx_hash, tx_mined_status, value, balance): status, status_str = self.app.wallet.get_tx_status(tx_hash, tx_mined_status) - icon = "atlas://electrum/gui/kivy/theming/light/" + TX_ICONS[status] + icon = "atlas://electrum_xzc/gui/kivy/theming/light/" + TX_ICONS[status] label = self.app.wallet.get_label(tx_hash) if tx_hash else _('Pruned transaction outputs') ri = {} ri['screen'] = self @@ -217,7 +217,7 @@ def do_save(self): # it should be already saved return # save address as invoice - from electrum.paymentrequest import make_unsigned_request, PaymentRequest + from electrum_xzc.paymentrequest import make_unsigned_request, PaymentRequest req = {'address':self.screen.address, 'memo':self.screen.message} amount = self.app.get_amount(self.screen.amount) if self.screen.amount else 0 req['amount'] = amount @@ -375,7 +375,7 @@ def on_address(self, addr): Clock.schedule_once(lambda dt: self.update_qr()) def get_URI(self): - from electrum.util import create_bip21_uri + from electrum_xzc.util import create_bip21_uri amount = self.screen.amount if amount: a, u = self.screen.amount.split() diff --git a/electrum/gui/kivy/uix/ui_screens/about.kv b/electrum/gui/kivy/uix/ui_screens/about.kv index e542b557eb0d..25663a344000 100644 --- a/electrum/gui/kivy/uix/ui_screens/about.kv +++ b/electrum/gui/kivy/uix/ui_screens/about.kv @@ -1,7 +1,7 @@ -#:import VERSION electrum.version.ELECTRUM_VERSION +#:import VERSION electrum_xzc.version.ELECTRUM_VERSION Popup: - title: _("About Electrum") + title: _("About Electrum-XZC") BoxLayout: orientation: 'vertical' spacing: '10dp' diff --git a/electrum/gui/kivy/uix/ui_screens/history.kv b/electrum/gui/kivy/uix/ui_screens/history.kv index 04988a70fad9..98b6eaa644cd 100644 --- a/electrum/gui/kivy/uix/ui_screens/history.kv +++ b/electrum/gui/kivy/uix/ui_screens/history.kv @@ -1,6 +1,6 @@ -#:import _ electrum.gui.kivy.i18n._ +#:import _ electrum_xzc.gui.kivy.i18n._ #:import Factory kivy.factory.Factory -#:set font_light 'electrum/gui/kivy/data/fonts/Roboto-Condensed.ttf' +#:set font_light 'electrum_xzc/gui/kivy/data/fonts/Roboto-Condensed.ttf' #:set btc_symbol chr(171) #:set mbtc_symbol chr(187) @@ -17,7 +17,7 @@ - icon: 'atlas://electrum/gui/kivy/theming/light/important' + icon: 'atlas://electrum_xzc/gui/kivy/theming/light/important' message: '' is_mine: True amount: '--' diff --git a/electrum/gui/kivy/uix/ui_screens/receive.kv b/electrum/gui/kivy/uix/ui_screens/receive.kv index 574e16c00e6d..017362b7dda3 100644 --- a/electrum/gui/kivy/uix/ui_screens/receive.kv +++ b/electrum/gui/kivy/uix/ui_screens/receive.kv @@ -1,8 +1,8 @@ -#:import _ electrum.gui.kivy.i18n._ +#:import _ electrum_xzc.gui.kivy.i18n._ #:import Decimal decimal.Decimal #:set btc_symbol chr(171) #:set mbtc_symbol chr(187) -#:set font_light 'electrum/gui/kivy/data/fonts/Roboto-Condensed.ttf' +#:set font_light 'electrum_xzc/gui/kivy/data/fonts/Roboto-Condensed.ttf' @@ -62,7 +62,7 @@ ReceiveScreen: height: blue_bottom.item_height spacing: '5dp' Image: - source: 'atlas://electrum/gui/kivy/theming/light/globe' + source: 'atlas://electrum_xzc/gui/kivy/theming/light/globe' size_hint: None, None size: '22dp', '22dp' pos_hint: {'center_y': .5} @@ -79,7 +79,7 @@ ReceiveScreen: height: blue_bottom.item_height spacing: '5dp' Image: - source: 'atlas://electrum/gui/kivy/theming/light/calculator' + source: 'atlas://electrum_xzc/gui/kivy/theming/light/calculator' opacity: 0.7 size_hint: None, None size: '22dp', '22dp' @@ -99,7 +99,7 @@ ReceiveScreen: height: blue_bottom.item_height spacing: '5dp' Image: - source: 'atlas://electrum/gui/kivy/theming/light/pen' + source: 'atlas://electrum_xzc/gui/kivy/theming/light/pen' size_hint: None, None size: '22dp', '22dp' pos_hint: {'center_y': .5} @@ -111,7 +111,7 @@ ReceiveScreen: size_hint: 1, None height: '48dp' IconButton: - icon: 'atlas://electrum/gui/kivy/theming/light/save' + icon: 'atlas://electrum_xzc/gui/kivy/theming/light/save' size_hint: 0.6, None height: '48dp' on_release: s.parent.do_save() @@ -126,7 +126,7 @@ ReceiveScreen: height: '48dp' on_release: s.parent.do_copy() IconButton: - icon: 'atlas://electrum/gui/kivy/theming/light/share' + icon: 'atlas://electrum_xzc/gui/kivy/theming/light/share' size_hint: 0.6, None height: '48dp' on_release: s.parent.do_share() diff --git a/electrum/gui/kivy/uix/ui_screens/send.kv b/electrum/gui/kivy/uix/ui_screens/send.kv index 88cbcc3a988b..9128a3977e82 100644 --- a/electrum/gui/kivy/uix/ui_screens/send.kv +++ b/electrum/gui/kivy/uix/ui_screens/send.kv @@ -1,8 +1,8 @@ -#:import _ electrum.gui.kivy.i18n._ +#:import _ electrum_xzc.gui.kivy.i18n._ #:import Decimal decimal.Decimal #:set btc_symbol chr(171) #:set mbtc_symbol chr(187) -#:set font_light 'electrum/gui/kivy/data/fonts/Roboto-Condensed.ttf' +#:set font_light 'electrum_xzc/gui/kivy/data/fonts/Roboto-Condensed.ttf' SendScreen: @@ -25,7 +25,7 @@ SendScreen: height: blue_bottom.item_height spacing: '5dp' Image: - source: 'atlas://electrum/gui/kivy/theming/light/globe' + source: 'atlas://electrum_xzc/gui/kivy/theming/light/globe' size_hint: None, None size: '22dp', '22dp' pos_hint: {'center_y': .5} @@ -43,7 +43,7 @@ SendScreen: height: blue_bottom.item_height spacing: '5dp' Image: - source: 'atlas://electrum/gui/kivy/theming/light/calculator' + source: 'atlas://electrum_xzc/gui/kivy/theming/light/calculator' opacity: 0.7 size_hint: None, None size: '22dp', '22dp' @@ -63,7 +63,7 @@ SendScreen: height: blue_bottom.item_height spacing: '5dp' Image: - source: 'atlas://electrum/gui/kivy/theming/light/pen' + source: 'atlas://electrum_xzc/gui/kivy/theming/light/pen' size_hint: None, None size: '22dp', '22dp' pos_hint: {'center_y': .5} @@ -80,7 +80,7 @@ SendScreen: height: blue_bottom.item_height spacing: '5dp' Image: - source: 'atlas://electrum/gui/kivy/theming/light/star_big_inactive' + source: 'atlas://electrum_xzc/gui/kivy/theming/light/star_big_inactive' opacity: 0.7 size_hint: None, None size: '22dp', '22dp' @@ -96,7 +96,7 @@ SendScreen: IconButton: size_hint: 0.6, 1 on_release: s.parent.do_save() - icon: 'atlas://electrum/gui/kivy/theming/light/save' + icon: 'atlas://electrum_xzc/gui/kivy/theming/light/save' Button: text: _('Invoices') size_hint: 1, 1 @@ -108,7 +108,7 @@ SendScreen: id: qr size_hint: 0.6, 1 on_release: Clock.schedule_once(lambda dt: app.scan_qr(on_complete=app.on_qr)) - icon: 'atlas://electrum/gui/kivy/theming/light/camera' + icon: 'atlas://electrum_xzc/gui/kivy/theming/light/camera' BoxLayout: size_hint: 1, None height: '48dp' diff --git a/electrum/gui/kivy/uix/ui_screens/status.kv b/electrum/gui/kivy/uix/ui_screens/status.kv index 77bfd7611bcc..b81ccd4b5532 100644 --- a/electrum/gui/kivy/uix/ui_screens/status.kv +++ b/electrum/gui/kivy/uix/ui_screens/status.kv @@ -1,5 +1,5 @@ Popup: - title: "Electrum" + title: "Electrum-XZC" confirmed: 0 unconfirmed: 0 unmatured: 0 diff --git a/electrum/gui/qt/__init__.py b/electrum/gui/qt/__init__.py index 0fa9095b1303..530d2e0dfb3e 100644 --- a/electrum/gui/qt/__init__.py +++ b/electrum/gui/qt/__init__.py @@ -42,13 +42,13 @@ from PyQt5.QtCore import QObject, pyqtSignal, QTimer import PyQt5.QtCore as QtCore -from electrum.i18n import _, set_language -from electrum.plugin import run_hook -from electrum.base_wizard import GoBack -from electrum.util import (UserCancelled, profiler, +from electrum_xzc.i18n import _, set_language +from electrum_xzc.plugin import run_hook +from electrum_xzc.base_wizard import GoBack +from electrum_xzc.util import (UserCancelled, profiler, WalletFileException, BitcoinException, get_new_wallet_name) -from electrum.wallet import Wallet, Abstract_Wallet -from electrum.logging import Logger +from electrum_xzc.wallet import Wallet, Abstract_Wallet +from electrum_xzc.logging import Logger from .installwizard import InstallWizard, WalletAlreadyOpenInMemory @@ -94,7 +94,7 @@ def __init__(self, config, daemon, plugins): if hasattr(QtCore.Qt, "AA_ShareOpenGLContexts"): QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_ShareOpenGLContexts) if hasattr(QGuiApplication, 'setDesktopFileName'): - QGuiApplication.setDesktopFileName('electrum.desktop') + QGuiApplication.setDesktopFileName('electrum-xzc.desktop') self.gui_thread = threading.current_thread() self.config = config self.daemon = daemon @@ -103,7 +103,7 @@ def __init__(self, config, daemon, plugins): self.efilter = OpenFileEventFilter(self.windows) self.app = QElectrumApplication(sys.argv) self.app.installEventFilter(self.efilter) - self.app.setWindowIcon(read_QIcon("electrum.png")) + self.app.setWindowIcon(read_QIcon("electrum-xzc.png")) # timer self.timer = QTimer(self.app) self.timer.setSingleShot(False) @@ -116,7 +116,7 @@ def __init__(self, config, daemon, plugins): # init tray self.dark_icon = self.config.get("dark_icon", False) self.tray = QSystemTrayIcon(self.tray_icon(), None) - self.tray.setToolTip('Electrum') + self.tray.setToolTip('Electrum-XZC') self.tray.activated.connect(self.tray_activated) self.build_tray_menu() self.tray.show() @@ -154,7 +154,7 @@ def build_tray_menu(self): submenu.addAction(_("Close"), window.close) m.addAction(_("Dark/Light"), self.toggle_tray_icon) m.addSeparator() - m.addAction(_("Exit Electrum"), self.close) + m.addAction(_("Exit Electrum-XZC"), self.close) def tray_icon(self): if self.dark_icon: diff --git a/electrum/gui/qt/address_dialog.py b/electrum/gui/qt/address_dialog.py index 083d5119797f..41c340d7e38f 100644 --- a/electrum/gui/qt/address_dialog.py +++ b/electrum/gui/qt/address_dialog.py @@ -23,7 +23,7 @@ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -from electrum.i18n import _ +from electrum_xzc.i18n import _ from PyQt5.QtWidgets import QVBoxLayout, QLabel diff --git a/electrum/gui/qt/address_list.py b/electrum/gui/qt/address_list.py index 96436d86d7a2..638b958cc4b1 100644 --- a/electrum/gui/qt/address_list.py +++ b/electrum/gui/qt/address_list.py @@ -29,11 +29,11 @@ from PyQt5.QtGui import QStandardItemModel, QStandardItem, QFont from PyQt5.QtWidgets import QAbstractItemView, QComboBox, QLabel, QMenu -from electrum.i18n import _ -from electrum.util import block_explorer_URL, profiler -from electrum.plugin import run_hook -from electrum.bitcoin import is_address -from electrum.wallet import InternalAddressCorruption +from electrum_xzc.i18n import _ +from electrum_xzc.util import block_explorer_URL, profiler +from electrum_xzc.plugin import run_hook +from electrum_xzc.bitcoin import is_address +from electrum_xzc.wallet import InternalAddressCorruption from .util import MyTreeView, MONOSPACE_FONT, ColorScheme, webopen @@ -176,7 +176,7 @@ def update(self): self.filter() def create_menu(self, position): - from electrum.wallet import Multisig_Wallet + from electrum_xzc.wallet import Multisig_Wallet is_multisig = isinstance(self.wallet, Multisig_Wallet) can_delete = self.wallet.can_delete_address() selected = self.selected_in_column(self.Columns.ADDRESS) diff --git a/electrum/gui/qt/amountedit.py b/electrum/gui/qt/amountedit.py index 8fc63fa1ab82..3a419e673609 100644 --- a/electrum/gui/qt/amountedit.py +++ b/electrum/gui/qt/amountedit.py @@ -8,7 +8,7 @@ from .util import char_width_in_lineedit -from electrum.util import (format_satoshis_plain, decimal_point_to_base_unit_name, +from electrum_xzc.util import (format_satoshis_plain, decimal_point_to_base_unit_name, FEERATE_PRECISION, quantize_feerate) diff --git a/electrum/gui/qt/console.py b/electrum/gui/qt/console.py index 3971ad696ce7..86630893659b 100644 --- a/electrum/gui/qt/console.py +++ b/electrum/gui/qt/console.py @@ -10,8 +10,8 @@ from PyQt5 import QtGui from PyQt5 import QtWidgets -from electrum import util -from electrum.i18n import _ +from electrum_xzc import util +from electrum_xzc.i18n import _ from .util import MONOSPACE_FONT diff --git a/electrum/gui/qt/contact_list.py b/electrum/gui/qt/contact_list.py index d6df01bb50ae..1cbb8d6c8136 100644 --- a/electrum/gui/qt/contact_list.py +++ b/electrum/gui/qt/contact_list.py @@ -29,10 +29,10 @@ from PyQt5.QtCore import Qt, QPersistentModelIndex, QModelIndex from PyQt5.QtWidgets import (QAbstractItemView, QMenu) -from electrum.i18n import _ -from electrum.bitcoin import is_address -from electrum.util import block_explorer_URL -from electrum.plugin import run_hook +from electrum_xzc.i18n import _ +from electrum_xzc.bitcoin import is_address +from electrum_xzc.util import block_explorer_URL +from electrum_xzc.plugin import run_hook from .util import MyTreeView, import_meta_gui, export_meta_gui, webopen diff --git a/electrum/gui/qt/exception_window.py b/electrum/gui/qt/exception_window.py index 49aeaa3c5eb0..6c5fd2dd0f3f 100644 --- a/electrum/gui/qt/exception_window.py +++ b/electrum/gui/qt/exception_window.py @@ -30,10 +30,10 @@ from PyQt5.QtWidgets import (QWidget, QLabel, QPushButton, QTextEdit, QMessageBox, QHBoxLayout, QVBoxLayout) -from electrum.i18n import _ -from electrum.base_crash_reporter import BaseCrashReporter -from electrum.logging import Logger -from electrum import constants +from electrum_xzc.i18n import _ +from electrum_xzc.base_crash_reporter import BaseCrashReporter +from electrum_xzc.logging import Logger +from electrum_xzc import constants from .util import MessageBoxMixin, read_QIcon, WaitingDialog diff --git a/electrum/gui/qt/fee_slider.py b/electrum/gui/qt/fee_slider.py index 25be72b8637a..bedf2b4b6bd6 100644 --- a/electrum/gui/qt/fee_slider.py +++ b/electrum/gui/qt/fee_slider.py @@ -4,7 +4,7 @@ from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QSlider, QToolTip -from electrum.i18n import _ +from electrum_xzc.i18n import _ class FeeSlider(QSlider): diff --git a/electrum/gui/qt/history_list.py b/electrum/gui/qt/history_list.py index 83d41992e1cc..adcb734c0bbb 100644 --- a/electrum/gui/qt/history_list.py +++ b/electrum/gui/qt/history_list.py @@ -38,25 +38,25 @@ QPushButton, QComboBox, QVBoxLayout, QCalendarWidget, QGridLayout) -from electrum.address_synchronizer import TX_HEIGHT_LOCAL -from electrum.i18n import _ -from electrum.util import (block_explorer_URL, profiler, TxMinedInfo, +from electrum_xzc.address_synchronizer import TX_HEIGHT_LOCAL +from electrum_xzc.i18n import _ +from electrum_xzc.util import (block_explorer_URL, profiler, TxMinedInfo, OrderedDictWithIndex, timestamp_to_datetime) -from electrum.logging import get_logger, Logger +from electrum_xzc.logging import get_logger, Logger from .util import (read_QIcon, MONOSPACE_FONT, Buttons, CancelButton, OkButton, filename_field, MyTreeView, AcceptFileDragDrop, WindowModalDialog, CloseButton, webopen) if TYPE_CHECKING: - from electrum.wallet import Abstract_Wallet + from electrum_xzc.wallet import Abstract_Wallet _logger = get_logger(__name__) try: - from electrum.plot import plot_history, NothingToPlotException + from electrum_xzc.plot import plot_history, NothingToPlotException except: _logger.info("could not import electrum.plot. This feature needs matplotlib to be installed.") plot_history = None @@ -693,7 +693,7 @@ def do_export_history(self, file_name, is_csv): for line in lines: transaction.writerow(line) else: - from electrum.util import json_encode + from electrum_xzc.util import json_encode f.write(json_encode(txns)) def text_txid_from_coordinate(self, row, col): diff --git a/electrum/gui/qt/installwizard.py b/electrum/gui/qt/installwizard.py index 7229400424cb..4d72ebfa928a 100644 --- a/electrum/gui/qt/installwizard.py +++ b/electrum/gui/qt/installwizard.py @@ -14,18 +14,18 @@ QVBoxLayout, QLineEdit, QFileDialog, QPushButton, QGridLayout, QSlider, QScrollArea) -from electrum.wallet import Wallet, Abstract_Wallet -from electrum.storage import WalletStorage -from electrum.util import UserCancelled, InvalidPassword, WalletFileException -from electrum.base_wizard import BaseWizard, HWD_SETUP_DECRYPT_WALLET, GoBack -from electrum.i18n import _ +from electrum_xzc.wallet import Wallet, Abstract_Wallet +from electrum_xzc.storage import WalletStorage +from electrum_xzc.util import UserCancelled, InvalidPassword, WalletFileException +from electrum_xzc.base_wizard import BaseWizard, HWD_SETUP_DECRYPT_WALLET, GoBack +from electrum_xzc.i18n import _ from .seed_dialog import SeedLayout, KeysLayout from .network_dialog import NetworkChoiceLayout from .util import (MessageBoxMixin, Buttons, icon_path, ChoicesLayout, WWLabel, InfoButton, char_width_in_lineedit) from .password_dialog import PasswordLayout, PasswordLayoutForHW, PW_NEW -from electrum.plugin import run_hook +from electrum_xzc.plugin import run_hook MSG_ENTER_PASSWORD = _("Choose a password to encrypt your wallet keys.") + '\n'\ + _("Leave this field empty if you want to disable encryption.") @@ -118,7 +118,7 @@ class InstallWizard(QDialog, MessageBoxMixin, BaseWizard): def __init__(self, config, app, plugins): QDialog.__init__(self, None) BaseWizard.__init__(self, config, plugins) - self.setWindowTitle('Electrum - ' + _('Install Wizard')) + self.setWindowTitle('Electrum-XZC - ' + _('Install Wizard')) self.app = app self.config = config self.setMinimumSize(600, 400) @@ -160,7 +160,7 @@ def __init__(self, config, app, plugins): hbox.setStretchFactor(scroll, 1) outer_vbox.addLayout(hbox) outer_vbox.addLayout(Buttons(self.back_button, self.next_button)) - self.set_icon('electrum.png') + self.set_icon('electrum-xzc.png') self.show() self.raise_() self.refresh_gui() # Need for QT on MacOSX. Lame. @@ -187,7 +187,7 @@ def select_storage(self, path, get_wallet_from_daemon) -> Tuple[str, Optional[Wa hbox2.addWidget(self.pw_e) hbox2.addStretch() vbox.addLayout(hbox2) - self.set_layout(vbox, title=_('Electrum wallet')) + self.set_layout(vbox, title=_('Electrum-XZC wallet')) self.temp_storage = WalletStorage(path, manual_upgrades=True) wallet_folder = os.path.dirname(self.temp_storage.path) diff --git a/electrum/gui/qt/invoice_list.py b/electrum/gui/qt/invoice_list.py index 11d9b1121986..a01916d94ad6 100644 --- a/electrum/gui/qt/invoice_list.py +++ b/electrum/gui/qt/invoice_list.py @@ -29,8 +29,8 @@ from PyQt5.QtGui import QStandardItemModel, QStandardItem, QFont from PyQt5.QtWidgets import QHeaderView, QMenu -from electrum.i18n import _ -from electrum.util import format_time +from electrum_xzc.i18n import _ +from electrum_xzc.util import format_time from .util import (MyTreeView, read_QIcon, MONOSPACE_FONT, PR_UNPAID, pr_tooltips, import_meta_gui, export_meta_gui, pr_icons) diff --git a/electrum/gui/qt/main_window.py b/electrum/gui/qt/main_window.py index 4d539a3eb7dd..68247b62910e 100644 --- a/electrum/gui/qt/main_window.py +++ b/electrum/gui/qt/main_window.py @@ -47,13 +47,13 @@ QShortcut, QMainWindow, QCompleter, QInputDialog, QWidget, QMenu, QSizePolicy, QStatusBar) -import electrum -from electrum import (keystore, simple_config, ecc, constants, util, bitcoin, commands, +import electrum_xzc +from electrum_xzc import (keystore, simple_config, ecc, constants, util, bitcoin, commands, coinchooser, paymentrequest) -from electrum.bitcoin import COIN, is_address, TYPE_ADDRESS -from electrum.plugin import run_hook -from electrum.i18n import _ -from electrum.util import (format_time, format_satoshis, format_fee_satoshis, +from electrum_xzc.bitcoin import COIN, is_address, TYPE_ADDRESS +from electrum_xzc.plugin import run_hook +from electrum_xzc.i18n import _ +from electrum_xzc.util import (format_time, format_satoshis, format_fee_satoshis, format_satoshis_plain, NotEnoughFunds, UserCancelled, NoDynamicFeeEstimates, profiler, export_meta, import_meta, bh2u, bfh, InvalidPassword, @@ -62,16 +62,16 @@ UnknownBaseUnit, DECIMAL_POINT_DEFAULT, UserFacingException, get_new_wallet_name, send_exception_to_crash_reporter, InvalidBitcoinURI) -from electrum.transaction import Transaction, TxOutput -from electrum.address_synchronizer import AddTransactionException -from electrum.wallet import (Multisig_Wallet, CannotBumpFee, Abstract_Wallet, +from electrum_xzc.transaction import Transaction, TxOutput +from electrum_xzc.address_synchronizer import AddTransactionException +from electrum_xzc.wallet import (Multisig_Wallet, CannotBumpFee, Abstract_Wallet, sweep_preparations, InternalAddressCorruption) -from electrum.version import ELECTRUM_VERSION -from electrum.network import Network, TxBroadcastError, BestEffortRequestFailed -from electrum.exchange_rate import FxThread -from electrum.simple_config import SimpleConfig -from electrum.logging import Logger -from electrum.paymentrequest import PR_PAID +from electrum_xzc.version import ELECTRUM_VERSION +from electrum_xzc.network import Network, TxBroadcastError, BestEffortRequestFailed +from electrum_xzc.exchange_rate import FxThread +from electrum_xzc.simple_config import SimpleConfig +from electrum_xzc.logging import Logger +from electrum_xzc.paymentrequest import PR_PAID from .exception_window import Exception_Hook from .amountedit import AmountEdit, BTCAmountEdit, MyLineEdit, FeerateEdit @@ -194,7 +194,7 @@ def add_optional_tab(tabs, tab, icon, description, name): if self.config.get("is_maximized"): self.showMaximized() - self.setWindowIcon(read_QIcon("electrum.png")) + self.setWindowIcon(read_QIcon("electrum-xzc.png")) self.init_menubar() wrtabs = weakref.proxy(tabs) @@ -237,9 +237,9 @@ def add_optional_tab(tabs, tab, icon, description, name): self.fetch_alias() # If the option hasn't been set yet - if config.get('check_updates') is None: - choice = self.question(title="Electrum - " + _("Enable update check"), - msg=_("For security reasons we advise that you always use the latest version of Electrum.") + " " + + if config.get('check_updates', False) is None: + choice = self.question(title="Electrum-XZC - " + _("Enable update check"), + msg=_("For security reasons we advise that you always use the latest version of Electrum-XZC.") + " " + _("Would you like to be notified when there is a newer version of Electrum available?")) config.set_key('check_updates', bool(choice), save=True) @@ -446,7 +446,7 @@ 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-XZC Testnet" if constants.net.TESTNET else "Electrum-XZC" title = '%s %s - %s' % (name, ELECTRUM_VERSION, self.wallet.basename()) extra = [self.wallet.storage.get('wallet_type', '?')] @@ -463,8 +463,8 @@ def warn_if_watching_only(self): if self.wallet.is_watching_only(): msg = ' '.join([ _("This wallet is watching-only."), - _("This means you will not be able to spend Bitcoins with it."), - _("Make sure you own the seed phrase or the private keys, before you request Bitcoins to be sent to this wallet.") + _("This means you will not be able to spend Zcoins with it."), + _("Make sure you own the seed phrase or the private keys, before you request Zcoins to be sent to this wallet.") ]) self.show_warning(msg, title=_('Watch-only wallet')) @@ -481,7 +481,7 @@ def warn_if_testnet(self): msg = ''.join([ _("You are in testnet mode."), ' ', _("Testnet coins are worthless."), '\n', - _("Testnet is separate from the main Bitcoin network. It is used for testing.") + _("Testnet is separate from the main Zcoin network. It is used for testing.") ]) cb = QCheckBox(_("Don't show this again.")) cb_checked = False @@ -650,13 +650,13 @@ def donate_to_server(self): self.show_error(_('No donation address for this server')) def show_about(self): - QMessageBox.about(self, "Electrum", + QMessageBox.about(self, "Electrum-XZC", (_("Version")+" %s" % ELECTRUM_VERSION + "\n\n" + - _("Electrum's focus is speed, with low resource usage and simplifying Bitcoin.") + " " + + _("Electrum's focus is speed, with low resource usage and simplifying Zcoin.") + " " + _("You do not need to perform regular backups, because your wallet can be " "recovered from a secret phrase that you can memorize or write on paper.") + " " + _("Startup times are instant because it operates in conjunction with high-performance " - "servers that handle the most complicated parts of the Bitcoin system.") + "\n\n" + + "servers that handle the most complicated parts of the Zcoin system.") + "\n\n" + _("Uses icons from the Icons8 icon pack (icons8.com)."))) def show_update_check(self, version=None): @@ -669,7 +669,7 @@ def show_report_bug(self): _("Before reporting a bug, upgrade to the most recent version of Electrum (latest release or git HEAD), and include the version number in your report."), _("Try to explain not only what the bug is, but how it occurs.") ]) - self.show_message(msg, title="Electrum - " + _("Reporting Bugs"), rich_text=True) + self.show_message(msg, title="Electrum-XZC - " + _("Reporting Bugs"), rich_text=True) def notify_transactions(self): if self.tx_notification_queue.qsize() == 0: @@ -709,9 +709,9 @@ def notify(self, message): if self.tray: try: # this requires Qt 5.9 - self.tray.showMessage("Electrum", message, read_QIcon("electrum_dark_icon"), 20000) + self.tray.showMessage("Electrum-XZC", message, read_QIcon("electrum_dark_icon"), 20000) except TypeError: - self.tray.showMessage("Electrum", message, QSystemTrayIcon.Information, 20000) + self.tray.showMessage("Electrum-XZC", message, QSystemTrayIcon.Information, 20000) @@ -902,7 +902,7 @@ def create_receive_tab(self): self.receive_address_e = ButtonsLineEdit() self.receive_address_e.addCopyButton(self.app) self.receive_address_e.setReadOnly(True) - msg = _('Bitcoin address where the payment should be received. Note that each payment request uses a different Bitcoin address.') + msg = _('Zcoin address where the payment should be received. Note that each payment request uses a different Zcoin address.') self.receive_address_label = HelpLabel(_('Receiving address'), msg) self.receive_address_e.textChanged.connect(self.update_receive_qr) self.receive_address_e.textChanged.connect(self.update_receive_address_styling) @@ -933,7 +933,7 @@ def create_receive_tab(self): msg = ' '.join([ _('Expiration date of your request.'), _('This information is seen by the recipient if you send them a signed payment request.'), - _('Expired requests have to be deleted manually from your list, in order to free the corresponding Bitcoin addresses.'), + _('Expired requests have to be deleted manually from your list, in order to free the corresponding Zcoin addresses.'), _('The bitcoin address never expires and will always be part of this electrum wallet.'), ]) grid.addWidget(HelpLabel(_('Request expires'), msg), 3, 0) @@ -1176,7 +1176,7 @@ def create_send_tab(self): self.amount_e = BTCAmountEdit(self.get_decimal_point) self.payto_e = PayToEdit(self) msg = _('Recipient of the funds.') + '\n\n'\ - + _('You may enter a Bitcoin address, a label from your list of contacts (a list of completions will be proposed), or an alias (email-like address that forwards to a Bitcoin address)') + + _('You may enter a Zcoin address, a label from your list of contacts (a list of completions will be proposed), or an alias (email-like address that forwards to a Zcoin address)') payto_label = HelpLabel(_('Pay to'), msg) grid.addWidget(payto_label, 1, 0) grid.addWidget(self.payto_e, 1, 1, 1, -1) @@ -1222,7 +1222,7 @@ def create_send_tab(self): hbox.addStretch(1) grid.addLayout(hbox, 4, 4) - msg = _('Bitcoin transactions are in general not free. A transaction fee is paid by the sender of the funds.') + '\n\n'\ + msg = _('Zcoin transactions are in general not free. A transaction fee is paid by the sender of the funds.') + '\n\n'\ + _('The amount of fee can be decided freely by the sender. However, transactions with low fees take more time to be processed.') + '\n\n'\ + _('A suggested fee is automatically added to this field. You may override it. The suggested fee increases with the size of the transaction.') self.fee_e_label = HelpLabel(_('Fee'), msg) @@ -1626,10 +1626,10 @@ def check_send_tab_outputs_and_show_errors(self, outputs) -> bool: for o in outputs: if o.address is None: - self.show_error(_('Bitcoin Address is None')) + self.show_error(_('Zcoin Address is None')) return True if o.type == TYPE_ADDRESS and not bitcoin.is_address(o.address): - self.show_error(_('Invalid Bitcoin Address')) + self.show_error(_('Invalid Zcoin Address')) return True if o.value is None: self.show_error(_('Invalid Amount')) @@ -1670,11 +1670,13 @@ def do_send(self, preview = False): tx.set_rbf(True) if fee < self.wallet.relayfee() * tx.estimated_size() / 1000: - self.show_error('\n'.join([ - _("This transaction requires a higher fee, or it will not be propagated by your current server"), - _("Try to raise your transaction fee, or use a server with a lower relay fee.") - ])) - return + msgText = '\n'.join([ + _("Your current server requires a higher fee to successfully propagate this transaction."), + _("It is recomended to raise your transaction fee or use a server with a lower relay fee."), + _("Try sending the transaction with the current fee?") + ]) + if not self.question(msgText): + return if preview: self.show_transaction(tx, tx_desc) @@ -2078,7 +2080,7 @@ def update_console(self): 'plugins': self.gui_object.plugins, 'window': self, 'config': self.config, - 'electrum': electrum, + 'electrum_xzc': electrum_xzc, 'daemon': self.gui_object.daemon, 'util': util, 'bitcoin': bitcoin, @@ -2137,7 +2139,7 @@ def update_buttons_on_seed(self): self.send_button.setVisible(not self.wallet.is_watching_only()) def change_password_dialog(self): - from electrum.storage import STO_EV_XPUB_PW + from electrum_xzc.storage import STO_EV_XPUB_PW if self.wallet.get_available_storage_encryption_version() == STO_EV_XPUB_PW: from .password_dialog import ChangePasswordDialogForHW d = ChangePasswordDialogForHW(self, self.wallet) @@ -2340,7 +2342,7 @@ def do_sign(self, address, message, signature, password): address = address.text().strip() message = message.toPlainText().strip() if not bitcoin.is_address(address): - self.show_message(_('Invalid Bitcoin address.')) + self.show_message(_('Invalid Zcoin address.')) return if self.wallet.is_watching_only(): self.show_message(_('This is a watching-only wallet.')) @@ -2368,7 +2370,7 @@ def do_verify(self, address, message, signature): address = address.text().strip() message = message.toPlainText().strip().encode('utf-8') if not bitcoin.is_address(address): - self.show_message(_('Invalid Bitcoin address.')) + self.show_message(_('Invalid Zcoin address.')) return try: # This can throw on invalid base64 @@ -2497,7 +2499,7 @@ def password_dialog(self, msg=None, parent=None): return d.run() def tx_from_text(self, txt): - from electrum.transaction import tx_from_str + from electrum_xzc.transaction import tx_from_str try: tx = tx_from_str(txt) return Transaction(tx) @@ -2506,7 +2508,7 @@ def tx_from_text(self, txt): return def read_tx_from_qrcode(self): - from electrum import qrscanner + from electrum_xzc import qrscanner try: data = qrscanner.scan_barcode(self.config.get_video_device()) except BaseException as e: @@ -2515,7 +2517,7 @@ def read_tx_from_qrcode(self): if not data: return # if the user scanned a bitcoin URI - if str(data).startswith("bitcoin:"): + if str(data).startswith("zcoin:"): self.pay_to_URI(data) return # else if the user scanned an offline signed tx @@ -2555,7 +2557,7 @@ def do_process_from_file(self): self.show_transaction(tx) def do_process_from_txid(self): - from electrum import transaction + from electrum_xzc import transaction txid, ok = QInputDialog.getText(self, _('Lookup transaction'), _('Transaction ID') + ':') if ok and txid: txid = str(txid).strip() @@ -2822,7 +2824,7 @@ def settings_dialog(self): lang_help = _('Select which language is used in the GUI (after restart).') lang_label = HelpLabel(_('Language') + ':', lang_help) lang_combo = QComboBox() - from electrum.i18n import languages + from electrum_xzc.i18n import languages lang_combo.addItems(list(languages.values())) lang_keys = list(languages.keys()) lang_cur_setting = self.config.get("language", '') @@ -2996,7 +2998,7 @@ def on_be(x): block_ex_combo.currentIndexChanged.connect(on_be) gui_widgets.append((block_ex_label, block_ex_combo)) - from electrum import qrscanner + from electrum_xzc import qrscanner system_cameras = qrscanner._find_system_cameras() qr_combo = QComboBox() qr_combo.addItem("Default","default") diff --git a/electrum/gui/qt/network_dialog.py b/electrum/gui/qt/network_dialog.py index 92e3733d561e..c91602826bf8 100644 --- a/electrum/gui/qt/network_dialog.py +++ b/electrum/gui/qt/network_dialog.py @@ -34,11 +34,11 @@ QTabWidget, QWidget, QLabel) from PyQt5.QtGui import QFontMetrics -from electrum.i18n import _ -from electrum import constants, blockchain -from electrum.interface import serialize_server, deserialize_server -from electrum.network import Network -from electrum.logging import get_logger +from electrum_xzc.i18n import _ +from electrum_xzc import constants, blockchain +from electrum_xzc.interface import serialize_server, deserialize_server +from electrum_xzc.network import Network +from electrum_xzc.logging import get_logger from .util import Buttons, CloseButton, HelpButton, read_QIcon, char_width_in_lineedit diff --git a/electrum/gui/qt/password_dialog.py b/electrum/gui/qt/password_dialog.py index 851bbc5aaf4e..9d94f01665b7 100644 --- a/electrum/gui/qt/password_dialog.py +++ b/electrum/gui/qt/password_dialog.py @@ -30,8 +30,8 @@ from PyQt5.QtGui import QPixmap from PyQt5.QtWidgets import QLineEdit, QLabel, QGridLayout, QVBoxLayout, QCheckBox -from electrum.i18n import _ -from electrum.plugin import run_hook +from electrum_xzc.i18n import _ +from electrum_xzc.plugin import run_hook from .util import icon_path, WindowModalDialog, OkButton, CancelButton, Buttons diff --git a/electrum/gui/qt/paytoedit.py b/electrum/gui/qt/paytoedit.py index ecb0ff47c147..c29f35af5659 100644 --- a/electrum/gui/qt/paytoedit.py +++ b/electrum/gui/qt/paytoedit.py @@ -28,11 +28,11 @@ from PyQt5.QtGui import QFontMetrics -from electrum import bitcoin -from electrum.util import bfh -from electrum.transaction import TxOutput, push_script -from electrum.bitcoin import opcodes -from electrum.logging import Logger +from electrum_xzc import bitcoin +from electrum_xzc.util import bfh +from electrum_xzc.transaction import TxOutput, push_script +from electrum_xzc.bitcoin import opcodes +from electrum_xzc.logging import Logger from .qrtextedit import ScanQRTextEdit from .completion_text_edit import CompletionTextEdit @@ -129,7 +129,7 @@ def check_text(self): self.payto_address = None if len(lines) == 1: data = lines[0] - if data.startswith("bitcoin:"): + if data.startswith("zcoin:"): self.scan_f(data) return try: @@ -203,7 +203,7 @@ def update_size(self): def qr_input(self): data = super(PayToEdit,self).qr_input() - if data.startswith("bitcoin:"): + if data.startswith("zcoin:"): self.scan_f(data) # TODO: update fee diff --git a/electrum/gui/qt/qrcodewidget.py b/electrum/gui/qt/qrcodewidget.py index 4e08e5db19da..52d539949895 100644 --- a/electrum/gui/qt/qrcodewidget.py +++ b/electrum/gui/qt/qrcodewidget.py @@ -6,8 +6,8 @@ from PyQt5.QtWidgets import ( QApplication, QVBoxLayout, QTextEdit, QHBoxLayout, QPushButton, QWidget) -import electrum -from electrum.i18n import _ +import electrum_xzc +from electrum_xzc.i18n import _ from .util import WindowModalDialog @@ -102,7 +102,7 @@ def __init__(self, data, parent=None, title = "", show_text=False): hbox = QHBoxLayout() hbox.addStretch(1) - config = electrum.get_config() + config = electrum_xzc.get_config() if config: filename = os.path.join(config.path, "qrcode.png") diff --git a/electrum/gui/qt/qrtextedit.py b/electrum/gui/qt/qrtextedit.py index a7c087937f0e..febffc727773 100644 --- a/electrum/gui/qt/qrtextedit.py +++ b/electrum/gui/qt/qrtextedit.py @@ -1,7 +1,7 @@ from PyQt5.QtWidgets import QFileDialog -from electrum.i18n import _ -from electrum.plugin import run_hook +from electrum_xzc.i18n import _ +from electrum_xzc.plugin import run_hook from .util import ButtonsTextEdit, MessageBoxMixin, ColorScheme @@ -54,7 +54,7 @@ def file_input(self): self.setText(data) def qr_input(self): - from electrum import qrscanner, get_config + from electrum_xzc import qrscanner, get_config try: data = qrscanner.scan_barcode(get_config().get_video_device()) except BaseException as e: diff --git a/electrum/gui/qt/qrwindow.py b/electrum/gui/qt/qrwindow.py index eca450eb3bd6..6dbc51efbeeb 100644 --- a/electrum/gui/qt/qrwindow.py +++ b/electrum/gui/qt/qrwindow.py @@ -28,7 +28,7 @@ from .qrcodewidget import QRCodeWidget -from electrum.i18n import _ +from electrum_xzc.i18n import _ class QR_Window(QWidget): @@ -36,7 +36,7 @@ class QR_Window(QWidget): def __init__(self, win): QWidget.__init__(self) self.win = win - self.setWindowTitle('Electrum - '+_('Payment Request')) + self.setWindowTitle('Electrum-XZC - '+_('Payment Request')) self.setMinimumSize(800, 800) self.setFocusPolicy(Qt.NoFocus) main_box = QHBoxLayout() diff --git a/electrum/gui/qt/request_list.py b/electrum/gui/qt/request_list.py index 2c0699be68e5..e6836ed71b8e 100644 --- a/electrum/gui/qt/request_list.py +++ b/electrum/gui/qt/request_list.py @@ -29,11 +29,11 @@ from PyQt5.QtWidgets import QMenu from PyQt5.QtCore import Qt -from electrum.i18n import _ -from electrum.util import format_time, age -from electrum.plugin import run_hook -from electrum.paymentrequest import PR_UNKNOWN -from electrum.wallet import InternalAddressCorruption +from electrum_xzc.i18n import _ +from electrum_xzc.util import format_time, age +from electrum_xzc.plugin import run_hook +from electrum_xzc.paymentrequest import PR_UNKNOWN +from electrum_xzc.wallet import InternalAddressCorruption from .util import MyTreeView, pr_tooltips, pr_icons, read_QIcon diff --git a/electrum/gui/qt/seed_dialog.py b/electrum/gui/qt/seed_dialog.py index 41372228dc83..c353f347b83d 100644 --- a/electrum/gui/qt/seed_dialog.py +++ b/electrum/gui/qt/seed_dialog.py @@ -28,9 +28,9 @@ from PyQt5.QtWidgets import (QVBoxLayout, QCheckBox, QHBoxLayout, QLineEdit, QLabel, QCompleter, QDialog, QStyledItemDelegate) -from electrum.i18n import _ -from electrum.mnemonic import Mnemonic, seed_type -import electrum.old_mnemonic +from electrum_xzc.i18n import _ +from electrum_xzc.mnemonic import Mnemonic, seed_type +import electrum_xzc.old_mnemonic from .util import (Buttons, OkButton, WWLabel, ButtonsTextEdit, icon_path, EnterButton, CloseButton, WindowModalDialog, ColorScheme) @@ -150,7 +150,7 @@ def __init__(self, seed=None, title=None, icon=True, msg=None, options=None, def initialize_completer(self): bip39_english_list = Mnemonic('en').wordlist - old_list = electrum.old_mnemonic.words + old_list = electrum_xzc.old_mnemonic.words only_old_list = set(old_list) - set(bip39_english_list) self.wordlist = bip39_english_list + list(only_old_list) # concat both lists self.wordlist.sort() @@ -182,7 +182,7 @@ def on_edit(self): t = seed_type(s) label = _('Seed Type') + ': ' + t if t else '' else: - from electrum.keystore import bip39_is_checksum_valid + from electrum_xzc.keystore import bip39_is_checksum_valid is_checksum, is_wordlist = bip39_is_checksum_valid(s) status = ('checksum: ' + ('ok' if is_checksum else 'failed')) if is_wordlist else 'unknown wordlist' label = 'BIP39' + ' (%s)'%status @@ -226,7 +226,7 @@ def on_edit(self): class SeedDialog(WindowModalDialog): def __init__(self, parent, seed, passphrase): - WindowModalDialog.__init__(self, parent, ('Electrum - ' + _('Seed'))) + WindowModalDialog.__init__(self, parent, ('Electrum-XZC - ' + _('Seed'))) self.setMinimumWidth(400) vbox = QVBoxLayout(self) title = _("Your wallet generation seed is:") diff --git a/electrum/gui/qt/transaction_dialog.py b/electrum/gui/qt/transaction_dialog.py index c3596b86d3ff..4fd97c9aa2b3 100644 --- a/electrum/gui/qt/transaction_dialog.py +++ b/electrum/gui/qt/transaction_dialog.py @@ -37,13 +37,13 @@ import qrcode from qrcode import exceptions -from electrum.bitcoin import base_encode -from electrum.i18n import _ -from electrum.plugin import run_hook -from electrum import simple_config -from electrum.util import bfh -from electrum.transaction import SerializationError, Transaction -from electrum.logging import get_logger +from electrum_xzc.bitcoin import base_encode +from electrum_xzc.i18n import _ +from electrum_xzc.plugin import run_hook +from electrum_xzc import simple_config +from electrum_xzc.util import bfh +from electrum_xzc.transaction import SerializationError, Transaction +from electrum_xzc.logging import get_logger from .util import (MessageBoxMixin, read_QIcon, Buttons, CopyButton, MONOSPACE_FONT, ColorScheme, ButtonsLineEdit) @@ -65,7 +65,7 @@ def show_transaction(tx, parent, desc=None, prompt_if_unsaved=False): d = TxDialog(tx, parent, desc, prompt_if_unsaved) except SerializationError as e: _logger.exception('unable to deserialize the transaction') - parent.show_critical(_("Electrum was unable to deserialize the transaction:") + "\n" + str(e)) + parent.show_critical(_("Electrum-ZXC was unable to deserialize the transaction:") + "\n" + str(e)) else: dialogs.append(d) d.show() diff --git a/electrum/gui/qt/update_checker.py b/electrum/gui/qt/update_checker.py index 00661d4eaddd..9400e6fd8b15 100644 --- a/electrum/gui/qt/update_checker.py +++ b/electrum/gui/qt/update_checker.py @@ -10,12 +10,12 @@ from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QLabel, QProgressBar, QHBoxLayout, QPushButton) -from electrum import version -from electrum import constants -from electrum import ecc -from electrum.i18n import _ -from electrum.util import make_aiohttp_session -from electrum.logging import Logger +from electrum_xzc import version +from electrum_xzc import constants +from electrum_xzc import ecc +from electrum_xzc.i18n import _ +from electrum_xzc.util import make_aiohttp_session +from electrum_xzc.logging import Logger class UpdateCheck(QWidget, Logger): diff --git a/electrum/gui/qt/util.py b/electrum/gui/qt/util.py index dab448716f13..27bb1fe28afa 100644 --- a/electrum/gui/qt/util.py +++ b/electrum/gui/qt/util.py @@ -22,10 +22,10 @@ QFileDialog, QWidget, QToolButton, QTreeView, QPlainTextEdit, QHeaderView, QApplication, QToolTip, QTreeWidget, QStyledItemDelegate) -from electrum.i18n import _, languages -from electrum.util import (FileImportFailed, FileExportFailed, +from electrum_xzc.i18n import _, languages +from electrum_xzc.util import (FileImportFailed, FileExportFailed, resource_path) -from electrum.paymentrequest import PR_UNPAID, PR_PAID, PR_EXPIRED +from electrum_xzc.paymentrequest import PR_UNPAID, PR_PAID, PR_EXPIRED if TYPE_CHECKING: from .main_window import ElectrumWindow diff --git a/electrum/gui/qt/utxo_list.py b/electrum/gui/qt/utxo_list.py index a013beab1ca0..7c81082a7387 100644 --- a/electrum/gui/qt/utxo_list.py +++ b/electrum/gui/qt/utxo_list.py @@ -30,7 +30,7 @@ from PyQt5.QtGui import QStandardItemModel, QStandardItem, QFont from PyQt5.QtWidgets import QAbstractItemView, QMenu -from electrum.i18n import _ +from electrum_xzc.i18n import _ from .util import MyTreeView, ColorScheme, MONOSPACE_FONT diff --git a/electrum/gui/stdio.py b/electrum/gui/stdio.py index 13b640c35d16..e5418fda6643 100644 --- a/electrum/gui/stdio.py +++ b/electrum/gui/stdio.py @@ -3,12 +3,12 @@ import datetime import logging -from electrum import WalletStorage, Wallet -from electrum.util import format_satoshis -from electrum.bitcoin import is_address, COIN, TYPE_ADDRESS -from electrum.transaction import TxOutput -from electrum.network import TxBroadcastError, BestEffortRequestFailed -from electrum.logging import console_stderr_handler +from electrum_xzc import WalletStorage, Wallet +from electrum_xzc.util import format_satoshis +from electrum_xzc.bitcoin import is_address, COIN, TYPE_ADDRESS +from electrum_xzc.transaction import TxOutput +from electrum_xzc.network import TxBroadcastError, BestEffortRequestFailed +from electrum_xzc.logging import console_stderr_handler _ = lambda x:x # i18n @@ -23,7 +23,7 @@ def __init__(self, config, daemon, plugins): self.network = daemon.network storage = WalletStorage(config.get_wallet_path()) if not storage.file_exists: - print("Wallet not found. try 'electrum create'") + print("Wallet not found. try 'electrum-xzc create'") exit() if storage.is_encrypted(): password = getpass.getpass('Password:', stream=None) @@ -170,7 +170,7 @@ def main(self): def do_send(self): if not is_address(self.str_recipient): - print(_('Invalid Bitcoin address')) + print(_('Invalid Zcoin address')) return try: amount = int(Decimal(self.str_amount) * COIN) @@ -220,12 +220,12 @@ def do_send(self): #self.update_contacts_tab() def network_dialog(self): - print("use 'electrum setconfig server/proxy' to change your network settings") + print("use 'electrum-xzc setconfig server/proxy' to change your network settings") return True def settings_dialog(self): - print("use 'electrum setconfig' to change your settings") + print("use 'electrum-xzc setconfig' to change your settings") return True def password_dialog(self): diff --git a/electrum/gui/text.py b/electrum/gui/text.py index 35e8b03074ff..4b9d5a071843 100644 --- a/electrum/gui/text.py +++ b/electrum/gui/text.py @@ -7,15 +7,15 @@ import getpass import logging -import electrum -from electrum.util import format_satoshis -from electrum.bitcoin import is_address, COIN, TYPE_ADDRESS -from electrum.transaction import TxOutput -from electrum.wallet import Wallet -from electrum.storage import WalletStorage -from electrum.network import NetworkParameters, TxBroadcastError, BestEffortRequestFailed -from electrum.interface import deserialize_server -from electrum.logging import console_stderr_handler +import electrum_xzc +from electrum_xzc.util import format_satoshis +from electrum_xzc.bitcoin import is_address, COIN, TYPE_ADDRESS +from electrum_xzc.transaction import TxOutput +from electrum_xzc.wallet import Wallet +from electrum_xzc.storage import WalletStorage +from electrum_xzc.network import NetworkParameters, TxBroadcastError, BestEffortRequestFailed +from electrum_xzc.interface import deserialize_server +from electrum_xzc.logging import console_stderr_handler _ = lambda x:x # i18n @@ -28,7 +28,7 @@ def __init__(self, config, daemon, plugins): self.network = daemon.network storage = WalletStorage(config.get_wallet_path()) if not storage.file_exists(): - print("Wallet not found. try 'electrum create'") + print("Wallet not found. try 'electrum-xzc create'") exit() if storage.is_encrypted(): password = getpass.getpass('Password:', stream=None) diff --git a/electrum/i18n.py b/electrum/i18n.py index 9c6fad995c58..cd232917b41f 100644 --- a/electrum/i18n.py +++ b/electrum/i18n.py @@ -42,40 +42,40 @@ def set_language(x): languages = { - '': _('Default'), - 'ar_SA': _('Arabic'), - 'bg_BG': _('Bulgarian'), - 'cs_CZ': _('Czech'), - 'da_DK': _('Danish'), - 'de_DE': _('German'), - 'el_GR': _('Greek'), - 'eo_UY': _('Esperanto'), - 'en_UK': _('English'), - 'es_ES': _('Spanish'), - 'fa_IR': _('Persian'), - 'fr_FR': _('French'), - 'hu_HU': _('Hungarian'), - 'hy_AM': _('Armenian'), - 'id_ID': _('Indonesian'), - 'it_IT': _('Italian'), - 'ja_JP': _('Japanese'), - 'ky_KG': _('Kyrgyz'), - 'lv_LV': _('Latvian'), - 'nb_NO': _('Norwegian Bokmal'), - 'nl_NL': _('Dutch'), - 'pl_PL': _('Polish'), - 'pt_BR': _('Brasilian'), - 'pt_PT': _('Portuguese'), - 'ro_RO': _('Romanian'), - 'ru_RU': _('Russian'), - 'sk_SK': _('Slovak'), - 'sl_SI': _('Slovenian'), - 'sv_SE': _('Swedish'), - 'ta_IN': _('Tamil'), - 'th_TH': _('Thai'), - 'tr_TR': _('Turkish'), - 'uk_UA': _('Ukrainian'), - 'vi_VN': _('Vietnamese'), - 'zh_CN': _('Chinese Simplified'), - 'zh_TW': _('Chinese Traditional') + '': _('Default') + # 'ar_SA': _('Arabic'), + # 'bg_BG': _('Bulgarian'), + # 'cs_CZ': _('Czech'), + # 'da_DK': _('Danish'), + # 'de_DE': _('German'), + # 'el_GR': _('Greek'), + # 'eo_UY': _('Esperanto'), + # 'en_UK': _('English'), + # 'es_ES': _('Spanish'), + # 'fa_IR': _('Persian'), + # 'fr_FR': _('French'), + # 'hu_HU': _('Hungarian'), + # 'hy_AM': _('Armenian'), + # 'id_ID': _('Indonesian'), + # 'it_IT': _('Italian'), + # 'ja_JP': _('Japanese'), + # 'ky_KG': _('Kyrgyz'), + # 'lv_LV': _('Latvian'), + # 'nb_NO': _('Norwegian Bokmal'), + # 'nl_NL': _('Dutch'), + # 'pl_PL': _('Polish'), + # 'pt_BR': _('Brasilian'), + # 'pt_PT': _('Portuguese'), + # 'ro_RO': _('Romanian'), + # 'ru_RU': _('Russian'), + # 'sk_SK': _('Slovak'), + # 'sl_SI': _('Slovenian'), + # 'sv_SE': _('Swedish'), + # 'ta_IN': _('Tamil'), + # 'th_TH': _('Thai'), + # 'tr_TR': _('Turkish'), + # 'uk_UA': _('Ukrainian'), + # 'vi_VN': _('Vietnamese'), + # 'zh_CN': _('Chinese Simplified'), + # 'zh_TW': _('Chinese Traditional') } diff --git a/electrum/interface.py b/electrum/interface.py index b5eac439c147..a8e38400e188 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -412,6 +412,8 @@ async def get_block_header(self, height, assert_mode): # use lower timeout as we usually have network.bhi_lock here timeout = self.network.get_network_timeout_seconds(NetworkTimeout.Urgent) res = await self.session.send_request('blockchain.block.header', [height], timeout=timeout) + if type(res) is dict: + return blockchain.deserialize_header(bytes.fromhex(res['header']), height) return blockchain.deserialize_header(bytes.fromhex(res), height) async def request_chunk(self, height, tip=None, *, can_return_early=False): @@ -618,7 +620,7 @@ async def _resolve_potential_chain_fork_given_forkpoint(self, good, bad, bad_hea forkfun = self.blockchain.fork if 'mock' not in bad_header else bad_header['mock']['fork'] b = forkfun(bad_header) # type: Blockchain self.blockchain = b - assert b.forkpoint == bad + assert b.forkpoint <= bad return 'fork', height async def _search_headers_backwards(self, height, header): diff --git a/electrum/network.py b/electrum/network.py index 02c01bf9c7ad..7487b9ddddd4 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -50,7 +50,7 @@ from . import constants from . import blockchain from . import bitcoin -from .blockchain import Blockchain, HEADER_SIZE +from .blockchain import Blockchain from .interface import (Interface, serialize_server, deserialize_server, RequestTimedOut, NetworkTimeout, BUCKET_NAME_OF_ONION_SERVERS) from .version import PROTOCOL_VERSION @@ -799,7 +799,7 @@ def check_interface_against_healthy_spread_of_connected_servers(self, iface_to_c async def _init_headers_file(self): b = blockchain.get_best_chain() filename = b.path() - length = HEADER_SIZE * len(constants.net.CHECKPOINTS) * 2016 + length = 180 * len(constants.net.CHECKPOINTS) * 2016 if not os.path.exists(filename) or os.path.getsize(filename) < length: with open(filename, 'wb') as f: if length > 0: diff --git a/electrum/paymentrequest.py b/electrum/paymentrequest.py index fedcd1b3a14e..e52ee2b3b785 100644 --- a/electrum/paymentrequest.py +++ b/electrum/paymentrequest.py @@ -85,7 +85,7 @@ async def get_payment_request(url: str) -> 'PaymentRequest': response.raise_for_status() # Guard against `bitcoin:`-URIs with invalid payment request URLs if "Content-Type" not in response.headers \ - or response.headers["Content-Type"] != "application/bitcoin-paymentrequest": + or response.headers["Content-Type"] != "application/zcoin-paymentrequest": data = None error = "payment URL not pointing to a payment request handling server" else: @@ -178,7 +178,7 @@ def verify(self, contacts): return True if pr.pki_type in ["x509+sha256", "x509+sha1"]: return self.verify_x509(pr) - elif pr.pki_type in ["dnssec+btc", "dnssec+ecdsa"]: + elif pr.pki_type in ["dnssec+xzc", "dnssec+ecdsa"]: return self.verify_dnssec(pr, contacts) else: self.error = "ERROR: Unsupported PKI Type for Message Signature" @@ -231,7 +231,7 @@ def verify_dnssec(self, pr, contacts): if info.get('validated') is not True: self.error = "Alias verification failed (DNSSEC)" return False - if pr.pki_type == "dnssec+btc": + if pr.pki_type == "dnssec+xzc": self.requestor = alias address = info.get('address') pr.signature = b'' @@ -359,7 +359,7 @@ def make_unsigned_request(req): def sign_request_with_alias(pr, alias, alias_privkey): - pr.pki_type = 'dnssec+btc' + pr.pki_type = 'dnssec+xzc' pr.pki_data = str(alias) message = pr.SerializeToString() ec_key = ecc.ECPrivkey(alias_privkey) @@ -466,7 +466,7 @@ def serialize_request(req): requestor = req.get('name') if requestor and signature: pr.signature = bfh(signature) - pr.pki_type = 'dnssec+btc' + pr.pki_type = 'dnssec+xzc' pr.pki_data = str(requestor) return pr diff --git a/electrum/plugin.py b/electrum/plugin.py index a7313862e3ec..b336401b0753 100644 --- a/electrum/plugin.py +++ b/electrum/plugin.py @@ -68,7 +68,7 @@ def __init__(self, config: SimpleConfig, gui_name): def load_plugins(self): for loader, name, ispkg in pkgutil.iter_modules([self.pkgpath]): - full_name = f'electrum.plugins.{name}' + full_name = f'electrum_xzc.plugins.{name}' spec = importlib.util.find_spec(full_name) if spec is None: # pkgutil found it but importlib can't ?! raise Exception(f"Error pre-loading {full_name}: no spec") @@ -106,7 +106,7 @@ def count(self): def load_plugin(self, name): if name in self.plugins: return self.plugins[name] - full_name = f'electrum.plugins.{name}.{self.gui_name}' + full_name = f'electrum_xzc.plugins.{name}.{self.gui_name}' spec = importlib.util.find_spec(full_name) if spec is None: raise RuntimeError("%s implementation for %s plugin not found" diff --git a/electrum/plugins/audio_modem/__init__.py b/electrum/plugins/audio_modem/__init__.py index 46c2d2091e00..75610e3762a5 100644 --- a/electrum/plugins/audio_modem/__init__.py +++ b/electrum/plugins/audio_modem/__init__.py @@ -1,4 +1,4 @@ -from electrum.i18n import _ +from electrum_xzc.i18n import _ fullname = _('Audio MODEM') description = _('Provides support for air-gapped transaction signing.') diff --git a/electrum/plugins/audio_modem/qt.py b/electrum/plugins/audio_modem/qt.py index 7a91bd30aaca..efea0de44c37 100644 --- a/electrum/plugins/audio_modem/qt.py +++ b/electrum/plugins/audio_modem/qt.py @@ -7,10 +7,10 @@ from PyQt5.QtWidgets import (QComboBox, QGridLayout, QLabel, QPushButton) -from electrum.plugin import BasePlugin, hook -from electrum.gui.qt.util import WaitingDialog, EnterButton, WindowModalDialog, read_QIcon -from electrum.i18n import _ -from electrum.logging import get_logger +from electrum_xzc.plugin import BasePlugin, hook +from electrum_xzc.gui.qt.util import WaitingDialog, EnterButton, WindowModalDialog, read_QIcon +from electrum_xzc.i18n import _ +from electrum_xzc.logging import get_logger _logger = get_logger(__name__) diff --git a/electrum/plugins/coldcard/__init__.py b/electrum/plugins/coldcard/__init__.py index 7cb033f427e4..eb6d9b288c86 100644 --- a/electrum/plugins/coldcard/__init__.py +++ b/electrum/plugins/coldcard/__init__.py @@ -1,4 +1,4 @@ -from electrum.i18n import _ +from electrum_xzc.i18n import _ fullname = 'Coldcard Wallet' description = 'Provides support for the Coldcard hardware wallet from Coinkite' diff --git a/electrum/plugins/coldcard/cmdline.py b/electrum/plugins/coldcard/cmdline.py index 6e6e69a2150f..c151d1a6a8ef 100644 --- a/electrum/plugins/coldcard/cmdline.py +++ b/electrum/plugins/coldcard/cmdline.py @@ -1,6 +1,6 @@ -from electrum.plugin import hook -from electrum.util import print_msg, raw_input, print_stderr -from electrum.logging import get_logger +from electrum_xzc.plugin import hook +from electrum_xzc.util import print_msg, raw_input, print_stderr +from electrum_xzc.logging import get_logger from .coldcard import ColdcardPlugin diff --git a/electrum/plugins/coldcard/coldcard.py b/electrum/plugins/coldcard/coldcard.py index b14c6a1ec75e..3b6003a9f364 100644 --- a/electrum/plugins/coldcard/coldcard.py +++ b/electrum/plugins/coldcard/coldcard.py @@ -6,16 +6,16 @@ import os, sys, time, io import traceback -from electrum.bip32 import BIP32Node, InvalidMasterKeyVersionBytes -from electrum.i18n import _ -from electrum.plugin import Device -from electrum.keystore import Hardware_KeyStore, xpubkey_to_pubkey, Xpub -from electrum.transaction import Transaction -from electrum.wallet import Standard_Wallet -from electrum.crypto import hash_160 -from electrum.util import bfh, bh2u, versiontuple, UserFacingException -from electrum.base_wizard import ScriptTypeNotSupported -from electrum.logging import get_logger +from electrum_xzc.bip32 import BIP32Node, InvalidMasterKeyVersionBytes +from electrum_xzc.i18n import _ +from electrum_xzc.plugin import Device +from electrum_xzc.keystore import Hardware_KeyStore, xpubkey_to_pubkey, Xpub +from electrum_xzc.transaction import Transaction +from electrum_xzc.wallet import Standard_Wallet +from electrum_xzc.crypto import hash_160 +from electrum_xzc.util import bfh, bh2u, versiontuple, UserFacingException +from electrum_xzc.base_wizard import ScriptTypeNotSupported +from electrum_xzc.logging import get_logger from ..hw_wallet import HW_PluginBase from ..hw_wallet.plugin import LibraryFoundButUnusable diff --git a/electrum/plugins/coldcard/qt.py b/electrum/plugins/coldcard/qt.py index 28801f433395..56246d0e9835 100644 --- a/electrum/plugins/coldcard/qt.py +++ b/electrum/plugins/coldcard/qt.py @@ -4,10 +4,10 @@ from PyQt5.QtCore import Qt, pyqtSignal from PyQt5.QtWidgets import QPushButton, QLabel, QVBoxLayout, QWidget, QGridLayout -from electrum.i18n import _ -from electrum.plugin import hook -from electrum.wallet import Standard_Wallet -from electrum.gui.qt.util import WindowModalDialog, CloseButton, get_parent_main_window +from electrum_xzc.i18n import _ +from electrum_xzc.plugin import hook +from electrum_xzc.wallet import Standard_Wallet +from electrum_xzc.gui.qt.util import WindowModalDialog, CloseButton, get_parent_main_window from .coldcard import ColdcardPlugin from ..hw_wallet.qt import QtHandlerBase, QtPluginBase diff --git a/electrum/plugins/cosigner_pool/__init__.py b/electrum/plugins/cosigner_pool/__init__.py index 085b5095bfb6..64cb1055b8af 100644 --- a/electrum/plugins/cosigner_pool/__init__.py +++ b/electrum/plugins/cosigner_pool/__init__.py @@ -1,4 +1,4 @@ -from electrum.i18n import _ +from electrum_xzc.i18n import _ fullname = _('Cosigner Pool') description = ' '.join([ _("This plugin facilitates the use of multi-signatures wallets."), diff --git a/electrum/plugins/cosigner_pool/qt.py b/electrum/plugins/cosigner_pool/qt.py index 531cc17003df..e498728890e3 100644 --- a/electrum/plugins/cosigner_pool/qt.py +++ b/electrum/plugins/cosigner_pool/qt.py @@ -29,16 +29,16 @@ from PyQt5.QtCore import QObject, pyqtSignal from PyQt5.QtWidgets import QPushButton -from electrum import util, keystore, ecc, crypto -from electrum import transaction -from electrum.bip32 import BIP32Node -from electrum.plugin import BasePlugin, hook -from electrum.i18n import _ -from electrum.wallet import Multisig_Wallet -from electrum.util import bh2u, bfh +from electrum_xzc import util, keystore, ecc, crypto +from electrum_xzc import transaction +from electrum_xzc.bip32 import BIP32Node +from electrum_xzc.plugin import BasePlugin, hook +from electrum_xzc.i18n import _ +from electrum_xzc.wallet import Multisig_Wallet +from electrum_xzc.util import bh2u, bfh -from electrum.gui.qt.transaction_dialog import show_transaction -from electrum.gui.qt.util import WaitingDialog +from electrum_xzc.gui.qt.transaction_dialog import show_transaction +from electrum_xzc.gui.qt.util import WaitingDialog import sys import traceback @@ -161,7 +161,7 @@ def transaction_dialog_update(self, d): d.cosigner_send_button.hide() def cosigner_can_sign(self, tx, cosigner_xpub): - from electrum.keystore import is_xpubkey, parse_xpubkey + from electrum_xzc.keystore import is_xpubkey, parse_xpubkey xpub_set = set([]) for txin in tx.inputs(): for x_pubkey in txin['x_pubkeys']: diff --git a/electrum/plugins/digitalbitbox/__init__.py b/electrum/plugins/digitalbitbox/__init__.py index 5653d6161282..338abae25e9d 100644 --- a/electrum/plugins/digitalbitbox/__init__.py +++ b/electrum/plugins/digitalbitbox/__init__.py @@ -1,4 +1,4 @@ -from electrum.i18n import _ +from electrum_xzc.i18n import _ fullname = 'Digital Bitbox' description = _('Provides support for Digital Bitbox hardware wallet') diff --git a/electrum/plugins/digitalbitbox/cmdline.py b/electrum/plugins/digitalbitbox/cmdline.py index cf5d4005a896..fa06cd5a724b 100644 --- a/electrum/plugins/digitalbitbox/cmdline.py +++ b/electrum/plugins/digitalbitbox/cmdline.py @@ -1,4 +1,4 @@ -from electrum.plugin import hook +from electrum_xzc.plugin import hook from .digitalbitbox import DigitalBitboxPlugin from ..hw_wallet import CmdLineHandler diff --git a/electrum/plugins/digitalbitbox/digitalbitbox.py b/electrum/plugins/digitalbitbox/digitalbitbox.py index 27a2a3876b18..5ecf33ffa4da 100644 --- a/electrum/plugins/digitalbitbox/digitalbitbox.py +++ b/electrum/plugins/digitalbitbox/digitalbitbox.py @@ -15,22 +15,22 @@ import sys import time -from electrum.crypto import sha256d, EncodeAES_base64, EncodeAES_bytes, DecodeAES_bytes, hmac_oneshot -from electrum.bitcoin import (TYPE_ADDRESS, push_script, var_int, public_key_to_p2pkh, +from electrum_xzc.crypto import sha256d, EncodeAES_base64, EncodeAES_bytes, DecodeAES_bytes, hmac_oneshot +from electrum_xzc.bitcoin import (TYPE_ADDRESS, push_script, var_int, public_key_to_p2pkh, is_address) -from electrum.bip32 import BIP32Node -from electrum import ecc -from electrum.ecc import msg_magic -from electrum.wallet import Standard_Wallet -from electrum import constants -from electrum.transaction import Transaction -from electrum.i18n import _ -from electrum.keystore import Hardware_KeyStore +from electrum_xzc.bip32 import BIP32Node +from electrum_xzc import ecc +from electrum_xzc.ecc import msg_magic +from electrum_xzc.wallet import Standard_Wallet +from electrum_xzc import constants +from electrum_xzc.transaction import Transaction +from electrum_xzc.i18n import _ +from electrum_xzc.keystore import Hardware_KeyStore from ..hw_wallet import HW_PluginBase -from electrum.util import to_string, UserCancelled, UserFacingException -from electrum.base_wizard import ScriptTypeNotSupported, HWD_SETUP_NEW_WALLET -from electrum.network import Network -from electrum.logging import get_logger +from electrum_xzc.util import to_string, UserCancelled, UserFacingException +from electrum_xzc.base_wizard import ScriptTypeNotSupported, HWD_SETUP_NEW_WALLET +from electrum_xzc.network import Network +from electrum_xzc.logging import get_logger _logger = get_logger(__name__) diff --git a/electrum/plugins/digitalbitbox/qt.py b/electrum/plugins/digitalbitbox/qt.py index 804162ba27fc..f4ff310865cc 100644 --- a/electrum/plugins/digitalbitbox/qt.py +++ b/electrum/plugins/digitalbitbox/qt.py @@ -1,8 +1,8 @@ from functools import partial -from electrum.i18n import _ -from electrum.plugin import hook -from electrum.wallet import Standard_Wallet +from electrum_xzc.i18n import _ +from electrum_xzc.plugin import hook +from electrum_xzc.wallet import Standard_Wallet from ..hw_wallet.qt import QtHandlerBase, QtPluginBase from ..hw_wallet.plugin import only_hook_if_libraries_available diff --git a/electrum/plugins/email_requests/__init__.py b/electrum/plugins/email_requests/__init__.py index 8c9e824725eb..ebfcbbd27ba1 100644 --- a/electrum/plugins/email_requests/__init__.py +++ b/electrum/plugins/email_requests/__init__.py @@ -1,4 +1,4 @@ -from electrum.i18n import _ +from electrum_xzc.i18n import _ fullname = _('Email') description = _("Send and receive payment request with an email account") diff --git a/electrum/plugins/email_requests/qt.py b/electrum/plugins/email_requests/qt.py index 000c60d62629..11ff5de1d366 100644 --- a/electrum/plugins/email_requests/qt.py +++ b/electrum/plugins/email_requests/qt.py @@ -41,13 +41,13 @@ from PyQt5.QtWidgets import (QVBoxLayout, QLabel, QGridLayout, QLineEdit, QInputDialog) -from electrum.gui.qt.util import (EnterButton, Buttons, CloseButton, OkButton, +from electrum_xzc.gui.qt.util import (EnterButton, Buttons, CloseButton, OkButton, WindowModalDialog, get_parent_main_window) -from electrum.plugin import BasePlugin, hook -from electrum.paymentrequest import PaymentRequest -from electrum.i18n import _ -from electrum.logging import Logger +from electrum_xzc.plugin import BasePlugin, hook +from electrum_xzc.paymentrequest import PaymentRequest +from electrum_xzc.i18n import _ +from electrum_xzc.logging import Logger class Processor(threading.Thread, Logger): @@ -176,7 +176,7 @@ def receive_list_menu(self, menu, addr): menu.addAction(_("Send via e-mail"), lambda: self.send(window, addr)) def send(self, window, addr): - from electrum import paymentrequest + from electrum_xzc import paymentrequest r = window.wallet.receive_requests.get(addr) message = r.get('memo', '') if r.get('signature'): diff --git a/electrum/plugins/greenaddress_instant/__init__.py b/electrum/plugins/greenaddress_instant/__init__.py index d2b317854be9..1bb78cba7f65 100644 --- a/electrum/plugins/greenaddress_instant/__init__.py +++ b/electrum/plugins/greenaddress_instant/__init__.py @@ -1,4 +1,4 @@ -from electrum.i18n import _ +from electrum_xzc.i18n import _ fullname = 'GreenAddress instant' description = _("Allows validating if your transactions have instant confirmations by GreenAddress") diff --git a/electrum/plugins/greenaddress_instant/qt.py b/electrum/plugins/greenaddress_instant/qt.py index 3e9dc79a7b53..299440a4f5f6 100644 --- a/electrum/plugins/greenaddress_instant/qt.py +++ b/electrum/plugins/greenaddress_instant/qt.py @@ -30,9 +30,9 @@ from PyQt5.QtWidgets import QApplication, QPushButton -from electrum.plugin import BasePlugin, hook -from electrum.i18n import _ -from electrum.network import Network +from electrum_xzc.plugin import BasePlugin, hook +from electrum_xzc.i18n import _ +from electrum_xzc.network import Network if TYPE_CHECKING: from aiohttp import ClientResponse diff --git a/electrum/plugins/hw_wallet/cmdline.py b/electrum/plugins/hw_wallet/cmdline.py index b91e094b81fa..8adf6152d82a 100644 --- a/electrum/plugins/hw_wallet/cmdline.py +++ b/electrum/plugins/hw_wallet/cmdline.py @@ -1,5 +1,5 @@ -from electrum.util import print_stderr, raw_input -from electrum.logging import get_logger +from electrum_xzc.util import print_stderr, raw_input +from electrum_xzc.logging import get_logger _logger = get_logger(__name__) diff --git a/electrum/plugins/hw_wallet/plugin.py b/electrum/plugins/hw_wallet/plugin.py index fd3ed697927c..13e61ad92b87 100644 --- a/electrum/plugins/hw_wallet/plugin.py +++ b/electrum/plugins/hw_wallet/plugin.py @@ -24,11 +24,11 @@ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -from electrum.plugin import BasePlugin, hook -from electrum.i18n import _ -from electrum.bitcoin import is_address, TYPE_SCRIPT, opcodes -from electrum.util import bfh, versiontuple, UserFacingException -from electrum.transaction import TxOutput, Transaction +from electrum_xzc.plugin import BasePlugin, hook +from electrum_xzc.i18n import _ +from electrum_xzc.bitcoin import is_address, TYPE_SCRIPT, opcodes +from electrum_xzc.util import bfh, versiontuple, UserFacingException +from electrum_xzc.transaction import TxOutput, Transaction class HW_PluginBase(BasePlugin): diff --git a/electrum/plugins/hw_wallet/qt.py b/electrum/plugins/hw_wallet/qt.py index 5a8c9dfe7ebf..c5117785de90 100644 --- a/electrum/plugins/hw_wallet/qt.py +++ b/electrum/plugins/hw_wallet/qt.py @@ -30,12 +30,12 @@ from PyQt5.QtCore import QObject, pyqtSignal from PyQt5.QtWidgets import QVBoxLayout, QLineEdit, QHBoxLayout, QLabel -from electrum.gui.qt.password_dialog import PasswordLayout, PW_PASSPHRASE -from electrum.gui.qt.util import (read_QIcon, WWLabel, OkButton, WindowModalDialog, +from electrum_xzc.gui.qt.password_dialog import PasswordLayout, PW_PASSPHRASE +from electrum_xzc.gui.qt.util import (read_QIcon, WWLabel, OkButton, WindowModalDialog, Buttons, CancelButton, TaskThread, char_width_in_lineedit) -from electrum.i18n import _ -from electrum.logging import Logger +from electrum_xzc.i18n import _ +from electrum_xzc.logging import Logger from .plugin import OutdatedHwFirmwareException @@ -190,9 +190,9 @@ def win_yes_no_question(self, msg): -from electrum.plugin import hook -from electrum.util import UserCancelled -from electrum.gui.qt.main_window import StatusBarButton +from electrum_xzc.plugin import hook +from electrum_xzc.util import UserCancelled +from electrum_xzc.gui.qt.main_window import StatusBarButton class QtPluginBase(object): diff --git a/electrum/plugins/keepkey/__init__.py b/electrum/plugins/keepkey/__init__.py index 0b54bc4a0db5..d14a6096679b 100644 --- a/electrum/plugins/keepkey/__init__.py +++ b/electrum/plugins/keepkey/__init__.py @@ -1,4 +1,4 @@ -from electrum.i18n import _ +from electrum_xzc.i18n import _ fullname = 'KeepKey' description = _('Provides support for KeepKey hardware wallet') diff --git a/electrum/plugins/keepkey/clientbase.py b/electrum/plugins/keepkey/clientbase.py index 740ffe694acc..68abf9e86923 100644 --- a/electrum/plugins/keepkey/clientbase.py +++ b/electrum/plugins/keepkey/clientbase.py @@ -1,12 +1,12 @@ import time from struct import pack -from electrum import ecc -from electrum.i18n import _ -from electrum.util import UserCancelled -from electrum.keystore import bip39_normalize_passphrase -from electrum.bip32 import BIP32Node, convert_bip32_path_to_list_of_uint32 -from electrum.logging import Logger +from electrum_xzc import ecc +from electrum_xzc.i18n import _ +from electrum_xzc.util import UserCancelled +from electrum_xzc.keystore import bip39_normalize_passphrase +from electrum_xzc.bip32 import BIP32Node, convert_bip32_path_to_list_of_uint32 +from electrum_xzc.logging import Logger class GuiMixin(object): diff --git a/electrum/plugins/keepkey/cmdline.py b/electrum/plugins/keepkey/cmdline.py index 7cbad274e150..1c0ef6b63252 100644 --- a/electrum/plugins/keepkey/cmdline.py +++ b/electrum/plugins/keepkey/cmdline.py @@ -1,4 +1,4 @@ -from electrum.plugin import hook +from electrum_xzc.plugin import hook from .keepkey import KeepKeyPlugin from ..hw_wallet import CmdLineHandler diff --git a/electrum/plugins/keepkey/keepkey.py b/electrum/plugins/keepkey/keepkey.py index 93cf709b2606..db492edd0d1b 100644 --- a/electrum/plugins/keepkey/keepkey.py +++ b/electrum/plugins/keepkey/keepkey.py @@ -2,14 +2,14 @@ import traceback import sys -from electrum.util import bfh, bh2u, UserCancelled, UserFacingException -from electrum.bitcoin import TYPE_ADDRESS, TYPE_SCRIPT -from electrum.bip32 import BIP32Node -from electrum import constants -from electrum.i18n import _ -from electrum.transaction import deserialize, Transaction -from electrum.keystore import Hardware_KeyStore, is_xpubkey, parse_xpubkey -from electrum.base_wizard import ScriptTypeNotSupported +from electrum_xzc.util import bfh, bh2u, UserCancelled, UserFacingException +from electrum_xzc.bitcoin import TYPE_ADDRESS, TYPE_SCRIPT +from electrum_xzc.bip32 import BIP32Node +from electrum_xzc import constants +from electrum_xzc.i18n import _ +from electrum_xzc.transaction import deserialize, Transaction +from electrum_xzc.keystore import Hardware_KeyStore, is_xpubkey, parse_xpubkey +from electrum_xzc.base_wizard import ScriptTypeNotSupported from ..hw_wallet import HW_PluginBase from ..hw_wallet.plugin import is_any_tx_output_on_change_branch, trezor_validate_op_return_output_and_get_data @@ -175,7 +175,7 @@ def get_client(self, keystore, force_pair=True): return client def get_coin_name(self): - return "Testnet" if constants.net.TESTNET else "Bitcoin" + return "Testnet" if constants.net.TESTNET else "Zcoin" def initialize_device(self, device_id, wizard, handler): # Initialization method diff --git a/electrum/plugins/keepkey/qt.py b/electrum/plugins/keepkey/qt.py index eb6f0cb63b05..31867e932a0e 100644 --- a/electrum/plugins/keepkey/qt.py +++ b/electrum/plugins/keepkey/qt.py @@ -8,11 +8,11 @@ QTextEdit, QLineEdit, QRadioButton, QCheckBox, QWidget, QMessageBox, QFileDialog, QSlider, QTabWidget) -from electrum.gui.qt.util import (WindowModalDialog, WWLabel, Buttons, CancelButton, +from electrum_xzc.gui.qt.util import (WindowModalDialog, WWLabel, Buttons, CancelButton, OkButton, CloseButton) -from electrum.i18n import _ -from electrum.plugin import hook -from electrum.util import bh2u +from electrum_xzc.i18n import _ +from electrum_xzc.plugin import hook +from electrum_xzc.util import bh2u from ..hw_wallet.qt import QtHandlerBase, QtPluginBase from ..hw_wallet.plugin import only_hook_if_libraries_available @@ -256,7 +256,7 @@ def clean_text(widget): else: msg = _("Enter the master private key beginning with xprv:") def set_enabled(): - from electrum.bip32 import is_xprv + from electrum_xzc.bip32 import is_xprv wizard.next_button.setEnabled(is_xprv(clean_text(text))) text.textChanged.connect(set_enabled) next_enabled = False diff --git a/electrum/plugins/labels/__init__.py b/electrum/plugins/labels/__init__.py index 4596bcae42ed..db44e119b5ed 100644 --- a/electrum/plugins/labels/__init__.py +++ b/electrum/plugins/labels/__init__.py @@ -1,4 +1,4 @@ -from electrum.i18n import _ +from electrum_xzc.i18n import _ fullname = _('LabelSync') description = ' '.join([ diff --git a/electrum/plugins/labels/cmdline.py b/electrum/plugins/labels/cmdline.py index 50a1ab46bd81..ac3494833081 100644 --- a/electrum/plugins/labels/cmdline.py +++ b/electrum/plugins/labels/cmdline.py @@ -1,5 +1,5 @@ from .labels import LabelsPlugin -from electrum.plugin import hook +from electrum_xzc.plugin import hook class Plugin(LabelsPlugin): diff --git a/electrum/plugins/labels/kivy.py b/electrum/plugins/labels/kivy.py index 0af93e085e09..7ef7ff9735db 100644 --- a/electrum/plugins/labels/kivy.py +++ b/electrum/plugins/labels/kivy.py @@ -1,5 +1,5 @@ from .labels import LabelsPlugin -from electrum.plugin import hook +from electrum_xzc.plugin import hook class Plugin(LabelsPlugin): diff --git a/electrum/plugins/labels/labels.py b/electrum/plugins/labels/labels.py index 9118a9f897bb..09932168b7ad 100644 --- a/electrum/plugins/labels/labels.py +++ b/electrum/plugins/labels/labels.py @@ -7,11 +7,11 @@ import base64 -from electrum.plugin import BasePlugin, hook -from electrum.crypto import aes_encrypt_with_iv, aes_decrypt_with_iv -from electrum.i18n import _ -from electrum.util import log_exceptions, ignore_exceptions, make_aiohttp_session -from electrum.network import Network +from electrum_xzc.plugin import BasePlugin, hook +from electrum_xzc.crypto import aes_encrypt_with_iv, aes_decrypt_with_iv +from electrum_xzc.i18n import _ +from electrum_xzc.util import log_exceptions, ignore_exceptions, make_aiohttp_session +from electrum_xzc.network import Network class ErrorConnectingServer(Exception): diff --git a/electrum/plugins/labels/qt.py b/electrum/plugins/labels/qt.py index 1962660f4646..e3ca5f173ea5 100644 --- a/electrum/plugins/labels/qt.py +++ b/electrum/plugins/labels/qt.py @@ -5,9 +5,9 @@ from PyQt5.QtCore import QObject, pyqtSignal from PyQt5.QtWidgets import (QHBoxLayout, QLabel, QVBoxLayout) -from electrum.plugin import hook -from electrum.i18n import _ -from electrum.gui.qt.util import ThreadedButton, Buttons, EnterButton, WindowModalDialog, OkButton +from electrum_xzc.plugin import hook +from electrum_xzc.i18n import _ +from electrum_xzc.gui.qt.util import ThreadedButton, Buttons, EnterButton, WindowModalDialog, OkButton from .labels import LabelsPlugin diff --git a/electrum/plugins/ledger/__init__.py b/electrum/plugins/ledger/__init__.py index b97f02335ca6..ab01d55958bd 100644 --- a/electrum/plugins/ledger/__init__.py +++ b/electrum/plugins/ledger/__init__.py @@ -1,4 +1,4 @@ -from electrum.i18n import _ +from electrum_xzc.i18n import _ fullname = 'Ledger Wallet' description = 'Provides support for Ledger hardware wallet' diff --git a/electrum/plugins/ledger/auth2fa.py b/electrum/plugins/ledger/auth2fa.py index f69a1c32f1be..57e90871fbe9 100644 --- a/electrum/plugins/ledger/auth2fa.py +++ b/electrum/plugins/ledger/auth2fa.py @@ -13,10 +13,10 @@ from btchip.btchip import BTChipException -from electrum.gui.qt.qrcodewidget import QRCodeWidget -from electrum.i18n import _ -from electrum import constants, bitcoin -from electrum.logging import get_logger +from electrum_xzc.gui.qt.qrcodewidget import QRCodeWidget +from electrum_xzc.i18n import _ +from electrum_xzc import constants, bitcoin +from electrum_xzc.logging import get_logger _logger = get_logger(__name__) diff --git a/electrum/plugins/ledger/cmdline.py b/electrum/plugins/ledger/cmdline.py index 3e810169748f..32d1159275be 100644 --- a/electrum/plugins/ledger/cmdline.py +++ b/electrum/plugins/ledger/cmdline.py @@ -1,4 +1,4 @@ -from electrum.plugin import hook +from electrum_xzc.plugin import hook from .ledger import LedgerPlugin from ..hw_wallet import CmdLineHandler diff --git a/electrum/plugins/ledger/ledger.py b/electrum/plugins/ledger/ledger.py index af886b84ec06..03bc06c8b1da 100644 --- a/electrum/plugins/ledger/ledger.py +++ b/electrum/plugins/ledger/ledger.py @@ -3,16 +3,16 @@ import sys import traceback -from electrum import ecc -from electrum.bitcoin import TYPE_ADDRESS, int_to_hex, var_int, is_segwit_script_type -from electrum.bip32 import BIP32Node -from electrum.i18n import _ -from electrum.keystore import Hardware_KeyStore -from electrum.transaction import Transaction -from electrum.wallet import Standard_Wallet -from electrum.util import bfh, bh2u, versiontuple, UserFacingException -from electrum.base_wizard import ScriptTypeNotSupported -from electrum.logging import get_logger +from electrum_xzc import ecc +from electrum_xzc.bitcoin import TYPE_ADDRESS, int_to_hex, var_int, is_segwit_script_type +from electrum_xzc.bip32 import BIP32Node +from electrum_xzc.i18n import _ +from electrum_xzc.keystore import Hardware_KeyStore +from electrum_xzc.transaction import Transaction +from electrum_xzc.wallet import Standard_Wallet +from electrum_xzc.util import bfh, bh2u, versiontuple, UserFacingException +from electrum_xzc.base_wizard import ScriptTypeNotSupported +from electrum_xzc.logging import get_logger from ..hw_wallet import HW_PluginBase from ..hw_wallet.plugin import is_any_tx_output_on_change_branch @@ -202,7 +202,7 @@ def checkDevice(self): self.perform_hw1_preflight() except BTChipException as e: if (e.sw == 0x6d00 or e.sw == 0x6700): - raise UserFacingException(_("Device not in Bitcoin mode")) from e + raise UserFacingException(_("Device not in Zcoin mode")) from e raise e self.preflightDone = True diff --git a/electrum/plugins/ledger/qt.py b/electrum/plugins/ledger/qt.py index 225c5ef4f578..9fa54e132dd5 100644 --- a/electrum/plugins/ledger/qt.py +++ b/electrum/plugins/ledger/qt.py @@ -3,10 +3,10 @@ from PyQt5.QtCore import pyqtSignal from PyQt5.QtWidgets import QInputDialog, QLabel, QVBoxLayout, QLineEdit -from electrum.i18n import _ -from electrum.plugin import hook -from electrum.wallet import Standard_Wallet -from electrum.gui.qt.util import WindowModalDialog +from electrum_xzc.i18n import _ +from electrum_xzc.plugin import hook +from electrum_xzc.wallet import Standard_Wallet +from electrum_xzc.gui.qt.util import WindowModalDialog from .ledger import LedgerPlugin from ..hw_wallet.qt import QtHandlerBase, QtPluginBase diff --git a/electrum/plugins/revealer/__init__.py b/electrum/plugins/revealer/__init__.py index beb58d30e70a..2db3f40a90bf 100644 --- a/electrum/plugins/revealer/__init__.py +++ b/electrum/plugins/revealer/__init__.py @@ -1,4 +1,4 @@ -from electrum.i18n import _ +from electrum_xzc.i18n import _ fullname = _('Revealer Backup Utility') description = ''.join(["
", diff --git a/electrum/plugins/revealer/qt.py b/electrum/plugins/revealer/qt.py index da6d540b33ef..b3612a385fc0 100644 --- a/electrum/plugins/revealer/qt.py +++ b/electrum/plugins/revealer/qt.py @@ -24,13 +24,13 @@ from PyQt5.QtWidgets import (QGridLayout, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QLineEdit) -from electrum.plugin import hook -from electrum.i18n import _ -from electrum.util import make_dir, InvalidPassword, UserCancelled -from electrum.gui.qt.util import (read_QIcon, EnterButton, WWLabel, icon_path, +from electrum_xzc.plugin import hook +from electrum_xzc.i18n import _ +from electrum_xzc.util import make_dir, InvalidPassword, UserCancelled +from electrum_xzc.gui.qt.util import (read_QIcon, EnterButton, WWLabel, icon_path, WindowModalDialog, Buttons, CloseButton, OkButton) -from electrum.gui.qt.qrtextedit import ScanQRTextEdit -from electrum.gui.qt.main_window import StatusBarButton +from electrum_xzc.gui.qt.qrtextedit import ScanQRTextEdit +from electrum_xzc.gui.qt.main_window import StatusBarButton from .revealer import RevealerPlugin @@ -73,7 +73,7 @@ def settings_widget(self, window): return EnterButton(_('Printer Calibration'), partial(self.calibration_dialog, window)) def password_dialog(self, msg=None, parent=None): - from electrum.gui.qt.password_dialog import PasswordDialog + from electrum_xzc.gui.qt.password_dialog import PasswordDialog parent = parent or self d = PasswordDialog(parent, msg) return d.run() diff --git a/electrum/plugins/revealer/revealer.py b/electrum/plugins/revealer/revealer.py index 33df769b2591..b5ea26134f96 100644 --- a/electrum/plugins/revealer/revealer.py +++ b/electrum/plugins/revealer/revealer.py @@ -3,8 +3,8 @@ from hashlib import sha256 from typing import NamedTuple, Optional, Dict, Tuple -from electrum.plugin import BasePlugin -from electrum.util import to_bytes, bh2u, bfh +from electrum_xzc.plugin import BasePlugin +from electrum_xzc.util import to_bytes, bh2u, bfh from .hmac_drbg import DRBG diff --git a/electrum/plugins/safe_t/__init__.py b/electrum/plugins/safe_t/__init__.py index 9bfb2d9bbfdd..fa5a1f6d9688 100644 --- a/electrum/plugins/safe_t/__init__.py +++ b/electrum/plugins/safe_t/__init__.py @@ -1,4 +1,4 @@ -from electrum.i18n import _ +from electrum_xzc.i18n import _ fullname = 'Safe-T mini Wallet' description = _('Provides support for Safe-T mini hardware wallet') diff --git a/electrum/plugins/safe_t/clientbase.py b/electrum/plugins/safe_t/clientbase.py index c402622eaf42..1e2182f1bff1 100644 --- a/electrum/plugins/safe_t/clientbase.py +++ b/electrum/plugins/safe_t/clientbase.py @@ -1,12 +1,12 @@ import time from struct import pack -from electrum import ecc -from electrum.i18n import _ -from electrum.util import UserCancelled -from electrum.keystore import bip39_normalize_passphrase -from electrum.bip32 import BIP32Node, convert_bip32_path_to_list_of_uint32 -from electrum.logging import Logger +from electrum_xzc import ecc +from electrum_xzc.i18n import _ +from electrum_xzc.util import UserCancelled +from electrum_xzc.keystore import bip39_normalize_passphrase +from electrum_xzc.bip32 import BIP32Node, convert_bip32_path_to_list_of_uint32 +from electrum_xzc.logging import Logger class GuiMixin(object): diff --git a/electrum/plugins/safe_t/cmdline.py b/electrum/plugins/safe_t/cmdline.py index 9c6346d3b6ba..3b8bcbde4b41 100644 --- a/electrum/plugins/safe_t/cmdline.py +++ b/electrum/plugins/safe_t/cmdline.py @@ -1,4 +1,4 @@ -from electrum.plugin import hook +from electrum_xzc.plugin import hook from .safe_t import SafeTPlugin from ..hw_wallet import CmdLineHandler diff --git a/electrum/plugins/safe_t/qt.py b/electrum/plugins/safe_t/qt.py index ae5aa2b7461b..0d019daf2224 100644 --- a/electrum/plugins/safe_t/qt.py +++ b/electrum/plugins/safe_t/qt.py @@ -8,11 +8,11 @@ QTextEdit, QLineEdit, QRadioButton, QCheckBox, QWidget, QMessageBox, QFileDialog, QSlider, QTabWidget) -from electrum.gui.qt.util import (WindowModalDialog, WWLabel, Buttons, CancelButton, +from electrum_xzc.gui.qt.util import (WindowModalDialog, WWLabel, Buttons, CancelButton, OkButton, CloseButton) -from electrum.i18n import _ -from electrum.plugin import hook -from electrum.util import bh2u +from electrum_xzc.i18n import _ +from electrum_xzc.plugin import hook +from electrum_xzc.util import bh2u from ..hw_wallet.qt import QtHandlerBase, QtPluginBase from ..hw_wallet.plugin import only_hook_if_libraries_available @@ -130,7 +130,7 @@ def clean_text(widget): else: msg = _("Enter the master private key beginning with xprv:") def set_enabled(): - from electrum.bip32 import is_xprv + from electrum_xzc.bip32 import is_xprv wizard.next_button.setEnabled(is_xprv(clean_text(text))) text.textChanged.connect(set_enabled) next_enabled = False diff --git a/electrum/plugins/safe_t/safe_t.py b/electrum/plugins/safe_t/safe_t.py index 379243d7b900..366e015f2655 100644 --- a/electrum/plugins/safe_t/safe_t.py +++ b/electrum/plugins/safe_t/safe_t.py @@ -2,15 +2,15 @@ import traceback import sys -from electrum.util import bfh, bh2u, versiontuple, UserCancelled, UserFacingException -from electrum.bitcoin import TYPE_ADDRESS, TYPE_SCRIPT -from electrum.bip32 import BIP32Node -from electrum import constants -from electrum.i18n import _ -from electrum.plugin import Device -from electrum.transaction import deserialize, Transaction -from electrum.keystore import Hardware_KeyStore, is_xpubkey, parse_xpubkey -from electrum.base_wizard import ScriptTypeNotSupported +from electrum_xzc.util import bfh, bh2u, versiontuple, UserCancelled, UserFacingException +from electrum_xzc.bitcoin import TYPE_ADDRESS, TYPE_SCRIPT +from electrum_xzc.bip32 import BIP32Node +from electrum_xzc import constants +from electrum_xzc.i18n import _ +from electrum_xzc.plugin import Device +from electrum_xzc.transaction import deserialize, Transaction +from electrum_xzc.keystore import Hardware_KeyStore, is_xpubkey, parse_xpubkey +from electrum_xzc.base_wizard import ScriptTypeNotSupported from ..hw_wallet import HW_PluginBase from ..hw_wallet.plugin import is_any_tx_output_on_change_branch, trezor_validate_op_return_output_and_get_data @@ -159,7 +159,7 @@ def get_client(self, keystore, force_pair=True): return client def get_coin_name(self): - return "Testnet" if constants.net.TESTNET else "Bitcoin" + return "Testnet" if constants.net.TESTNET else "Zcoin" def initialize_device(self, device_id, wizard, handler): # Initialization method diff --git a/electrum/plugins/safe_t/transport.py b/electrum/plugins/safe_t/transport.py index 03e0b087956e..8dabe12d8d0d 100644 --- a/electrum/plugins/safe_t/transport.py +++ b/electrum/plugins/safe_t/transport.py @@ -1,4 +1,4 @@ -from electrum.logging import get_logger +from electrum_xzc.logging import get_logger _logger = get_logger(__name__) diff --git a/electrum/plugins/trezor/__init__.py b/electrum/plugins/trezor/__init__.py index 2d4267d78543..f1135149d7b2 100644 --- a/electrum/plugins/trezor/__init__.py +++ b/electrum/plugins/trezor/__init__.py @@ -1,4 +1,4 @@ -from electrum.i18n import _ +from electrum_xzc.i18n import _ fullname = 'Trezor Wallet' description = _('Provides support for Trezor hardware wallet') diff --git a/electrum/plugins/trezor/clientbase.py b/electrum/plugins/trezor/clientbase.py index 7188c379884b..9daa1307dc1b 100644 --- a/electrum/plugins/trezor/clientbase.py +++ b/electrum/plugins/trezor/clientbase.py @@ -1,13 +1,13 @@ import time from struct import pack -from electrum import ecc -from electrum.i18n import _ -from electrum.util import UserCancelled, UserFacingException -from electrum.keystore import bip39_normalize_passphrase -from electrum.bip32 import BIP32Node, convert_bip32_path_to_list_of_uint32 as parse_path -from electrum.logging import Logger -from electrum.plugins.hw_wallet.plugin import OutdatedHwFirmwareException +from electrum_xzc import ecc +from electrum_xzc.i18n import _ +from electrum_xzc.util import UserCancelled, UserFacingException +from electrum_xzc.keystore import bip39_normalize_passphrase +from electrum_xzc.bip32 import BIP32Node, convert_bip32_path_to_list_of_uint32 as parse_path +from electrum_xzc.logging import Logger +from electrum_xzc.plugins.hw_wallet.plugin import OutdatedHwFirmwareException from trezorlib.client import TrezorClient from trezorlib.exceptions import TrezorFailure, Cancelled, OutdatedFirmwareError diff --git a/electrum/plugins/trezor/cmdline.py b/electrum/plugins/trezor/cmdline.py index e435aad138f7..b36cd497a9d9 100644 --- a/electrum/plugins/trezor/cmdline.py +++ b/electrum/plugins/trezor/cmdline.py @@ -1,4 +1,4 @@ -from electrum.plugin import hook +from electrum_xzc.plugin import hook from .trezor import TrezorPlugin from ..hw_wallet import CmdLineHandler diff --git a/electrum/plugins/trezor/qt.py b/electrum/plugins/trezor/qt.py index 281e3f56d296..f991bf400bd7 100644 --- a/electrum/plugins/trezor/qt.py +++ b/electrum/plugins/trezor/qt.py @@ -7,11 +7,11 @@ QLineEdit, QRadioButton, QCheckBox, QWidget, QMessageBox, QFileDialog, QSlider, QTabWidget) -from electrum.gui.qt.util import (WindowModalDialog, WWLabel, Buttons, CancelButton, +from electrum_xzc.gui.qt.util import (WindowModalDialog, WWLabel, Buttons, CancelButton, OkButton, CloseButton) -from electrum.i18n import _ -from electrum.plugin import hook -from electrum.util import bh2u +from electrum_xzc.i18n import _ +from electrum_xzc.plugin import hook +from electrum_xzc.util import bh2u from ..hw_wallet.qt import QtHandlerBase, QtPluginBase from ..hw_wallet.plugin import only_hook_if_libraries_available diff --git a/electrum/plugins/trezor/trezor.py b/electrum/plugins/trezor/trezor.py index 75b168f26bba..b22d57093cc8 100644 --- a/electrum/plugins/trezor/trezor.py +++ b/electrum/plugins/trezor/trezor.py @@ -2,16 +2,16 @@ import sys from typing import NamedTuple, Any -from electrum.util import bfh, bh2u, versiontuple, UserCancelled, UserFacingException -from electrum.bitcoin import TYPE_ADDRESS, TYPE_SCRIPT -from electrum.bip32 import BIP32Node, convert_bip32_path_to_list_of_uint32 as parse_path -from electrum import constants -from electrum.i18n import _ -from electrum.plugin import Device -from electrum.transaction import deserialize, Transaction -from electrum.keystore import Hardware_KeyStore, is_xpubkey, parse_xpubkey -from electrum.base_wizard import ScriptTypeNotSupported, HWD_SETUP_NEW_WALLET -from electrum.logging import get_logger +from electrum_xzc.util import bfh, bh2u, versiontuple, UserCancelled, UserFacingException +from electrum_xzc.bitcoin import TYPE_ADDRESS, TYPE_SCRIPT +from electrum_xzc.bip32 import BIP32Node, convert_bip32_path_to_list_of_uint32 as parse_path +from electrum_xzc import constants +from electrum_xzc.i18n import _ +from electrum_xzc.plugin import Device +from electrum_xzc.transaction import deserialize, Transaction +from electrum_xzc.keystore import Hardware_KeyStore, is_xpubkey, parse_xpubkey +from electrum_xzc.base_wizard import ScriptTypeNotSupported, HWD_SETUP_NEW_WALLET +from electrum_xzc.logging import get_logger from ..hw_wallet import HW_PluginBase from ..hw_wallet.plugin import (is_any_tx_output_on_change_branch, trezor_validate_op_return_output_and_get_data, @@ -183,7 +183,7 @@ def get_client(self, keystore, force_pair=True): return client def get_coin_name(self): - return "Testnet" if constants.net.TESTNET else "Bitcoin" + return "Zcoin Testnet" if constants.net.TESTNET else "Zcoin" def initialize_device(self, device_id, wizard, handler): # Initialization method diff --git a/electrum/plugins/trustedcoin/__init__.py b/electrum/plugins/trustedcoin/__init__.py index 81ec4f2ce0b2..d43f1800dac9 100644 --- a/electrum/plugins/trustedcoin/__init__.py +++ b/electrum/plugins/trustedcoin/__init__.py @@ -1,4 +1,4 @@ -from electrum.i18n import _ +from electrum_xzc.i18n import _ fullname = _('Two Factor Authentication') description = ''.join([ diff --git a/electrum/plugins/trustedcoin/cmdline.py b/electrum/plugins/trustedcoin/cmdline.py index 156283a68c2d..ec6526306ae7 100644 --- a/electrum/plugins/trustedcoin/cmdline.py +++ b/electrum/plugins/trustedcoin/cmdline.py @@ -23,8 +23,8 @@ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -from electrum.i18n import _ -from electrum.plugin import hook +from electrum_xzc.i18n import _ +from electrum_xzc.plugin import hook from .trustedcoin import TrustedCoinPlugin diff --git a/electrum/plugins/trustedcoin/kivy.py b/electrum/plugins/trustedcoin/kivy.py index 4cd01fbe8afa..8d089a6306bf 100644 --- a/electrum/plugins/trustedcoin/kivy.py +++ b/electrum/plugins/trustedcoin/kivy.py @@ -30,8 +30,8 @@ from kivy.clock import Clock -from electrum.i18n import _ -from electrum.plugin import hook +from electrum_xzc.i18n import _ +from electrum_xzc.plugin import hook from .trustedcoin import TrustedCoinPlugin, server, KIVY_DISCLAIMER, TrustedCoinException, ErrorConnectingServer diff --git a/electrum/plugins/trustedcoin/qt.py b/electrum/plugins/trustedcoin/qt.py index b11de233eca1..3addb84d6bf9 100644 --- a/electrum/plugins/trustedcoin/qt.py +++ b/electrum/plugins/trustedcoin/qt.py @@ -33,17 +33,17 @@ from PyQt5.QtWidgets import (QTextEdit, QVBoxLayout, QLabel, QGridLayout, QHBoxLayout, QRadioButton, QCheckBox, QLineEdit) -from electrum.gui.qt.util import (read_QIcon, WindowModalDialog, WaitingDialog, OkButton, +from electrum_xzc.gui.qt.util import (read_QIcon, WindowModalDialog, WaitingDialog, OkButton, CancelButton, Buttons, icon_path, WWLabel, CloseButton) -from electrum.gui.qt.qrcodewidget import QRCodeWidget -from electrum.gui.qt.amountedit import AmountEdit -from electrum.gui.qt.main_window import StatusBarButton -from electrum.gui.qt.installwizard import InstallWizard -from electrum.i18n import _ -from electrum.plugin import hook -from electrum.util import is_valid_email -from electrum.logging import Logger -from electrum.base_wizard import GoBack +from electrum_xzc.gui.qt.qrcodewidget import QRCodeWidget +from electrum_xzc.gui.qt.amountedit import AmountEdit +from electrum_xzc.gui.qt.main_window import StatusBarButton +from electrum_xzc.gui.qt.installwizard import InstallWizard +from electrum_xzc.i18n import _ +from electrum_xzc.plugin import hook +from electrum_xzc.util import is_valid_email +from electrum_xzc.logging import Logger +from electrum_xzc.base_wizard import GoBack from .trustedcoin import TrustedCoinPlugin, server diff --git a/electrum/plugins/trustedcoin/trustedcoin.py b/electrum/plugins/trustedcoin/trustedcoin.py index ed9ef6d18674..b304a108970b 100644 --- a/electrum/plugins/trustedcoin/trustedcoin.py +++ b/electrum/plugins/trustedcoin/trustedcoin.py @@ -35,20 +35,20 @@ from urllib.parse import quote from aiohttp import ClientResponse -from electrum import ecc, constants, keystore, version, bip32, bitcoin -from electrum.bitcoin import TYPE_ADDRESS -from electrum.bip32 import BIP32Node, xpub_type -from electrum.crypto import sha256 -from electrum.transaction import TxOutput -from electrum.mnemonic import Mnemonic, seed_type, is_any_2fa_seed_type -from electrum.wallet import Multisig_Wallet, Deterministic_Wallet -from electrum.i18n import _ -from electrum.plugin import BasePlugin, hook -from electrum.util import NotEnoughFunds, UserFacingException -from electrum.storage import STO_EV_USER_PW -from electrum.network import Network -from electrum.base_wizard import BaseWizard -from electrum.logging import Logger +from electrum_xzc import ecc, constants, keystore, version, bip32, bitcoin +from electrum_xzc.bitcoin import TYPE_ADDRESS +from electrum_xzc.bip32 import BIP32Node, xpub_type +from electrum_xzc.crypto import sha256 +from electrum_xzc.transaction import TxOutput +from electrum_xzc.mnemonic import Mnemonic, seed_type, is_any_2fa_seed_type +from electrum_xzc.wallet import Multisig_Wallet, Deterministic_Wallet +from electrum_xzc.i18n import _ +from electrum_xzc.plugin import BasePlugin, hook +from electrum_xzc.util import NotEnoughFunds, UserFacingException +from electrum_xzc.storage import STO_EV_USER_PW +from electrum_xzc.network import Network +from electrum_xzc.base_wizard import BaseWizard +from electrum_xzc.logging import Logger def get_signing_xpub(xtype): diff --git a/electrum/plugins/virtualkeyboard/__init__.py b/electrum/plugins/virtualkeyboard/__init__.py index c24f19b1a3cf..53c05f17c9f1 100644 --- a/electrum/plugins/virtualkeyboard/__init__.py +++ b/electrum/plugins/virtualkeyboard/__init__.py @@ -1,4 +1,4 @@ -from electrum.i18n import _ +from electrum_xzc.i18n import _ fullname = 'Virtual Keyboard' description = '%s\n%s' % (_("Add an optional virtual keyboard to the password dialog."), _("Warning: do not use this if it makes you pick a weaker password.")) diff --git a/electrum/plugins/virtualkeyboard/qt.py b/electrum/plugins/virtualkeyboard/qt.py index 3016a77ce9a4..4ad1c1c6d19d 100644 --- a/electrum/plugins/virtualkeyboard/qt.py +++ b/electrum/plugins/virtualkeyboard/qt.py @@ -2,8 +2,8 @@ from PyQt5.QtWidgets import (QVBoxLayout, QGridLayout, QPushButton) -from electrum.plugin import BasePlugin, hook -from electrum.i18n import _ +from electrum_xzc.plugin import BasePlugin, hook +from electrum_xzc.i18n import _ class Plugin(BasePlugin): diff --git a/electrum/scripts/bip70.py b/electrum/scripts/bip70.py index 7b3d0de2cce1..0547ac14f675 100755 --- a/electrum/scripts/bip70.py +++ b/electrum/scripts/bip70.py @@ -4,9 +4,9 @@ import tlslite -from electrum.transaction import Transaction -from electrum import paymentrequest -from electrum import paymentrequest_pb2 as pb2 +from electrum_xzc.transaction import Transaction +from electrum_xzc import paymentrequest +from electrum_xzc import paymentrequest_pb2 as pb2 chain_file = 'mychain.pem' cert_file = 'mycert.pem' diff --git a/electrum/scripts/block_headers.py b/electrum/scripts/block_headers.py index abf6a25950db..2133bc8cfc5c 100755 --- a/electrum/scripts/block_headers.py +++ b/electrum/scripts/block_headers.py @@ -5,8 +5,8 @@ import time import asyncio -from electrum.network import Network -from electrum.util import print_msg, json_encode, create_and_start_event_loop, log_exceptions +from electrum_xzc.network import Network +from electrum_xzc.util import print_msg, json_encode, create_and_start_event_loop, log_exceptions # start network loop, stopping_fut, loop_thread = create_and_start_event_loop() diff --git a/electrum/scripts/estimate_fee.py b/electrum/scripts/estimate_fee.py index 76bcc55b54cf..735c63a6ebb0 100755 --- a/electrum/scripts/estimate_fee.py +++ b/electrum/scripts/estimate_fee.py @@ -4,8 +4,8 @@ from statistics import median from numbers import Number -from electrum.network import filter_protocol, Network -from electrum.util import create_and_start_event_loop, log_exceptions +from electrum_xzc.network import filter_protocol, Network +from electrum_xzc.util import create_and_start_event_loop, log_exceptions loop, stopping_fut, loop_thread = create_and_start_event_loop() diff --git a/electrum/scripts/get_history.py b/electrum/scripts/get_history.py index a97698288624..45dcaf0e6f21 100755 --- a/electrum/scripts/get_history.py +++ b/electrum/scripts/get_history.py @@ -3,15 +3,15 @@ import sys import asyncio -from electrum import bitcoin -from electrum.network import Network -from electrum.util import json_encode, print_msg, create_and_start_event_loop, log_exceptions +from electrum_xzc import bitcoin +from electrum_xzc.network import Network +from electrum_xzc.util import json_encode, print_msg, create_and_start_event_loop, log_exceptions try: addr = sys.argv[1] except Exception: - print("usage: get_history ") + print("usage: get_history ") sys.exit(1) loop, stopping_fut, loop_thread = create_and_start_event_loop() diff --git a/electrum/scripts/peers.py b/electrum/scripts/peers.py index e55e716fe47b..c4d9eda81272 100755 --- a/electrum/scripts/peers.py +++ b/electrum/scripts/peers.py @@ -1,9 +1,9 @@ #!/usr/bin/env python3 import asyncio -from electrum.network import filter_protocol, Network -from electrum.util import create_and_start_event_loop, log_exceptions -from electrum.blockchain import hash_raw_header +from electrum_xzc.network import filter_protocol, Network +from electrum_xzc.util import create_and_start_event_loop, log_exceptions +from electrum_xzc.blockchain import hash_raw_header loop, stopping_fut, loop_thread = create_and_start_event_loop() network = Network() diff --git a/electrum/scripts/quick_start.py b/electrum/scripts/quick_start.py index 40960966fe21..2571d58be699 100644 --- a/electrum/scripts/quick_start.py +++ b/electrum/scripts/quick_start.py @@ -1,11 +1,11 @@ import os -from electrum.simple_config import SimpleConfig -from electrum import constants -from electrum.daemon import Daemon -from electrum.storage import WalletStorage -from electrum.wallet import Wallet, create_new_wallet -from electrum.commands import Commands +from electrum_xzc.simple_config import SimpleConfig +from electrum_xzc import constants +from electrum_xzc.daemon import Daemon +from electrum_xzc.storage import WalletStorage +from electrum_xzc.wallet import Wallet, create_new_wallet +from electrum_xzc.commands import Commands config = SimpleConfig({"testnet": True}) # to use ~/.electrum/testnet as datadir diff --git a/electrum/scripts/servers.py b/electrum/scripts/servers.py index c9ef3c613336..dc03cdbac8ab 100755 --- a/electrum/scripts/servers.py +++ b/electrum/scripts/servers.py @@ -2,10 +2,10 @@ import json import asyncio -from electrum.simple_config import SimpleConfig -from electrum.network import filter_version, Network -from electrum.util import create_and_start_event_loop, log_exceptions -from electrum import constants +from electrum_xzc.simple_config import SimpleConfig +from electrum_xzc.network import filter_version, Network +from electrum_xzc.util import create_and_start_event_loop, log_exceptions +from electrum_xzc import constants # testnet? #constants.set_testnet() diff --git a/electrum/scripts/txradar.py b/electrum/scripts/txradar.py index 7fb8f7be3250..180ac25e1776 100755 --- a/electrum/scripts/txradar.py +++ b/electrum/scripts/txradar.py @@ -2,8 +2,8 @@ import sys import asyncio -from electrum.network import filter_protocol, Network -from electrum.util import create_and_start_event_loop, log_exceptions +from electrum_xzc.network import filter_protocol, Network +from electrum_xzc.util import create_and_start_event_loop, log_exceptions try: diff --git a/electrum/scripts/watch_address.py b/electrum/scripts/watch_address.py index 851160de58a7..42eee8fed85c 100755 --- a/electrum/scripts/watch_address.py +++ b/electrum/scripts/watch_address.py @@ -3,9 +3,9 @@ import sys import asyncio -from electrum.network import Network -from electrum.util import print_msg, create_and_start_event_loop -from electrum.synchronizer import SynchronizerBase +from electrum_xzc.network import Network +from electrum_xzc.util import print_msg, create_and_start_event_loop +from electrum_xzc.synchronizer import SynchronizerBase try: diff --git a/electrum/servers.json b/electrum/servers.json index fa8e9b651967..c115e21520b2 100644 --- a/electrum/servers.json +++ b/electrum/servers.json @@ -1,414 +1,35 @@ { - "3smoooajg7qqac2y.onion": { + "electrumx.zcoin.io": { "pruning": "-", "s": "50002", "t": "50001", "version": "1.4" }, - "81-7-10-251.blue.kundencontroller.de": { - "pruning": "-", - "s": "50002", - "version": "1.4" - }, - "E-X.not.fyi": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "VPS.hsmiths.com": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "b.ooze.cc": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "bauerjda5hnedjam.onion": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "bauerjhejlv6di7s.onion": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "bitcoin.corgi.party": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "bitcoin3nqy3db7c.onion": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "bitcoins.sk": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "btc.cihar.com": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "btc.xskyx.net": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "currentlane.lovebitco.in": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "daedalus.bauerj.eu": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "electrum.jochen-hoenicke.de": { - "pruning": "-", - "s": "50005", - "t": "50003", - "version": "1.4" - }, - "dragon085.startdedicated.de": { - "pruning": "-", - "s": "50002", - "version": "1.4" - }, - "e-1.claudioboxx.com": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "e.keff.org": { + "electrumx01.zcoin.io": { "pruning": "-", "s": "50002", "t": "50001", "version": "1.4" }, - "electrum-server.ninja": { + "electrumx02.zcoin.io": { "pruning": "-", "s": "50002", "t": "50001", "version": "1.4" }, - "electrum-unlimited.criptolayer.net": { - "pruning": "-", - "s": "50002", - "version": "1.4" - }, - "electrum.eff.ro": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "electrum.festivaldelhumor.org": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "electrum.hsmiths.com": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "electrum.leblancnet.us": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "electrum.mindspot.org": { - "pruning": "-", - "s": "50002", - "version": "1.4" - }, - "electrum.qtornado.com": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "electrum.taborsky.cz": { - "pruning": "-", - "s": "50002", - "version": "1.4" - }, - "electrum.villocq.com": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "electrum2.eff.ro": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "electrum2.villocq.com": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "electrumx.bot.nu": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "electrumx.ddns.net": { + "electrumx03.zcoin.io": { "pruning": "-", "s": "50002", "t": "50001", "version": "1.4" }, - "electrumx.ftp.sh": { - "pruning": "-", - "s": "50002", - "version": "1.4" - }, - "electrumx.ml": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "electrumx.soon.it": { + "51.15.82.184": { "pruning": "-", "s": "50002", "t": "50001", "version": "1.4" }, - "electrumxhqdsmlu.onion": { - "pruning": "-", - "t": "50001", - "version": "1.4" - }, - "elx01.knas.systems": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "enode.duckdns.org": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "fedaykin.goip.de": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "fn.48.org": { - "pruning": "-", - "s": "50002", - "t": "50003", - "version": "1.4" - }, - "helicarrier.bauerj.eu": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "hsmiths4fyqlw5xw.onion": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "hsmiths5mjk6uijs.onion": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "icarus.tetradrachm.net": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "electrum.emzy.de": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "ndnd.selfhost.eu": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "ndndword5lpb7eex.onion": { - "pruning": "-", - "t": "50001", - "version": "1.4" - }, - "orannis.com": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "ozahtqwp25chjdjd.onion": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "qtornadoklbgdyww.onion": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "rbx.curalle.ovh": { - "pruning": "-", - "s": "50002", - "version": "1.4" - }, - "s7clinmo4cazmhul.onion": { - "pruning": "-", - "t": "50001", - "version": "1.4" - }, - "tardis.bauerj.eu": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "technetium.network": { - "pruning": "-", - "s": "50002", - "version": "1.4" - }, - "tomscryptos.com": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "ulrichard.ch": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "vmd27610.contaboserver.net": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "vmd30612.contaboserver.net": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "wsw6tua3xl24gsmi264zaep6seppjyrkyucpsmuxnjzyt3f3j6swshad.onion": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "xray587.startdedicated.de": { - "pruning": "-", - "s": "50002", - "version": "1.4" - }, - "yuio.top": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "bitcoin.dragon.zone": { - "pruning": "-", - "s": "50004", - "t": "50003", - "version": "1.4" - }, - "ecdsa.net" : { - "pruning": "-", - "s": "110", - "t": "50001", - "version": "1.4" - }, - "btc.usebsv.com": { - "pruning": "-", - "s": "50006", - "version": "1.4" - }, - "e2.keff.org": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "electrum.hodlister.co": { - "pruning": "-", - "s": "50002", - "version": "1.4" - }, - "electrum3.hodlister.co": { - "pruning": "-", - "s": "50002", - "version": "1.4" - }, - "electrum5.hodlister.co": { - "pruning": "-", - "s": "50002", - "version": "1.4" - }, - "electrumx.electricnewyear.net": { - "pruning": "-", - "s": "50002", - "version": "1.4" - }, - "fortress.qtornado.com": { - "pruning": "-", - "s": "443", - "t": "50001", - "version": "1.4" - }, - "green-gold.westeurope.cloudapp.azure.com": { - "pruning": "-", - "s": "56002", - "t": "56001", - "version": "1.4" - }, - "electrumx.erbium.eu": { + "47.75.76.176": { "pruning": "-", "s": "50002", "t": "50001", diff --git a/electrum/servers_testnet.json b/electrum/servers_testnet.json index 3fffeaa38843..9e50cec7a952 100644 --- a/electrum/servers_testnet.json +++ b/electrum/servers_testnet.json @@ -1,38 +1,14 @@ { - "hsmithsxurybd7uh.onion": { - "pruning": "-", - "s": "53012", - "t": "53011", - "version": "1.4" - }, - "testnet.hsmiths.com": { - "pruning": "-", - "s": "53012", - "t": "53011", - "version": "1.4" - }, - "testnet.qtornado.com": { + "95.179.170.3": { "pruning": "-", "s": "51002", "t": "51001", - "version": "1.4" - }, - "testnet1.bauerj.eu": { - "pruning": "-", - "s": "50002", - "t": "50001", - "version": "1.4" - }, - "tn.not.fyi": { - "pruning": "-", - "s": "55002", - "t": "55001", - "version": "1.4" + "version": "1.1" }, - "bitcoin.cluelessperson.com": { + "localhost": { "pruning": "-", "s": "51002", "t": "51001", - "version": "1.4" + "version": "1.1" } } diff --git a/electrum/simple_config.py b/electrum/simple_config.py index 8a970802b41f..d4da3ab67754 100644 --- a/electrum/simple_config.py +++ b/electrum/simple_config.py @@ -207,7 +207,7 @@ def convert_version_3(self): base_unit = self.user_config.get('base_unit') if isinstance(base_unit, str): self._set_key_in_user_config('base_unit', None) - map_ = {'btc':8, 'mbtc':5, 'ubtc':2, 'bits':2, 'sat':0} + map_ = {'xzc':8, 'mxzc':5, 'uxzc':2, 'bits':2, 'sat':0} decimal_point = map_.get(base_unit.lower()) self._set_key_in_user_config('decimal_point', decimal_point) @@ -483,7 +483,7 @@ def has_dynamic_fees_ready(self): return self.has_fee_etas() def is_dynfee(self): - return bool(self.get('dynamic_fees', True)) + return bool(self.get('dynamic_fees', False)) def use_mempool_fees(self): return bool(self.get('mempool_fees', False)) diff --git a/electrum/tests/__init__.py b/electrum/tests/__init__.py index 7d1d336d385e..25b772c0ec2d 100644 --- a/electrum/tests/__init__.py +++ b/electrum/tests/__init__.py @@ -1,7 +1,7 @@ import unittest import threading -from electrum import constants +from electrum_xzc import constants # Set this locally to make the test suite run faster. diff --git a/electrum/tests/test_bitcoin.py b/electrum/tests/test_bitcoin.py index f6edb51dd0c3..fda0dfb0ab93 100644 --- a/electrum/tests/test_bitcoin.py +++ b/electrum/tests/test_bitcoin.py @@ -1,7 +1,7 @@ import base64 import sys -from electrum.bitcoin import (public_key_to_p2pkh, address_from_private_key, +from electrum_xzc.bitcoin import (public_key_to_p2pkh, address_from_private_key, is_address, is_private_key, var_int, _op_push, address_to_script, deserialize_privkey, serialize_privkey, is_segwit_address, @@ -9,18 +9,18 @@ is_compressed_privkey, EncodeBase58Check, DecodeBase58Check, script_num_to_hex, push_script, add_number_to_script, int_to_hex, opcodes, base_encode, base_decode, BitcoinException) -from electrum.bip32 import (BIP32Node, convert_bip32_intpath_to_strpath, +from electrum_xzc.bip32 import (BIP32Node, convert_bip32_intpath_to_strpath, xpub_from_xprv, xpub_type, is_xprv, is_bip32_derivation, is_xpub, convert_bip32_path_to_list_of_uint32, normalize_bip32_derivation) -from electrum.crypto import sha256d, SUPPORTED_PW_HASH_VERSIONS -from electrum import ecc, crypto, constants -from electrum.ecc import number_to_string, string_to_number -from electrum.util import bfh, bh2u, InvalidPassword -from electrum.storage import WalletStorage -from electrum.keystore import xtype_from_derivation - -from electrum import ecc_fast +from electrum_xzc.crypto import sha256d, SUPPORTED_PW_HASH_VERSIONS +from electrum_xzc import ecc, crypto, constants +from electrum_xzc.ecc import number_to_string, string_to_number +from electrum_xzc.util import bfh, bh2u, InvalidPassword +from electrum_xzc.storage import WalletStorage +from electrum_xzc.keystore import xtype_from_derivation + +from electrum_xzc import ecc_fast from . import SequentialTestCase from . import TestCaseForTestnet diff --git a/electrum/tests/test_blockchain.py b/electrum/tests/test_blockchain.py index 6c9b09c98ec4..11ee9acf0568 100644 --- a/electrum/tests/test_blockchain.py +++ b/electrum/tests/test_blockchain.py @@ -2,10 +2,10 @@ import tempfile import os -from electrum import constants, blockchain -from electrum.simple_config import SimpleConfig -from electrum.blockchain import Blockchain, deserialize_header, hash_header -from electrum.util import bh2u, bfh, make_dir +from electrum_xzc import constants, blockchain +from electrum_xzc.simple_config import SimpleConfig +from electrum_xzc.blockchain import Blockchain, deserialize_header, hash_header +from electrum_xzc.util import bh2u, bfh, make_dir from . import SequentialTestCase diff --git a/electrum/tests/test_commands.py b/electrum/tests/test_commands.py index 5e08661abbc3..dcb878a8b412 100644 --- a/electrum/tests/test_commands.py +++ b/electrum/tests/test_commands.py @@ -2,9 +2,9 @@ from unittest import mock from decimal import Decimal -from electrum.commands import Commands, eval_bool -from electrum import storage -from electrum.wallet import restore_wallet_from_text +from electrum_xzc.commands import Commands, eval_bool +from electrum_xzc import storage +from electrum_xzc.wallet import restore_wallet_from_text from . import TestCaseForTestnet diff --git a/electrum/tests/test_dnssec.py b/electrum/tests/test_dnssec.py index e7e9ac4fb84a..8f2d9b690144 100644 --- a/electrum/tests/test_dnssec.py +++ b/electrum/tests/test_dnssec.py @@ -1,6 +1,6 @@ import dns -from electrum import dnssec +from electrum_xzc import dnssec from . import SequentialTestCase from .test_bitcoin import needs_test_with_all_ecc_implementations diff --git a/electrum/tests/test_mnemonic.py b/electrum/tests/test_mnemonic.py index c36c4acd1a5f..44f27ca49dd6 100644 --- a/electrum/tests/test_mnemonic.py +++ b/electrum/tests/test_mnemonic.py @@ -1,11 +1,11 @@ from typing import NamedTuple, Optional -from electrum import keystore -from electrum import mnemonic -from electrum import old_mnemonic -from electrum.util import bh2u, bfh -from electrum.mnemonic import is_new_seed, is_old_seed, seed_type -from electrum.version import SEED_PREFIX_SW, SEED_PREFIX +from electrum_xzc import keystore +from electrum_xzc import mnemonic +from electrum_xzc import old_mnemonic +from electrum_xzc.util import bh2u, bfh +from electrum_xzc.mnemonic import is_new_seed, is_old_seed, seed_type +from electrum_xzc.version import SEED_PREFIX_SW, SEED_PREFIX from . import SequentialTestCase from .test_wallet_vertical import UNICODE_HORROR, UNICODE_HORROR_HEX diff --git a/electrum/tests/test_network.py b/electrum/tests/test_network.py index ece54056f957..ac49cdd350c7 100644 --- a/electrum/tests/test_network.py +++ b/electrum/tests/test_network.py @@ -2,12 +2,12 @@ import tempfile import unittest -from electrum import constants -from electrum.simple_config import SimpleConfig -from electrum import blockchain -from electrum.interface import Interface -from electrum.crypto import sha256 -from electrum.util import bh2u +from electrum_xzc import constants +from electrum_xzc.simple_config import SimpleConfig +from electrum_xzc import blockchain +from electrum_xzc.interface import Interface +from electrum_xzc.crypto import sha256 +from electrum_xzc.util import bh2u class MockTaskGroup: diff --git a/electrum/tests/test_revealer.py b/electrum/tests/test_revealer.py index 0667c95c1288..d5acbd23b044 100644 --- a/electrum/tests/test_revealer.py +++ b/electrum/tests/test_revealer.py @@ -1,4 +1,4 @@ -from electrum.plugins.revealer.revealer import RevealerPlugin +from electrum_xzc.plugins.revealer.revealer import RevealerPlugin from . import SequentialTestCase diff --git a/electrum/tests/test_simple_config.py b/electrum/tests/test_simple_config.py index 4ec2a7e4cb05..d125f2feee37 100644 --- a/electrum/tests/test_simple_config.py +++ b/electrum/tests/test_simple_config.py @@ -5,7 +5,7 @@ import shutil from io import StringIO -from electrum.simple_config import (SimpleConfig, read_user_config) +from electrum_xzc.simple_config import (SimpleConfig, read_user_config) from . import SequentialTestCase diff --git a/electrum/tests/test_storage_upgrade.py b/electrum/tests/test_storage_upgrade.py index bb74fc026a48..db8c2c583af4 100644 --- a/electrum/tests/test_storage_upgrade.py +++ b/electrum/tests/test_storage_upgrade.py @@ -2,9 +2,9 @@ import tempfile import os -from electrum.storage import WalletStorage -from electrum.wallet import Wallet -from electrum import constants +from electrum_xzc.storage import WalletStorage +from electrum_xzc.wallet import Wallet +from electrum_xzc import constants from .test_wallet import WalletTestCase diff --git a/electrum/tests/test_transaction.py b/electrum/tests/test_transaction.py index a83e0223b157..cc65a77460f9 100644 --- a/electrum/tests/test_transaction.py +++ b/electrum/tests/test_transaction.py @@ -1,8 +1,8 @@ -from electrum import transaction -from electrum.transaction import TxOutputForUI, tx_from_str -from electrum.bitcoin import TYPE_ADDRESS -from electrum.keystore import xpubkey_to_address -from electrum.util import bh2u, bfh +from electrum_xzc import transaction +from electrum_xzc.transaction import TxOutputForUI, tx_from_str +from electrum_xzc.bitcoin import TYPE_ADDRESS +from electrum_xzc.keystore import xpubkey_to_address +from electrum_xzc.util import bh2u, bfh from . import SequentialTestCase, TestCaseForTestnet from .test_bitcoin import needs_test_with_all_ecc_implementations diff --git a/electrum/tests/test_util.py b/electrum/tests/test_util.py index 6e8b6bcae755..8f99f795b525 100644 --- a/electrum/tests/test_util.py +++ b/electrum/tests/test_util.py @@ -1,6 +1,6 @@ from decimal import Decimal -from electrum.util import (format_satoshis, format_fee_satoshis, parse_URI, +from electrum_xzc.util import (format_satoshis, format_fee_satoshis, parse_URI, is_hash256_str, chunks) from . import SequentialTestCase @@ -50,7 +50,7 @@ def _do_test_parse_URI(self, uri, expected): self.assertEqual(expected, result) def test_parse_URI_address(self): - self._do_test_parse_URI('bitcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma', + self._do_test_parse_URI('zcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma', {'address': '15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma'}) def test_parse_URI_only_address(self): @@ -59,41 +59,41 @@ def test_parse_URI_only_address(self): def test_parse_URI_address_label(self): - self._do_test_parse_URI('bitcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma?label=electrum%20test', + self._do_test_parse_URI('zcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma?label=electrum%20test', {'address': '15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma', 'label': 'electrum test'}) def test_parse_URI_address_message(self): - self._do_test_parse_URI('bitcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma?message=electrum%20test', + self._do_test_parse_URI('zcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma?message=electrum%20test', {'address': '15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma', 'message': 'electrum test', 'memo': 'electrum test'}) def test_parse_URI_address_amount(self): - self._do_test_parse_URI('bitcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma?amount=0.0003', + self._do_test_parse_URI('zcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma?amount=0.0003', {'address': '15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma', 'amount': 30000}) def test_parse_URI_address_request_url(self): - self._do_test_parse_URI('bitcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma?r=http://domain.tld/page?h%3D2a8628fc2fbe', + self._do_test_parse_URI('zcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma?r=http://domain.tld/page?h%3D2a8628fc2fbe', {'address': '15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma', 'r': 'http://domain.tld/page?h=2a8628fc2fbe'}) def test_parse_URI_ignore_args(self): - self._do_test_parse_URI('bitcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma?test=test', + self._do_test_parse_URI('zcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma?test=test', {'address': '15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma', 'test': 'test'}) def test_parse_URI_multiple_args(self): - self._do_test_parse_URI('bitcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma?amount=0.00004&label=electrum-test&message=electrum%20test&test=none&r=http://domain.tld/page', + self._do_test_parse_URI('zcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma?amount=0.00004&label=electrum-test&message=electrum%20test&test=none&r=http://domain.tld/page', {'address': '15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma', 'amount': 4000, 'label': 'electrum-test', 'message': u'electrum test', 'memo': u'electrum test', 'r': 'http://domain.tld/page', 'test': 'none'}) def test_parse_URI_no_address_request_url(self): - self._do_test_parse_URI('bitcoin:?r=http://domain.tld/page?h%3D2a8628fc2fbe', + self._do_test_parse_URI('zcoin:?r=http://domain.tld/page?h%3D2a8628fc2fbe', {'r': 'http://domain.tld/page?h=2a8628fc2fbe'}) def test_parse_URI_invalid_address(self): - self.assertRaises(BaseException, parse_URI, 'bitcoin:invalidaddress') + self.assertRaises(BaseException, parse_URI, 'zcoin:invalidaddress') def test_parse_URI_invalid(self): - self.assertRaises(BaseException, parse_URI, 'notbitcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma') + self.assertRaises(BaseException, parse_URI, 'notzcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma') def test_parse_URI_parameter_polution(self): - self.assertRaises(Exception, parse_URI, 'bitcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma?amount=0.0003&label=test&amount=30.0') + self.assertRaises(Exception, parse_URI, 'zcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma?amount=0.0003&label=test&amount=30.0') def test_is_hash256_str(self): self.assertTrue(is_hash256_str('09a4c03e3bdf83bbe3955f907ee52da4fc12f4813d459bc75228b64ad08617c7')) diff --git a/electrum/tests/test_wallet.py b/electrum/tests/test_wallet.py index 7d062501d3ae..3ec5cd940678 100644 --- a/electrum/tests/test_wallet.py +++ b/electrum/tests/test_wallet.py @@ -7,14 +7,14 @@ import time from io import StringIO -from electrum.storage import WalletStorage -from electrum.json_db import FINAL_SEED_VERSION -from electrum.wallet import (Abstract_Wallet, Standard_Wallet, create_new_wallet, +from electrum_xzc.storage import WalletStorage +from electrum_xzc.json_db import FINAL_SEED_VERSION +from electrum_xzc.wallet import (Abstract_Wallet, Standard_Wallet, create_new_wallet, restore_wallet_from_text, Imported_Wallet) -from electrum.exchange_rate import ExchangeBase, FxThread -from electrum.util import TxMinedInfo -from electrum.bitcoin import COIN -from electrum.json_db import JsonDB +from electrum_xzc.exchange_rate import ExchangeBase, FxThread +from electrum_xzc.util import TxMinedInfo +from electrum_xzc.bitcoin import COIN +from electrum_xzc.json_db import JsonDB from . import SequentialTestCase diff --git a/electrum/tests/test_wallet_vertical.py b/electrum/tests/test_wallet_vertical.py index ee9f50dab78b..2536c47f9e1b 100644 --- a/electrum/tests/test_wallet_vertical.py +++ b/electrum/tests/test_wallet_vertical.py @@ -5,16 +5,16 @@ from typing import Sequence import asyncio -from electrum import storage, bitcoin, keystore, bip32 -from electrum import Transaction -from electrum import SimpleConfig -from electrum.address_synchronizer import TX_HEIGHT_UNCONFIRMED, TX_HEIGHT_UNCONF_PARENT -from electrum.wallet import sweep, Multisig_Wallet, Standard_Wallet, Imported_Wallet, restore_wallet_from_text -from electrum.util import bfh, bh2u -from electrum.transaction import TxOutput -from electrum.mnemonic import seed_type - -from electrum.plugins.trustedcoin import trustedcoin +from electrum_xzc import storage, bitcoin, keystore, bip32 +from electrum_xzc import Transaction +from electrum_xzc import SimpleConfig +from electrum_xzc.address_synchronizer import TX_HEIGHT_UNCONFIRMED, TX_HEIGHT_UNCONF_PARENT +from electrum_xzc.wallet import sweep, Multisig_Wallet, Standard_Wallet, Imported_Wallet, restore_wallet_from_text +from electrum_xzc.util import bfh, bh2u +from electrum_xzc.transaction import TxOutput +from electrum_xzc.mnemonic import seed_type + +from electrum_xzc.plugins.trustedcoin import trustedcoin from . import TestCaseForTestnet from . import SequentialTestCase diff --git a/electrum/tests/test_x509.py b/electrum/tests/test_x509.py index 75d11a8c2c74..01065f6775e2 100644 --- a/electrum/tests/test_x509.py +++ b/electrum/tests/test_x509.py @@ -1,5 +1,5 @@ import unittest -from electrum.x509 import X509 +from electrum_xzc.x509 import X509 class TestX509(unittest.TestCase): def test_generalizedtime(self): full = X509(b'0\x82\x05F0\x82\x03.\x02\t\x00\xfeV\xd6\xb5?\xb1j\xe40\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\x000d1\x0b0\t\x06\x03U\x04\x06\x13\x02US1\x130\x11\x06\x03U\x04\x08\x0c\nCalifornia1!0\x1f\x06\x03U\x04\n\x0c\x18Internet Widgits Pty Ltd1\x1d0\x1b\x06\x03U\x04\x03\x0c\x14testnet.qtornado.com0 \x17\r180206010225Z\x18\x0f21180113010225Z0d1\x0b0\t\x06\x03U\x04\x06\x13\x02US1\x130\x11\x06\x03U\x04\x08\x0c\nCalifornia1!0\x1f\x06\x03U\x04\n\x0c\x18Internet Widgits Pty Ltd1\x1d0\x1b\x06\x03U\x04\x03\x0c\x14testnet.qtornado.com0\x82\x02"0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\x00\x03\x82\x02\x0f\x000\x82\x02\n\x02\x82\x02\x01\x00\xc2B\xe0\xa8\xd9$M\xbc)Wx\x0cv\x00\xc0\xfa2Ew:\xce\xa7\xcb\xc8\r?\xea\xc5R(\xc7\xc3Y\xe7zq=\xcd\x8d\xe3\x86\x9ecSI\xc7\x84\xf2~\x91\xd4\x19\xc2;\x97\xe81e\xf2\xeb\xf1\xadw\xa3p\x88A*-\r\xb6Yt\x98R\xe8\x8a\xf9\xb5>"F\xac\x19%\xc8~\x1d\xac\x93A\xffk\xce\xdb\xfc9\x05\xa0\xad\xf9V\x0f0\xa2b\xd0@\xe4\xf1\xb1\xe8\xb1\x10[&\xa1\xff\x13\xcfQ\xb7\x805\xef\xe7tL\xe5|\x08W\x8c\xd72\x9d\'\xeb\x92)3N\x01M\x06\xa9\xdc\xe4\'\x13\x90x\xd8\x830\x97\xa8\xcc2d \xfa\x91\x04\xd0\x1b\xe7\xaa t\x87\xba]\xb5w\x05(\xba\x07\xc2X$~?L\xc5\x03\xb2\xdeQ\xf3\xf3\xdab\xd9\x92\xd9\x86^:\x93\xc9\x86~\xd1\x94\xd4\x80\x9c\xff0\xc6m\xf4\xf0\xd6\x18\x96l\x1d\x0c\xe8\x15 \x8c\x89\xcb\xa4*\xd9\xefg\x844\x81\xb3\xce\xa1\x8a|\xf9h\xc3\xe1!\xfeZ`\xb71\x97Kj\x0b"\xd3\x98T\r\xd9\xbb\xc6\x0b\x81\x81k\x0e\xd01\x16\x91\xe4A\x8c\x1a\xe9W\xd4=<\xd4m_\xd4m\xa4H\x14\xc0\xae\x12\xab\x808\xf1\xf9_\xbb\xfb\xd0U\x0e\\\xd3.?\xa36\xe1hstU"\x17P\xcb>\x83\x9c\xaa\x9b\xb7\xe5\xb4\xb5W\xdc\xc1\xee\x91K\x12\xc2\xe1U\xaf\xf7I`\x83\x91\x0c\xc0\xcb\x15\x13!V\xa9\xc1\xca\x1b\x80\xff\xd8\x1f\xd8_+\x83\xcd\xcb%\xd6\xb7\xdc\x8a2\xa8Q\x1f\xbb.\xdf\x05\xb7hD\xab\xea\xe9\xfb.\xdd\x93\xd1\xf0\xb8r\xb9t.\xab\xf6]\xac\xc9U9\x87\x9e\xe36 \x87\xe7eo\x98\xac\xf4\x87\x8e\xf4\xa86\xd3\xcapy\xee\xa0]\xdbA\xb9\x00\xe9_R\xc8\xf7\xca\x13\xc6\xb1Z|c\xe8v\xa24\xac?k\xf1\xc4\x97\x18\x07\xbaU\xc9\xf5? \x95\x8f\x11\xa7\xc9\x8eY\x9c\xdfnx?\x88\xba\x90\xef\x94WU\xb5\xcf\x0b"\xe8\xfe\xa6.\x0cr-\xaf3\x8a\xe6v\xf9\xb91\x87\x91\xc6\xb1\xe9\xb9UP\xf5\x14\xb7\x99\x80\xc0\xc5}\x9a~\x7f\x06\x1e\xb8\x05\xd5\xa2LXO\\73i\x82\xcd\xc6#\xb7\xa4q\xd7\xd4y\xb1d\xaf\xa8\t\x9e1K\xd94\xaf7\x08\x8c);\xd2\xed\x91\xc6\xed\x83\x90\r\xef\x85\xf0\xfeJi\x02;\xf0\x0b\x03\xe7\xc1\x84\xd45\xaeP\xc2Lp\x1akb\xcaP\xe9\xfc\xc1\xc8VPQu\x85\x92l\x12\xb99{\x91\xd0\xa6d\n\xde\xf85\x93e\xfa\\\xf9cKx8\x84"s\xb8\xe52~\x97\x05\xc3\xf6\x1c\xca\x0b\xda\x8b\x90\xfeu5,\x94,\x99\xf9\x9a\xf3T\x8dAZ\xc7\xe9\x95-\x98\xf2\xbaL\x89\xc0?\xba1\xb5\\t|RY_\xc6\xabr\xe8') diff --git a/electrum/transaction.py b/electrum/transaction.py index 1501e0ef5d97..27a11a8603fb 100644 --- a/electrum/transaction.py +++ b/electrum/transaction.py @@ -604,7 +604,7 @@ def __init__(self, raw): self._inputs = None self._outputs = None # type: List[TxOutput] self.locktime = 0 - self.version = 2 + self.version = 1 # by default we assume this is a partial txn; # this value will get properly set when deserializing self.is_partial_originally = True diff --git a/electrum/util.py b/electrum/util.py index 62df080a9817..379de5c15d5d 100644 --- a/electrum/util.py +++ b/electrum/util.py @@ -65,11 +65,11 @@ def inv_dict(d): ca_path = certifi.where() -base_units = {'BTC':8, 'mBTC':5, 'bits':2, 'sat':0} +base_units = {'XZC':8, 'mXZC':5, 'bits':2, 'sat':0} base_units_inverse = inv_dict(base_units) -base_units_list = ['BTC', 'mBTC', 'bits', 'sat'] # list(dict) does not guarantee order +base_units_list = ['XZC', 'mXZC', 'bits', 'sat'] # list(dict) does not guarantee order -DECIMAL_POINT_DEFAULT = 5 # mBTC +DECIMAL_POINT_DEFAULT = 8 # XZC class UnknownBaseUnit(Exception): pass @@ -472,11 +472,11 @@ def user_dir(): if 'ANDROID_DATA' in os.environ: return android_data_dir() elif os.name == 'posix': - return os.path.join(os.environ["HOME"], ".electrum") + return os.path.join(os.environ["HOME"], ".electrum-xzc") elif "APPDATA" in os.environ: - return os.path.join(os.environ["APPDATA"], "Electrum") + return os.path.join(os.environ["APPDATA"], "Electrum-XZC") elif "LOCALAPPDATA" in os.environ: - return os.path.join(os.environ["LOCALAPPDATA"], "Electrum") + return os.path.join(os.environ["LOCALAPPDATA"], "Electrum-XZC") else: #raise Exception("No home directory found in environment variables.") return @@ -648,53 +648,21 @@ def time_difference(distance_in_time, include_seconds): return "over %d years" % (round(distance_in_minutes / 525600)) mainnet_block_explorers = { - 'Bitupper Explorer': ('https://bitupper.com/en/explorer/bitcoin/', - {'tx': 'transactions/', 'addr': 'addresses/'}), - 'Bitflyer.jp': ('https://chainflyer.bitflyer.jp/', - {'tx': 'Transaction/', 'addr': 'Address/'}), - 'Blockchain.info': ('https://blockchain.com/btc/', - {'tx': 'tx/', 'addr': 'address/'}), - 'blockchainbdgpzk.onion': ('https://blockchainbdgpzk.onion/', - {'tx': 'tx/', 'addr': 'address/'}), - 'Blockstream.info': ('https://blockstream.info/', - {'tx': 'tx/', 'addr': 'address/'}), - 'Bitaps.com': ('https://btc.bitaps.com/', - {'tx': '', 'addr': ''}), - 'BTC.com': ('https://btc.com/', - {'tx': '', 'addr': ''}), - 'Chain.so': ('https://www.chain.so/', - {'tx': 'tx/BTC/', 'addr': 'address/BTC/'}), - 'Insight.is': ('https://insight.bitpay.com/', - {'tx': 'tx/', 'addr': 'address/'}), - 'TradeBlock.com': ('https://tradeblock.com/blockchain/', - {'tx': 'tx/', 'addr': 'address/'}), - 'BlockCypher.com': ('https://live.blockcypher.com/btc/', - {'tx': 'tx/', 'addr': 'address/'}), - 'Blockchair.com': ('https://blockchair.com/bitcoin/', - {'tx': 'transaction/', 'addr': 'address/'}), - 'blockonomics.co': ('https://www.blockonomics.co/', - {'tx': 'api/tx?txid=', 'addr': '#/search?q='}), - 'OXT.me': ('https://oxt.me/', - {'tx': 'transaction/', 'addr': 'address/'}), - 'smartbit.com.au': ('https://www.smartbit.com.au/', - {'tx': 'tx/', 'addr': 'address/'}), - 'system default': ('blockchain:/', - {'tx': 'tx/', 'addr': 'address/'}), + 'explorer.zcoin.io': ('https://explorer.zcoin.io', + {'tx': '/tx/', 'addr': '/address/'}), + 'blockbook.zcoin.io': ('https://blockbook.zcoin.io', + {'tx': '/tx/', 'addr': '/address/'}), + 'chainz.cryptoid.info': ('https://chainz.cryptoid.info/xzc', + {'tx': '/tx.dws?', 'addr': '/address.dws?'}), + 'CryptoCore': ('https://xzc.ccore.online', + {'tx': '/transaction/', 'addr': '/address/'}), + 'bchain.info': ('https://bchain.info/XZC', + {'tx': '/tx/', 'addr': '/addr/'}), } testnet_block_explorers = { - 'Bitaps.com': ('https://tbtc.bitaps.com/', - {'tx': '', 'addr': ''}), - 'BlockCypher.com': ('https://live.blockcypher.com/btc-testnet/', - {'tx': 'tx/', 'addr': 'address/'}), - 'Blockchain.info': ('https://www.blockchain.com/btctest/', - {'tx': 'tx/', 'addr': 'address/'}), - 'Blockstream.info': ('https://blockstream.info/testnet/', - {'tx': 'tx/', 'addr': 'address/'}), - 'smartbit.com.au': ('https://testnet.smartbit.com.au/', - {'tx': 'tx/', 'addr': 'address/'}), - 'system default': ('blockchain://000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943/', - {'tx': 'tx/', 'addr': 'address/'}), + 'testexplorer.zcoin.io': ('http://testexplorer.zcoin.io', + {'tx': '/tx/', 'addr': '/address/'}), } def block_explorer_info(): @@ -703,7 +671,7 @@ def block_explorer_info(): def block_explorer(config: 'SimpleConfig') -> str: from . import constants - default_ = 'Blockstream.info' + default_ = 'explorer.zcoin.io' be_key = config.get('block_explorer', default_) be = block_explorer_info().get(be_key) return be_key if be is not None else default_ @@ -739,12 +707,12 @@ def parse_URI(uri: str, on_pr: Callable = None, *, loop=None) -> dict: if ':' not in uri: if not bitcoin.is_address(uri): - raise InvalidBitcoinURI("Not a bitcoin address") + raise InvalidBitcoinURI("Not a zcoin address") return {'address': uri} u = urllib.parse.urlparse(uri) if u.scheme != 'bitcoin': - raise InvalidBitcoinURI("Not a bitcoin URI") + raise InvalidBitcoinURI("Not a zcoin URI") address = u.path # python for android fails to parse query @@ -761,7 +729,7 @@ def parse_URI(uri: str, on_pr: Callable = None, *, loop=None) -> dict: out = {k: v[0] for k, v in pq.items()} if address: if not bitcoin.is_address(address): - raise InvalidBitcoinURI(f"Invalid bitcoin address: {address}") + raise InvalidBitcoinURI(f"Invalid zcoin address: {address}") out['address'] = address if 'amount' in out: am = out['amount'] @@ -831,7 +799,7 @@ def create_bip21_uri(addr, amount_sat: Optional[int], message: Optional[str], raise Exception(f"illegal key for URI: {repr(k)}") v = urllib.parse.quote(v) query.append(f"{k}={v}") - p = urllib.parse.ParseResult(scheme='bitcoin', netloc='', path=addr, params='', query='&'.join(query), fragment='') + p = urllib.parse.ParseResult(scheme='zcoin', netloc='', path=addr, params='', query='&'.join(query), fragment='') return str(urllib.parse.urlunparse(p)) diff --git a/electrum/wallet.py b/electrum/wallet.py index acb605a69ca8..1786fe1e9426 100644 --- a/electrum/wallet.py +++ b/electrum/wallet.py @@ -1179,7 +1179,7 @@ def get_payment_request(self, addr, config): if not r: return out = copy.copy(r) - out['URI'] = 'bitcoin:' + addr + '?amount=' + format_satoshis(out.get('amount')) + out['URI'] = 'zcoin:' + addr + '?amount=' + format_satoshis(out.get('amount')) status, conf = self.get_request_status(addr) out['status'] = status if conf is not None: diff --git a/run_electrum b/run_electrum index 1f5ee2f03df0..994e1ae1d1a4 100755 --- a/run_electrum +++ b/run_electrum @@ -38,7 +38,7 @@ if sys.version_info[:3] < _min_python_version_tuple: script_dir = os.path.dirname(os.path.realpath(__file__)) is_bundle = getattr(sys, 'frozen', False) -is_local = not is_bundle and os.path.exists(os.path.join(script_dir, "electrum.desktop")) +is_local = not is_bundle and os.path.exists(os.path.join(script_dir, "electrum-xzc.desktop")) is_android = 'ANDROID_DATA' in os.environ if is_local: # running from source @@ -46,7 +46,7 @@ if is_local: # running from source warnings.simplefilter('default', DeprecationWarning) # move this back to gui/kivy/__init.py once plugins are moved -os.environ['KIVY_DATA_DIR'] = os.path.abspath(os.path.dirname(__file__)) + '/electrum/gui/kivy/data/' +os.environ['KIVY_DATA_DIR'] = os.path.abspath(os.path.dirname(__file__)) + '/electrum_xzc/gui/kivy/data/' if is_local or is_android: sys.path.insert(0, os.path.join(script_dir, 'packages')) @@ -79,17 +79,17 @@ if not is_android: check_imports() -from electrum.logging import get_logger, configure_logging -from electrum import util -from electrum import constants -from electrum import SimpleConfig -from electrum.wallet import Wallet -from electrum.storage import WalletStorage, get_derivation_used_for_hw_device_encryption -from electrum.util import print_msg, print_stderr, json_encode, json_decode, UserCancelled -from electrum.util import InvalidPassword -from electrum.commands import get_parser, known_commands, Commands, config_variables -from electrum import daemon -from electrum import keystore +from electrum_xzc.logging import get_logger, configure_logging +from electrum_xzc import util +from electrum_xzc import constants +from electrum_xzc import SimpleConfig +from electrum_xzc.wallet import Wallet +from electrum_xzc.storage import WalletStorage, get_derivation_used_for_hw_device_encryption +from electrum_xzc.util import print_msg, print_stderr, json_encode, json_decode, UserCancelled +from electrum_xzc.util import InvalidPassword +from electrum_xzc.commands import get_parser, known_commands, Commands, config_variables +from electrum_xzc import daemon +from electrum_xzc import keystore _logger = get_logger(__name__) @@ -264,7 +264,7 @@ def run_offline_command(config, config_options, plugins): def init_plugins(config, gui_name): - from electrum.plugin import Plugins + from electrum_xzc.plugin import Plugins return Plugins(config, gui_name) @@ -391,7 +391,7 @@ if __name__ == '__main__': init_plugins(config, 'cmdline') d = daemon.Daemon(config, fd) if config.get('websocket_server'): - from electrum import websockets + from electrum_xzc import websockets websockets.WebSocketServer(config, d.network) if config.get('requests_dir'): path = os.path.join(config.get('requests_dir'), 'index.html') diff --git a/setup.py b/setup.py index 409664742772..e7b67aceca53 100755 --- a/setup.py +++ b/setup.py @@ -26,7 +26,7 @@ requirements_hw = f.read().splitlines() # load version.py; needlessly complicated alternative to "imp.load_source": -version_spec = importlib.util.spec_from_file_location('version', 'electrum/version.py') +version_spec = importlib.util.spec_from_file_location('version', 'electrum_xzc/version.py') version_module = version = importlib.util.module_from_spec(version_spec) version_spec.loader.exec_module(version_module) @@ -46,8 +46,8 @@ else: usr_share = os.path.expanduser('~/.local/share') data_files += [ - (os.path.join(usr_share, 'applications/'), ['electrum.desktop']), - (os.path.join(usr_share, icons_dirname), ['electrum/gui/icons/electrum.png']), + (os.path.join(usr_share, 'applications/'), ['electrum-xzc.desktop']), + (os.path.join(usr_share, icons_dirname), ['electrum_xzc/gui/icons/electrum-xzc.png']), ] extras_require = { @@ -59,36 +59,36 @@ setup( - name="Electrum", + name="Electrum-XZC", version=version.ELECTRUM_VERSION, python_requires='>={}'.format(MIN_PYTHON_VERSION), install_requires=requirements, extras_require=extras_require, packages=[ - 'electrum', - 'electrum.gui', - 'electrum.gui.qt', - 'electrum.plugins', - ] + [('electrum.plugins.'+pkg) for pkg in find_packages('electrum/plugins')], + 'electrum_xzc', + 'electrum_xzc.gui', + 'electrum_xzc.gui.qt', + 'electrum_xzc.plugins', + ] + [('electrum_xzc.plugins.'+pkg) for pkg in find_packages('electrum_xzc/plugins')], package_dir={ - 'electrum': 'electrum' + 'electrum_xzc': 'electrum_xzc' }, package_data={ '': ['*.txt', '*.json', '*.ttf', '*.otf'], - 'electrum': [ + 'electrum_xzc': [ 'wordlist/*.txt', 'locale/*/LC_MESSAGES/electrum.mo', ], - 'electrum.gui': [ + 'electrum_xzc.gui': [ 'icons/*', ], }, - scripts=['electrum/electrum'], + scripts=['electrum_xzc/electrum-xzc'], data_files=data_files, - description="Lightweight Bitcoin Wallet", + description="Lightweight Zcoin Wallet", author="Thomas Voegtlin", author_email="thomasv@electrum.org", license="MIT Licence", url="https://electrum.org", - long_description="""Lightweight Bitcoin Wallet""", + long_description="""Lightweight Zcoin Wallet""", )