Some Electrum RPCs (yet to be implemented) require the scripthash index, and imo it does not make sense to allow partial Electrum functionality. So make sure the index is available when the Electrum server is enabled.
Details
Details
- Reviewers
Fabien - Group Reviewers
Restricted Project - Commits
- rABCb4ca4a8c259c: [chronik] make -chronikelectrumbind require -chronikscripthashindex
ninja check-functional
Diff Detail
Diff Detail
- Repository
- rABC Bitcoin ABC
- Lint
Lint Not Applicable - Unit
Tests Not Applicable
Event Timeline
chronik/chronik-cpp/chronik.cpp | ||
---|---|---|
60 ↗ | (On Diff #52404) | I like auto, but here really... bool is the same number of chars |
Comment Actions
Tail of the build log:
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s ----------------------------|---------|----------|---------|---------|------------------------------ All files | 16.22 | 17.79 | 11.15 | 25.88 | ecash-lib | 0 | 0 | 0 | 0 | eslint.config.js | 0 | 0 | 0 | 0 | ecash-lib/dist/ffi | 0 | 0 | 0 | 0 | ecash_lib_wasm_browser.js | 0 | 0 | 0 | 0 | 3-336 ecash_lib_wasm_nodejs.js | 0 | 0 | 0 | 0 | 1-264 ecash-lib/src | 22.8 | 19.47 | 13.75 | 43.85 | consts.ts | 0 | 100 | 100 | 0 | 6-8 ecc.ts | 30.76 | 83.33 | 22.22 | 57.14 | 23-31 hash.ts | 35.29 | 83.33 | 22.22 | 66.66 | 14,17,20 index.ts | 0 | 0 | 0 | 0 | indexBrowser.ts | 0 | 0 | 0 | 0 | indexNodeJs.ts | 0 | 0 | 0 | 0 | initBrowser.ts | 0 | 100 | 0 | 0 | 11-13 initNodeJs.ts | 53.84 | 100 | 66.66 | 85.71 | 12 op.ts | 20.13 | 23.33 | 36.36 | 39.47 | ...4,107,109,117-122,133-161 opcode.ts | 50.2 | 83.33 | 100 | 100 | 1 script.ts | 19.26 | 17.64 | 9.67 | 33.33 | ...5-42,50,55,62-173,182-193 sigHashType.ts | 38.66 | 25 | 38.46 | 76.31 | 26-58 tx.ts | 16.48 | 11.9 | 4.76 | 31.91 | ...8,143-145,150-151,156,176 txBuilder.ts | 8.02 | 9.61 | 4.54 | 16.48 | ...0,234-237,246-250,256-260 unsignedTx.ts | 6.69 | 5 | 2.56 | 12.58 | ...0,344-345,350-351,356-357 ecash-lib/src/address | 11.35 | 15.15 | 5.12 | 22.41 | address.ts | 10.95 | 11.36 | 3.22 | 21.05 | ...3,239-240,255-256,266-344 legacyaddr.ts | 12.04 | 22.72 | 12.5 | 25 | 15-19,23-38,70-111,124-128 ecash-lib/src/ffi | 8.38 | 1.44 | 1.88 | 8.59 | ecash_lib_wasm_browser.js | 0 | 0 | 0 | 0 | 3-336 ecash_lib_wasm_nodejs.js | 18.36 | 5 | 4.34 | 18.62 | ...0-155,171-243,250-251,255 ecash-lib/src/io | 19.54 | 32 | 24.19 | 38.16 | bytes.ts | 3.77 | 62.5 | 6.66 | 7.4 | 13-64 hex.ts | 29.87 | 50 | 22.22 | 61.76 | 33-37,41-45,50,58,66-68 int.ts | 0 | 0 | 0 | 0 | str.ts | 46.15 | 83.33 | 40 | 85.71 | 15 varsize.ts | 6.12 | 13.15 | 20 | 12 | 14-24,35-47 writer.ts | 0 | 0 | 0 | 0 | writerbytes.ts | 22.03 | 21.87 | 33.33 | 43.33 | 33,42-67,79 writerlength.ts | 33.33 | 83.33 | 30.76 | 62.5 | 26-36 ecash-lib/src/test | 22.15 | 24.63 | 20.58 | 42.1 | testRunner.ts | 22.15 | 24.63 | 20.58 | 42.1 | ...-75,87-89,102-112,122-207 ecash-lib/src/token | 14.28 | 17.24 | 7.14 | 27.52 | alp.ts | 9.37 | 15.62 | 4.34 | 18.29 | ...3,127-131,135-137,141-145 common.ts | 54.54 | 83.33 | 100 | 100 | 1 empp.ts | 26.08 | 50 | 14.28 | 50 | 11-14,22-28 slp.ts | 14.76 | 7.35 | 4 | 28.2 | ...7,174-178,185-197,201-211 ----------------------------|---------|----------|---------|---------|------------------------------ ##teamcity[blockOpened name='Code Coverage Summary'] ##teamcity[buildStatisticValue key='CodeCoverageAbsBCovered' value='456'] ##teamcity[buildStatisticValue key='CodeCoverageAbsBTotal' value='2811'] ##teamcity[buildStatisticValue key='CodeCoverageAbsRCovered' value='161'] ##teamcity[buildStatisticValue key='CodeCoverageAbsRTotal' value='905'] ##teamcity[buildStatisticValue key='CodeCoverageAbsMCovered' value='51'] ##teamcity[buildStatisticValue key='CodeCoverageAbsMTotal' value='457'] ##teamcity[buildStatisticValue key='CodeCoverageAbsLCovered' value='448'] ##teamcity[buildStatisticValue key='CodeCoverageAbsLTotal' value='1731'] ##teamcity[blockClosed name='Code Coverage Summary'] mv: cannot stat 'test_results/ecash-lib-integration-tests-junit.xml': No such file or directory Build ecash-lib-integration-tests failed with exit code 1
Comment Actions
Build Bitcoin ABC Diffs / Diff Testing (build-chronik) failed.
Tail of the build log:
Doc-tests chronik-bridge running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests chronik-db running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests chronik-http running 1 test test chronik/chronik-http/src/protobuf.rs - protobuf::Protobuf (line 29) ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.39s Doc-tests chronik-indexer running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests chronik-plugin running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests chronik-plugin-common running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests chronik-plugin-impl running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests chronik-proto running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests chronik-util running 2 tests test chronik/chronik-util/src/log.rs - log::log (line 65) ... ignored test chronik/chronik-util/src/log.rs - log::log_chronik (line 87) ... ignored test result: ok. 0 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.00s ninja: build stopped: cannot make progress due to previous errors. Build build-chronik failed with exit code 1
Comment Actions
Tail of the build log:
2025-01-27T16:20:00.512000Z TestFramework (INFO): Stopping nodes [node 0] Cleaning up leftover process Running Unit Tests for Test Framework Modules [1msetup_scripts/ecash-agora_base.py[0m started [1msetup_scripts/ecash-agora_base.py[0m failed, Duration: 1 s [1mstdout:[0m [1mstderr:[0m Traceback (most recent call last): File "/work/test/functional/setup_scripts/ecash-agora_base.py", line 65, in <module> EcashAgoraSetup().main() File "/work/test/functional/setup_scripts/../test_framework/test_framework.py", line 172, in main exit_code = self.shutdown() ^^^^^^^^^^^^^^^ File "/work/test/functional/setup_scripts/../test_framework/test_framework.py", line 398, in shutdown self.stop_nodes() File "/work/test/functional/setup_scripts/../test_framework/test_framework.py", line 653, in stop_nodes node.stop_node(wait=wait, wait_until_stopped=False) File "/work/test/functional/setup_scripts/../test_framework/test_node.py", line 515, in stop_node self.stop(wait=wait) ^^^^^^^^^ File "/work/test/functional/setup_scripts/../test_framework/test_node.py", line 283, in __getattr__ assert self.rpc is not None, self._node_msg("Error: RPC not initialized") ^^^^^^^^^^^^^^^^^^^^ AssertionError: [node 0] Error: RPC not initialized [1m TEST | STATUS | DURATION [0m[0;31msetup_scripts/ecash-agora_base.py | ✖ Failed | 1 s [0m[0;31m[1m ALL | ✖ Failed | 1 s (accumulated) [0m[0mRuntime: 1 s Test runner completed with code 1 ------------|---------|----------|---------|---------|---------------------------------------------- File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s ------------|---------|----------|---------|---------|---------------------------------------------- All files | 3.9 | 6.94 | 3.4 | 7.66 | ad.ts | 6.6 | 15.62 | 20 | 12.72 | 6,33-100,127-146 agora.ts | 3.57 | 3.01 | 1.56 | 7.04 | 14,42,47,114-493,545-950,970-976 consts.ts | 57.14 | 83.33 | 100 | 100 | 1 index.ts | 0 | 0 | 0 | 0 | oneshot.ts | 5 | 22.72 | 4 | 9.87 | 5,77-223,234-251,263-270,279-286 partial.ts | 2.2 | 3.73 | 1.92 | 4.32 | ...7,1332-1342,1352-1371,1388-1395,1405-1412 ------------|---------|----------|---------|---------|---------------------------------------------- ##teamcity[blockOpened name='Code Coverage Summary'] ##teamcity[buildStatisticValue key='CodeCoverageAbsBCovered' value='43'] ##teamcity[buildStatisticValue key='CodeCoverageAbsBTotal' value='1101'] ##teamcity[buildStatisticValue key='CodeCoverageAbsRCovered' value='25'] ##teamcity[buildStatisticValue key='CodeCoverageAbsRTotal' value='360'] ##teamcity[buildStatisticValue key='CodeCoverageAbsMCovered' value='5'] ##teamcity[buildStatisticValue key='CodeCoverageAbsMTotal' value='147'] ##teamcity[buildStatisticValue key='CodeCoverageAbsLCovered' value='43'] ##teamcity[buildStatisticValue key='CodeCoverageAbsLTotal' value='561'] ##teamcity[blockClosed name='Code Coverage Summary'] mv: cannot stat 'test_results/ecash-agora-integration-tests-junit.xml': No such file or directory Build ecash-agora-integration-tests failed with exit code 1
Comment Actions
Build Bitcoin ABC Diffs / Diff Testing (build-chronik-plugins) failed.
Tail of the build log:
Doc-tests chronik-bridge running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests chronik-db running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests chronik-http running 1 test test chronik/chronik-http/src/protobuf.rs - protobuf::Protobuf (line 29) ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.37s Doc-tests chronik-indexer running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests chronik-plugin running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests chronik-plugin-common running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests chronik-plugin-impl running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests chronik-proto running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests chronik-util running 2 tests test chronik/chronik-util/src/log.rs - log::log (line 65) ... ignored test chronik/chronik-util/src/log.rs - log::log_chronik (line 87) ... ignored test result: ok. 0 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.00s ninja: build stopped: cannot make progress due to previous errors. Build build-chronik-plugins failed with exit code 1
Comment Actions
Tail of the build log:
[1msetup_scripts/chronik-client_block_and_blocks.py[0m started [1msetup_scripts/chronik-client_block_and_blocks.py[0m failed, Duration: 2 s [1mstdout:[0m [1mstderr:[0m Traceback (most recent call last): File "/work/test/functional/setup_scripts/chronik-client_block_and_blocks.py", line 58, in <module> ChronikClient_Block_Setup().main() File "/work/test/functional/setup_scripts/../test_framework/test_framework.py", line 172, in main exit_code = self.shutdown() ^^^^^^^^^^^^^^^ File "/work/test/functional/setup_scripts/../test_framework/test_framework.py", line 398, in shutdown self.stop_nodes() File "/work/test/functional/setup_scripts/../test_framework/test_framework.py", line 653, in stop_nodes node.stop_node(wait=wait, wait_until_stopped=False) File "/work/test/functional/setup_scripts/../test_framework/test_node.py", line 515, in stop_node self.stop(wait=wait) ^^^^^^^^^ File "/work/test/functional/setup_scripts/../test_framework/test_node.py", line 283, in __getattr__ assert self.rpc is not None, self._node_msg("Error: RPC not initialized") ^^^^^^^^^^^^^^^^^^^^ AssertionError: [node 0] Error: RPC not initialized [1m TEST | STATUS | DURATION [0m[0;31msetup_scripts/chronik-client_block_and_blocks.py | ✖ Failed | 2 s [0m[0;31m[1m ALL | ✖ Failed | 2 s (accumulated) [0m[0mRuntime: 2 s Test runner for chronik-client_block_and_blocks completed with code 1 ----------------------|---------|----------|---------|---------|------------------------------------ File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s ----------------------|---------|----------|---------|---------|------------------------------------ All files | 4.69 | 0.45 | 1.05 | 4.58 | chronik-client | 100 | 100 | 100 | 100 | index.ts | 100 | 100 | 100 | 100 | chronik-client/proto | 3.87 | 0.49 | 1.38 | 3.91 | chronik.ts | 3.87 | 0.49 | 1.38 | 3.91 | ...7,6332-6371,6379-6483,6487-6496 chronik-client/src | 8.33 | 0 | 0 | 7.59 | ChronikClient.ts | 4.91 | 0 | 0 | 4.91 | ...20-392,405-462,476-580,648-1451 failoverProxy.ts | 4.67 | 0 | 0 | 4.8 | 33-327 hex.ts | 31.57 | 0 | 0 | 33.33 | 33-37,41-45,49-62,66-68 validation.ts | 26.82 | 0 | 0 | 18.91 | 14-49,54-55,62-63,73-88 ----------------------|---------|----------|---------|---------|------------------------------------ ##teamcity[blockOpened name='Code Coverage Summary'] ##teamcity[buildStatisticValue key='CodeCoverageAbsBCovered' value='147'] ##teamcity[buildStatisticValue key='CodeCoverageAbsBTotal' value='3132'] ##teamcity[buildStatisticValue key='CodeCoverageAbsRCovered' value='12'] ##teamcity[buildStatisticValue key='CodeCoverageAbsRTotal' value='2645'] ##teamcity[buildStatisticValue key='CodeCoverageAbsMCovered' value='6'] ##teamcity[buildStatisticValue key='CodeCoverageAbsMTotal' value='567'] ##teamcity[buildStatisticValue key='CodeCoverageAbsLCovered' value='142'] ##teamcity[buildStatisticValue key='CodeCoverageAbsLTotal' value='3097'] ##teamcity[blockClosed name='Code Coverage Summary'] mv: cannot stat 'test_results/chronik-client-integration-tests-junit.xml': No such file or directory Build chronik-client-integration-tests failed with exit code 1
Comment Actions
Build Bitcoin ABC Diffs / Diff Testing (build-chronik) failed.
Failed tests logs:
====== Bitcoin ABC functional tests: chronik_electrum_basic.py ====== ------- Stdout: ------- 2025-01-28T13:24:46.634000Z TestFramework (INFO): Initializing test directory /work/abc-ci-builds/build-chronik/test/tmp/test_runner_₿₵_🏃_20250128_132138/chronik_electrum_basic_230 2025-01-28T13:25:48.633000Z TestFramework (ERROR): Assertion failed Traceback (most recent call last): File "/work/test/functional/test_framework/test_node.py", line 792, in assert_start_raises_init_error ret = self.process.wait(timeout=self.rpc_timeout) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.11/subprocess.py", line 1262, in wait return self._wait(timeout=timeout) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.11/subprocess.py", line 1989, in _wait raise TimeoutExpired(self.args, timeout) subprocess.TimeoutExpired: Command '['/work/abc-ci-builds/build-chronik/src/bitcoind', '-datadir=/work/abc-ci-builds/build-chronik/test/tmp/test_runner_₿₵_🏃_20250128_132138/chronik_electrum_basic_230/node0', '-logtimemicros', '-logthreadnames', '-logsourcelocations', '-debug', '-debugexclude=libevent', '-debugexclude=leveldb', '-uacomment=testnode-0', '-chronik', '-chronikscripthashindex=0']' timed out after 60 seconds During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/work/test/functional/test_framework/test_framework.py", line 149, in main self._run_test_internal() File "/work/test/functional/test_framework/test_framework.py", line 139, in _run_test_internal self.run_test() File "/work/test/functional/chronik_electrum_basic.py", line 32, in run_test self.test_init_errors() File "/work/test/functional/chronik_electrum_basic.py", line 59, in test_init_errors self.node.assert_start_raises_init_error( File "/work/test/functional/test_framework/test_node.py", line 831, in assert_start_raises_init_error self._raise_assertion_error(assert_msg) File "/work/test/functional/test_framework/test_node.py", line 266, in _raise_assertion_error raise AssertionError(self._node_msg(msg)) AssertionError: [node 0] bitcoind should have exited within 60s with expected error Error: The -chronikelectrumbind option requires -chronikscripthashindex to be true. 2025-01-28T13:25:48.686000Z TestFramework (INFO): Stopping nodes 2025-01-28T13:25:48.686000Z TestFramework (WARNING): Not cleaning up dir /work/abc-ci-builds/build-chronik/test/tmp/test_runner_₿₵_🏃_20250128_132138/chronik_electrum_basic_230 2025-01-28T13:25:48.686000Z TestFramework (ERROR): Test failed. Test logging available at /work/abc-ci-builds/build-chronik/test/tmp/test_runner_₿₵_🏃_20250128_132138/chronik_electrum_basic_230/test_framework.log 2025-01-28T13:25:48.686000Z TestFramework (ERROR): 2025-01-28T13:25:48.687000Z TestFramework (ERROR): Hint: Call /work/test/functional/combine_logs.py '/work/abc-ci-builds/build-chronik/test/tmp/test_runner_₿₵_🏃_20250128_132138/chronik_electrum_basic_230' to consolidate all logs 2025-01-28T13:25:48.687000Z TestFramework (ERROR): 2025-01-28T13:25:48.687000Z TestFramework (ERROR): If this failure happened unexpectedly or intermittently, please file a bug and provide a link or upload of the combined log. 2025-01-28T13:25:48.687000Z TestFramework (ERROR): https://github.com/Bitcoin-ABC/bitcoin-abc/issues 2025-01-28T13:25:48.687000Z TestFramework (ERROR):
Each failure log is accessible here:
Bitcoin ABC functional tests: chronik_electrum_basic.py
Comment Actions
Build Bitcoin ABC Diffs / Diff Testing (build-chronik-plugins) failed.
Failed tests logs:
====== Bitcoin ABC functional tests: chronik_electrum_basic.py ====== ------- Stdout: ------- 2025-01-28T13:27:29.527000Z TestFramework (INFO): Initializing test directory /work/abc-ci-builds/build-chronik-plugins/test/tmp/test_runner_₿₵_🏃_20250128_132510/chronik_electrum_basic_230 2025-01-28T13:28:30.431000Z TestFramework (ERROR): Assertion failed Traceback (most recent call last): File "/work/test/functional/test_framework/test_node.py", line 792, in assert_start_raises_init_error ret = self.process.wait(timeout=self.rpc_timeout) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.11/subprocess.py", line 1262, in wait return self._wait(timeout=timeout) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.11/subprocess.py", line 1989, in _wait raise TimeoutExpired(self.args, timeout) subprocess.TimeoutExpired: Command '['/work/abc-ci-builds/build-chronik-plugins/src/bitcoind', '-datadir=/work/abc-ci-builds/build-chronik-plugins/test/tmp/test_runner_₿₵_🏃_20250128_132510/chronik_electrum_basic_230/node0', '-logtimemicros', '-logthreadnames', '-logsourcelocations', '-debug', '-debugexclude=libevent', '-debugexclude=leveldb', '-uacomment=testnode-0', '-chronik', '-chronikscripthashindex=0']' timed out after 60 seconds During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/work/test/functional/test_framework/test_framework.py", line 149, in main self._run_test_internal() File "/work/test/functional/test_framework/test_framework.py", line 139, in _run_test_internal self.run_test() File "/work/test/functional/chronik_electrum_basic.py", line 32, in run_test self.test_init_errors() File "/work/test/functional/chronik_electrum_basic.py", line 59, in test_init_errors self.node.assert_start_raises_init_error( File "/work/test/functional/test_framework/test_node.py", line 831, in assert_start_raises_init_error self._raise_assertion_error(assert_msg) File "/work/test/functional/test_framework/test_node.py", line 266, in _raise_assertion_error raise AssertionError(self._node_msg(msg)) AssertionError: [node 0] bitcoind should have exited within 60s with expected error Error: The -chronikelectrumbind option requires -chronikscripthashindex to be true. 2025-01-28T13:28:30.487000Z TestFramework (INFO): Stopping nodes 2025-01-28T13:28:30.488000Z TestFramework (WARNING): Not cleaning up dir /work/abc-ci-builds/build-chronik-plugins/test/tmp/test_runner_₿₵_🏃_20250128_132510/chronik_electrum_basic_230 2025-01-28T13:28:30.488000Z TestFramework (ERROR): Test failed. Test logging available at /work/abc-ci-builds/build-chronik-plugins/test/tmp/test_runner_₿₵_🏃_20250128_132510/chronik_electrum_basic_230/test_framework.log 2025-01-28T13:28:30.488000Z TestFramework (ERROR): 2025-01-28T13:28:30.488000Z TestFramework (ERROR): Hint: Call /work/test/functional/combine_logs.py '/work/abc-ci-builds/build-chronik-plugins/test/tmp/test_runner_₿₵_🏃_20250128_132510/chronik_electrum_basic_230' to consolidate all logs 2025-01-28T13:28:30.488000Z TestFramework (ERROR): 2025-01-28T13:28:30.488000Z TestFramework (ERROR): If this failure happened unexpectedly or intermittently, please file a bug and provide a link or upload of the combined log. 2025-01-28T13:28:30.489000Z TestFramework (ERROR): https://github.com/Bitcoin-ABC/bitcoin-abc/issues 2025-01-28T13:28:30.489000Z TestFramework (ERROR):
Each failure log is accessible here:
Bitcoin ABC functional tests: chronik_electrum_basic.py