diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ebb9e89e6..6a76faa0a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## vNext +### Features + +- Added new Mnemonic input component ([PR 2979](https://github.com/input-output-hk/daedalus/pull/2979)) + ### Fixes - Ensured non-recommended decimal place setting alert is correctly shown ([PR 3007](https://github.com/input-output-hk/daedalus/pull/3007)) @@ -9,6 +13,7 @@ ### Chores +- Updated cardano-node to 1.35.3; added `vasil-dev`, `preprod`, `preview` variants ([PR 3025](https://github.com/input-output-hk/daedalus/pull/3025)) - Updated cardano-node to 1.35.2 ([PR 3021](https://github.com/input-output-hk/daedalus/pull/3021)) - Fix `darwin-launcher.go` to replace its process image with `cardano-launcher` (binary), and not swallow `stdout` ([PR 3023](https://github.com/input-output-hk/daedalus/pull/3023)) - Updated cardano-node to 1.35.1 ([PR 3012](https://github.com/input-output-hk/daedalus/pull/3012)) @@ -47,6 +52,7 @@ ### Chores +- Upgraded webpack to version 5 ([PR 2772](https://github.com/input-output-hk/daedalus/pull/2772)) - Bumped vulnerable dependencies versions ([PR 2943](https://github.com/input-output-hk/daedalus/pull/2943)) - Added support for Trezor firmware 2.5.1 ([PR 2991](https://github.com/input-output-hk/daedalus/pull/2991)) - Added steps on how to link with `react-polymorph` and other external UI libraries ([PR 2948](https://github.com/input-output-hk/daedalus/pull/2948)) diff --git a/default.nix b/default.nix index 5db33408d8..42d9746d6a 100644 --- a/default.nix +++ b/default.nix @@ -50,6 +50,7 @@ let aarch64-darwin = macos.silicon; }.${target}; walletPkgs = import "${sources.cardano-wallet}/nix" {}; + cardanoWorldFlake = (flake-compat { src = sources.cardano-world; }).defaultNix.outputs; # only used for CLI, to be removed when upgraded to next node version nodePkgs = import "${sources.cardano-node}/nix" {}; shellPkgs = (import "${sources.cardano-shell}/nix") {}; @@ -68,7 +69,7 @@ let ostable.aarch64-darwin = "macos64-arm"; packages = self: { - inherit walletFlake cluster pkgs version target nodeImplementation; + inherit walletFlake cardanoWorldFlake cluster pkgs version target nodeImplementation; cardanoLib = localLib.iohkNix.cardanoLib; daedalus-bridge = self.bridgeTable.${nodeImplementation}; @@ -145,7 +146,7 @@ let nsis = nsisNixPkgs.callPackage ./nix/nsis.nix {}; launcherConfigs = self.callPackage ./nix/launcher-config.nix { - inherit devShell topologyOverride configOverride genesisOverride; + inherit devShell topologyOverride configOverride genesisOverride system; network = cluster; os = ostable.${target}; backend = nodeImplementation; @@ -261,6 +262,24 @@ let ''; uninstaller = if needSignedBinaries then self.signedUninstaller else self.unsignedUninstaller; + windowsIcons = let + buildInputs = with pkgs; [ imagemagick ]; + # Allow fallback to `mainnet` if cluster’s icons don’t exist: + srcCluster = if builtins.pathExists (./installers/icons + "/${cluster}") then cluster else "mainnet"; + in pkgs.runCommand "windows-icons-${cluster}" { inherit buildInputs; } '' + mkdir -p $out/${cluster} $out + cp -r ${./installers/icons + "/${srcCluster}"}/. $out/${cluster}/. + cp ${./installers/icons/installBanner.bmp} $out/installBanner.bmp + cd $out/${cluster} + rm *.ico *.ICO || true # XXX: just in case + for f in *.png ; do + # XXX: these sizes are too large for the ICO format: + if [ "$f" == 1024x1024.png ] || [ "$f" == 512x512.png ] ; then continue ; fi + convert "$f" "''${f%.png}.ico" + done + convert 16x16.png 24x24.png 32x32.png 48x48.png 64x64.png 128x128.png 256x256.png ${cluster}.ico + ''; + unsigned-windows-installer = let installDir = self.launcherConfigs.installerConfig.spacedName; in pkgs.runCommand "win64-installer-${cluster}" { @@ -275,7 +294,7 @@ let mkdir -p $out/{nix-support,cfg-files} mkdir installers cp -vir ${./installers/dhall} installers/dhall - cp -vir ${./installers/icons} installers/icons + cp -vir ${self.windowsIcons} installers/icons cp -vir ${./package.json} package.json chmod -R +w installers cd installers diff --git a/installer-clusters.cfg b/installer-clusters.cfg index 769fd28527..fc79f54335 100644 --- a/installer-clusters.cfg +++ b/installer-clusters.cfg @@ -1 +1 @@ -mainnet selfnode mainnet_flight testnet +mainnet preprod preview shelley_qa selfnode diff --git a/installers/common/Types.hs b/installers/common/Types.hs index e1a8921ee4..e26586f721 100644 --- a/installers/common/Types.hs +++ b/installers/common/Types.hs @@ -58,6 +58,9 @@ data Cluster | Shelley_QA | Testnet | Alonzo_Purple + | Vasil_Dev + | Preprod + | Preview deriving (Bounded, Enum, Eq, Read, Show) -- | The wallet backend to include in the installer. @@ -109,6 +112,9 @@ clusterNetwork Staging = "staging" clusterNetwork Shelley_QA = "shelley_qa" clusterNetwork Testnet = "testnet" clusterNetwork Alonzo_Purple = "alonzo_purple" +clusterNetwork Vasil_Dev = "vasil_dev" +clusterNetwork Preprod = "preprod" +clusterNetwork Preview = "preview" packageFileName :: OS -> Cluster -> Version -> Backend -> Text -> Maybe BuildJob -> FilePath packageFileName _os cluster ver backend _backendVer build = fromText name <.> ext diff --git a/installers/daedalus-installer.nix b/installers/daedalus-installer.nix index 82af9814a5..f189dac354 100644 --- a/installers/daedalus-installer.nix +++ b/installers/daedalus-installer.nix @@ -8,7 +8,17 @@ mkDerivation { pname = "daedalus-installer"; version = "0.1.0.0"; - src = ./.; + src = lib.cleanSourceWith { + name = "daedalus-installer-src"; + src = ./.; + filter = name: type: (type == "directory" && ( + lib.hasSuffix "/common" name + )) || (type == "regular" && ( + lib.hasSuffix ".hs" name || + lib.hasSuffix ".cabal" name || + lib.hasSuffix "/cabal.project" name + )); + }; isLibrary = true; isExecutable = true; doCheck = false; diff --git a/installers/icons/README.md b/installers/icons/README.md index 94da35866d..6d8efe0228 100644 --- a/installers/icons/README.md +++ b/installers/icons/README.md @@ -6,17 +6,7 @@ directories. ### Windows -Use Nix to enter a shell with the necessary tools available: - - nix run nixpkgs.icoutils nixpkgs.imagemagick - -To generate ico files: - - icotool -c -o 256x256.ico 256x256.png - -To Merge all icons into a single bundle: - - ./update_icons +Are generated automatically, based on the PNG files. Currently, the Windows installer uses the bundle with 8 of the icons. diff --git a/installers/icons/alonzo_purple/128x128.ico b/installers/icons/alonzo_purple/128x128.ico deleted file mode 100644 index 8a6c17313e..0000000000 Binary files a/installers/icons/alonzo_purple/128x128.ico and /dev/null differ diff --git a/installers/icons/alonzo_purple/16x16.ico b/installers/icons/alonzo_purple/16x16.ico deleted file mode 100644 index 5b56282b90..0000000000 Binary files a/installers/icons/alonzo_purple/16x16.ico and /dev/null differ diff --git a/installers/icons/alonzo_purple/18x18.ico b/installers/icons/alonzo_purple/18x18.ico deleted file mode 100644 index 35f657f2ed..0000000000 Binary files a/installers/icons/alonzo_purple/18x18.ico and /dev/null differ diff --git a/installers/icons/alonzo_purple/19x19.ico b/installers/icons/alonzo_purple/19x19.ico deleted file mode 100644 index 0ef4f06a9e..0000000000 Binary files a/installers/icons/alonzo_purple/19x19.ico and /dev/null differ diff --git a/installers/icons/alonzo_purple/22x22.ico b/installers/icons/alonzo_purple/22x22.ico deleted file mode 100644 index 49d135e124..0000000000 Binary files a/installers/icons/alonzo_purple/22x22.ico and /dev/null differ diff --git a/installers/icons/alonzo_purple/24x24.ico b/installers/icons/alonzo_purple/24x24.ico deleted file mode 100644 index 23461f69c1..0000000000 Binary files a/installers/icons/alonzo_purple/24x24.ico and /dev/null differ diff --git a/installers/icons/alonzo_purple/256x256.ico b/installers/icons/alonzo_purple/256x256.ico deleted file mode 100644 index d87af62f94..0000000000 Binary files a/installers/icons/alonzo_purple/256x256.ico and /dev/null differ diff --git a/installers/icons/alonzo_purple/32x32.ico b/installers/icons/alonzo_purple/32x32.ico deleted file mode 100644 index b81dfe59ed..0000000000 Binary files a/installers/icons/alonzo_purple/32x32.ico and /dev/null differ diff --git a/installers/icons/alonzo_purple/40x40.ico b/installers/icons/alonzo_purple/40x40.ico deleted file mode 100644 index 3040316250..0000000000 Binary files a/installers/icons/alonzo_purple/40x40.ico and /dev/null differ diff --git a/installers/icons/alonzo_purple/48x48.ico b/installers/icons/alonzo_purple/48x48.ico deleted file mode 100644 index 13b75e2484..0000000000 Binary files a/installers/icons/alonzo_purple/48x48.ico and /dev/null differ diff --git a/installers/icons/alonzo_purple/64x64.ico b/installers/icons/alonzo_purple/64x64.ico deleted file mode 100644 index 95221d2c99..0000000000 Binary files a/installers/icons/alonzo_purple/64x64.ico and /dev/null differ diff --git a/installers/icons/alonzo_purple/alonzo_purple.ico b/installers/icons/alonzo_purple/alonzo_purple.ico deleted file mode 100644 index 4048e24543..0000000000 Binary files a/installers/icons/alonzo_purple/alonzo_purple.ico and /dev/null differ diff --git a/installers/icons/local/128x128.ico b/installers/icons/local/128x128.ico deleted file mode 100644 index a5d3a62751..0000000000 Binary files a/installers/icons/local/128x128.ico and /dev/null differ diff --git a/installers/icons/local/16x16.ico b/installers/icons/local/16x16.ico deleted file mode 100644 index eb241687bb..0000000000 Binary files a/installers/icons/local/16x16.ico and /dev/null differ diff --git a/installers/icons/local/18x18.ico b/installers/icons/local/18x18.ico deleted file mode 100644 index aae71fb7fd..0000000000 Binary files a/installers/icons/local/18x18.ico and /dev/null differ diff --git a/installers/icons/local/19x19.ico b/installers/icons/local/19x19.ico deleted file mode 100644 index c2d5aa393d..0000000000 Binary files a/installers/icons/local/19x19.ico and /dev/null differ diff --git a/installers/icons/local/22x22.ico b/installers/icons/local/22x22.ico deleted file mode 100644 index 6bc205619a..0000000000 Binary files a/installers/icons/local/22x22.ico and /dev/null differ diff --git a/installers/icons/local/24x24.ico b/installers/icons/local/24x24.ico deleted file mode 100644 index 7ceddc1238..0000000000 Binary files a/installers/icons/local/24x24.ico and /dev/null differ diff --git a/installers/icons/local/256x256.ico b/installers/icons/local/256x256.ico deleted file mode 100644 index 757886222f..0000000000 Binary files a/installers/icons/local/256x256.ico and /dev/null differ diff --git a/installers/icons/local/32x32.ico b/installers/icons/local/32x32.ico deleted file mode 100644 index 3df8821001..0000000000 Binary files a/installers/icons/local/32x32.ico and /dev/null differ diff --git a/installers/icons/local/40x40.ico b/installers/icons/local/40x40.ico deleted file mode 100644 index 1ae76f56e8..0000000000 Binary files a/installers/icons/local/40x40.ico and /dev/null differ diff --git a/installers/icons/local/48x48.ico b/installers/icons/local/48x48.ico deleted file mode 100644 index 8d709f8ca3..0000000000 Binary files a/installers/icons/local/48x48.ico and /dev/null differ diff --git a/installers/icons/local/64x64.ico b/installers/icons/local/64x64.ico deleted file mode 100644 index ba0ede3bde..0000000000 Binary files a/installers/icons/local/64x64.ico and /dev/null differ diff --git a/installers/icons/local/selfnode.ico b/installers/icons/local/selfnode.ico deleted file mode 100644 index 7c339dc4a9..0000000000 Binary files a/installers/icons/local/selfnode.ico and /dev/null differ diff --git a/installers/icons/mainnet/128x128.ico b/installers/icons/mainnet/128x128.ico deleted file mode 100644 index 8b225ae1cb..0000000000 Binary files a/installers/icons/mainnet/128x128.ico and /dev/null differ diff --git a/installers/icons/mainnet/16x16.ico b/installers/icons/mainnet/16x16.ico deleted file mode 100644 index 0df611f296..0000000000 Binary files a/installers/icons/mainnet/16x16.ico and /dev/null differ diff --git a/installers/icons/mainnet/18x18.ico b/installers/icons/mainnet/18x18.ico deleted file mode 100644 index ddc41e38cd..0000000000 Binary files a/installers/icons/mainnet/18x18.ico and /dev/null differ diff --git a/installers/icons/mainnet/19x19.ico b/installers/icons/mainnet/19x19.ico deleted file mode 100644 index b2106743c4..0000000000 Binary files a/installers/icons/mainnet/19x19.ico and /dev/null differ diff --git a/installers/icons/mainnet/22x22.ico b/installers/icons/mainnet/22x22.ico deleted file mode 100644 index 2221dc4cfc..0000000000 Binary files a/installers/icons/mainnet/22x22.ico and /dev/null differ diff --git a/installers/icons/mainnet/24x24.ico b/installers/icons/mainnet/24x24.ico deleted file mode 100644 index 15dac5d179..0000000000 Binary files a/installers/icons/mainnet/24x24.ico and /dev/null differ diff --git a/installers/icons/mainnet/256x256.ico b/installers/icons/mainnet/256x256.ico deleted file mode 100644 index 1d37456a14..0000000000 Binary files a/installers/icons/mainnet/256x256.ico and /dev/null differ diff --git a/installers/icons/mainnet/32x32.ico b/installers/icons/mainnet/32x32.ico deleted file mode 100644 index 2720222288..0000000000 Binary files a/installers/icons/mainnet/32x32.ico and /dev/null differ diff --git a/installers/icons/mainnet/40x40.ico b/installers/icons/mainnet/40x40.ico deleted file mode 100644 index 93d3a49125..0000000000 Binary files a/installers/icons/mainnet/40x40.ico and /dev/null differ diff --git a/installers/icons/mainnet/48x48.ico b/installers/icons/mainnet/48x48.ico deleted file mode 100644 index b0d246700e..0000000000 Binary files a/installers/icons/mainnet/48x48.ico and /dev/null differ diff --git a/installers/icons/mainnet/64x64.ico b/installers/icons/mainnet/64x64.ico deleted file mode 100644 index 1ff6082884..0000000000 Binary files a/installers/icons/mainnet/64x64.ico and /dev/null differ diff --git a/installers/icons/mainnet/mainnet.ico b/installers/icons/mainnet/mainnet.ico deleted file mode 100644 index 68ca6d09ff..0000000000 Binary files a/installers/icons/mainnet/mainnet.ico and /dev/null differ diff --git a/installers/icons/mainnet_flight/128x128.ico b/installers/icons/mainnet_flight/128x128.ico deleted file mode 100644 index 89310db8f3..0000000000 Binary files a/installers/icons/mainnet_flight/128x128.ico and /dev/null differ diff --git a/installers/icons/mainnet_flight/16x16.ico b/installers/icons/mainnet_flight/16x16.ico deleted file mode 100644 index 96f64d1361..0000000000 Binary files a/installers/icons/mainnet_flight/16x16.ico and /dev/null differ diff --git a/installers/icons/mainnet_flight/18x18.ico b/installers/icons/mainnet_flight/18x18.ico deleted file mode 100644 index 4aa4575cc3..0000000000 Binary files a/installers/icons/mainnet_flight/18x18.ico and /dev/null differ diff --git a/installers/icons/mainnet_flight/19x19.ico b/installers/icons/mainnet_flight/19x19.ico deleted file mode 100644 index 9a4c08fb20..0000000000 Binary files a/installers/icons/mainnet_flight/19x19.ico and /dev/null differ diff --git a/installers/icons/mainnet_flight/22x22.ico b/installers/icons/mainnet_flight/22x22.ico deleted file mode 100644 index e86ac3dc28..0000000000 Binary files a/installers/icons/mainnet_flight/22x22.ico and /dev/null differ diff --git a/installers/icons/mainnet_flight/24x24.ico b/installers/icons/mainnet_flight/24x24.ico deleted file mode 100644 index 8991674cd0..0000000000 Binary files a/installers/icons/mainnet_flight/24x24.ico and /dev/null differ diff --git a/installers/icons/mainnet_flight/256x256.ico b/installers/icons/mainnet_flight/256x256.ico deleted file mode 100644 index 7ab22bf5ce..0000000000 Binary files a/installers/icons/mainnet_flight/256x256.ico and /dev/null differ diff --git a/installers/icons/mainnet_flight/32x32.ico b/installers/icons/mainnet_flight/32x32.ico deleted file mode 100644 index c44e0bc650..0000000000 Binary files a/installers/icons/mainnet_flight/32x32.ico and /dev/null differ diff --git a/installers/icons/mainnet_flight/40x40.ico b/installers/icons/mainnet_flight/40x40.ico deleted file mode 100644 index fd100b804f..0000000000 Binary files a/installers/icons/mainnet_flight/40x40.ico and /dev/null differ diff --git a/installers/icons/mainnet_flight/48x48.ico b/installers/icons/mainnet_flight/48x48.ico deleted file mode 100644 index 31be88d116..0000000000 Binary files a/installers/icons/mainnet_flight/48x48.ico and /dev/null differ diff --git a/installers/icons/mainnet_flight/64x64.ico b/installers/icons/mainnet_flight/64x64.ico deleted file mode 100644 index 699d6cb212..0000000000 Binary files a/installers/icons/mainnet_flight/64x64.ico and /dev/null differ diff --git a/installers/icons/mainnet_flight/mainnet_flight.ico b/installers/icons/mainnet_flight/mainnet_flight.ico deleted file mode 100644 index 1add653ada..0000000000 Binary files a/installers/icons/mainnet_flight/mainnet_flight.ico and /dev/null differ diff --git a/installers/icons/preprod.iconset/icon_1024x1024.png b/installers/icons/preprod.iconset/icon_1024x1024.png new file mode 100755 index 0000000000..c0d013ca62 Binary files /dev/null and b/installers/icons/preprod.iconset/icon_1024x1024.png differ diff --git a/installers/icons/preprod.iconset/icon_1024x1024@2x.png b/installers/icons/preprod.iconset/icon_1024x1024@2x.png new file mode 100755 index 0000000000..115102d857 Binary files /dev/null and b/installers/icons/preprod.iconset/icon_1024x1024@2x.png differ diff --git a/installers/icons/preprod.iconset/icon_128x128.png b/installers/icons/preprod.iconset/icon_128x128.png new file mode 100755 index 0000000000..91f93c04c3 Binary files /dev/null and b/installers/icons/preprod.iconset/icon_128x128.png differ diff --git a/installers/icons/preprod.iconset/icon_128x128@2x.png b/installers/icons/preprod.iconset/icon_128x128@2x.png new file mode 100755 index 0000000000..534429f2b6 Binary files /dev/null and b/installers/icons/preprod.iconset/icon_128x128@2x.png differ diff --git a/installers/icons/preprod.iconset/icon_16x16.png b/installers/icons/preprod.iconset/icon_16x16.png new file mode 100755 index 0000000000..c9d740ee1f Binary files /dev/null and b/installers/icons/preprod.iconset/icon_16x16.png differ diff --git a/installers/icons/preprod.iconset/icon_16x16@2x.png b/installers/icons/preprod.iconset/icon_16x16@2x.png new file mode 100755 index 0000000000..3a9033c203 Binary files /dev/null and b/installers/icons/preprod.iconset/icon_16x16@2x.png differ diff --git a/installers/icons/preprod.iconset/icon_18x18.png b/installers/icons/preprod.iconset/icon_18x18.png new file mode 100755 index 0000000000..836e4d6364 Binary files /dev/null and b/installers/icons/preprod.iconset/icon_18x18.png differ diff --git a/installers/icons/preprod.iconset/icon_18x18@2x.png b/installers/icons/preprod.iconset/icon_18x18@2x.png new file mode 100755 index 0000000000..8f094407eb Binary files /dev/null and b/installers/icons/preprod.iconset/icon_18x18@2x.png differ diff --git a/installers/icons/preprod.iconset/icon_19x19.png b/installers/icons/preprod.iconset/icon_19x19.png new file mode 100755 index 0000000000..9943ddf6fa Binary files /dev/null and b/installers/icons/preprod.iconset/icon_19x19.png differ diff --git a/installers/icons/preprod.iconset/icon_19x19@2x.png b/installers/icons/preprod.iconset/icon_19x19@2x.png new file mode 100755 index 0000000000..2a63ef81a5 Binary files /dev/null and b/installers/icons/preprod.iconset/icon_19x19@2x.png differ diff --git a/installers/icons/preprod.iconset/icon_22x22.png b/installers/icons/preprod.iconset/icon_22x22.png new file mode 100755 index 0000000000..485ebd97be Binary files /dev/null and b/installers/icons/preprod.iconset/icon_22x22.png differ diff --git a/installers/icons/preprod.iconset/icon_22x22@2x.png b/installers/icons/preprod.iconset/icon_22x22@2x.png new file mode 100755 index 0000000000..879f57396e Binary files /dev/null and b/installers/icons/preprod.iconset/icon_22x22@2x.png differ diff --git a/installers/icons/preprod.iconset/icon_24x24.png b/installers/icons/preprod.iconset/icon_24x24.png new file mode 100755 index 0000000000..320730ff56 Binary files /dev/null and b/installers/icons/preprod.iconset/icon_24x24.png differ diff --git a/installers/icons/preprod.iconset/icon_24x24@2x.png b/installers/icons/preprod.iconset/icon_24x24@2x.png new file mode 100755 index 0000000000..eeb134ced0 Binary files /dev/null and b/installers/icons/preprod.iconset/icon_24x24@2x.png differ diff --git a/installers/icons/preprod.iconset/icon_256x256.png b/installers/icons/preprod.iconset/icon_256x256.png new file mode 100755 index 0000000000..a0dee2e675 Binary files /dev/null and b/installers/icons/preprod.iconset/icon_256x256.png differ diff --git a/installers/icons/preprod.iconset/icon_256x256@2x.png b/installers/icons/preprod.iconset/icon_256x256@2x.png new file mode 100755 index 0000000000..f4cdfb8be0 Binary files /dev/null and b/installers/icons/preprod.iconset/icon_256x256@2x.png differ diff --git a/installers/icons/preprod.iconset/icon_32x32.png b/installers/icons/preprod.iconset/icon_32x32.png new file mode 100755 index 0000000000..bfb1f9059d Binary files /dev/null and b/installers/icons/preprod.iconset/icon_32x32.png differ diff --git a/installers/icons/preprod.iconset/icon_32x32@2x.png b/installers/icons/preprod.iconset/icon_32x32@2x.png new file mode 100755 index 0000000000..890680bc93 Binary files /dev/null and b/installers/icons/preprod.iconset/icon_32x32@2x.png differ diff --git a/installers/icons/preprod.iconset/icon_40x40.png b/installers/icons/preprod.iconset/icon_40x40.png new file mode 100755 index 0000000000..bcd32fc1a2 Binary files /dev/null and b/installers/icons/preprod.iconset/icon_40x40.png differ diff --git a/installers/icons/preprod.iconset/icon_40x40@2x.png b/installers/icons/preprod.iconset/icon_40x40@2x.png new file mode 100755 index 0000000000..06c38b35f8 Binary files /dev/null and b/installers/icons/preprod.iconset/icon_40x40@2x.png differ diff --git a/installers/icons/preprod.iconset/icon_48x48.png b/installers/icons/preprod.iconset/icon_48x48.png new file mode 100755 index 0000000000..01eba24e2c Binary files /dev/null and b/installers/icons/preprod.iconset/icon_48x48.png differ diff --git a/installers/icons/preprod.iconset/icon_48x48@2x.png b/installers/icons/preprod.iconset/icon_48x48@2x.png new file mode 100755 index 0000000000..b0d7b4006e Binary files /dev/null and b/installers/icons/preprod.iconset/icon_48x48@2x.png differ diff --git a/installers/icons/preprod.iconset/icon_512x512.png b/installers/icons/preprod.iconset/icon_512x512.png new file mode 100755 index 0000000000..4263d6d1df Binary files /dev/null and b/installers/icons/preprod.iconset/icon_512x512.png differ diff --git a/installers/icons/preprod.iconset/icon_512x512@2x.png b/installers/icons/preprod.iconset/icon_512x512@2x.png new file mode 100755 index 0000000000..1691dc657e Binary files /dev/null and b/installers/icons/preprod.iconset/icon_512x512@2x.png differ diff --git a/installers/icons/preprod.iconset/icon_64x64.png b/installers/icons/preprod.iconset/icon_64x64.png new file mode 100755 index 0000000000..4a64a33d6c Binary files /dev/null and b/installers/icons/preprod.iconset/icon_64x64.png differ diff --git a/installers/icons/preprod.iconset/icon_64x64@2x.png b/installers/icons/preprod.iconset/icon_64x64@2x.png new file mode 100755 index 0000000000..3e0112474c Binary files /dev/null and b/installers/icons/preprod.iconset/icon_64x64@2x.png differ diff --git a/installers/icons/preprod/1024x1024.png b/installers/icons/preprod/1024x1024.png new file mode 100755 index 0000000000..c0d013ca62 Binary files /dev/null and b/installers/icons/preprod/1024x1024.png differ diff --git a/installers/icons/preprod/128x128.png b/installers/icons/preprod/128x128.png new file mode 100755 index 0000000000..91f93c04c3 Binary files /dev/null and b/installers/icons/preprod/128x128.png differ diff --git a/installers/icons/preprod/16x16.png b/installers/icons/preprod/16x16.png new file mode 100755 index 0000000000..c9d740ee1f Binary files /dev/null and b/installers/icons/preprod/16x16.png differ diff --git a/installers/icons/preprod/18x18.png b/installers/icons/preprod/18x18.png new file mode 100755 index 0000000000..836e4d6364 Binary files /dev/null and b/installers/icons/preprod/18x18.png differ diff --git a/installers/icons/preprod/19x19.png b/installers/icons/preprod/19x19.png new file mode 100755 index 0000000000..9943ddf6fa Binary files /dev/null and b/installers/icons/preprod/19x19.png differ diff --git a/installers/icons/preprod/22x22.png b/installers/icons/preprod/22x22.png new file mode 100755 index 0000000000..485ebd97be Binary files /dev/null and b/installers/icons/preprod/22x22.png differ diff --git a/installers/icons/preprod/24x24.png b/installers/icons/preprod/24x24.png new file mode 100755 index 0000000000..320730ff56 Binary files /dev/null and b/installers/icons/preprod/24x24.png differ diff --git a/installers/icons/preprod/256x256.png b/installers/icons/preprod/256x256.png new file mode 100755 index 0000000000..a0dee2e675 Binary files /dev/null and b/installers/icons/preprod/256x256.png differ diff --git a/installers/icons/preprod/32x32.png b/installers/icons/preprod/32x32.png new file mode 100755 index 0000000000..bfb1f9059d Binary files /dev/null and b/installers/icons/preprod/32x32.png differ diff --git a/installers/icons/preprod/40x40.png b/installers/icons/preprod/40x40.png new file mode 100755 index 0000000000..bcd32fc1a2 Binary files /dev/null and b/installers/icons/preprod/40x40.png differ diff --git a/installers/icons/preprod/48x48.png b/installers/icons/preprod/48x48.png new file mode 100755 index 0000000000..01eba24e2c Binary files /dev/null and b/installers/icons/preprod/48x48.png differ diff --git a/installers/icons/preprod/512x512.png b/installers/icons/preprod/512x512.png new file mode 100755 index 0000000000..4263d6d1df Binary files /dev/null and b/installers/icons/preprod/512x512.png differ diff --git a/installers/icons/preprod/64x64.png b/installers/icons/preprod/64x64.png new file mode 100755 index 0000000000..4a64a33d6c Binary files /dev/null and b/installers/icons/preprod/64x64.png differ diff --git a/installers/icons/preview.iconset/icon_1024x1024.png b/installers/icons/preview.iconset/icon_1024x1024.png new file mode 100755 index 0000000000..f790e7937c Binary files /dev/null and b/installers/icons/preview.iconset/icon_1024x1024.png differ diff --git a/installers/icons/preview.iconset/icon_1024x1024@2x.png b/installers/icons/preview.iconset/icon_1024x1024@2x.png new file mode 100755 index 0000000000..a12a7fb4d9 Binary files /dev/null and b/installers/icons/preview.iconset/icon_1024x1024@2x.png differ diff --git a/installers/icons/preview.iconset/icon_128x128.png b/installers/icons/preview.iconset/icon_128x128.png new file mode 100755 index 0000000000..9f9bd411ee Binary files /dev/null and b/installers/icons/preview.iconset/icon_128x128.png differ diff --git a/installers/icons/preview.iconset/icon_128x128@2x.png b/installers/icons/preview.iconset/icon_128x128@2x.png new file mode 100755 index 0000000000..79adcc67fb Binary files /dev/null and b/installers/icons/preview.iconset/icon_128x128@2x.png differ diff --git a/installers/icons/preview.iconset/icon_16x16.png b/installers/icons/preview.iconset/icon_16x16.png new file mode 100755 index 0000000000..0770174f80 Binary files /dev/null and b/installers/icons/preview.iconset/icon_16x16.png differ diff --git a/installers/icons/preview.iconset/icon_16x16@2x.png b/installers/icons/preview.iconset/icon_16x16@2x.png new file mode 100755 index 0000000000..e8a4c59ab2 Binary files /dev/null and b/installers/icons/preview.iconset/icon_16x16@2x.png differ diff --git a/installers/icons/preview.iconset/icon_18x18.png b/installers/icons/preview.iconset/icon_18x18.png new file mode 100755 index 0000000000..4fe64df918 Binary files /dev/null and b/installers/icons/preview.iconset/icon_18x18.png differ diff --git a/installers/icons/preview.iconset/icon_18x18@2x.png b/installers/icons/preview.iconset/icon_18x18@2x.png new file mode 100755 index 0000000000..c8f4a10e3a Binary files /dev/null and b/installers/icons/preview.iconset/icon_18x18@2x.png differ diff --git a/installers/icons/preview.iconset/icon_19x19.png b/installers/icons/preview.iconset/icon_19x19.png new file mode 100755 index 0000000000..c12b583dbb Binary files /dev/null and b/installers/icons/preview.iconset/icon_19x19.png differ diff --git a/installers/icons/preview.iconset/icon_19x19@2x.png b/installers/icons/preview.iconset/icon_19x19@2x.png new file mode 100755 index 0000000000..72f68fd5d4 Binary files /dev/null and b/installers/icons/preview.iconset/icon_19x19@2x.png differ diff --git a/installers/icons/preview.iconset/icon_22x22.png b/installers/icons/preview.iconset/icon_22x22.png new file mode 100755 index 0000000000..9bcfdba1be Binary files /dev/null and b/installers/icons/preview.iconset/icon_22x22.png differ diff --git a/installers/icons/preview.iconset/icon_22x22@2x.png b/installers/icons/preview.iconset/icon_22x22@2x.png new file mode 100755 index 0000000000..3a7961a801 Binary files /dev/null and b/installers/icons/preview.iconset/icon_22x22@2x.png differ diff --git a/installers/icons/preview.iconset/icon_24x24.png b/installers/icons/preview.iconset/icon_24x24.png new file mode 100755 index 0000000000..06db9cf292 Binary files /dev/null and b/installers/icons/preview.iconset/icon_24x24.png differ diff --git a/installers/icons/preview.iconset/icon_24x24@2x.png b/installers/icons/preview.iconset/icon_24x24@2x.png new file mode 100755 index 0000000000..42ba308d41 Binary files /dev/null and b/installers/icons/preview.iconset/icon_24x24@2x.png differ diff --git a/installers/icons/preview.iconset/icon_256x256.png b/installers/icons/preview.iconset/icon_256x256.png new file mode 100755 index 0000000000..9e96ae86f9 Binary files /dev/null and b/installers/icons/preview.iconset/icon_256x256.png differ diff --git a/installers/icons/preview.iconset/icon_256x256@2x.png b/installers/icons/preview.iconset/icon_256x256@2x.png new file mode 100755 index 0000000000..a0b71e28a2 Binary files /dev/null and b/installers/icons/preview.iconset/icon_256x256@2x.png differ diff --git a/installers/icons/preview.iconset/icon_32x32.png b/installers/icons/preview.iconset/icon_32x32.png new file mode 100755 index 0000000000..69e3d2374a Binary files /dev/null and b/installers/icons/preview.iconset/icon_32x32.png differ diff --git a/installers/icons/preview.iconset/icon_32x32@2x.png b/installers/icons/preview.iconset/icon_32x32@2x.png new file mode 100755 index 0000000000..d7729c3b00 Binary files /dev/null and b/installers/icons/preview.iconset/icon_32x32@2x.png differ diff --git a/installers/icons/preview.iconset/icon_40x40.png b/installers/icons/preview.iconset/icon_40x40.png new file mode 100755 index 0000000000..ccb075f3a1 Binary files /dev/null and b/installers/icons/preview.iconset/icon_40x40.png differ diff --git a/installers/icons/preview.iconset/icon_40x40@2x.png b/installers/icons/preview.iconset/icon_40x40@2x.png new file mode 100755 index 0000000000..4cf3c82c62 Binary files /dev/null and b/installers/icons/preview.iconset/icon_40x40@2x.png differ diff --git a/installers/icons/preview.iconset/icon_48x48.png b/installers/icons/preview.iconset/icon_48x48.png new file mode 100755 index 0000000000..1f0c8c7338 Binary files /dev/null and b/installers/icons/preview.iconset/icon_48x48.png differ diff --git a/installers/icons/preview.iconset/icon_48x48@2x.png b/installers/icons/preview.iconset/icon_48x48@2x.png new file mode 100755 index 0000000000..34343f9eb4 Binary files /dev/null and b/installers/icons/preview.iconset/icon_48x48@2x.png differ diff --git a/installers/icons/preview.iconset/icon_512x512.png b/installers/icons/preview.iconset/icon_512x512.png new file mode 100755 index 0000000000..626c187549 Binary files /dev/null and b/installers/icons/preview.iconset/icon_512x512.png differ diff --git a/installers/icons/preview.iconset/icon_512x512@2x.png b/installers/icons/preview.iconset/icon_512x512@2x.png new file mode 100755 index 0000000000..282c7802a6 Binary files /dev/null and b/installers/icons/preview.iconset/icon_512x512@2x.png differ diff --git a/installers/icons/preview.iconset/icon_64x64.png b/installers/icons/preview.iconset/icon_64x64.png new file mode 100755 index 0000000000..282eb73ed4 Binary files /dev/null and b/installers/icons/preview.iconset/icon_64x64.png differ diff --git a/installers/icons/preview.iconset/icon_64x64@2x.png b/installers/icons/preview.iconset/icon_64x64@2x.png new file mode 100755 index 0000000000..f618d7df15 Binary files /dev/null and b/installers/icons/preview.iconset/icon_64x64@2x.png differ diff --git a/installers/icons/preview/1024x1024.png b/installers/icons/preview/1024x1024.png new file mode 100755 index 0000000000..f790e7937c Binary files /dev/null and b/installers/icons/preview/1024x1024.png differ diff --git a/installers/icons/preview/128x128.png b/installers/icons/preview/128x128.png new file mode 100755 index 0000000000..9f9bd411ee Binary files /dev/null and b/installers/icons/preview/128x128.png differ diff --git a/installers/icons/preview/16x16.png b/installers/icons/preview/16x16.png new file mode 100755 index 0000000000..0770174f80 Binary files /dev/null and b/installers/icons/preview/16x16.png differ diff --git a/installers/icons/preview/18x18.png b/installers/icons/preview/18x18.png new file mode 100755 index 0000000000..4fe64df918 Binary files /dev/null and b/installers/icons/preview/18x18.png differ diff --git a/installers/icons/preview/19x19.png b/installers/icons/preview/19x19.png new file mode 100755 index 0000000000..c12b583dbb Binary files /dev/null and b/installers/icons/preview/19x19.png differ diff --git a/installers/icons/preview/22x22.png b/installers/icons/preview/22x22.png new file mode 100755 index 0000000000..9bcfdba1be Binary files /dev/null and b/installers/icons/preview/22x22.png differ diff --git a/installers/icons/preview/24x24.png b/installers/icons/preview/24x24.png new file mode 100755 index 0000000000..06db9cf292 Binary files /dev/null and b/installers/icons/preview/24x24.png differ diff --git a/installers/icons/preview/256x256.png b/installers/icons/preview/256x256.png new file mode 100755 index 0000000000..9e96ae86f9 Binary files /dev/null and b/installers/icons/preview/256x256.png differ diff --git a/installers/icons/preview/32x32.png b/installers/icons/preview/32x32.png new file mode 100755 index 0000000000..69e3d2374a Binary files /dev/null and b/installers/icons/preview/32x32.png differ diff --git a/installers/icons/preview/40x40.png b/installers/icons/preview/40x40.png new file mode 100755 index 0000000000..ccb075f3a1 Binary files /dev/null and b/installers/icons/preview/40x40.png differ diff --git a/installers/icons/preview/48x48.png b/installers/icons/preview/48x48.png new file mode 100755 index 0000000000..1f0c8c7338 Binary files /dev/null and b/installers/icons/preview/48x48.png differ diff --git a/installers/icons/preview/512x512.png b/installers/icons/preview/512x512.png new file mode 100755 index 0000000000..626c187549 Binary files /dev/null and b/installers/icons/preview/512x512.png differ diff --git a/installers/icons/preview/64x64.png b/installers/icons/preview/64x64.png new file mode 100755 index 0000000000..282eb73ed4 Binary files /dev/null and b/installers/icons/preview/64x64.png differ diff --git a/installers/icons/selfnode/128x128.ico b/installers/icons/selfnode/128x128.ico deleted file mode 100644 index a5d3a62751..0000000000 Binary files a/installers/icons/selfnode/128x128.ico and /dev/null differ diff --git a/installers/icons/selfnode/16x16.ico b/installers/icons/selfnode/16x16.ico deleted file mode 100644 index eb241687bb..0000000000 Binary files a/installers/icons/selfnode/16x16.ico and /dev/null differ diff --git a/installers/icons/selfnode/18x18.ico b/installers/icons/selfnode/18x18.ico deleted file mode 100644 index aae71fb7fd..0000000000 Binary files a/installers/icons/selfnode/18x18.ico and /dev/null differ diff --git a/installers/icons/selfnode/19x19.ico b/installers/icons/selfnode/19x19.ico deleted file mode 100644 index c2d5aa393d..0000000000 Binary files a/installers/icons/selfnode/19x19.ico and /dev/null differ diff --git a/installers/icons/selfnode/22x22.ico b/installers/icons/selfnode/22x22.ico deleted file mode 100644 index 6bc205619a..0000000000 Binary files a/installers/icons/selfnode/22x22.ico and /dev/null differ diff --git a/installers/icons/selfnode/24x24.ico b/installers/icons/selfnode/24x24.ico deleted file mode 100644 index 7ceddc1238..0000000000 Binary files a/installers/icons/selfnode/24x24.ico and /dev/null differ diff --git a/installers/icons/selfnode/256x256.ico b/installers/icons/selfnode/256x256.ico deleted file mode 100644 index 757886222f..0000000000 Binary files a/installers/icons/selfnode/256x256.ico and /dev/null differ diff --git a/installers/icons/selfnode/32x32.ico b/installers/icons/selfnode/32x32.ico deleted file mode 100644 index 3df8821001..0000000000 Binary files a/installers/icons/selfnode/32x32.ico and /dev/null differ diff --git a/installers/icons/selfnode/40x40.ico b/installers/icons/selfnode/40x40.ico deleted file mode 100644 index 1ae76f56e8..0000000000 Binary files a/installers/icons/selfnode/40x40.ico and /dev/null differ diff --git a/installers/icons/selfnode/48x48.ico b/installers/icons/selfnode/48x48.ico deleted file mode 100644 index 8d709f8ca3..0000000000 Binary files a/installers/icons/selfnode/48x48.ico and /dev/null differ diff --git a/installers/icons/selfnode/64x64.ico b/installers/icons/selfnode/64x64.ico deleted file mode 100644 index ba0ede3bde..0000000000 Binary files a/installers/icons/selfnode/64x64.ico and /dev/null differ diff --git a/installers/icons/selfnode/selfnode.ico b/installers/icons/selfnode/selfnode.ico deleted file mode 100644 index 7c339dc4a9..0000000000 Binary files a/installers/icons/selfnode/selfnode.ico and /dev/null differ diff --git a/installers/icons/shelley_qa/128x128.ico b/installers/icons/shelley_qa/128x128.ico deleted file mode 100644 index 336069460a..0000000000 Binary files a/installers/icons/shelley_qa/128x128.ico and /dev/null differ diff --git a/installers/icons/shelley_qa/16x16.ico b/installers/icons/shelley_qa/16x16.ico deleted file mode 100644 index 5b56282b90..0000000000 Binary files a/installers/icons/shelley_qa/16x16.ico and /dev/null differ diff --git a/installers/icons/shelley_qa/18x18.ico b/installers/icons/shelley_qa/18x18.ico deleted file mode 100644 index 35f657f2ed..0000000000 Binary files a/installers/icons/shelley_qa/18x18.ico and /dev/null differ diff --git a/installers/icons/shelley_qa/19x19.ico b/installers/icons/shelley_qa/19x19.ico deleted file mode 100644 index 0ef4f06a9e..0000000000 Binary files a/installers/icons/shelley_qa/19x19.ico and /dev/null differ diff --git a/installers/icons/shelley_qa/22x22.ico b/installers/icons/shelley_qa/22x22.ico deleted file mode 100644 index 49d135e124..0000000000 Binary files a/installers/icons/shelley_qa/22x22.ico and /dev/null differ diff --git a/installers/icons/shelley_qa/24x24.ico b/installers/icons/shelley_qa/24x24.ico deleted file mode 100644 index 23461f69c1..0000000000 Binary files a/installers/icons/shelley_qa/24x24.ico and /dev/null differ diff --git a/installers/icons/shelley_qa/256x256.ico b/installers/icons/shelley_qa/256x256.ico deleted file mode 100644 index eabede1e4f..0000000000 Binary files a/installers/icons/shelley_qa/256x256.ico and /dev/null differ diff --git a/installers/icons/shelley_qa/32x32.ico b/installers/icons/shelley_qa/32x32.ico deleted file mode 100644 index b81dfe59ed..0000000000 Binary files a/installers/icons/shelley_qa/32x32.ico and /dev/null differ diff --git a/installers/icons/shelley_qa/40x40.ico b/installers/icons/shelley_qa/40x40.ico deleted file mode 100644 index ab7736b2bf..0000000000 Binary files a/installers/icons/shelley_qa/40x40.ico and /dev/null differ diff --git a/installers/icons/shelley_qa/48x48.ico b/installers/icons/shelley_qa/48x48.ico deleted file mode 100644 index 06ff11565c..0000000000 Binary files a/installers/icons/shelley_qa/48x48.ico and /dev/null differ diff --git a/installers/icons/shelley_qa/64x64.ico b/installers/icons/shelley_qa/64x64.ico deleted file mode 100644 index 6ab00fae0f..0000000000 Binary files a/installers/icons/shelley_qa/64x64.ico and /dev/null differ diff --git a/installers/icons/shelley_qa/shelley_qa.ico b/installers/icons/shelley_qa/shelley_qa.ico deleted file mode 100644 index afe30765ed..0000000000 Binary files a/installers/icons/shelley_qa/shelley_qa.ico and /dev/null differ diff --git a/installers/icons/staging/128x128.ico b/installers/icons/staging/128x128.ico deleted file mode 100644 index 679df7c5c7..0000000000 Binary files a/installers/icons/staging/128x128.ico and /dev/null differ diff --git a/installers/icons/staging/16x16.ico b/installers/icons/staging/16x16.ico deleted file mode 100644 index 86b65b6201..0000000000 Binary files a/installers/icons/staging/16x16.ico and /dev/null differ diff --git a/installers/icons/staging/18x18.ico b/installers/icons/staging/18x18.ico deleted file mode 100644 index c97f9657fc..0000000000 Binary files a/installers/icons/staging/18x18.ico and /dev/null differ diff --git a/installers/icons/staging/19x19.ico b/installers/icons/staging/19x19.ico deleted file mode 100644 index 1b79dd4dc3..0000000000 Binary files a/installers/icons/staging/19x19.ico and /dev/null differ diff --git a/installers/icons/staging/22x22.ico b/installers/icons/staging/22x22.ico deleted file mode 100644 index e7ccda85b9..0000000000 Binary files a/installers/icons/staging/22x22.ico and /dev/null differ diff --git a/installers/icons/staging/24x24.ico b/installers/icons/staging/24x24.ico deleted file mode 100644 index 5cd3723dde..0000000000 Binary files a/installers/icons/staging/24x24.ico and /dev/null differ diff --git a/installers/icons/staging/256x256.ico b/installers/icons/staging/256x256.ico deleted file mode 100644 index 001d63b3d5..0000000000 Binary files a/installers/icons/staging/256x256.ico and /dev/null differ diff --git a/installers/icons/staging/32x32.ico b/installers/icons/staging/32x32.ico deleted file mode 100644 index a12a0020be..0000000000 Binary files a/installers/icons/staging/32x32.ico and /dev/null differ diff --git a/installers/icons/staging/40x40.ico b/installers/icons/staging/40x40.ico deleted file mode 100644 index 228aa95a4a..0000000000 Binary files a/installers/icons/staging/40x40.ico and /dev/null differ diff --git a/installers/icons/staging/48x48.ico b/installers/icons/staging/48x48.ico deleted file mode 100644 index ac6b293c54..0000000000 Binary files a/installers/icons/staging/48x48.ico and /dev/null differ diff --git a/installers/icons/staging/64x64.ico b/installers/icons/staging/64x64.ico deleted file mode 100644 index a31bf5e932..0000000000 Binary files a/installers/icons/staging/64x64.ico and /dev/null differ diff --git a/installers/icons/staging/staging.ico b/installers/icons/staging/staging.ico deleted file mode 100644 index 0797931da2..0000000000 Binary files a/installers/icons/staging/staging.ico and /dev/null differ diff --git a/installers/icons/testnet/128x128.ico b/installers/icons/testnet/128x128.ico deleted file mode 100644 index 977bc45329..0000000000 Binary files a/installers/icons/testnet/128x128.ico and /dev/null differ diff --git a/installers/icons/testnet/16x16.ico b/installers/icons/testnet/16x16.ico deleted file mode 100644 index 5b56282b90..0000000000 Binary files a/installers/icons/testnet/16x16.ico and /dev/null differ diff --git a/installers/icons/testnet/18x18.ico b/installers/icons/testnet/18x18.ico deleted file mode 100644 index 35f657f2ed..0000000000 Binary files a/installers/icons/testnet/18x18.ico and /dev/null differ diff --git a/installers/icons/testnet/19x19.ico b/installers/icons/testnet/19x19.ico deleted file mode 100644 index 0ef4f06a9e..0000000000 Binary files a/installers/icons/testnet/19x19.ico and /dev/null differ diff --git a/installers/icons/testnet/22x22.ico b/installers/icons/testnet/22x22.ico deleted file mode 100644 index 49d135e124..0000000000 Binary files a/installers/icons/testnet/22x22.ico and /dev/null differ diff --git a/installers/icons/testnet/24x24.ico b/installers/icons/testnet/24x24.ico deleted file mode 100644 index 23461f69c1..0000000000 Binary files a/installers/icons/testnet/24x24.ico and /dev/null differ diff --git a/installers/icons/testnet/256x256.ico b/installers/icons/testnet/256x256.ico deleted file mode 100644 index 2d5a6716c3..0000000000 Binary files a/installers/icons/testnet/256x256.ico and /dev/null differ diff --git a/installers/icons/testnet/32x32.ico b/installers/icons/testnet/32x32.ico deleted file mode 100644 index b81dfe59ed..0000000000 Binary files a/installers/icons/testnet/32x32.ico and /dev/null differ diff --git a/installers/icons/testnet/40x40.ico b/installers/icons/testnet/40x40.ico deleted file mode 100644 index fca38feb1f..0000000000 Binary files a/installers/icons/testnet/40x40.ico and /dev/null differ diff --git a/installers/icons/testnet/48x48.ico b/installers/icons/testnet/48x48.ico deleted file mode 100644 index ec72c04828..0000000000 Binary files a/installers/icons/testnet/48x48.ico and /dev/null differ diff --git a/installers/icons/testnet/64x64.ico b/installers/icons/testnet/64x64.ico deleted file mode 100644 index dd2c5c5ea2..0000000000 Binary files a/installers/icons/testnet/64x64.ico and /dev/null differ diff --git a/installers/icons/testnet/testnet.ico b/installers/icons/testnet/testnet.ico deleted file mode 100644 index 780a11e8b5..0000000000 Binary files a/installers/icons/testnet/testnet.ico and /dev/null differ diff --git a/installers/icons/update_icons b/installers/icons/update_icons deleted file mode 100755 index 4c343cdc8d..0000000000 --- a/installers/icons/update_icons +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -# -# this script merges the png files into a single ico for windows - -for x in mainnet mainnet_flight testnet staging shelley_qa alonzo_purple selfnode; do - pushd $x - convert 16x16.png 24x24.png 32x32.png 48x48.png 64x64.png 128x128.png 256x256.png $x.ico - popd -done diff --git a/installers/icons/vasil_dev.iconset/icon_1024x1024.png b/installers/icons/vasil_dev.iconset/icon_1024x1024.png new file mode 100644 index 0000000000..289d9fb504 Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_1024x1024.png differ diff --git a/installers/icons/vasil_dev.iconset/icon_1024x1024@2x.png b/installers/icons/vasil_dev.iconset/icon_1024x1024@2x.png new file mode 100644 index 0000000000..52ea16f5c5 Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_1024x1024@2x.png differ diff --git a/installers/icons/vasil_dev.iconset/icon_128x128.png b/installers/icons/vasil_dev.iconset/icon_128x128.png new file mode 100644 index 0000000000..a74db1e8b3 Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_128x128.png differ diff --git a/installers/icons/vasil_dev.iconset/icon_128x128@2x.png b/installers/icons/vasil_dev.iconset/icon_128x128@2x.png new file mode 100644 index 0000000000..8521a2e4cf Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_128x128@2x.png differ diff --git a/installers/icons/vasil_dev.iconset/icon_16x16.png b/installers/icons/vasil_dev.iconset/icon_16x16.png new file mode 100644 index 0000000000..2dcd440146 Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_16x16.png differ diff --git a/installers/icons/vasil_dev.iconset/icon_16x16@2x.png b/installers/icons/vasil_dev.iconset/icon_16x16@2x.png new file mode 100644 index 0000000000..1902aaf385 Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_16x16@2x.png differ diff --git a/installers/icons/vasil_dev.iconset/icon_18x18.png b/installers/icons/vasil_dev.iconset/icon_18x18.png new file mode 100644 index 0000000000..910d5a4986 Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_18x18.png differ diff --git a/installers/icons/vasil_dev.iconset/icon_18x18@2x.png b/installers/icons/vasil_dev.iconset/icon_18x18@2x.png new file mode 100644 index 0000000000..4b21177082 Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_18x18@2x.png differ diff --git a/installers/icons/vasil_dev.iconset/icon_19x19.png b/installers/icons/vasil_dev.iconset/icon_19x19.png new file mode 100644 index 0000000000..0fc76cffdb Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_19x19.png differ diff --git a/installers/icons/vasil_dev.iconset/icon_19x19@2x.png b/installers/icons/vasil_dev.iconset/icon_19x19@2x.png new file mode 100644 index 0000000000..a3fa80aa4e Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_19x19@2x.png differ diff --git a/installers/icons/vasil_dev.iconset/icon_22x22.png b/installers/icons/vasil_dev.iconset/icon_22x22.png new file mode 100644 index 0000000000..8be57fd323 Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_22x22.png differ diff --git a/installers/icons/vasil_dev.iconset/icon_22x22@2x.png b/installers/icons/vasil_dev.iconset/icon_22x22@2x.png new file mode 100644 index 0000000000..ef674c841e Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_22x22@2x.png differ diff --git a/installers/icons/vasil_dev.iconset/icon_24x24.png b/installers/icons/vasil_dev.iconset/icon_24x24.png new file mode 100644 index 0000000000..8eb22f1e28 Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_24x24.png differ diff --git a/installers/icons/vasil_dev.iconset/icon_24x24@2x.png b/installers/icons/vasil_dev.iconset/icon_24x24@2x.png new file mode 100644 index 0000000000..d066f79039 Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_24x24@2x.png differ diff --git a/installers/icons/vasil_dev.iconset/icon_256x256.png b/installers/icons/vasil_dev.iconset/icon_256x256.png new file mode 100644 index 0000000000..cde3d5458d Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_256x256.png differ diff --git a/installers/icons/vasil_dev.iconset/icon_256x256@2x.png b/installers/icons/vasil_dev.iconset/icon_256x256@2x.png new file mode 100644 index 0000000000..15b2bd80bf Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_256x256@2x.png differ diff --git a/installers/icons/vasil_dev.iconset/icon_32x32.png b/installers/icons/vasil_dev.iconset/icon_32x32.png new file mode 100644 index 0000000000..99437a5c89 Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_32x32.png differ diff --git a/installers/icons/vasil_dev.iconset/icon_32x32@2x.png b/installers/icons/vasil_dev.iconset/icon_32x32@2x.png new file mode 100644 index 0000000000..51b612c901 Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_32x32@2x.png differ diff --git a/installers/icons/vasil_dev.iconset/icon_40x40.png b/installers/icons/vasil_dev.iconset/icon_40x40.png new file mode 100644 index 0000000000..6b3a6237ad Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_40x40.png differ diff --git a/installers/icons/vasil_dev.iconset/icon_40x40@2x.png b/installers/icons/vasil_dev.iconset/icon_40x40@2x.png new file mode 100644 index 0000000000..1693f87a4e Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_40x40@2x.png differ diff --git a/installers/icons/vasil_dev.iconset/icon_48x48.png b/installers/icons/vasil_dev.iconset/icon_48x48.png new file mode 100644 index 0000000000..78eb9ad55b Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_48x48.png differ diff --git a/installers/icons/vasil_dev.iconset/icon_48x48@2x.png b/installers/icons/vasil_dev.iconset/icon_48x48@2x.png new file mode 100644 index 0000000000..d049c35d13 Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_48x48@2x.png differ diff --git a/installers/icons/vasil_dev.iconset/icon_512x512.png b/installers/icons/vasil_dev.iconset/icon_512x512.png new file mode 100644 index 0000000000..54997c800a Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_512x512.png differ diff --git a/installers/icons/vasil_dev.iconset/icon_512x512@2x.png b/installers/icons/vasil_dev.iconset/icon_512x512@2x.png new file mode 100644 index 0000000000..6449a83b33 Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_512x512@2x.png differ diff --git a/installers/icons/vasil_dev.iconset/icon_64x64.png b/installers/icons/vasil_dev.iconset/icon_64x64.png new file mode 100644 index 0000000000..780d091231 Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_64x64.png differ diff --git a/installers/icons/vasil_dev.iconset/icon_64x64@2x.png b/installers/icons/vasil_dev.iconset/icon_64x64@2x.png new file mode 100644 index 0000000000..9df0ce6372 Binary files /dev/null and b/installers/icons/vasil_dev.iconset/icon_64x64@2x.png differ diff --git a/installers/icons/vasil_dev/1024x1024.png b/installers/icons/vasil_dev/1024x1024.png new file mode 100644 index 0000000000..289d9fb504 Binary files /dev/null and b/installers/icons/vasil_dev/1024x1024.png differ diff --git a/installers/icons/vasil_dev/128x128.png b/installers/icons/vasil_dev/128x128.png new file mode 100644 index 0000000000..a74db1e8b3 Binary files /dev/null and b/installers/icons/vasil_dev/128x128.png differ diff --git a/installers/icons/vasil_dev/16x16.png b/installers/icons/vasil_dev/16x16.png new file mode 100644 index 0000000000..2dcd440146 Binary files /dev/null and b/installers/icons/vasil_dev/16x16.png differ diff --git a/installers/icons/vasil_dev/18x18.png b/installers/icons/vasil_dev/18x18.png new file mode 100644 index 0000000000..910d5a4986 Binary files /dev/null and b/installers/icons/vasil_dev/18x18.png differ diff --git a/installers/icons/vasil_dev/19x19.png b/installers/icons/vasil_dev/19x19.png new file mode 100644 index 0000000000..0fc76cffdb Binary files /dev/null and b/installers/icons/vasil_dev/19x19.png differ diff --git a/installers/icons/vasil_dev/22x22.png b/installers/icons/vasil_dev/22x22.png new file mode 100644 index 0000000000..8be57fd323 Binary files /dev/null and b/installers/icons/vasil_dev/22x22.png differ diff --git a/installers/icons/vasil_dev/24x24.png b/installers/icons/vasil_dev/24x24.png new file mode 100644 index 0000000000..8eb22f1e28 Binary files /dev/null and b/installers/icons/vasil_dev/24x24.png differ diff --git a/installers/icons/vasil_dev/256x256.png b/installers/icons/vasil_dev/256x256.png new file mode 100644 index 0000000000..cde3d5458d Binary files /dev/null and b/installers/icons/vasil_dev/256x256.png differ diff --git a/installers/icons/vasil_dev/32x32.png b/installers/icons/vasil_dev/32x32.png new file mode 100644 index 0000000000..99437a5c89 Binary files /dev/null and b/installers/icons/vasil_dev/32x32.png differ diff --git a/installers/icons/vasil_dev/40x40.png b/installers/icons/vasil_dev/40x40.png new file mode 100644 index 0000000000..6b3a6237ad Binary files /dev/null and b/installers/icons/vasil_dev/40x40.png differ diff --git a/installers/icons/vasil_dev/48x48.png b/installers/icons/vasil_dev/48x48.png new file mode 100644 index 0000000000..78eb9ad55b Binary files /dev/null and b/installers/icons/vasil_dev/48x48.png differ diff --git a/installers/icons/vasil_dev/512x512.png b/installers/icons/vasil_dev/512x512.png new file mode 100644 index 0000000000..54997c800a Binary files /dev/null and b/installers/icons/vasil_dev/512x512.png differ diff --git a/installers/icons/vasil_dev/64x64.png b/installers/icons/vasil_dev/64x64.png new file mode 100644 index 0000000000..780d091231 Binary files /dev/null and b/installers/icons/vasil_dev/64x64.png differ diff --git a/nix/launcher-config.nix b/nix/launcher-config.nix index 8fd88fa0e0..0dbd6b8cac 100644 --- a/nix/launcher-config.nix +++ b/nix/launcher-config.nix @@ -8,6 +8,8 @@ , topologyOverride ? null , configOverride ? null , genesisOverride ? null +, cardanoWorldFlake +, system }: # Creates an attr set for a cluster containing: @@ -29,7 +31,48 @@ let cluster = "alonzo-purple"; networkName = "alonzo-purple"; }; + shelley_qa = fromCardanoWorld "shelley_qa"; + vasil_dev = fromCardanoWorld "vasil-dev"; + preprod = fromCardanoWorld "preprod"; + preview = fromCardanoWorld "preview"; }; + + fromCardanoWorld = envName: let + originalFiles = builtins.path { + name = "cardano-world-config-${envName}"; + path = cardanoWorldFlake.${system}.cardano.packages.cardano-config-html-internal + "/config/" + envName; + }; + + originalNodeConfig = builtins.fromJSON (builtins.unsafeDiscardStringContext ( + builtins.readFile (originalFiles + "/config.json"))); + + topology = builtins.fromJSON (builtins.unsafeDiscardStringContext ( + builtins.readFile (originalFiles + "/topology.json"))); + + topologyFirstAccessPoint = builtins.head (builtins.head topology.PublicRoots).publicRoots.accessPoints; + + isP2P = originalNodeConfig ? EnableP2P && originalNodeConfig.EnableP2P; + + nodeConfig = originalNodeConfig // { + AlonzoGenesisFile = originalFiles + "/" + originalNodeConfig.AlonzoGenesisFile; + ByronGenesisFile = originalFiles + "/" + originalNodeConfig.ByronGenesisFile; + ShelleyGenesisFile = originalFiles + "/" + originalNodeConfig.ShelleyGenesisFile; + minSeverity = "Info"; # XXX: Needed for sync % updates. + EnableP2P = false; # XXX: Doesn’t work behind NAT? Let’s use the legacy topology. + }; + in { + cluster = envName; + networkName = envName; + cardanoEnv = { + inherit nodeConfig; + } // (if isP2P then { + relaysNew = topologyFirstAccessPoint.address; + edgePort = topologyFirstAccessPoint.port; + } else { + topologyFile = originalFiles + "/topology.json"; + }); + }; + dirSep = if os == "windows" then "\\" else "/"; configDir = configFilesSource: { linux = configFilesSource; @@ -91,6 +134,9 @@ let testnet = "Testnet"; shelley_qa = "Shelley QA"; alonzo_purple = "Alonzo Purple"; + vasil_dev = "Vasil-Dev"; + preprod = "Pre-Prod"; + preview = "Preview"; }; unsupported = "Unsupported"; networkSupported = __hasAttr network supportedNetworks; @@ -215,7 +261,14 @@ let edgePort = 30001; edgeNodes = [ "127.0.0.1" ]; }; - topologyFile = if (topologyOverride == null) then (if network == "local" then localTopology else normalTopologyFile) else topologyOverride; + topologyFile = + if envCfg ? topologyFile + then envCfg.topologyFile + else if (topologyOverride == null) + then (if network == "local" + then localTopology + else normalTopologyFile) + else topologyOverride; nodeConfigFiles = runCommand "node-cfg-files" { inherit nodeConfig topologyFile; passAsFile = [ "nodeConfig" ]; diff --git a/nix/sources.json b/nix/sources.json index 550be4bff2..30dc8afee2 100644 --- a/nix/sources.json +++ b/nix/sources.json @@ -1,14 +1,14 @@ { "cardano-node": { - "branch": "tags/1.35.2", + "branch": "tags/1.35.3", "description": null, "homepage": null, "owner": "input-output-hk", "repo": "cardano-node", - "rev": "7612a245a6e2c51d0f1c3e0d65d7fe9363850043", - "sha256": "01a5qdrmsag18s2mlf8axfbrag59j2fp6xyc89pwmzgs7x77ldsr", + "rev": "950c4e222086fed5ca53564e642434ce9307b0b9", + "sha256": "020fwimsm24yblr1fmnwx240wj8r3x715p89cpjgnnd8axwf32p0", "type": "tarball", - "url": "https://github.com/input-output-hk/cardano-node/archive/7612a245a6e2c51d0f1c3e0d65d7fe9363850043.tar.gz", + "url": "https://github.com/input-output-hk/cardano-node/archive/950c4e222086fed5ca53564e642434ce9307b0b9.tar.gz", "url_template": "https://github.com///archive/.tar.gz" }, "cardano-shell": { @@ -24,15 +24,27 @@ "url_template": "https://github.com///archive/.tar.gz" }, "cardano-wallet": { - "branch": "master", + "branch": "v2022-08-16", "description": "Official Wallet Backend & API for Cardano decentralized", "homepage": null, "owner": "input-output-hk", "repo": "cardano-wallet", - "rev": "7ed8f067dd6d5dc78e7353bf65ea5e3423cdfca8", - "sha256": "1f9lwqi4qghaqi3754732h0cz98f7qbjhcx416jliqy6nibly6lp", + "rev": "afe575663a866c612b4a4dc3a90a8a700e387a86", + "sha256": "03shbj5kxvcb22k1bvfcv9q529lg47g9y9pvvwkyb2jy285rwyhv", + "type": "tarball", + "url": "https://github.com/input-output-hk/cardano-wallet/archive/afe575663a866c612b4a4dc3a90a8a700e387a86.tar.gz", + "url_template": "https://github.com///archive/.tar.gz" + }, + "cardano-world": { + "branch": "master", + "description": "Future Cardano mono-repo", + "homepage": null, + "owner": "input-output-hk", + "repo": "cardano-world", + "rev": "74e93f9fdc863638ce43998e0ccccbf56b4612aa", + "sha256": "16nvwmb7n22x0ql1n2cah36dylxgcybm1mi9n4pbb3xsr75b8b5b", "type": "tarball", - "url": "https://github.com/input-output-hk/cardano-wallet/archive/7ed8f067dd6d5dc78e7353bf65ea5e3423cdfca8.tar.gz", + "url": "https://github.com/input-output-hk/cardano-world/archive/74e93f9fdc863638ce43998e0ccccbf56b4612aa.tar.gz", "url_template": "https://github.com///archive/.tar.gz" }, "flake-compat": { diff --git a/release.nix b/release.nix index 5ff3f8589e..bcb50ecaa2 100644 --- a/release.nix +++ b/release.nix @@ -10,7 +10,8 @@ let shellEnvs = { linux = import ./shell.nix { system = "x86_64-linux"; autoStartBackend = true; }; darwin = import ./shell.nix { system = "x86_64-darwin"; autoStartBackend = true; }; - darwin-arm = import ./shell.nix { system = "aarch64-darwin"; autoStartBackend = true; }; + # TODO: re-enable when we have `aarch64-darwin` in Hydra + #darwin-arm = import ./shell.nix { system = "aarch64-darwin"; autoStartBackend = true; }; }; suffix = if buildNum == null then "" else "-${toString buildNum}"; version = (builtins.fromJSON (builtins.readFile ./package.json)).version; @@ -20,7 +21,8 @@ let x86_64-linux = import ./. { target = "x86_64-linux"; }; x86_64-windows = import ./. { target = "x86_64-windows"; }; x86_64-darwin = import ./. { target = "x86_64-darwin"; }; - aarch64-darwin = import ./. { target = "aarch64-darwin"; }; + # TODO: re-enable when we have `aarch64-darwin` in Hydra + #aarch64-darwin = import ./. { target = "aarch64-darwin"; }; }; in table.${system}; @@ -52,6 +54,7 @@ let sources = import ./nix/sources.nix; in { inherit shellEnvs; + gcRoot = builtins.mapAttrs (_: v: v.gcRoot) shellEnvs; inherit ((daedalusPkgs {}).pkgs) mono; wine = (daedalusPkgs {}).wine; wine64 = (daedalusPkgs {}).wine64; diff --git a/shell.nix b/shell.nix index 0861398bfc..189b73cc72 100644 --- a/shell.nix +++ b/shell.nix @@ -74,6 +74,16 @@ let name = "daedalus-build"; buildInputs = daedalusShellBuildInputs; }; + + gcRoot = pkgs.runCommandLocal "gc-root" { + properBuildShell = buildShell.overrideAttrs (old: { buildCommand = "export >$out"; }); + cardanoWalletsHaskellNix = daedalusPkgs.walletFlake.defaultNix.outputs.legacyPackages.${system}.roots; + ourHaskellNix = if pkgs.stdenv.isLinux then daedalusPkgs.yaml2json.project.roots else ""; + daedalusInstallerInputs = with daedalusPkgs.daedalus-installer; buildInputs ++ nativeBuildInputs; + # cardano-bridge inputs are GC’d, and rebuilt too often on Apple M1 CI: + cardanoBridgeInputs = builtins.map (attr: if daedalusPkgs ? ${attr} && pkgs.lib.isDerivation daedalusPkgs.${attr} then daedalusPkgs.${attr} else null) (builtins.attrNames (builtins.functionArgs (import ./nix/cardano-bridge.nix))); + } "export >$out"; + debug.node = pkgs.writeShellScriptBin "debug-node" (with daedalusPkgs.launcherConfigs.launcherConfig; '' cardano-node run --topology ${nodeConfig.network.topologyFile} --config ${nodeConfig.network.configFile} --database-path ${stateDir}/chain --port 3001 --socket-path ${stateDir}/cardano-node.socket ''); @@ -201,4 +211,4 @@ let " ''; }; -in daedalusShell // { inherit fixYarnLock buildShell devops; } +in daedalusShell // { inherit fixYarnLock buildShell devops gcRoot; } diff --git a/source/common/types/cardano-node.types.ts b/source/common/types/cardano-node.types.ts index c00fd03832..f5b5b518bf 100644 --- a/source/common/types/cardano-node.types.ts +++ b/source/common/types/cardano-node.types.ts @@ -4,6 +4,9 @@ import { STAGING, SHELLEY_QA, ALONZO_PURPLE, + VASIL_DEV, + PREPROD, + PREVIEW, SELFNODE, } from './environment.types'; import { GetBlockSyncProgressType } from '../ipc/api'; @@ -29,6 +32,9 @@ export type NetworkNames = | 'staging' | 'shelley_qa' | 'alonzo_purple' + | 'vasil_dev' + | 'preprod' + | 'preview' | 'selfnode' | 'development' | string; @@ -39,6 +45,9 @@ export const NetworkNameOptions = { staging: 'staging', shelley_qa: 'shelley_qa', alonzo_purple: 'alonzo_purple', + vasil_dev: 'vasil_dev', + preprod: 'preprod', + preview: 'preview', selfnode: 'selfnode', development: 'development', }; @@ -73,6 +82,9 @@ export type CardanoPidOptions = | 'staging-PREVIOUS-CARDANO-PID' | 'shelley_qa-PREVIOUS-CARDANO-PID' | 'alonzo_purple-PREVIOUS-CARDANO-PID' + | 'vasil_dev-PREVIOUS-CARDANO-PID' + | 'preprod-PREVIOUS-CARDANO-PID' + | 'preview-PREVIOUS-CARDANO-PID' | 'selfnode-PREVIOUS-CARDANO-PID' | 'development-PREVIOUS-CARDANO-PID' | string; @@ -144,6 +156,9 @@ export const NetworkMagics: { testnet: NetworkMagicType; staging: NetworkMagicType; alonzo_purple: NetworkMagicType; + vasil_dev: NetworkMagicType; + preprod: NetworkMagicType; + preview: NetworkMagicType; shelley_qa: NetworkMagicType; selfnode: NetworkMagicType; } = { @@ -155,6 +170,12 @@ export const NetworkMagics: { [TESTNET]: [1097911063, 0], // Cardano Alonzo Purple network magic [ALONZO_PURPLE]: [8, 0], + // Cardano Vasil-Dev network magic + [VASIL_DEV]: [9, 0], + // Cardano Pre-Prod network magic + [PREPROD]: [1, 0], + // Cardano Preview network magic + [PREVIEW]: [2, 0], // Cardano Shelley QA network magic [SHELLEY_QA]: [3, 0], // Cardano Selfnode network magic diff --git a/source/common/types/environment.types.ts b/source/common/types/environment.types.ts index 5017b87b06..06fabda70e 100644 --- a/source/common/types/environment.types.ts +++ b/source/common/types/environment.types.ts @@ -10,6 +10,9 @@ export type Environment = { isStaging: boolean; isTestnet: boolean; isAlonzoPurple: boolean; + isVasilDev: boolean; + isPreprod: boolean; + isPreview: boolean; isShelleyQA: boolean; isSelfnode: boolean; isDevelopment: boolean; @@ -44,6 +47,9 @@ export const TESTNET = 'testnet'; export const STAGING = 'staging'; export const SHELLEY_QA = 'shelley_qa'; export const ALONZO_PURPLE = 'alonzo_purple'; +export const VASIL_DEV = 'vasil_dev'; +export const PREPROD = 'preprod'; +export const PREVIEW = 'preview'; export const SELFNODE = 'selfnode'; export const MAC_OS = 'darwin'; export const WINDOWS = 'win32'; @@ -61,6 +67,9 @@ export type Network = | 'staging' | 'shelley_qa' | 'alonzo_purple' + | 'vasil_dev' + | 'preprod' + | 'preview' | 'selfnode' | 'development'; export const networkPrettyNames = { @@ -69,6 +78,9 @@ export const networkPrettyNames = { staging: 'Staging', shelley_qa: 'Shelley QA', alonzo_purple: 'Alonzo Purple', + vasil_dev: 'Vasil-Dev', + preprod: 'Pre-Prod', + preview: 'Preview', selfnode: 'Selfnode', development: 'Development', }; diff --git a/source/common/utils/environmentCheckers.ts b/source/common/utils/environmentCheckers.ts index 4965c5f5e7..757115e1a0 100644 --- a/source/common/utils/environmentCheckers.ts +++ b/source/common/utils/environmentCheckers.ts @@ -1,6 +1,9 @@ import { upperFirst } from 'lodash'; import { ALONZO_PURPLE, + VASIL_DEV, + PREPROD, + PREVIEW, SHELLEY_QA, DEVELOPMENT, LINUX, @@ -30,6 +33,18 @@ export const evaluateNetwork = (network: string | null | undefined) => { currentNetwork = ALONZO_PURPLE; } + if (network === 'vasil-dev') { + currentNetwork = VASIL_DEV; + } + + if (network === 'pre-prod') { + currentNetwork = PREPROD; + } + + if (network === 'preview') { + currentNetwork = PREVIEW; + } + return currentNetwork; }; export const getBuildLabel = ( @@ -54,6 +69,9 @@ export const checkIsMainnet = (network: string) => network === MAINNET; export const checkIsTestnet = (network: string) => network === TESTNET; export const checkIsAlonzoPurple = (network: string) => network === ALONZO_PURPLE; +export const checkIsVasilDev = (network: string) => network === VASIL_DEV; +export const checkIsPreprod = (network: string) => network === PREPROD; +export const checkIsPreview = (network: string) => network === PREVIEW; export const checkIsShelleyQA = (network: string) => network === SHELLEY_QA; export const checkIsStaging = (network: string) => network === STAGING; export const checkIsSelfnode = (network: string) => network === SELFNODE; diff --git a/source/main/environment.ts b/source/main/environment.ts index c49976a0e2..5118eddfee 100644 --- a/source/main/environment.ts +++ b/source/main/environment.ts @@ -6,6 +6,9 @@ import { DEVELOPMENT, OS_NAMES } from '../common/types/environment.types'; import { evaluateNetwork, checkIsAlonzoPurple, + checkIsVasilDev, + checkIsPreprod, + checkIsPreview, checkIsShelleyQA, checkIsDev, checkIsTest, @@ -41,13 +44,16 @@ const isMainnet = checkIsMainnet(NETWORK); const isStaging = checkIsStaging(NETWORK); const isTestnet = checkIsTestnet(NETWORK); const isAlonzoPurple = checkIsAlonzoPurple(NETWORK); +const isVasilDev = checkIsVasilDev(NETWORK); +const isPreprod = checkIsPreprod(NETWORK); +const isPreview = checkIsPreview(NETWORK); const isShelleyQA = checkIsShelleyQA(NETWORK); const isSelfnode = checkIsSelfnode(NETWORK); const isDevelopment = checkIsDevelopment(NETWORK); const analyticsFeatureEnabled = true; const keepLocalClusterRunning = process.env.KEEP_LOCAL_CLUSTER_RUNNING; const API_VERSION = process.env.API_VERSION || 'dev'; -const NODE_VERSION = '1.35.2'; // TODO: pick up this value from process.env +const NODE_VERSION = '1.35.3'; // TODO: pick up this value from process.env const mainProcessID = get(process, 'ppid', '-'); const rendererProcessID = process.pid; @@ -83,6 +89,9 @@ export const environment: Environment = Object.assign( isStaging, isTestnet, isAlonzoPurple, + isVasilDev, + isPreprod, + isPreview, isShelleyQA, isSelfnode, isDevelopment, diff --git a/source/renderer/app/components/sidebar/SidebarCategoryNetworkInfo.tsx b/source/renderer/app/components/sidebar/SidebarCategoryNetworkInfo.tsx index db0c891786..58b04015a1 100644 --- a/source/renderer/app/components/sidebar/SidebarCategoryNetworkInfo.tsx +++ b/source/renderer/app/components/sidebar/SidebarCategoryNetworkInfo.tsx @@ -34,6 +34,21 @@ const messages = defineMessages({ defaultMessage: '!!!Alonzo Purple', description: 'Label for alonzo_purple with version.', }, + vasil_dev: { + id: 'test.environment.vasilDevLabel', + defaultMessage: '!!!Vasil-Dev', + description: 'Label for vasil_dev with version.', + }, + preprod: { + id: 'test.environment.preprodLabel', + defaultMessage: '!!!Pre-Prod', + description: 'Label for preprod with version.', + }, + preview: { + id: 'test.environment.previewLabel', + defaultMessage: '!!!Preview', + description: 'Label for preview with version.', + }, selfnode: { id: 'test.environment.selfnodeLabel', defaultMessage: '!!!Selfnode vx', diff --git a/source/renderer/app/components/staking/redeem-itn-rewards/Step1ConfigurationDialog.scss b/source/renderer/app/components/staking/redeem-itn-rewards/Step1ConfigurationDialog.scss index c74e7a7a66..486df2485c 100644 --- a/source/renderer/app/components/staking/redeem-itn-rewards/Step1ConfigurationDialog.scss +++ b/source/renderer/app/components/staking/redeem-itn-rewards/Step1ConfigurationDialog.scss @@ -23,15 +23,6 @@ .recoveryPhrase { margin-bottom: 20px; - - :global { - .SimpleOptions_option { - padding: 14px 20px; - } - .SimpleAutocomplete_requiredWordsInfo { - color: var(--rp-autocomplete-required-words-invert-color); - } - } } .walletsDropdownWrapper { diff --git a/source/renderer/app/components/staking/redeem-itn-rewards/Step1ConfigurationDialog.tsx b/source/renderer/app/components/staking/redeem-itn-rewards/Step1ConfigurationDialog.tsx index bfdbe289d6..cc5c243f1b 100644 --- a/source/renderer/app/components/staking/redeem-itn-rewards/Step1ConfigurationDialog.tsx +++ b/source/renderer/app/components/staking/redeem-itn-rewards/Step1ConfigurationDialog.tsx @@ -1,38 +1,32 @@ import React, { Component } from 'react'; import { observer } from 'mobx-react'; import { get } from 'lodash'; -import classnames from 'classnames'; import vjf from 'mobx-react-form/lib/validators/VJF'; -import { Autocomplete } from 'react-polymorph/lib/components/Autocomplete'; -import { AutocompleteSkin } from 'react-polymorph/lib/skins/simple/AutocompleteSkin'; import { Checkbox } from 'react-polymorph/lib/components/Checkbox'; import { CheckboxSkin } from 'react-polymorph/lib/skins/simple/CheckboxSkin'; import { Link } from 'react-polymorph/lib/components/Link'; import { LinkSkin } from 'react-polymorph/lib/skins/simple/LinkSkin'; import { defineMessages, - intlShape, - FormattedMessage, FormattedHTMLMessage, + FormattedMessage, + intlShape, } from 'react-intl'; import { BigNumber } from 'bignumber.js'; import Wallet from '../../../domains/Wallet'; -import { - errorOrIncompleteMarker, - validateMnemonics, -} from '../../../utils/validations'; +import { validateMnemonics } from '../../../utils/validations'; import DialogCloseButton from '../../widgets/DialogCloseButton'; import WalletsDropdown from '../../widgets/forms/WalletsDropdown'; import Dialog from '../../widgets/Dialog'; import styles from './Step1ConfigurationDialog.scss'; import ReactToolboxMobxForm from '../../../utils/ReactToolboxMobxForm'; -import globalMessages from '../../../i18n/global-messages'; import LocalizableError from '../../../i18n/LocalizableError'; import { ITN_WALLET_RECOVERY_PHRASE_WORD_COUNT } from '../../../config/cryptoConfig'; import { FORM_VALIDATION_DEBOUNCE_WAIT } from '../../../config/timingConfig'; import { MIN_REWARDS_REDEMPTION_RECEIVER_BALANCE } from '../../../config/stakingConfig'; // @ts-ignore ts-migrate(2307) FIXME: Cannot find module '../../../assets/images/close-c... Remove this comment to see the full error message import closeCrossThin from '../../../assets/images/close-cross-thin.inline.svg'; +import { MnemonicInput } from '../../wallet/mnemonic-input'; const messages = defineMessages({ title: { @@ -167,7 +161,6 @@ class Step1ConfigurationDialog extends Component { wasRecoveryPhraseValidAtLeastOnce: false, }; - recoveryPhraseAutocomplete: Autocomplete; form = new ReactToolboxMobxForm( { fields: { @@ -217,6 +210,7 @@ class Step1ConfigurationDialog extends Component { }, options: { validateOnChange: true, + showErrorsOnChange: false, validationDebounceWait: FORM_VALIDATION_DEBOUNCE_WAIT, }, } @@ -258,7 +252,6 @@ class Step1ConfigurationDialog extends Component { suggestedMnemonics, openExternalLink, wallets, - recoveryPhrase, error, } = this.props; const calculatedMinRewardsReceiverBalance = new BigNumber( @@ -339,6 +332,8 @@ class Step1ConfigurationDialog extends Component { onClose={onClose} /> ); + const { reset, ...mnemonicInputProps } = recoveryPhraseField.bind(); + return ( { />{' '}

- { - this.recoveryPhraseAutocomplete = autocomplete; - }} - options={suggestedMnemonics} - requiredSelections={[ITN_WALLET_RECOVERY_PHRASE_WORD_COUNT]} - requiredSelectionsInfo={(required, actual) => - intl.formatMessage(globalMessages.knownMnemonicWordCount, { - actual, - required, - }) - } - maxSelections={ITN_WALLET_RECOVERY_PHRASE_WORD_COUNT} - error={errorOrIncompleteMarker(recoveryPhraseField.error)} - maxVisibleOptions={5} - noResultsMessage={intl.formatMessage(messages.noResults)} - className={styles.recoveryPhrase} - skin={AutocompleteSkin} - optionHeight={50} - preselectedOptions={[...(recoveryPhrase || [])]} - /> +
+ +
{ { }, options: { validateOnChange: true, + showErrorsOnChange: false, validationDebounceWait: FORM_VALIDATION_DEBOUNCE_WAIT, }, } @@ -364,8 +340,6 @@ class WalletRestoreDialog extends Component { recoveryPhraseField.debouncedValidation.cancel(); recoveryPhraseField.reset(); recoveryPhraseField.showErrors(false); - // Autocomplete has to be reset manually - this.recoveryPhraseAutocomplete.clear(); }; render() { @@ -406,6 +380,8 @@ class WalletRestoreDialog extends Component { 'yoroiTab', this.isYoroi() ? styles.activeButton : '', ]); + const { reset, ...mnemonicInputProps } = recoveryPhraseField.bind(); + return ( { ]} /> )} - - { - this.recoveryPhraseAutocomplete = autocomplete; - }} + - intl.formatMessage(globalMessages.knownMnemonicWordCount, { - actual, - required, - }) - } - maxSelections={RECOVERY_PHRASE_WORD_COUNT_OPTIONS[walletType]} - error={errorOrIncompleteMarker(recoveryPhraseField.error)} - maxVisibleOptions={5} - noResultsMessage={intl.formatMessage( - messages.recoveryPhraseNoResults - )} - optionHeight={50} + availableWords={suggestedMnemonics} + wordCount={RECOVERY_PHRASE_WORD_COUNT_OPTIONS[walletType]} + error={recoveryPhraseField.error} + reset={form.resetting} /> -
{intl.formatMessage(messages.passwordSectionLabel)} diff --git a/source/renderer/app/components/wallet/backup-recovery/WalletRecoveryPhraseDisplayDialog.tsx b/source/renderer/app/components/wallet/backup-recovery/WalletRecoveryPhraseDisplayDialog.tsx index 561d27713f..7ac6272e48 100644 --- a/source/renderer/app/components/wallet/backup-recovery/WalletRecoveryPhraseDisplayDialog.tsx +++ b/source/renderer/app/components/wallet/backup-recovery/WalletRecoveryPhraseDisplayDialog.tsx @@ -1,8 +1,7 @@ import React, { Component } from 'react'; import { observer } from 'mobx-react'; import classnames from 'classnames'; -import { defineMessages, intlShape, FormattedHTMLMessage } from 'react-intl'; -import WalletRecoveryPhraseMnemonic from './WalletRecoveryPhraseMnemonic'; +import { defineMessages, FormattedHTMLMessage, intlShape } from 'react-intl'; import DialogCloseButton from '../../widgets/DialogCloseButton'; import Dialog from '../../widgets/Dialog'; import WalletRecoveryInstructions from './WalletRecoveryInstructions'; @@ -10,6 +9,7 @@ import globalMessages from '../../../i18n/global-messages'; import styles from './WalletRecoveryPhraseDisplayDialog.scss'; import { WALLET_RECOVERY_PHRASE_WORD_COUNT } from '../../../config/cryptoConfig'; import LoadingSpinner from '../../widgets/LoadingSpinner'; +import { MnemonicInput } from '../mnemonic-input'; const messages = defineMessages({ backupInstructions: { @@ -64,6 +64,7 @@ class WalletRecoveryPhraseDisplayDialog extends Component { primary: true, }, ]; + const mnemonicValues = recoveryPhrase.split(' '); return ( { /> } /> - + ); } diff --git a/source/renderer/app/components/wallet/backup-recovery/WalletRecoveryPhraseEntryDialog.tsx b/source/renderer/app/components/wallet/backup-recovery/WalletRecoveryPhraseEntryDialog.tsx index 66213e592f..3467a11549 100644 --- a/source/renderer/app/components/wallet/backup-recovery/WalletRecoveryPhraseEntryDialog.tsx +++ b/source/renderer/app/components/wallet/backup-recovery/WalletRecoveryPhraseEntryDialog.tsx @@ -2,20 +2,14 @@ import React, { Component } from 'react'; import { observer } from 'mobx-react'; import classnames from 'classnames'; import vjf from 'mobx-react-form/lib/validators/VJF'; -import { Autocomplete } from 'react-polymorph/lib/components/Autocomplete'; -import { AutocompleteSkin } from 'react-polymorph/lib/skins/simple/AutocompleteSkin'; import { Checkbox } from 'react-polymorph/lib/components/Checkbox'; import { CheckboxSkin } from 'react-polymorph/lib/skins/simple/CheckboxSkin'; -import { defineMessages, intlShape, FormattedHTMLMessage } from 'react-intl'; +import { defineMessages, FormattedHTMLMessage, intlShape } from 'react-intl'; import { WALLET_RECOVERY_PHRASE_WORD_COUNT } from '../../../config/cryptoConfig'; import suggestedMnemonics from '../../../../../common/config/crypto/valid-words.en'; import { isValidMnemonic } from '../../../../../common/config/crypto/decrypt'; import ReactToolboxMobxForm from '../../../utils/ReactToolboxMobxForm'; -import { - errorOrIncompleteMarker, - validateMnemonics, -} from '../../../utils/validations'; -import WalletRecoveryPhraseMnemonic from './WalletRecoveryPhraseMnemonic'; +import { validateMnemonics } from '../../../utils/validations'; import DialogCloseButton from '../../widgets/DialogCloseButton'; import DialogBackButton from '../../widgets/DialogBackButton'; import Dialog from '../../widgets/Dialog'; @@ -23,6 +17,7 @@ import WalletRecoveryInstructions from './WalletRecoveryInstructions'; import globalMessages from '../../../i18n/global-messages'; import styles from './WalletRecoveryPhraseEntryDialog.scss'; import LoadingSpinner from '../../widgets/LoadingSpinner'; +import { MnemonicInput } from '../mnemonic-input'; const messages = defineMessages({ verificationInstructions: { @@ -43,19 +38,6 @@ const messages = defineMessages({ defaultMessage: '!!!Enter your {numberOfWords}-word recovery phrase', description: 'Placeholder hint for the mnemonics autocomplete.', }, - recoveryPhraseInputPlaceholder: { - id: - 'wallet.backup.recovery.phrase.entry.dialog.recoveryPhraseInputPlaceholder', - defaultMessage: '!!!Enter word #{wordNumber}', - description: 'Placeholder for the mnemonics autocomplete.', - }, - recoveryPhraseNoResults: { - id: - 'wallet.backup.recovery.phrase.entry.dialog.recoveryPhraseInputNoResults', - defaultMessage: '!!!No results', - description: - '"No results" message for the recovery phrase input search results.', - }, recoveryPhraseInvalidMnemonics: { id: 'wallet.backup.recovery.phrase.entry.dialog.recoveryPhraseInvalidMnemonics', @@ -85,6 +67,7 @@ const messages = defineMessages({ }, }); type Props = { + recoveryPhrase: string; enteredPhrase: Array; isValid: boolean; isTermOfflineAccepted: boolean; @@ -118,6 +101,13 @@ class WalletRecoveryPhraseEntryDialog extends Component { this.props.onUpdateVerificationPhrase({ verificationPhrase: enteredWords, }); + + if (this.props.recoveryPhrase !== enteredWords.join(' ')) { + return this.context.intl.formatMessage( + messages.recoveryPhraseInvalidMnemonics + ); + } + return validateMnemonics({ requiredWords: WALLET_RECOVERY_PHRASE_WORD_COUNT, providedWords: field.value, @@ -137,11 +127,20 @@ class WalletRecoveryPhraseEntryDialog extends Component { vjf: vjf(), }, options: { + showErrorsOnChange: false, validateOnChange: true, }, } ); + handleSubmit = () => { + this.form.submit({ + onSuccess: () => { + this.props.onFinishBackup(); + }, + }); + }; + render() { const { form } = this; const { intl } = this.context; @@ -156,7 +155,7 @@ class WalletRecoveryPhraseEntryDialog extends Component { canFinishBackup, onRestartBackup, onCancelBackup, - onFinishBackup, + recoveryPhrase, } = this.props; const recoveryPhraseField = form.$('recoveryPhrase'); const dialogClasses = classnames([ @@ -164,20 +163,27 @@ class WalletRecoveryPhraseEntryDialog extends Component { 'WalletRecoveryPhraseEntryDialog', ]); const wordCount = WALLET_RECOVERY_PHRASE_WORD_COUNT; - const enteredPhraseString = enteredPhrase.join(' '); const buttonLabel = !isSubmitting ? ( intl.formatMessage(messages.buttonLabelConfirm) ) : ( ); + const canSubmit = + (!recoveryPhraseField.error && + recoveryPhraseField.value.length === recoveryPhrase.split(' ').length && + recoveryPhraseField.value.every((word) => word)) || + canFinishBackup; + const actions = [ { label: buttonLabel, - onClick: onFinishBackup, - disabled: !canFinishBackup, + onClick: this.handleSubmit, + disabled: !canSubmit, primary: true, }, ]; + const { reset, ...mnemonicInputProps } = recoveryPhraseField.bind(); + return ( { } )} /> - - - intl.formatMessage(globalMessages.knownMnemonicWordCount, { - actual, - required, - }) - } - maxSelections={wordCount} - error={errorOrIncompleteMarker(recoveryPhraseField.error)} - maxVisibleOptions={5} - noResultsMessage={intl.formatMessage( - messages.recoveryPhraseNoResults - )} - skin={AutocompleteSkin} - optionHeight={50} + availableWords={suggestedMnemonics} + wordCount={wordCount} + error={recoveryPhraseField.error} + reset={form.resetting} /> )} {isValid && ( <> - +
void; + onConfirmSelection: () => void; + onPaste: ClipboardEventHandler; + ordinalNumber: number; + value: string; + options: string[]; + maxVisibleOptions: number; + disabled: boolean; + reset: boolean; + noResultsMessage: string; + inputRef: RefObject; +} + +function MnemonicAutocompleteContainer({ + onChange, + onConfirmSelection, + onPaste, + reset, + ordinalNumber, + value = '', + options, + maxVisibleOptions, + disabled, + noResultsMessage, + inputRef, +}: MnemonicAutocompleteContainerProps) { + const initialState = useMemo( + () => ({ + inputValue: value, + filteredOptions: options.slice(0, maxVisibleOptions), + isOpen: false, + mouseIsOverOptions: false, + blurred: false, + }), + [] + ); + const [state, setState] = useState(initialState); + const rootRef = useRef(); + const optionsRef = useRef(); + const suggestionsRef = useRef(); + + const toggleOpen = () => + setState((prevState) => ({ ...prevState, isOpen: !prevState.isOpen })); + + const toggleMouseIsOverOptions = () => + setState((prevState) => ({ + ...prevState, + mouseIsOverOptions: !prevState.mouseIsOverOptions, + })); + + const handleInputClick: MouseEventHandler = (event) => { + toggleOpen(); + event.currentTarget.setSelectionRange(0, event.currentTarget.value.length); + }; + + const handleInputChange = useCallback>( + (event) => { + const { value: inputValue } = event.currentTarget; + let selectedOption = ''; + const trimmedInputValue = inputValue.trim(); + const filteredOptions = options + .filter(startsWith(trimmedInputValue)) + .slice(0, maxVisibleOptions); + const isOpen = + filteredOptions.length > 1 || filteredOptions[0] !== trimmedInputValue; + + if (filteredOptions.includes(trimmedInputValue)) { + selectedOption = trimmedInputValue; + } + + setState((prevState) => ({ + ...prevState, + isOpen, + filteredOptions, + inputValue: trimmedInputValue, + })); + + onChange(selectedOption); + + if (selectedOption && filteredOptions.length === 1) { + onConfirmSelection(); + } + }, + [options, onChange, onConfirmSelection, maxVisibleOptions] + ); + + const handleInputSelect = useCallback( + (inputValue) => { + setState((prevState) => ({ + ...prevState, + isOpen: false, + filteredOptions: [inputValue], + inputValue, + })); + + onChange(inputValue); + onConfirmSelection(); + }, + [onChange, onConfirmSelection] + ); + + const handleBlur = () => + setState((prevState) => ({ ...prevState, blurred: true })); + + // this useEffect handles input paste event + useEffect(() => { + if (!value) return; + + const filteredOptions = options + .filter(startsWith(value)) + .slice(0, maxVisibleOptions); + + if (filteredOptions.length > 1) { + setState((prevState) => ({ + ...prevState, + inputValue: value, + })); + } else { + handleInputSelect(value); + } + }, [value]); + + useEffect(() => { + if (reset) { + setState(initialState); + } + }, [reset]); + + return ( + + {({ optionsMaxHeight, optionHeight = 50 }) => ( + + )} + + ); +} + +export { MnemonicAutocompleteContainer }; diff --git a/source/renderer/app/components/wallet/mnemonic-input/MnemonicAutocompleteLayout.scss b/source/renderer/app/components/wallet/mnemonic-input/MnemonicAutocompleteLayout.scss new file mode 100644 index 0000000000..d76efbaa29 --- /dev/null +++ b/source/renderer/app/components/wallet/mnemonic-input/MnemonicAutocompleteLayout.scss @@ -0,0 +1,46 @@ +$label-width: 24px; +$label-margin-right: 11px; + +.root { + color: var(--theme-main-body-messages-color); + height: 22px; + line-height: 22px; + position: relative; +} + +.inputWrapper { + height: 100%; +} + +.input { + background-color: transparent; + border: 0; + border-bottom: var(--rp-autocomplete-border); + color: inherit; + font-family: inherit; + font-size: inherit; + height: 100%; + line-height: inherit; + padding: 0 0 0 $label-width + $label-margin-right; + width: 100%; + + &:focus { + border-bottom-color: var(--rp-autocomplete-border-color-opened); + outline: none; + } + + &Error { + border-bottom-color: var(--rp-theme-color-error); + } +} + +.inputLabel { + bottom: 0; + color: var(--theme-input-border-color); + height: 100%; + left: 0; + line-height: inherit; + position: absolute; + text-align: right; + width: $label-width; +} diff --git a/source/renderer/app/components/wallet/mnemonic-input/MnemonicAutocompleteLayout.tsx b/source/renderer/app/components/wallet/mnemonic-input/MnemonicAutocompleteLayout.tsx new file mode 100644 index 0000000000..dab08e04be --- /dev/null +++ b/source/renderer/app/components/wallet/mnemonic-input/MnemonicAutocompleteLayout.tsx @@ -0,0 +1,106 @@ +import React, { + ChangeEventHandler, + ClipboardEventHandler, + MouseEventHandler, + RefObject, +} from 'react'; +import cx from 'classnames'; +import { FormField } from 'react-polymorph/lib/components/FormField'; +import { Options } from 'react-polymorph/lib/components/Options'; +import { OptionsSkin } from 'react-polymorph/lib/skins/simple/OptionsSkin'; +import styles from './MnemonicAutocompleteLayout.scss'; + +interface MnemonicInputSkinProps { + onClick: MouseEventHandler; + onChange: ChangeEventHandler; + onSelect: (value: string) => void; + onBlur: () => void; + onPaste: ClipboardEventHandler; + toggleMouseLocation: () => void; + toggleOpen: () => void; + + value: string; + ordinalNumber: number; + disabled: boolean; + error: boolean; + isOpen: boolean; + optionHeight?: number; + options: string[]; + optionsMaxHeight: number; + noResultsMessage: string; + + optionsRef: RefObject; + rootRef: RefObject; + inputRef: RefObject; + suggestionsRef: RefObject; +} + +function MnemonicAutocompleteLayout({ + onClick, + onChange, + onSelect, + onBlur, + onPaste, + toggleMouseLocation, + toggleOpen, + + value, + ordinalNumber, + disabled, + error, + isOpen, + optionHeight, + options, + optionsMaxHeight, + noResultsMessage, + + optionsRef, + rootRef, + inputRef, + suggestionsRef, +}: MnemonicInputSkinProps) { + return ( +
+
{ordinalNumber}.
+ ( +
+ +
+ )} + /> + +
+ ); +} + +export { MnemonicAutocompleteLayout }; diff --git a/source/renderer/app/components/wallet/mnemonic-input/MnemonicInput.scss b/source/renderer/app/components/wallet/mnemonic-input/MnemonicInput.scss new file mode 100644 index 0000000000..82819ee81a --- /dev/null +++ b/source/renderer/app/components/wallet/mnemonic-input/MnemonicInput.scss @@ -0,0 +1,50 @@ +// has to be the same as in mnemonic-input/constants.ts +$columns: 3; +$header-vertical-padding: 10px; + +.root { + color: var(--theme-dialog-text-color); + font-family: var(--font-medium); +} + +.header { + align-items: center; + display: flex; + height: #{$header-vertical-padding * 2 + 19}; + justify-content: space-between; + padding: $header-vertical-padding 0; +} + +.headerSlot { + flex-basis: 100%; +} + +.headerLeftSlot { + text-align: left; +} + +.headerRightSlot { + color: var(--theme-input-border-color); + font-family: var(--font-regular); + font-size: 14px; + text-align: right; +} + +.headerError { + color: var(--rp-theme-color-error); +} + +.content { + background-color: var(--theme-mnemonic-background-color); + display: flex; + justify-content: space-between; + padding: 20px; +} + +.inputList { + width: calc(#{percentage(1 / $columns)} - 30px); +} + +.inputWrapper { + margin-bottom: 10px; +} diff --git a/source/renderer/app/components/wallet/mnemonic-input/MnemonicInput.tsx b/source/renderer/app/components/wallet/mnemonic-input/MnemonicInput.tsx new file mode 100644 index 0000000000..16c3ce4f7a --- /dev/null +++ b/source/renderer/app/components/wallet/mnemonic-input/MnemonicInput.tsx @@ -0,0 +1,185 @@ +import React, { + ClipboardEventHandler, + useCallback, + useEffect, + useMemo, + useRef, + VFC, +} from 'react'; +import { defineMessages, injectIntl } from 'react-intl'; +import { chunk, constant, times } from 'lodash'; +import cx from 'classnames'; +import { INCOMPLETE_MNEMONIC_MARKER } from '../../../utils/validations'; +import { MnemonicAutocompleteContainer } from './MnemonicAutocompleteContainer'; +import { COLUMNS_COUNT } from './constants'; +import styles from './MnemonicInput.scss'; +import { Intl } from '../../../types/i18nTypes'; + +const messages = defineMessages({ + recoveryPhraseNoResults: { + id: + 'paper.wallet.create.certificate.verification.dialog.recoveryPhrase.noResults', + defaultMessage: '!!!No results', + description: + '"Paper wallet create certificate verification dialog" recovery phrase no results label.', + }, + mnemonicCounter: { + id: 'paper.wallet.create.certificate.verification.dialog.mnemonicCounter', + defaultMessage: + '!!!{providedWordCount} of {requiredWordCount} words entered', + description: 'Mnemonic input word counter', + }, +}); + +interface InteractiveMnemonicInputProps { + onChange: (values: string[]) => void; + + value: string[]; + error?: string; + reset?: boolean; + availableWords: string[]; + wordCount: number; + label?: string; +} + +interface DisabledMnemonicInputProps { + value: string[]; + wordCount: number; + disabled: true; +} + +const MnemonicInput: VFC< + InteractiveMnemonicInputProps | DisabledMnemonicInputProps +> = injectIntl( + ({ + intl, + onChange, + value: selectedWords, + disabled, + availableWords = [], + wordCount, + error, + reset = false, + label, + }: InteractiveMnemonicInputProps & + DisabledMnemonicInputProps & { intl: Intl }) => { + useEffect(() => { + if (selectedWords.length < 1) { + onChange(times(wordCount, constant(''))); + } + }, [selectedWords]); + + const providedWordCount = selectedWords.filter((word) => word?.length) + .length; + const showError = + providedWordCount === wordCount && + error && + error !== INCOMPLETE_MNEMONIC_MARKER; + const wordsPerColumn = Math.ceil(wordCount / COLUMNS_COUNT); + const inputIndicesByColumnIndex = useMemo( + () => chunk(times(wordCount), wordsPerColumn), + [wordCount] + ); + const inputRefs = times(wordCount, () => useRef()); + const createHandleWordChange = useCallback( + (idx: number) => (newValue) => { + if (!onChange || newValue === selectedWords[idx]) return; + + const newSelectedWords = [...selectedWords]; + newSelectedWords[idx] = newValue; + + onChange(newSelectedWords); + }, + [selectedWords, onChange] + ); + const handleInputPaste = useCallback< + ClipboardEventHandler + >( + (event) => { + const pastedWords = event.clipboardData + .getData('Text') + .trim() + .split(' '); + const filteredWords = pastedWords.filter((word) => + availableWords.includes(word) + ); + + // single word paste will be handled by `onChange` event + // multiple word paste will be handled by `onPaste` event itself, and prevents `onChange` invocation + if (filteredWords.length > 1) { + event.preventDefault(); + } + + if (filteredWords.length === wordCount) { + onChange(filteredWords); + } + }, + [availableWords, onChange] + ); + + const createHandleConfirmSelection = useCallback( + (idx: number) => () => { + inputRefs[idx + 1]?.current.focus(); + }, + [inputRefs] + ); + + return ( +
+ {!disabled && ( +
+ {label && ( +
+ {label} +
+ )} +
+ {showError + ? error + : intl.formatMessage(messages.mnemonicCounter, { + providedWordCount, + requiredWordCount: wordCount, + })} +
+
+ )} +
+ {inputIndicesByColumnIndex.map((inputIndices) => ( +
+ {inputIndices.map((idx) => { + const value = selectedWords[idx]; + return ( +
+ +
+ ); + })} +
+ ))} +
+
+ ); + } +); + +export { MnemonicInput }; diff --git a/source/renderer/app/components/wallet/mnemonic-input/constants.ts b/source/renderer/app/components/wallet/mnemonic-input/constants.ts new file mode 100644 index 0000000000..55c6348c42 --- /dev/null +++ b/source/renderer/app/components/wallet/mnemonic-input/constants.ts @@ -0,0 +1,2 @@ +// has to be the same as in mnemonic-input/MnemonicInput.scss +export const COLUMNS_COUNT = 3; diff --git a/source/renderer/app/components/wallet/mnemonic-input/index.ts b/source/renderer/app/components/wallet/mnemonic-input/index.ts new file mode 100644 index 0000000000..1c0012c9d2 --- /dev/null +++ b/source/renderer/app/components/wallet/mnemonic-input/index.ts @@ -0,0 +1 @@ +export { MnemonicInput } from './MnemonicInput'; diff --git a/source/renderer/app/components/wallet/paper-wallet-certificate/VerificationDialog.scss b/source/renderer/app/components/wallet/paper-wallet-certificate/VerificationDialog.scss index 63e7cba89e..8f7ee977f4 100644 --- a/source/renderer/app/components/wallet/paper-wallet-certificate/VerificationDialog.scss +++ b/source/renderer/app/components/wallet/paper-wallet-certificate/VerificationDialog.scss @@ -60,12 +60,6 @@ } } - :global { - input { - padding-right: 40px; - } - } - .checkbox { margin-top: 20px; } diff --git a/source/renderer/app/components/wallet/paper-wallet-certificate/VerificationDialog.tsx b/source/renderer/app/components/wallet/paper-wallet-certificate/VerificationDialog.tsx index 2787e9129b..f4f8703b1b 100644 --- a/source/renderer/app/components/wallet/paper-wallet-certificate/VerificationDialog.tsx +++ b/source/renderer/app/components/wallet/paper-wallet-certificate/VerificationDialog.tsx @@ -1,12 +1,9 @@ import React, { Component } from 'react'; -import { join } from 'lodash'; import { observer } from 'mobx-react'; import classnames from 'classnames'; import { defineMessages, intlShape } from 'react-intl'; import vjf from 'mobx-react-form/lib/validators/VJF'; -import { Autocomplete } from 'react-polymorph/lib/components/Autocomplete'; import { Checkbox } from 'react-polymorph/lib/components/Checkbox'; -import { AutocompleteSkin } from 'react-polymorph/lib/skins/simple/AutocompleteSkin'; import { CheckboxSkin } from 'react-polymorph/lib/skins/simple/CheckboxSkin'; import Dialog from '../../widgets/Dialog'; import DialogCloseButton from '../../widgets/DialogCloseButton'; @@ -20,6 +17,7 @@ import { PAPER_WALLET_WRITTEN_WORDS_COUNT, } from '../../../config/cryptoConfig'; import { FORM_VALIDATION_DEBOUNCE_WAIT } from '../../../config/timingConfig'; +import { MnemonicInput } from '../mnemonic-input'; const messages = defineMessages({ headline: { @@ -49,20 +47,6 @@ const messages = defineMessages({ description: '"Paper wallet create certificate verification dialog" recovery phrase label.', }, - recoveryPhraseHint: { - id: - 'paper.wallet.create.certificate.verification.dialog.recoveryPhrase.hint', - defaultMessage: '!!!Enter recovery phrase', - description: - '"Paper wallet create certificate verification dialog" recovery phrase hint.', - }, - recoveryPhraseNoResults: { - id: - 'paper.wallet.create.certificate.verification.dialog.recoveryPhrase.noResults', - defaultMessage: '!!!No results', - description: - '"Paper wallet create certificate verification dialog" recovery phrase no results label.', - }, clearButtonLabel: { id: 'paper.wallet.create.certificate.verification.dialog.button.clearLabel', defaultMessage: '!!!Clear', @@ -90,6 +74,7 @@ type State = { storingConfirmed: boolean; recoveringConfirmed: boolean; isRecoveryPhraseValid: boolean; + error: boolean; }; type Props = { walletCertificateRecoveryPhrase: string; @@ -112,6 +97,7 @@ class VerificationDialog extends Component { storingConfirmed: false, recoveringConfirmed: false, isRecoveryPhraseValid: false, + error: false, }; onStoringConfirmation = () => { this.setState((prevState) => ({ @@ -123,15 +109,11 @@ class VerificationDialog extends Component { recoveringConfirmed: !prevState.recoveringConfirmed, })); }; - recoveryPhraseAutocomplete: Autocomplete; form = new ReactToolboxMobxForm( { fields: { recoveryPhrase: { label: this.context.intl.formatMessage(messages.recoveryPhraseLabel), - placeholder: this.context.intl.formatMessage( - messages.recoveryPhraseHint - ), value: [], validators: [ ({ field }) => { @@ -157,7 +139,7 @@ class VerificationDialog extends Component { } const fullRecoveryPhrase = `${walletCertificateRecoveryPhrase} ${additionalMnemonicWords}`; - const enteredRecoveryPhrase = join(enteredWordsArray, ' '); + const enteredRecoveryPhrase = enteredWordsArray.join(' '); const isRecoveryPhraseValid = fullRecoveryPhrase === enteredRecoveryPhrase; this.setState({ @@ -185,10 +167,19 @@ class VerificationDialog extends Component { }, options: { validateOnChange: true, + showErrorsOnChange: false, validationDebounceWait: FORM_VALIDATION_DEBOUNCE_WAIT, }, } ); + handleMnemonicInputChange = (value) => { + if (this.state.error) { + this.setState((prevState) => ({ ...prevState, error: false })); + } + + this.form.$('recoveryPhrase').bind().onChange(value); + }; + submit = () => { this.form.submit({ onSuccess: (form) => { @@ -197,24 +188,19 @@ class VerificationDialog extends Component { recoveryPhrase, }); }, - onError: () => {}, + onError: () => { + this.setState((prevState) => ({ ...prevState, error: true })); + }, }); }; resetForm = () => { const { form } = this; - const autocomplete = this.recoveryPhraseAutocomplete; // Cancel all debounced field validations form.each((field) => { field.debouncedValidation.cancel(); }); form.reset(); form.showErrors(false); - // Autocomplete has to be reset manually - autocomplete.clear(); - - if (autocomplete && autocomplete.focus) { - autocomplete.focus(); - } this.setState({ storingConfirmed: false, @@ -251,10 +237,12 @@ class VerificationDialog extends Component { className: 'continueButton', label: intl.formatMessage(globalMessages.dialogButtonContinueLabel), primary: true, - disabled: !storingConfirmed || !recoveringConfirmed, + disabled: form.hasError, onClick: this.submit.bind(this), }, ]; + const { reset, ...mnemonicInputProps } = recoveryPhraseField.bind(); + return ( {

- { - this.recoveryPhraseAutocomplete = autocomplete; - }} - {...recoveryPhraseField.bind()} + - { vjf: vjf(), }, options: { + showErrorsOnChange: false, validateOnChange: true, }, } ); + handleSubmit = () => { + this.form.submit({ + onSuccess: (form) => { + const { recoveryPhrase } = form.values(); + + this.setState({ isVerifying: true }); + this.props.onContinue({ recoveryPhrase }); + }, + }); + }; + render() { const { form } = this; const { intl } = this.context; - const { onClose, onContinue, expectedWordCount, walletName } = this.props; + const { onClose, expectedWordCount, walletName } = this.props; const { isVerifying } = this.state; const recoveryPhraseField = form.$('recoveryPhrase'); const { length: enteredWordCount } = recoveryPhraseField.value; @@ -123,20 +135,13 @@ class WalletRecoveryPhraseStep2Dialog extends Component { (Array.isArray(expectedWordCount) ? expectedWordCount.includes(enteredWordCount) : enteredWordCount === expectedWordCount); - const recoveryPhrase = recoveryPhraseField.value; + // const { reset, ...mnemonicInputProps } = recoveryPhraseField.bind(); const actions = [ { className: isVerifying ? styles.isVerifying : null, label: intl.formatMessage(messages.recoveryPhraseStep2Button), primary: true, - onClick: () => { - this.setState({ - isVerifying: true, - }); - onContinue({ - recoveryPhrase, - }); - }, + onClick: this.handleSubmit, disabled: !canSubmit, }, ]; @@ -156,6 +161,7 @@ class WalletRecoveryPhraseStep2Dialog extends Component {

{intl.formatMessage(messages.recoveryPhraseStep2Description)}

+ {/* TODO https://input-output.atlassian.net/browse/DDW-1119 */} { }) } maxSelections={maxSelections} - error={errorOrIncompleteMarker(recoveryPhraseField.error)} + error={ + recoveryPhraseField.error !== INCOMPLETE_MNEMONIC_MARKER && + recoveryPhraseField.error + } maxVisibleOptions={5} noResultsMessage={intl.formatMessage( messages.recoveryPhraseNoResults diff --git a/source/renderer/app/components/wallet/wallet-restore/MnemonicsDialog.tsx b/source/renderer/app/components/wallet/wallet-restore/MnemonicsDialog.tsx index 10c768e8e2..90edcacfc8 100644 --- a/source/renderer/app/components/wallet/wallet-restore/MnemonicsDialog.tsx +++ b/source/renderer/app/components/wallet/wallet-restore/MnemonicsDialog.tsx @@ -1,23 +1,20 @@ import React, { Component } from 'react'; +import _ from 'lodash'; import { observer } from 'mobx-react'; import { defineMessages, intlShape } from 'react-intl'; import vjf from 'mobx-react-form/lib/validators/VJF'; -import { Autocomplete } from 'react-polymorph/lib/components/Autocomplete'; -import { AutocompleteSkin } from 'react-polymorph/lib/skins/simple/AutocompleteSkin'; -import { - errorOrIncompleteMarker, - validateMnemonics, -} from '../../../utils/validations'; +import { validateMnemonics } from '../../../utils/validations'; import WalletRestoreDialog from './widgets/WalletRestoreDialog'; import ReactToolboxMobxForm from '../../../utils/ReactToolboxMobxForm'; import globalMessages from '../../../i18n/global-messages'; import validWords from '../../../../../common/config/crypto/valid-words.en'; import type { - WalletKind, WalletDaedalusKind, - WalletYoroiKind, WalletHardwareKind, + WalletKind, + WalletYoroiKind, } from '../../../types/walletRestoreTypes'; +import { MnemonicInput } from '../mnemonic-input'; const messages = defineMessages({ autocompletePlaceholder: { @@ -95,6 +92,7 @@ class MnemonicsDialog extends Component { vjf: vjf(), }, options: { + showErrorsOnChange: false, validateOnChange: true, }, } @@ -108,16 +106,14 @@ class MnemonicsDialog extends Component { render() { const { intl } = this.context; - const { - onClose, - onBack, - mnemonics, - onSetWalletMnemonics, - maxWordCount, - expectedWordCount, - } = this.props; + const { onClose, onBack, onSetWalletMnemonics, maxWordCount } = this.props; const recoveryPhraseField = this.form.$('recoveryPhrase'); - const canSubmit = recoveryPhraseField.isValid && !recoveryPhraseField.error; + const canSubmit = + !recoveryPhraseField.error && + recoveryPhraseField.value.length === maxWordCount && + recoveryPhraseField.value.every((word) => word); + const { reset, ...mnemonicInputProps } = recoveryPhraseField.bind(); + return ( { onClose={onClose} onBack={onBack} > -
- - intl.formatMessage(globalMessages.knownMnemonicWordCount, { - actual, - required, - }) - } - maxSelections={maxWordCount} - error={errorOrIncompleteMarker(recoveryPhraseField.error)} - maxVisibleOptions={5} - noResultsMessage={intl.formatMessage( - messages.autocompleteNoResults - )} - skin={AutocompleteSkin} - onChange={(enteredMnemonics) => { - recoveryPhraseField.set(enteredMnemonics); - onSetWalletMnemonics(enteredMnemonics); - }} - preselectedOptions={[...mnemonics]} - optionHeight={50} - /> -
-
+ { + recoveryPhraseField.set(enteredMnemonics); + onSetWalletMnemonics(enteredMnemonics); + }} + availableWords={validWords} + wordCount={maxWordCount} + error={recoveryPhraseField.error} + reset={this.form.resetting} + /> ); } diff --git a/source/renderer/app/components/widgets/WalletTestEnvironmentLabel.tsx b/source/renderer/app/components/widgets/WalletTestEnvironmentLabel.tsx index 4687182c3f..40028da710 100644 --- a/source/renderer/app/components/widgets/WalletTestEnvironmentLabel.tsx +++ b/source/renderer/app/components/widgets/WalletTestEnvironmentLabel.tsx @@ -29,6 +29,21 @@ const messages = defineMessages({ defaultMessage: '!!!Alonzo Purple', description: 'Label for alonzo_purple with version.', }, + vasil_dev: { + id: 'test.environment.vasilDevLabel', + defaultMessage: '!!!Vasil-Dev', + description: 'Label for vasil_dev with version.', + }, + preprod: { + id: 'test.environment.preprodLabel', + defaultMessage: '!!!Pre-Prod', + description: 'Label for preprod with version.', + }, + preview: { + id: 'test.environment.previewLabel', + defaultMessage: '!!!Preview', + description: 'Label for preview with version.', + }, selfnode: { id: 'test.environment.selfnodeLabel', defaultMessage: '!!!Selfnode vx', diff --git a/source/renderer/app/components/widgets/forms/MnemonicInputWidget.scss b/source/renderer/app/components/widgets/forms/MnemonicInputWidget.scss deleted file mode 100644 index 1afb6564c3..0000000000 --- a/source/renderer/app/components/widgets/forms/MnemonicInputWidget.scss +++ /dev/null @@ -1,23 +0,0 @@ -@import '../../../themes/mixins/forms'; - -.component { - margin-bottom: 1.5rem; -} - -.tokens { - display: flex; - flex-wrap: wrap; - margin-left: -5px; - margin-right: -5px; -} - -.label { - @include form-label; - margin-bottom: 0.75rem; -} - -.input { - margin: 5px; - padding: 0 !important; - width: 8rem; -} diff --git a/source/renderer/app/components/widgets/forms/MnemonicInputWidget.tsx b/source/renderer/app/components/widgets/forms/MnemonicInputWidget.tsx deleted file mode 100644 index b66e07f2eb..0000000000 --- a/source/renderer/app/components/widgets/forms/MnemonicInputWidget.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import React, { Component } from 'react'; -import { IObservableArray } from 'mobx'; -import { observer } from 'mobx-react'; -import { defineMessages, intlShape } from 'react-intl'; -import { Input } from 'react-polymorph/lib/components/Input'; -import { InputSkin } from 'react-polymorph/lib/skins/simple/InputSkin'; -import styles from './MnemonicInputWidget.scss'; - -const messages = defineMessages({ - token: { - id: 'global.labels.token', - defaultMessage: '!!!Token', - description: 'Token description.', - }, -}); -type Props = { - label: string; - tokens: IObservableArray; - onTokenChanged: (...args: Array) => any; - error?: string; -}; - -@observer -class MnemonicInputWidget extends Component { - static contextTypes = { - intl: intlShape.isRequired, - }; - - render() { - const { intl } = this.context; - const { label, tokens, onTokenChanged, error } = this.props; - return ( -
-
{label}
- {error &&
{error}
} -
- {tokens.map((token, index) => ( - onTokenChanged(index, value)} - skin={InputSkin} - /> - ))} -
-
- ); - } -} - -export default MnemonicInputWidget; diff --git a/source/renderer/app/components/widgets/forms/PinCode.tsx b/source/renderer/app/components/widgets/forms/PinCode.tsx index bd34c32997..f06eab285e 100644 --- a/source/renderer/app/components/widgets/forms/PinCode.tsx +++ b/source/renderer/app/components/widgets/forms/PinCode.tsx @@ -17,7 +17,7 @@ type Props = { length?: number; disabled: boolean; value: Array; - error: string | null; + error?: string; }; export default class PinCode extends Component { static defaultProps = { diff --git a/source/renderer/app/config/analyticsConfig.ts b/source/renderer/app/config/analyticsConfig.ts index f5dbeb6df3..f239171b82 100644 --- a/source/renderer/app/config/analyticsConfig.ts +++ b/source/renderer/app/config/analyticsConfig.ts @@ -8,12 +8,15 @@ export const DEV_MODE_SITE_MAP_ID = 1; export const NETWORK_TO_ANALYTICS_SITE_ID_MAP: Record = { mainnet: 4, mainnet_flight: 4, - testnet: 2, - staging: 1, - shelley_qa: 1, - alonzo_purple: 1, - selfnode: 1, - development: 1, + testnet: 3, + preprod: 3, + preview: 3, + staging: 5, + shelley_qa: 5, + alonzo_purple: 5, + selfnode: 5, + development: 5, + vasil_dev: 5, }; export const CPU_DIMENSION_KEY = 'dimension2'; diff --git a/source/renderer/app/config/hardwareWalletsConfig.ts b/source/renderer/app/config/hardwareWalletsConfig.ts index 1658b79189..56ff5fda01 100644 --- a/source/renderer/app/config/hardwareWalletsConfig.ts +++ b/source/renderer/app/config/hardwareWalletsConfig.ts @@ -9,7 +9,13 @@ export const SHELLEY_PURPOSE_INDEX = 1852; export const BYRON_PURPOSE_INDEX = 44; export const ADA_COIN_TYPE = 1815; export const DEFAULT_ADDRESS_INDEX = 0; -const { isMainnet, isStaging, isSelfnode } = global.environment; +const { + isMainnet, + isStaging, + isSelfnode, + isPreprod, + isPreview, +} = global.environment; const hardwareWalletNetworksConfig = {}; map(NetworkMagics, (networkMagic: NetworkMagicType, network: Network) => { const isMainnetLikeNetwork = isMainnet || isSelfnode || isStaging; diff --git a/source/renderer/app/i18n/global-messages.ts b/source/renderer/app/i18n/global-messages.ts index c7f4dfc2d2..c2b92e34f1 100644 --- a/source/renderer/app/i18n/global-messages.ts +++ b/source/renderer/app/i18n/global-messages.ts @@ -222,6 +222,21 @@ export default defineMessages({ defaultMessage: '!!!Alonzo Purple', description: '"Alonzo Purple" Cardano network', }, + network_vasil_dev: { + id: 'environment.network.vasil_dev', + defaultMessage: '!!!Vasil-Dev', + description: '"Vasil-Dev" Cardano network', + }, + network_preprod: { + id: 'environment.network.preprod', + defaultMessage: '!!!Pre-Prod', + description: '"Pre-Prod" Cardano network', + }, + network_preview: { + id: 'environment.network.preview', + defaultMessage: '!!!Preview', + description: '"Preview" Cardano network', + }, network_development: { id: 'environment.network.development', defaultMessage: '!!!Development', diff --git a/source/renderer/app/i18n/locales/defaultMessages.json b/source/renderer/app/i18n/locales/defaultMessages.json index fa9933337f..6e1cd7b2ab 100644 --- a/source/renderer/app/i18n/locales/defaultMessages.json +++ b/source/renderer/app/i18n/locales/defaultMessages.json @@ -301,6 +301,21 @@ "description": "\"Alonzo Purple\" Cardano network", "id": "environment.network.alonzo_purple" }, + { + "defaultMessage": "!!!Vasil-Dev", + "description": "\"Vasil-Dev\" Cardano network", + "id": "environment.network.vasil_dev" + }, + { + "defaultMessage": "!!!Pre-Prod", + "description": "\"Pre-Prod\" Cardano network", + "id": "environment.network.preprod" + }, + { + "defaultMessage": "!!!Preview", + "description": "\"Preview\" Cardano network", + "id": "environment.network.preview" + }, { "defaultMessage": "!!!Development", "description": "\"development\" Cardano network", @@ -366,6 +381,11 @@ "description": "Reset label.", "id": "global.labels.reset" }, + { + "defaultMessage": "!!!Token", + "description": "Token description.", + "id": "global.labels.token" + }, { "defaultMessage": "!!!Reveal", "description": "Reveal label.", @@ -399,16 +419,6 @@ ], "path": "source/renderer/app/i18n/global-messages.ts" }, - { - "descriptors": [ - { - "defaultMessage": "!!!Token", - "description": "Token description.", - "id": "global.labels.token" - } - ], - "path": "source/renderer/app/components/widgets/forms/MnemonicInputWidget.tsx" - }, { "descriptors": [ { @@ -1221,6 +1231,21 @@ "description": "Label for alonzo_purple with version.", "id": "test.environment.alonzoPurpleLabel" }, + { + "defaultMessage": "!!!Vasil-Dev", + "description": "Label for vasil_dev with version.", + "id": "test.environment.vasilDevLabel" + }, + { + "defaultMessage": "!!!Pre-Prod", + "description": "Label for preprod with version.", + "id": "test.environment.preprodLabel" + }, + { + "defaultMessage": "!!!Preview", + "description": "Label for preview with version.", + "id": "test.environment.previewLabel" + }, { "defaultMessage": "!!!Selfnode vx", "description": "Label for selfnode with version.", @@ -2036,21 +2061,11 @@ "description": "Label for the recovery phrase input on the wallet restore dialog.", "id": "wallet.restore.dialog.recovery.phrase.input.label" }, - { - "defaultMessage": "!!!Enter recovery phrase", - "description": "Hint \"Enter recovery phrase\" for the recovery phrase input on the wallet restore dialog.", - "id": "wallet.restore.dialog.recovery.phrase.input.hint" - }, { "defaultMessage": "!!!New", "description": "Label \"new\" on the wallet restore dialog.", "id": "wallet.restore.dialog.recovery.phrase.newLabel" }, - { - "defaultMessage": "!!!No results", - "description": "\"No results\" message for the recovery phrase input search results.", - "id": "wallet.restore.dialog.recovery.phrase.input.noResults" - }, { "defaultMessage": "!!!Restore wallet", "description": "Label for the \"Restore wallet\" button on the wallet restore dialog.", @@ -2106,16 +2121,6 @@ "description": "Label for the shielded recovery phrase input on the wallet restore dialog.", "id": "wallet.restore.dialog.shielded.recovery.phrase.input.label" }, - { - "defaultMessage": "!!!Enter your {numberOfWords}-word paper wallet recovery phrase", - "description": "Hint \"Enter your 27-word paper wallet recovery phrase.\" for the recovery phrase input on the wallet restore dialog.", - "id": "wallet.restore.dialog.shielded.recovery.phrase.input.hint" - }, - { - "defaultMessage": "!!!Enter word #{wordNumber}", - "description": "Placeholder \"Enter word #\" for the recovery phrase input on the wallet restore dialog.", - "id": "wallet.restore.dialog.shielded.recovery.phrase.input.placeholder" - }, { "defaultMessage": "!!!Restore paper wallet", "description": "Label for the \"Restore paper wallet\" button on the wallet restore dialog.", @@ -4836,16 +4841,6 @@ "description": "Placeholder hint for the mnemonics autocomplete.", "id": "wallet.backup.recovery.phrase.entry.dialog.recoveryPhraseInputHint" }, - { - "defaultMessage": "!!!Enter word #{wordNumber}", - "description": "Placeholder for the mnemonics autocomplete.", - "id": "wallet.backup.recovery.phrase.entry.dialog.recoveryPhraseInputPlaceholder" - }, - { - "defaultMessage": "!!!No results", - "description": "\"No results\" message for the recovery phrase input search results.", - "id": "wallet.backup.recovery.phrase.entry.dialog.recoveryPhraseInputNoResults" - }, { "defaultMessage": "!!!Invalid recovery phrase", "description": "Error message shown when invalid recovery phrase was entered.", @@ -4919,6 +4914,21 @@ ], "path": "source/renderer/app/components/wallet/file-import/WalletFileImportDialog.tsx" }, + { + "descriptors": [ + { + "defaultMessage": "!!!No results", + "description": "\"Paper wallet create certificate verification dialog\" recovery phrase no results label.", + "id": "paper.wallet.create.certificate.verification.dialog.recoveryPhrase.noResults" + }, + { + "defaultMessage": "!!!{providedWordCount} of {requiredWordCount} words entered", + "description": "Mnemonic input word counter", + "id": "paper.wallet.create.certificate.verification.dialog.mnemonicCounter" + } + ], + "path": "source/renderer/app/components/wallet/mnemonic-input/MnemonicInput.tsx" + }, { "descriptors": [ { @@ -5216,16 +5226,6 @@ "description": "\"Paper wallet create certificate verification dialog\" recovery phrase label.", "id": "paper.wallet.create.certificate.verification.dialog.recoveryPhrase.label" }, - { - "defaultMessage": "!!!Enter recovery phrase", - "description": "\"Paper wallet create certificate verification dialog\" recovery phrase hint.", - "id": "paper.wallet.create.certificate.verification.dialog.recoveryPhrase.hint" - }, - { - "defaultMessage": "!!!No results", - "description": "\"Paper wallet create certificate verification dialog\" recovery phrase no results label.", - "id": "paper.wallet.create.certificate.verification.dialog.recoveryPhrase.noResults" - }, { "defaultMessage": "!!!Clear", "description": "\"Paper wallet create certificate verification dialog\" button clear label.", diff --git a/source/renderer/app/i18n/locales/en-US.json b/source/renderer/app/i18n/locales/en-US.json index cc906c0701..4bb4bb4ef2 100755 --- a/source/renderer/app/i18n/locales/en-US.json +++ b/source/renderer/app/i18n/locales/en-US.json @@ -175,10 +175,13 @@ "environment.network.alonzo_purple": "Alonzo Purple", "environment.network.development": "Development", "environment.network.mainnet": "Mainnet", + "environment.network.preprod": "Pre-Prod", + "environment.network.preview": "Preview", "environment.network.selfnode": "Selfnode", "environment.network.shelley_qa": "Shelley QA", "environment.network.staging": "Staging", "environment.network.testnet": "Testnet", + "environment.network.vasil_dev": "Vasil-Dev", "global.ada.name": "Ada", "global.ada.unit": "ADA", "global.dialog.button.continue": "Continue", @@ -325,8 +328,8 @@ "paper.wallet.create.certificate.verification.dialog.button.clearLabel": "Clear", "paper.wallet.create.certificate.verification.dialog.headline": "Verify certificate", "paper.wallet.create.certificate.verification.dialog.instructions": "Make sure you enter all {fullPhraseWordCount} words for the paper wallet recovery phrase, first {printedWordCount} words printed on the certificate followed by the {writtenWordCount} words you wrote by hand.", + "paper.wallet.create.certificate.verification.dialog.mnemonicCounter": "{providedWordCount} of {requiredWordCount} words entered", "paper.wallet.create.certificate.verification.dialog.recoveringUnderstandanceConfirmationLabel": "I understand that my paper wallet can be recovered only by using my paper wallet certificate.", - "paper.wallet.create.certificate.verification.dialog.recoveryPhrase.hint": "Enter recovery phrase", "paper.wallet.create.certificate.verification.dialog.recoveryPhrase.label": "Paper wallet recovery phrase", "paper.wallet.create.certificate.verification.dialog.recoveryPhrase.noResults": "No results", "paper.wallet.create.certificate.verification.dialog.storingUnderstandanceConfirmationLabel": "I understand that the paper wallet I create will not be stored in Daedalus.", @@ -697,10 +700,13 @@ "test.environment.daedalusFlightLabel": "Cardano mainnet - Daedalus Flight", "test.environment.developmentLabel": "Development", "test.environment.mainnetLabel": "Mainnet", + "test.environment.preprodLabel": "Pre-Prod", + "test.environment.previewLabel": "Preview", "test.environment.selfnodeLabel": "Selfnode", "test.environment.shelleyQaLabel": "Shelley QA", "test.environment.stagingLabel": "Staging", "test.environment.testnetLabel": "Testnet", + "test.environment.vasilDevLabel": "Vasil-Dev", "voting.apiError.description1": "Unable to communicate with the API that retrieves the Catalyst date information.", "voting.apiError.description2": "Please, try again later.", "voting.apiError.title": "Catalyst API unavailable", @@ -815,8 +821,6 @@ "wallet.backup.recovery.phrase.display.dialog.button.label.iHaveWrittenItDown": "Yes, I have written down my wallet recovery phrase.", "wallet.backup.recovery.phrase.entry.dialog.recoveryPhraseInputHint": "Enter your {numberOfWords}-word recovery phrase", "wallet.backup.recovery.phrase.entry.dialog.recoveryPhraseInputLabel": "Verify your recovery phrase", - "wallet.backup.recovery.phrase.entry.dialog.recoveryPhraseInputNoResults": "No results", - "wallet.backup.recovery.phrase.entry.dialog.recoveryPhraseInputPlaceholder": "Enter word #{wordNumber}", "wallet.backup.recovery.phrase.entry.dialog.recoveryPhraseInvalidMnemonics": "Invalid recovery phrase", "wallet.backup.recovery.phrase.entry.dialog.terms.and.condition.offline": "I understand that the simplest way to keep my wallet recovery phrase secure is to never store it digitally or online. If I decide to use an online service, such as a password manager with an encrypted database, it is my responsibility to make sure that I use it correctly.", "wallet.backup.recovery.phrase.entry.dialog.terms.and.condition.recovery": "I understand that the only way to recover my wallet if my computer is lost, broken, stolen, or stops working is to use my wallet recovery phrase.", @@ -970,9 +974,7 @@ "wallet.restore.dialog.passwordFieldPlaceholder": "Password", "wallet.restore.dialog.passwordSectionDescription": "Keep your wallet secure by setting the spending password", "wallet.restore.dialog.passwordSectionLabel": "Spending password", - "wallet.restore.dialog.recovery.phrase.input.hint": "Enter recovery phrase", "wallet.restore.dialog.recovery.phrase.input.label": "Recovery phrase", - "wallet.restore.dialog.recovery.phrase.input.noResults": "No results", "wallet.restore.dialog.recovery.phrase.newLabel": "New", "wallet.restore.dialog.recovery.phrase.type.12word.option": "Balance wallet", "wallet.restore.dialog.recovery.phrase.type.15word.option": "Rewards wallet", @@ -980,9 +982,7 @@ "wallet.restore.dialog.recovery.phrase.type.word": " words", "wallet.restore.dialog.repeatPasswordLabel": "Repeat password", "wallet.restore.dialog.restore.wallet.button.label": "Restore wallet", - "wallet.restore.dialog.shielded.recovery.phrase.input.hint": "Enter your {numberOfWords}-word paper wallet recovery phrase", "wallet.restore.dialog.shielded.recovery.phrase.input.label": "27-word paper wallet recovery phrase", - "wallet.restore.dialog.shielded.recovery.phrase.input.placeholder": "Enter word #{wordNumber}", "wallet.restore.dialog.spendingPasswordLabel": "Enter password", "wallet.restore.dialog.step.configuration.continueButtonLabel": "Continue", "wallet.restore.dialog.step.configuration.description1": "Name your restored wallet and set a spending password to keep your wallet secure.", diff --git a/source/renderer/app/i18n/locales/ja-JP.json b/source/renderer/app/i18n/locales/ja-JP.json index be05877fb9..4fd5c64f04 100755 --- a/source/renderer/app/i18n/locales/ja-JP.json +++ b/source/renderer/app/i18n/locales/ja-JP.json @@ -175,10 +175,13 @@ "environment.network.alonzo_purple": "Alonzo Purple", "environment.network.development": "開発", "environment.network.mainnet": "メインネット", + "environment.network.preprod": "Pre-Prod", + "environment.network.preview": "Preview", "environment.network.selfnode": "Selfnode", "environment.network.shelley_qa": "Shelley QA", "environment.network.staging": "ステージング", "environment.network.testnet": "テストネット", + "environment.network.vasil_dev": "Vasil-Dev", "global.ada.name": "ADA", "global.ada.unit": "ADA", "global.dialog.button.continue": "続ける", @@ -325,10 +328,10 @@ "paper.wallet.create.certificate.verification.dialog.button.clearLabel": "取り消す", "paper.wallet.create.certificate.verification.dialog.headline": "証明書を検証する", "paper.wallet.create.certificate.verification.dialog.instructions": "{fullPhraseWordCount}語のペーパーウォレット復元フレーズをすべて入力してください。まず証明書に印刷されている{printedWordCount}語、次に自分で書き留めた{writtenWordCount}語を入力します。", + "paper.wallet.create.certificate.verification.dialog.mnemonicCounter": "{providedWordCount}/{requiredWordCount}語入力済み", "paper.wallet.create.certificate.verification.dialog.recoveringUnderstandanceConfirmationLabel": "ウォレットを復元する唯一の方法がペーパーウォレット証明書を利用することであることを理解しました。", - "paper.wallet.create.certificate.verification.dialog.recoveryPhrase.hint": "復元フレーズを入力してください", "paper.wallet.create.certificate.verification.dialog.recoveryPhrase.label": "ペーパーウォレット復元フレーズ", - "paper.wallet.create.certificate.verification.dialog.recoveryPhrase.noResults": "該当するフレーズは見つかりませんでした", + "paper.wallet.create.certificate.verification.dialog.recoveryPhrase.noResults": "該当なし", "paper.wallet.create.certificate.verification.dialog.storingUnderstandanceConfirmationLabel": "作成したペーパーウォレットがDaedalusウォレットに保管されないことを理解しました。", "paper.wallet.create.certificate.verification.dialog.subtitle": "ペーパーウォレット証明書の有効性を検証するためにペーパーウォレット復元フレーズを入力してください。", "paper.wallet.pdf.info.author": "Daedalusウォレット", @@ -697,10 +700,13 @@ "test.environment.daedalusFlightLabel": "Cardano Mainnet - Daedalus Flight", "test.environment.developmentLabel": "開発", "test.environment.mainnetLabel": "メインネット", + "test.environment.preprodLabel": "Pre-Prod", + "test.environment.previewLabel": "Preview", "test.environment.selfnodeLabel": "Selfnode", "test.environment.shelleyQaLabel": "Shelley QA", "test.environment.stagingLabel": "ステージング", "test.environment.testnetLabel": "テストネット", + "test.environment.vasilDevLabel": "Vasil-Dev", "voting.apiError.description1": "Catalystの日付情報を取得するAPIと通信できません。", "voting.apiError.description2": "しばらくしてからもう一度試してみてください。", "voting.apiError.title": "Catalyst APIは使用できません", @@ -815,8 +821,6 @@ "wallet.backup.recovery.phrase.display.dialog.button.label.iHaveWrittenItDown": "はい、ウォレットの復元フレーズを書き留めました", "wallet.backup.recovery.phrase.entry.dialog.recoveryPhraseInputHint": "{numberOfWords}語のウォレット復元フレーズを入力してください", "wallet.backup.recovery.phrase.entry.dialog.recoveryPhraseInputLabel": "復元フレーズを検証してください", - "wallet.backup.recovery.phrase.entry.dialog.recoveryPhraseInputNoResults": "該当するフレーズは見つかりませんでした", - "wallet.backup.recovery.phrase.entry.dialog.recoveryPhraseInputPlaceholder": "{wordNumber}番目の単語を入力", "wallet.backup.recovery.phrase.entry.dialog.recoveryPhraseInvalidMnemonics": "無効な復元フレーズ", "wallet.backup.recovery.phrase.entry.dialog.terms.and.condition.offline": "ウォレット復元フレーズを安全に保管する最もシンプルな方法はデジタルまたはオンラインに保存しないことであることを理解しました。暗号化データベース付きパスワードマネージャーなどオンラインサービスを使用する場合は、自己責任で適切に使用します。", "wallet.backup.recovery.phrase.entry.dialog.terms.and.condition.recovery": "コンピューターが喪失、故障、盗難、作動不能などとなった場合、ウォレットは復元フレーズを使用することによってのみ復元することができることを理解しました。", @@ -970,9 +974,7 @@ "wallet.restore.dialog.passwordFieldPlaceholder": "パスワード", "wallet.restore.dialog.passwordSectionDescription": "送信時パスワードを設定してウォレットを安全に保ちましょう", "wallet.restore.dialog.passwordSectionLabel": "送信時パスワード", - "wallet.restore.dialog.recovery.phrase.input.hint": "復元フレーズを入力してください", "wallet.restore.dialog.recovery.phrase.input.label": "復元フレーズ", - "wallet.restore.dialog.recovery.phrase.input.noResults": "該当する単語は見つかりませんでした", "wallet.restore.dialog.recovery.phrase.newLabel": "新しい", "wallet.restore.dialog.recovery.phrase.type.12word.option": "残高ウォレット", "wallet.restore.dialog.recovery.phrase.type.15word.option": "報酬ウォレット", @@ -980,9 +982,7 @@ "wallet.restore.dialog.recovery.phrase.type.word": "語", "wallet.restore.dialog.repeatPasswordLabel": "パスワードを再入力してください", "wallet.restore.dialog.restore.wallet.button.label": "ウォレットを復元する", - "wallet.restore.dialog.shielded.recovery.phrase.input.hint": "{numberOfWords}語のペーパーウォレット復元フレーズを入力してください。", "wallet.restore.dialog.shielded.recovery.phrase.input.label": "27語のペーパーウォレット復元フレーズ", - "wallet.restore.dialog.shielded.recovery.phrase.input.placeholder": "{wordNumber}番目の単語を入力", "wallet.restore.dialog.spendingPasswordLabel": "パスワードを入力してください", "wallet.restore.dialog.step.configuration.continueButtonLabel": "続ける", "wallet.restore.dialog.step.configuration.description1": "復元したウォレットに名前を付け、ウォレットを安全に保つために送信時パスワードを設定してください。", diff --git a/source/renderer/app/utils/validations.ts b/source/renderer/app/utils/validations.ts index 808d818357..ba8ee7f5cb 100644 --- a/source/renderer/app/utils/validations.ts +++ b/source/renderer/app/utils/validations.ts @@ -113,9 +113,6 @@ export function validateMnemonics(params: ValidateMnemonicsParams) { return params.validator(providedWords); } -export function errorOrIncompleteMarker(error: string) { - return error === INCOMPLETE_MNEMONIC_MARKER ? null : error; -} /** * Voting PIN code validation diff --git a/source/renderer/mobx-react-form.d.ts b/source/renderer/mobx-react-form.d.ts index 149fdb387c..7fedc82610 100644 --- a/source/renderer/mobx-react-form.d.ts +++ b/source/renderer/mobx-react-form.d.ts @@ -28,7 +28,7 @@ declare module 'mobx-react-form' { isValid: boolean; value: any; checked: boolean; - error: string; + error?: string; name: string; type: string; id: string; @@ -49,6 +49,8 @@ declare module 'mobx-react-form' { isValid: boolean; validating: boolean; + resetting: boolean; + hasError: boolean; reset: () => void; showErrors: (showMessage: boolean) => void; diff --git a/storybook/stories/common/Widgets.stories.tsx b/storybook/stories/common/Widgets.stories.tsx index 4bd601e419..f5eb7c7d76 100644 --- a/storybook/stories/common/Widgets.stories.tsx +++ b/storybook/stories/common/Widgets.stories.tsx @@ -10,7 +10,6 @@ import StoryLayout from '../_support/StoryLayout'; import enMessages from '../../../source/renderer/app/i18n/locales/en-US.json'; import jpMessages from '../../../source/renderer/app/i18n/locales/ja-JP.json'; import BigButtonForDialogs from '../../../source/renderer/app/components/widgets/BigButtonForDialogs'; -import MnemonicInputWidget from '../../../source/renderer/app/components/widgets/forms/MnemonicInputWidget'; import InlineEditingInput from '../../../source/renderer/app/components/widgets/forms/InlineEditingInput'; import CountdownWidget from '../../../source/renderer/app/components/widgets/CountdownWidget'; // @ts-ignore ts-migrate(2307) FIXME: Cannot find module '../../../source/renderer/app/a... Remove this comment to see the full error message @@ -201,21 +200,6 @@ storiesOf('Common / Widgets', module)
)) - // @ts-ignore ts-migrate(2345) FIXME: Argument of type '(props: { locale: string;}) =... Remove this comment to see the full error message - .add('MnemonicInputWidget - 9 words', (props: { locale: string }) => { - const tokens = observable(['', '', '', '', '', '', '', '', '']); - return ( - - { - tokens[index] = token; - }} - /> - - ); - }) .add('TinySwitch', () => ) // @ts-ignore ts-migrate(2345) FIXME: Argument of type '(props: { locale: string;}) =... Remove this comment to see the full error message .add('TinySwitch - short label', (props: { locale: string }) => ( diff --git a/translations/messages.json b/translations/messages.json index 5a303fa5be..18a4cebc9c 100644 --- a/translations/messages.json +++ b/translations/messages.json @@ -301,6 +301,21 @@ "description": "\"Alonzo Purple\" Cardano network", "id": "environment.network.alonzo_purple" }, + { + "defaultMessage": "!!!Vasil-Dev", + "description": "\"Vasil-Dev\" Cardano network", + "id": "environment.network.vasil_dev" + }, + { + "defaultMessage": "!!!Pre-Prod", + "description": "\"Pre-Prod\" Cardano network", + "id": "environment.network.preprod" + }, + { + "defaultMessage": "!!!Preview", + "description": "\"Preview\" Cardano network", + "id": "environment.network.preview" + }, { "defaultMessage": "!!!Development", "description": "\"development\" Cardano network", @@ -366,6 +381,11 @@ "description": "Reset label.", "id": "global.labels.reset" }, + { + "defaultMessage": "!!!Token", + "description": "Token description.", + "id": "global.labels.token" + }, { "defaultMessage": "!!!Reveal", "description": "Reveal label.", @@ -399,16 +419,6 @@ ], "path": "source/renderer/app/i18n/global-messages.ts" }, - { - "descriptors": [ - { - "defaultMessage": "!!!Token", - "description": "Token description.", - "id": "global.labels.token" - } - ], - "path": "source/renderer/app/components/widgets/forms/MnemonicInputWidget.tsx" - }, { "descriptors": [ { @@ -1221,6 +1231,21 @@ "description": "Label for alonzo_purple with version.", "id": "test.environment.alonzoPurpleLabel" }, + { + "defaultMessage": "!!!Vasil-Dev", + "description": "Label for vasil_dev with version.", + "id": "test.environment.vasilDevLabel" + }, + { + "defaultMessage": "!!!Pre-Prod", + "description": "Label for preprod with version.", + "id": "test.environment.preprodLabel" + }, + { + "defaultMessage": "!!!Preview", + "description": "Label for preview with version.", + "id": "test.environment.previewLabel" + }, { "defaultMessage": "!!!Selfnode vx", "description": "Label for selfnode with version.", @@ -2036,21 +2061,11 @@ "description": "Label for the recovery phrase input on the wallet restore dialog.", "id": "wallet.restore.dialog.recovery.phrase.input.label" }, - { - "defaultMessage": "!!!Enter recovery phrase", - "description": "Hint \"Enter recovery phrase\" for the recovery phrase input on the wallet restore dialog.", - "id": "wallet.restore.dialog.recovery.phrase.input.hint" - }, { "defaultMessage": "!!!New", "description": "Label \"new\" on the wallet restore dialog.", "id": "wallet.restore.dialog.recovery.phrase.newLabel" }, - { - "defaultMessage": "!!!No results", - "description": "\"No results\" message for the recovery phrase input search results.", - "id": "wallet.restore.dialog.recovery.phrase.input.noResults" - }, { "defaultMessage": "!!!Restore wallet", "description": "Label for the \"Restore wallet\" button on the wallet restore dialog.", @@ -2106,16 +2121,6 @@ "description": "Label for the shielded recovery phrase input on the wallet restore dialog.", "id": "wallet.restore.dialog.shielded.recovery.phrase.input.label" }, - { - "defaultMessage": "!!!Enter your {numberOfWords}-word paper wallet recovery phrase", - "description": "Hint \"Enter your 27-word paper wallet recovery phrase.\" for the recovery phrase input on the wallet restore dialog.", - "id": "wallet.restore.dialog.shielded.recovery.phrase.input.hint" - }, - { - "defaultMessage": "!!!Enter word #{wordNumber}", - "description": "Placeholder \"Enter word #\" for the recovery phrase input on the wallet restore dialog.", - "id": "wallet.restore.dialog.shielded.recovery.phrase.input.placeholder" - }, { "defaultMessage": "!!!Restore paper wallet", "description": "Label for the \"Restore paper wallet\" button on the wallet restore dialog.", @@ -4836,16 +4841,6 @@ "description": "Placeholder hint for the mnemonics autocomplete.", "id": "wallet.backup.recovery.phrase.entry.dialog.recoveryPhraseInputHint" }, - { - "defaultMessage": "!!!Enter word #{wordNumber}", - "description": "Placeholder for the mnemonics autocomplete.", - "id": "wallet.backup.recovery.phrase.entry.dialog.recoveryPhraseInputPlaceholder" - }, - { - "defaultMessage": "!!!No results", - "description": "\"No results\" message for the recovery phrase input search results.", - "id": "wallet.backup.recovery.phrase.entry.dialog.recoveryPhraseInputNoResults" - }, { "defaultMessage": "!!!Invalid recovery phrase", "description": "Error message shown when invalid recovery phrase was entered.", @@ -4919,6 +4914,21 @@ ], "path": "source/renderer/app/components/wallet/file-import/WalletFileImportDialog.tsx" }, + { + "descriptors": [ + { + "defaultMessage": "!!!No results", + "description": "\"Paper wallet create certificate verification dialog\" recovery phrase no results label.", + "id": "paper.wallet.create.certificate.verification.dialog.recoveryPhrase.noResults" + }, + { + "defaultMessage": "!!!{providedWordCount} of {requiredWordCount} words entered", + "description": "Mnemonic input word counter", + "id": "paper.wallet.create.certificate.verification.dialog.mnemonicCounter" + } + ], + "path": "source/renderer/app/components/wallet/mnemonic-input/MnemonicInput.tsx" + }, { "descriptors": [ { @@ -5216,16 +5226,6 @@ "description": "\"Paper wallet create certificate verification dialog\" recovery phrase label.", "id": "paper.wallet.create.certificate.verification.dialog.recoveryPhrase.label" }, - { - "defaultMessage": "!!!Enter recovery phrase", - "description": "\"Paper wallet create certificate verification dialog\" recovery phrase hint.", - "id": "paper.wallet.create.certificate.verification.dialog.recoveryPhrase.hint" - }, - { - "defaultMessage": "!!!No results", - "description": "\"Paper wallet create certificate verification dialog\" recovery phrase no results label.", - "id": "paper.wallet.create.certificate.verification.dialog.recoveryPhrase.noResults" - }, { "defaultMessage": "!!!Clear", "description": "\"Paper wallet create certificate verification dialog\" button clear label.", diff --git a/yarn2nix.nix b/yarn2nix.nix index 20bac58265..cd145d9eb3 100644 --- a/yarn2nix.nix +++ b/yarn2nix.nix @@ -1,4 +1,5 @@ { lib, yarn, nodejs, python3, python2, api, apiVersion, cluster, buildNum, nukeReferences, fetchzip, daedalus, stdenv, win64 ? false, wine64, runCommand, fetchurl, unzip, spacedName, iconPath, launcherConfig, pkgs, python27 +, windowsIcons , libcap , libgcrypt , libgpgerror @@ -146,8 +147,14 @@ yarn2nix.mkYarnPackage { cd deps/daedalus/ cp ${newPackagePath} package.json + + rm -r installers/icons/ + cp -r ${windowsIcons} installers/icons + chmod -R +w installers/icons + + # TODO: why are the following 2 lines needed? mkdir -p installers/icons/${cluster}/${cluster} - cp ${iconPath.base}/* installers/icons/${cluster}/${cluster}/ + cp ${windowsIcons}/${cluster}/* installers/icons/${cluster}/${cluster}/ export DEBUG=electron-packager yarn --verbose --offline package --win64 --dir $(pwd) --icon installers/icons/${cluster}/${cluster}