1
0

92 Commits

Author SHA1 Message Date
SomberNight
c919d4940a keystore: fix memory leak for LRU cache
Using `@functools.lru_cache` on an instance method behaves in interesting ways.
The cache kept a ref around for `self`, so in effect we were never GC-ing keystore objects. Effectively there was a single global cache for derive_pubkey, with keys `(keystore, for_change, n)`.

This PR now changes the caching to be per-keystore:
each ks has a cache, keyed `(for_change, n)`.
GC-ing individual keystores should now be possible, which should result in cleaning up just their own cache.

This also enables the corresponding previously silence flake8-bugbear check for `@functools.lru_cache`. (note that the check can selectively be disabled by adding a comment on the relevant line: `# noqa: B019`)
2025-11-18 17:06:42 +00:00
SomberNight
bdb7a3566f ci: update flake8 2025-11-18 17:02:23 +00:00
f321x
80ea7becdc CI: regtest: stop on failed test, expose datadirs
Stops the running regtest if one test fails (using the --failfast
option) and makes the wallet data directories of alice, bob and carol
available for debugging. This seems helpful to fix issues only happening
on the CI.
2025-10-31 14:50:19 +01:00
SomberNight
2dc9ca906b ci: add task to also run unit tests with new python 3.14 2025-10-09 15:17:48 +00:00
ghost43
fd0ad25775 Merge pull request #10238 from SomberNight/202509_ci_coveralls
ci: only run coveralls on one of the unittest tasks
2025-09-26 14:35:36 +00:00
SomberNight
750f1d0c99 ci: appimage build: run build.sh directly instead of sub-scripts
- previously we had the CI spawn us inside a docker container as per our Dockerfile,
  and we ran make_appimage.sh inside that
- now we also need to run make_type2_runtime.sh, which builds and runs another docker container, so the old approach does not work
  - follow-up https://github.com/spesmilo/electrum/pull/10019
- looks easier to just try to run build.sh, the outer script, which does all that
  - makes the CI task more similar to what dev machines run
  - at the cost of somewhat more compute
2025-09-26 14:25:24 +00:00
SomberNight
1423508341 ci: only run coveralls on one of the unittest tasks
coveralls has been quite flaky recently -- let's try to lower the number of CI tasks where it spreads the flakiness.
2025-09-26 13:24:53 +00:00
SomberNight
b60d2e9610 ci: add task to run unittests with frozen deps
I think it makes sense to run the tests with both the "latest" dependencies,
and with the pinned dependencies that we package for releases.

Testing with latest can reveal changes/issues with new dep versions,
while testing with pinned is testing what users will actually run.
Previously we were only testing with "latest".
2025-09-03 16:40:54 +00:00
SomberNight
6583a986a2 ci: tests: move away from tox, just use pytest directly
- it was originally added in https://github.com/spesmilo/electrum/pull/1334,
  with the goal of simplifying running the tests on local dev machines.
  However this usage is not documented anywhere, and AFAIK regular contributors
  don't use it either.
- tox just adds another layer of abstraction that is not that useful IMO
  - I want more control over which electrum-deps are installed, which tox is
    (in this case) unhelpfully abstracting away
2025-09-03 15:33:05 +00:00
f321x
ac2666ef9e fix failing pip installs in regtest CI
It seems like the OS version of the CI image has been bumped, the regtest of PR https://github.com/spesmilo/electrum/pull/10073 fails for me with this error:

```
(Reading database ... 55%
(Reading database ... 60%
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 100%
(Reading database ... 111702 files and directories currently installed.)
Preparing to unpack .../jq_1.7.1-3ubuntu0.24.04.1_amd64.deb ...
Unpacking jq (1.7.1-3ubuntu0.24.04.1) over (1.7.1-3build1) ...
Preparing to unpack .../libjq1_1.7.1-3ubuntu0.24.04.1_amd64.deb ...
Unpacking libjq1:amd64 (1.7.1-3ubuntu0.24.04.1) over (1.7.1-3build1) ...
Setting up libjq1:amd64 (1.7.1-3ubuntu0.24.04.1) ...
Setting up jq (1.7.1-3ubuntu0.24.04.1) ...
Processing triggers for man-db (2.12.0-4build2) ...
Processing triggers for libc-bin (2.39-0ubuntu8.5) ...

Running kernel seems to be up-to-date.

No services need to be restarted.

No containers need to be restarted.

No user sessions are running outdated binaries.

No VM guests are running outdated hypervisor (qemu) binaries on this host.
python3 -m pip install --user --upgrade pip
error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
    python3-xyz, where xyz is the package you are trying to
    install.

    If you wish to install a non-Debian-packaged Python package,
    create a virtual environment using python3 -m venv path/to/venv.
    Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
    sure you have python3-full installed.

    If you wish to install a non-Debian packaged Python application,
    it may be easiest to use pipx install xyz, which will manage a
    virtual environment for you. Make sure you have pipx installed.

    See /usr/share/doc/python3.12/README.venv for more information.

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.
```

This should make the pip installs work again, however not sure how to test it *on* the CI? i it locally and it seems to work on Ubuntu 24.04 with this patch.
2025-07-22 20:04:31 +02:00
SomberNight
fc93e2ca4c ci: update electrumx 2025-06-13 23:53:29 +00:00
SomberNight
5fd6603ea6 ci: regtests: bump e-x 2025-05-29 17:29:27 +00:00
SomberNight
8198209149 ci: regtests: bump e-x 2025-05-28 14:45:47 +00:00
SomberNight
96f861a570 ci: add linter task "ban unicode" to protect against malicious unicode
This script scans the whole codebase for unicode characters and
errors if it finds any, unless the character is specifically whitelisted.

The motivation is to protect against homoglyph attacks, invisible unicode characters,
bidirectional and other control characters, and other malicious unicode usage.

Given that we mostly expect to use ASCII characters in the source code,
the most robust and generic fix seems to be to just ban all unicode usage.

see https://trojansource.codes/ :
> Compilers, interpreters, and build pipelines supporting Unicode should throw errors or warnings
> for unterminated bidirectional control characters in comments or string literals,
> and for identifiers with mixed-script confusable characters.
> Language specifications should formally disallow unterminated bidirectional
> control characters in comments and string literals.
> Code editors and repository frontends should make bidirectional control characters
> and mixed-script confusable characters perceptible with visual symbols or warnings.

also https://github.com/maltfield/detect-malicious-unicode
2025-05-09 18:03:25 +00:00
SomberNight
d1e1ca7fd2 ci: fix "locale: upload to crowdin" task
follow-up https://github.com/spesmilo/electrum/pull/9726
2025-04-14 18:08:31 +00:00
SomberNight
31b176169a contrib: mv locale-related scripts to contrib/locale/ 2025-04-14 17:18:37 +00:00
SomberNight
ef452b1f49 contrib/push_locale: update qt5->qt6 2025-04-07 17:16:02 +00:00
SomberNight
5c233ac325 ci: enable more flake8 stuff
```
$ export ELECTRUM_LINTERS=E9,E101,E129,E273,E274,E703,E71,E722,F5,F6,F7,F8,W191,W29,B
$ export ELECTRUM_LINTERS_IGNORE=B007,B009,B010,B019,B036,F541,F841
$ flake8 . --count --select="$ELECTRUM_LINTERS" --ignore="$ELECTRUM_LINTERS_IGNORE" --show-source --statistics --exclude "*_pb2.py,electrum/_vendor/"
./electrum/commands.py:98:1: F811 redefinition of unused 'format_satoshis' from line 48
def format_satoshis(x):
^
./electrum/commands.py:437:9: F811 redefinition of unused 'Mnemonic' from line 62
        from .mnemonic import Mnemonic
        ^
./electrum/gui/qt/wizard/wallet.py:37:5: F811 redefinition of unused 'Daemon' from line 14
    from electrum.daemon import Daemon
    ^
./electrum/lntransport.py:14:1: F811 redefinition of unused 'Optional' from line 12
from typing import NamedTuple, List, Tuple, Mapping, Optional, TYPE_CHECKING, Union, Dict, Set, Sequence
^
./electrum/lntransport.py:14:1: F811 redefinition of unused 'TYPE_CHECKING' from line 12
from typing import NamedTuple, List, Tuple, Mapping, Optional, TYPE_CHECKING, Union, Dict, Set, Sequence
^
./electrum/plugin.py:966:13: F811 redefinition of unused 'hid' from line 593
            import hid
            ^
./electrum/plugin.py:1040:13: F811 redefinition of unused 'hid' from line 593
            import hid
            ^
./electrum/util.py:44:1: F811 redefinition of unused 'json' from line 26
import json
^
./electrum/util.py:46:1: F811 redefinition of unused 'NamedTuple' from line 29
from typing import NamedTuple, Optional
^
./electrum/util.py:46:1: F811 redefinition of unused 'Optional' from line 29
from typing import NamedTuple, Optional
^
./electrum/util.py:1456:56: F811 redefinition of unused 'traceback' from line 34
        async def __aexit__(self, exc_type, exc_value, traceback):
                                                       ^
./electrum/wallet_db.py:536:9: F811 redefinition of unused 'LOCAL' from line 46
        LOCAL = 1
        ^
./electrum/wallet_db.py:537:9: F811 redefinition of unused 'REMOTE' from line 46
        REMOTE = -1
        ^
./tests/test_bitcoin.py:28:1: F811 redefinition of unused 'bitcoin' from line 9
from electrum import crypto, constants, bitcoin
^
./tests/test_txbatcher.py:11:1: F811 redefinition of unused 'Transaction' from line 7
from electrum.transaction import Transaction, PartialTxInput, PartialTxOutput, TxOutpoint
^
./tests/test_wallet_vertical.py:20:1: F811 redefinition of unused 'Transaction' from line 10
from electrum.transaction import Transaction, PartialTxOutput, tx_from_any, Sighash
^
16    F811 redefinition of unused 'format_satoshis' from line 48
16

```
2025-04-02 16:21:59 +00:00
SomberNight
55281295b7 ci: bump flake8 to new version
```
./electrum/commands.py:144:9: F824 `global known_commands` is unused: name is never assigned in scope
        global known_commands
        ^
./electrum/commands.py:1916:9: F824 `global known_commands` is unused: name is never assigned in scope
        global known_commands
        ^
./electrum/gui/qt/main_window.py:2405:13: F824 `nonlocal done` is unused: name is never assigned in scope
            nonlocal done
            ^
./electrum/i18n.py:52:5: F824 `global language` is unused: name is never assigned in scope
    global language
    ^
./electrum/plugin.py:189:9: F824 `global _root_permission_cache` is unused: name is never assigned in scope
        global _root_permission_cache
        ^
5     F824 `global known_commands` is unused: name is never assigned in scope
5

```
2025-04-02 14:56:53 +00:00
SomberNight
f13983015d tests: run debug-mode unittests on python 3.13 2025-03-04 15:50:36 +00:00
SomberNight
b55b8d183b ci: fix "regtest" task failing due to pip weirdness
pip was failing to install "electrum_aionostr>=0.0.7".
This was when using "python3-pip" from ubuntu 22.04 apt.

```
Discarding 95a16d58c8/electrum_aionostr-0.0.7.tar.gz (sha256)=e0b45d608977891c3bb4f6a4dee9a4e843fa661ceca31f81e7b992e65117070a (from https://pypi.org/simple/electrum-aionostr/) (requires-python:>=3.8): Requested unknown from 95a16d58c8/electrum_aionostr-0.0.7.tar.gz (sha256)=e0b45d608977891c3bb4f6a4dee9a4e843fa661ceca31f81e7b992e65117070a (from Electrum==4.5.8) has inconsistent name: filename has 'electrum-aionostr', but metadata has 'unknown'
```

Updating to newer pip directly using pip seems to fix this:
```
$ python3 -m pip install --user --upgrade pip
Requirement already satisfied: pip in /usr/lib/python3/dist-packages (22.0.2)
Collecting pip
  Downloading pip-25.0-py3-none-any.whl (1.8 MB)
```
2025-02-05 13:23:42 +00:00
SomberNight
fb5a1af666 bump min required Python version to 3.10 2025-01-10 18:52:49 +00:00
ThomasV
ab583c9b7e cirrus: follow-up previous commit 2024-12-08 10:16:28 +01:00
ThomasV
0d632348b9 cirrus: disable python3.8 unittests
see #9239
2024-12-08 10:08:33 +01:00
SomberNight
c6a8b022bd ci: run tests also with python 3.13 2024-10-18 15:10:03 +00:00
SomberNight
3d7f3355cb ci: libsecp build: follow-up prev 2024-10-10 15:46:10 +00:00
ThomasV
9dbbd815a3 build scripts: add libsecp256k1 library to the electrum_ecc directory 2024-10-10 15:46:07 +00:00
SomberNight
05868666d6 ci: give more memory to Windows build
build is getting OOM killed.. maybe since Qt6 migration?
2024-10-07 19:01:10 +00:00
SomberNight
aac3190cb1 ci: fix windows build caching
follow-up fcc4e1d387

error msg was:
```
SHA for cache folders (/opt/wine64/drive_c/electrum/contrib/build-wine/.cache/win32/wine_pip_cache, /opt/wine64/drive_c/electrum/contrib/build-wine/.cache/win64/wine_pip_cache) is 'be33ad1b0598b1733992e36659bb71406f8fcfaa3a442166ecbe26e2db9a65c2'
Failed to tar caches for Upload 'pip' cache with error walking folder /opt/wine64/drive_c/electrum/contrib/build-wine/.cache/win32/wine_pip_cache: lstat /opt/wine64/drive_c/electrum/contrib/build-wine/.cache/win32/wine_pip_cache: no such file or directory!
```
2024-10-04 13:59:03 +00:00
SomberNight
fcc4e1d387 wine build: build 64-bit windows binaries
required for qt6

related: https://github.com/spesmilo/electrum/issues/6598
2024-09-18 15:46:16 +00:00
SomberNight
ebbdadb080 ci: follow-up: build own libsecp256k1 instead of using apt
follow-up dbc69727bd
2024-05-29 13:30:49 +00:00
SomberNight
dbc69727bd ci: unittests: build own libsecp256k1 instead of using apt
related 6bf7542b25
2024-05-28 17:13:17 +00:00
SomberNight
6bf7542b25 ci: regtests: build own libsecp256k1 instead of using apt
- version in apt is too old (cirrus is using ubuntu 22.04 LTS atm) for schnorr module
- this way we have better control of exact version to use
2024-04-11 16:52:42 +00:00
Sander van Grieken
4c6421e162 tests: fix CI regtest new path 2024-02-16 17:41:34 +01:00
ghost43
5582b753e5 Merge pull request #8881 from accumulator/qobject_test
add a simple test framework for testing QObjects and their signal/slot mechanism
2024-02-15 14:46:50 +00:00
SomberNight
9a6ec61647 ci: also run unit tests with python 3.12 2024-02-15 14:22:31 +00:00
Sander van Grieken
71dbf76cd0 add new 'qml_gui' extra to setup.py and include it for tox 2024-02-12 11:29:05 +01:00
SomberNight
d63253b30b ci: only run build tasks once per day (or on manual trigger)
related https://github.com/cirruslabs/cirrus-ci-docs/discussions/949
2024-01-16 17:28:08 +00:00
SomberNight
7de45c1325 ci: pin flake8 version
- new version of flake8-bugbear (24.1.16) introduced new tests (B036), which we were failing
- that's fine, but our CI should not suddenly break because of this
- better to do explicit manual version bumps of the linter
2024-01-16 16:31:56 +00:00
Sander van Grieken
e561ce211b cirrus: task timeout 90m 2023-11-07 10:17:10 +01:00
ThomasV
f98602918b Revert "Update .cirrus.yml"
This reverts commit 33ac0b4591.
2023-11-02 19:03:15 +01:00
robertmin2
33ac0b4591 Update .cirrus.yml 2023-10-31 16:57:52 +01:00
JeremyRand
a3d7df48db Cirrus: Mark E722 linter as mandatory (#8668)
These linter warnings were all fixed in
312f2641e7, so making CI enforce them will
reduce the risk of regressions.

Co-authored-by: Jeremy Rand <jeremyrand@danwin1210.de>
2023-10-31 13:52:24 +00:00
ThomasV
8acb5dd7e9 CI: run unit tests in debug mode with python 3.11
Python 3.12 does not work with current aiohttp, see
https://github.com/aio-libs/aiohttp/issues/7229

It is currently possible to build a wheel using aiohttp==3.9.0b0.
However, unit tests fail in that case, because TestLNTransport::test_loop stalls.
2023-10-08 11:43:55 +02:00
SomberNight
43615487de follow-up prev 2023-09-06 16:24:11 +00:00
SomberNight
19718001e4 (trivial) CI: rename tasks 2023-09-06 16:21:18 +00:00
SomberNight
b45c84f24f remove the kivy gui
We now use the qml gui on Android, and haven't been maintaining
the kivy GUI for a while.
2023-08-30 16:47:37 +00:00
SomberNight
111a753dc2 ci: don't run unit tests on pypy
We never really supported pypy - the CI was running the tests there
just to see compatibility.
A few of the unit tests consistently hang, resulting in the whole
test runner timing out and wasting compute resources. Someone could
debug the hangs and try to fix them, but I don't have the time.
2023-08-30 12:46:12 +00:00
SomberNight
5a4b98a066 CI: don't run unit tests on "python:rc", looks like it's unmaintained
The "python:rc" tag on dockerhub has not been updated for 2+ years
and is still at 3.10.0rc2. Even 3.11 has been released for many months now.
see https://hub.docker.com/_/python/tags
2023-08-04 18:18:24 +00:00
SomberNight
1767d26de9 tests: make regtest tests somewhat faster by faster polling in e-x
using 4e66804dc0

on my machine, before-after:
Ran 9 tests in 495.865s
Ran 9 tests in 376.183s
2023-07-14 15:18:36 +00:00