biome: 1.9.2 -> 1.9.3
[NixPkgs.git] / pkgs / applications / misc / electrum / default.nix
blob0faaf369125d7bb50859ef948dbcc679f08c8212
1 { lib
2 , stdenv
3 , fetchurl
4 , fetchFromGitHub
5 , wrapQtAppsHook
6 , python3
7 , zbar
8 , secp256k1
9 , enableQt ? true
10 , callPackage
11 , qtwayland
12 , fetchPypi
15 let
16   version = "4.5.5";
18   python = python3.override {
19     self = python;
20     packageOverrides = self: super: {
21       # Pin ledger-bitcoin to 0.2.1
22       ledger-bitcoin = super.ledger-bitcoin.overridePythonAttrs (oldAttrs: rec {
23         version = "0.2.1";
24         format = "pyproject";
25         src = fetchPypi {
26           pname = "ledger_bitcoin";
27           inherit version;
28           hash = "sha256-AWl/q2MzzspNIo6yf30S92PgM/Ygsb+1lJsg7Asztso=";
29         };
30       });
31     };
32   };
34   libsecp256k1_name =
35     if stdenv.hostPlatform.isLinux then "libsecp256k1.so.{v}"
36     else if stdenv.hostPlatform.isDarwin then "libsecp256k1.{v}.dylib"
37     else "libsecp256k1${stdenv.hostPlatform.extensions.sharedLibrary}";
39   libzbar_name =
40     if stdenv.hostPlatform.isLinux then "libzbar.so.0"
41     else if stdenv.hostPlatform.isDarwin then "libzbar.0.dylib"
42     else "libzbar${stdenv.hostPlatform.extensions.sharedLibrary}";
44   # Not provided in official source releases, which are what upstream signs.
45   tests = fetchFromGitHub {
46     owner = "spesmilo";
47     repo = "electrum";
48     rev = version;
49     sha256 = "sha256-CbhI/q+zjk9odxuvdzpogi046FqkedJooiQwS+WAkJ8=";
51     postFetch = ''
52       mv $out ./all
53       mv ./all/tests $out
54     '';
55   };
59 python.pkgs.buildPythonApplication {
60   pname = "electrum";
61   inherit version;
63   src = fetchurl {
64     url = "https://download.electrum.org/${version}/Electrum-${version}.tar.gz";
65     sha256 = "1jiagz9avkbd158pcip7p4wz0pdsxi94ndvg5p8afvshb32aqwav";
66   };
68   postUnpack = ''
69     # can't symlink, tests get confused
70     cp -ar ${tests} $sourceRoot/tests
71   '';
73   nativeBuildInputs = lib.optionals enableQt [ wrapQtAppsHook ];
74   buildInputs = lib.optional (stdenv.hostPlatform.isLinux && enableQt) qtwayland;
76   propagatedBuildInputs = with python.pkgs; [
77     aiohttp
78     aiohttp-socks
79     aiorpcx
80     attrs
81     bitstring
82     cryptography
83     dnspython
84     jsonrpclib-pelix
85     matplotlib
86     pbkdf2
87     protobuf
88     pysocks
89     qrcode
90     requests
91     certifi
92     jsonpatch
93     # plugins
94     btchip-python
95     ledger-bitcoin
96     ckcc-protocol
97     keepkey
98     trezor
99     bitbox02
100     cbor2
101     pyserial
102   ] ++ lib.optionals enableQt [
103     pyqt5
104     qdarkstyle
105   ];
107   checkInputs = with python.pkgs; lib.optionals enableQt [
108     pyqt6
109   ];
111   postPatch = ''
112     # make compatible with protobuf4 by easing dependencies ...
113     substituteInPlace ./contrib/requirements/requirements.txt \
114       --replace "protobuf>=3.20,<4" "protobuf>=3.20"
115     # ... and regenerating the paymentrequest_pb2.py file
116     protoc --python_out=. electrum/paymentrequest.proto
118     substituteInPlace ./electrum/ecc_fast.py \
119       --replace ${libsecp256k1_name} ${secp256k1}/lib/libsecp256k1${stdenv.hostPlatform.extensions.sharedLibrary}
120   '' + (if enableQt then ''
121     substituteInPlace ./electrum/qrscanner.py \
122       --replace ${libzbar_name} ${zbar.lib}/lib/libzbar${stdenv.hostPlatform.extensions.sharedLibrary}
123   '' else ''
124     sed -i '/qdarkstyle/d' contrib/requirements/requirements.txt
125   '');
127   postInstall = lib.optionalString stdenv.hostPlatform.isLinux ''
128     substituteInPlace $out/share/applications/electrum.desktop \
129       --replace 'Exec=sh -c "PATH=\"\\$HOME/.local/bin:\\$PATH\"; electrum %u"' \
130                 "Exec=$out/bin/electrum %u" \
131       --replace 'Exec=sh -c "PATH=\"\\$HOME/.local/bin:\\$PATH\"; electrum --testnet %u"' \
132                 "Exec=$out/bin/electrum --testnet %u"
133   '';
135   postFixup = lib.optionalString enableQt ''
136     wrapQtApp $out/bin/electrum
137   '';
139   nativeCheckInputs = with python.pkgs; [ pytestCheckHook pyaes pycryptodomex ];
141   pytestFlagsArray = [ "tests" ];
143   postCheck = ''
144     $out/bin/electrum help >/dev/null
145   '';
147   passthru.updateScript = callPackage ./update.nix { };
149   meta = with lib; {
150     description = "Lightweight Bitcoin wallet";
151     longDescription = ''
152       An easy-to-use Bitcoin client featuring wallets generated from
153       mnemonic seeds (in addition to other, more advanced, wallet options)
154       and the ability to perform transactions without downloading a copy
155       of the blockchain.
156     '';
157     homepage = "https://electrum.org/";
158     downloadPage = "https://electrum.org/#download";
159     changelog = "https://github.com/spesmilo/electrum/blob/master/RELEASE-NOTES";
160     license = licenses.mit;
161     platforms = platforms.all;
162     maintainers = with maintainers; [ joachifm np prusnak chewblacka ];
163     mainProgram = "electrum";
164   };