chore: refactor Linux and macOS build/packaging steps

Replaces PR #105.

Implement a `pkg-macos` target that ultimately results in `Status.dmg` being
written to `pkg/`. Due to [limitations][limits] of the OpenSSL `.dylib`s in
`/usr/lib/` on macOS, `libssl.a` and `libcrypto.a` are statically linked into
`bin/nim_status_client` from a [Homebrew][brew] "bottle" that is compatible
with macOS 10.13 (the oldest macOS version compatible with Qt v5.14).

`pkg-macos` creates an `.app` bundle layout in `tmp/macos/dist` based partly on
information in a very helpful [StackOverflow answer][so-answer]. Note the part
of the answer (toward the end) that explains a problem with the working
directory and how to fix it. That's the reason for the `nim_status_client.sh`
script introduced in this commit (it gets copied into the bundle). It's also
the reason for having `Info.plist` copied into the bundle before `macdeployqt`
is run (see below) and then overwriting it with `Info.runner.plist` before
creating the `.dmg` file. The app icons file `status-icon.icns` was taken from
`deployment/macos/` in the [status-react][sr] repo.

The [`macdeployqt`][macdeployqt] tool is used to copy the needed portions of Qt
into the bundle; it automatically updates `rpath`, etc. so the
`nim_status_client` executable in the bundle can locate the libs within the
bundle.

`macdeployqt` is run twice, for the "outer" and "inner" `.app` bundles,
because of an apparent bug in `macdeployqt` that results in QtWebEngine related
resources not being processed correctly on the first pass. This results in some
bloat in the final bundle but it seems unavoidable at present.

The [create-dmg][cdmg] tool is used to package the bundle into a `.dmg`
file. There are two reasons for this:
1. It produces a nice looking icon for the `.dmg` that overlays the Status logo
on an external disk icon.
2. `Info.plist` needs to be overwritten after running `macdeployqt` (see
explanation above) but before creating the `.dmg` file. If we passed the `-dmg`
cli option to `macdeployqt` to have it generate the `.dmg` file then it
wouldn't be possible to overwrite `Info.plist`.

So there is a cosmetic reason and a practical reason for using another
tool. Probably the biggest downside is that `create-dmg` is implemented in
Node.js so it needs to be installed with `npm`; that's the reason this commit
introduces `package.json`, etc. Note that zero code from `node_modules` ends up
in the `.app` bundle or the `.dmg` file.

Code signing of the macOS `.app` bundle and `.dmg` is attempted if the
environment variable `MACOS_CODESIGN_IDENT` is defined. In that case, the
environment variable `MACOS_KEYCHAIN_OPT` may optionally be defined with the
path to a preferred keychain database file.

Refactor a number of sections in the Makefile for consistency's sake, e.g. the
`appimage` target becomes `pkg-linux` and ultimately results in
`NimStatusClient-x86_64.AppImage` being written to `pkg/`.

Make a number of changes to bring the Linux packaging steps up-to-date and use
the `-qmlimport` cli option of `linuxdeployqt` to simplify resolution of Qt
plugins.

Note that `make pkg` will correctly resolve to `make pkg-linux` or `make
pkg-macos` depending on the OS in use.

Consistently use lower-case "c" in the name of *components* directories and
imports.

[limits]: https://developer.apple.com/forums/thread/124782
[brew]: https://brew.sh/
[so-answer]: https://stackoverflow.com/a/3251285
[sr]: https://github.com/status-im/status-react/tree/develop/deployment/macos
[macdeployqt]: https://doc.qt.io/qt-5/macos-deployment.html
[cdmg]: https://github.com/sindresorhus/create-dmg
This commit is contained in:
Michael Bradley, Jr 2020-06-04 15:56:44 -05:00 committed by Michael Bradley
parent 92862ef7ae
commit ce7e6b8d51
33 changed files with 1584 additions and 215 deletions

10
.gitignore vendored
View File

@ -6,8 +6,18 @@ noBackup/
*.qml.autosave *.qml.autosave
.vscode .vscode
bin/ bin/
/bottles/
pkg/
vendor/.nimble vendor/.nimble
*.AppImage *.AppImage
tmp tmp
nimcache nimcache
.DS_Store .DS_Store
nim-status-client*.tgz
node_modules
npm-debug.log*
npm-shrinkwrap.json
/package/
yarn-debug.log*
yarn-error.log*
yarn.lock

2
.npmrc Normal file
View File

@ -0,0 +1,2 @@
engine-strict = true
save-exact = true

1
.yarnrc Normal file
View File

@ -0,0 +1 @@
--install.no-lockfile true

2
AppRun
View File

@ -1,5 +1,5 @@
#!/bin/bash #!/bin/bash
APPDIR="$(dirname "$(readlink -f "${0}")")" APPDIR="$(dirname "$(readlink -f "${0}")")"
export LD_LIBRARY_PATH=${APPDIR}/usr/lib/:$LD_LIBRARY_PATH export LD_LIBRARY_PATH="${APPDIR}/usr/lib/:${LD_LIBRARY_PATH}"
exec "${APPDIR}/usr/bin/nim_status_client" "$@" exec "${APPDIR}/usr/bin/nim_status_client" "$@"

26
Info.plist Normal file
View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDisplayName</key>
<string>Status Desktop</string>
<key>CFBundleExecutable</key>
<string>nim_status_client</string>
<key>CFBundleIconFile</key>
<string>status-icon.icns</string>
<key>CFBundleIdentifier</key>
<string>im.Status.NimStatusClient</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>Status</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>IFMajorVersion</key>
<integer>1</integer>
<key>IFMinorVersion</key>
<integer>0</integer>
</dict>
</plist>

26
Info.runner.plist Normal file
View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDisplayName</key>
<string>Status Desktop</string>
<key>CFBundleExecutable</key>
<string>nim_status_client.sh</string>
<key>CFBundleIconFile</key>
<string>status-icon.icns</string>
<key>CFBundleIdentifier</key>
<string>im.Status.NimStatusClient</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>Status</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>IFMajorVersion</key>
<integer>1</integer>
<key>IFMinorVersion</key>
<integer>0</integer>
</dict>
</plist>

232
Makefile
View File

@ -15,10 +15,15 @@ BUILD_SYSTEM_DIR := vendor/nimbus-build-system
.PHONY: \ .PHONY: \
all \ all \
appimage \ bottles \
bottles-dummy \
bottles-macos \
clean \ clean \
deps \ deps \
nim_status_client \ nim_status_client \
pkg \
pkg-linux \
pkg-macos \
run \ run \
update update
@ -48,11 +53,52 @@ else
detected_OS := $(strip $(shell uname)) detected_OS := $(strip $(shell uname))
endif endif
ifeq ($(detected_OS), Darwin)
BOTTLES_TARGET := bottles-macos
PKG_TARGET := pkg-macos
MACOSX_DEPLOYMENT_TARGET := 10.13
export MACOSX_DEPLOYMENT_TARGET
CGO_CFLAGS := -mmacosx-version-min=10.13
export CGO_CFLAGS
CFLAGS := -mmacosx-version-min=10.13
export CFLAGS
else
BOTTLES_TARGET := bottles-dummy
PKG_TARGET := pkg-linux
endif
bottles: $(BOTTLES_TARGET)
bottles-dummy: ;
BOTTLE_OPENSSL := bottles/openssl/INSTALL_RECEIPT.json
$(BOTTLE_OPENSSL):
rm -rf bottles/Downloads/openssl* bottles/openssl*
mkdir -p bottles/Downloads
cd bottles/Downloads && \
wget -O openssl.tar.gz "https://bintray.com/homebrew/bottles/download_file?file_path=openssl%401.1-1.1.1g.high_sierra.bottle.tar.gz" && \
tar xzf openssl* && \
mv openssl@1.1/1.1.1g ../openssl
BOTTLE_PCRE := bottles/pcre/INSTALL_RECEIPT.json
$(BOTTLE_PCRE):
rm -rf bottles/Downloads/pcre* bottles/pcre*
mkdir -p bottles/Downloads
cd bottles/Downloads && \
wget -O pcre.tar.gz "https://bintray.com/homebrew/bottles/download_file?file_path=pcre-8.44.high_sierra.bottle.tar.gz" && \
tar xzf pcre* && \
mv pcre/8.44 ../pcre
bottles-macos: | $(BOTTLE_OPENSSL) $(BOTTLE_PCRE)
rm -rf bottles/Downloads
ifeq ($(detected_OS), Darwin) ifeq ($(detected_OS), Darwin)
NIM_PARAMS := $(NIM_PARAMS) -L:"-framework Foundation -framework Security -framework IOKit -framework CoreServices" NIM_PARAMS := $(NIM_PARAMS) -L:"-framework Foundation -framework Security -framework IOKit -framework CoreServices"
endif endif
DOTHERSIDE := vendor/DOtherSide/lib/libDOtherSideStatic.a DOTHERSIDE := vendor/DOtherSide/build/lib/libDOtherSideStatic.a
# Qt5 dirs (we can't indent with tabs here) # Qt5 dirs (we can't indent with tabs here)
QT5_PCFILEDIR := $(shell pkg-config --variable=pcfiledir Qt5Core 2>/dev/null) QT5_PCFILEDIR := $(shell pkg-config --variable=pcfiledir Qt5Core 2>/dev/null)
@ -75,7 +121,7 @@ ifeq ($(QT5_PCFILEDIR),)
endif endif
export QT5_LIBDIR export QT5_LIBDIR
# order matters here, due to "-Wl,-as-needed" # order matters here, due to "-Wl,-as-needed"
NIM_PARAMS += --passL:"$(DOTHERSIDE) $(shell PKG_CONFIG_PATH="$(QT5_PCFILEDIR)" pkg-config --libs Qt5Core Qt5Qml Qt5Gui Qt5Quick Qt5QuickControls2 Qt5Widgets)" NIM_PARAMS += --passL:"$(DOTHERSIDE) $(shell PKG_CONFIG_PATH="$(QT5_PCFILEDIR)" pkg-config --libs Qt5Core Qt5Qml Qt5Gui Qt5Quick Qt5QuickControls2 Qt5Widgets Qt5Svg)"
# TODO: control debug/release builds with a Make var # TODO: control debug/release builds with a Make var
# We need `-d:debug` to get Nim's default stack traces. # We need `-d:debug` to get Nim's default stack traces.
@ -84,21 +130,17 @@ NIM_PARAMS += --outdir:./bin -d:debug
CFLAGS += -g CFLAGS += -g
CXXFLAGS += -g CXXFLAGS += -g
deps: | deps-common deps: | deps-common bottles
update: | update-common update: | update-common
APPIMAGETOOL := appimagetool-x86_64.AppImage
$(APPIMAGETOOL):
wget https://github.com/AppImage/AppImageKit/releases/download/continuous/$(APPIMAGETOOL)
chmod +x $(APPIMAGETOOL)
$(DOTHERSIDE): | deps $(DOTHERSIDE): | deps
echo -e $(BUILD_MSG) "DOtherSide" echo -e $(BUILD_MSG) "DOtherSide"
+ cd vendor/DOtherSide && \ + cd vendor/DOtherSide && \
mkdir -p build && \
cd build && \
rm -f CMakeCache.txt && \ rm -f CMakeCache.txt && \
cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_DOCS=OFF -DENABLE_TESTS=OFF -DENABLE_DYNAMIC_LIBS=OFF -DENABLE_STATIC_LIBS=ON . $(HANDLE_OUTPUT) && \ cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_DOCS=OFF -DENABLE_TESTS=OFF -DENABLE_DYNAMIC_LIBS=OFF -DENABLE_STATIC_LIBS=ON .. $(HANDLE_OUTPUT) && \
$(MAKE) VERBOSE=$(V) $(HANDLE_OUTPUT) $(MAKE) VERBOSE=$(V) $(HANDLE_OUTPUT)
STATUSGO := vendor/status-go/build/bin/libstatus.a STATUSGO := vendor/status-go/build/bin/libstatus.a
@ -112,47 +154,135 @@ nim_status_client: | $(DOTHERSIDE) $(STATUSGO) deps
echo -e $(BUILD_MSG) "$@" && \ echo -e $(BUILD_MSG) "$@" && \
$(ENV_SCRIPT) nim c $(NIM_PARAMS) --passL:"$(STATUSGO)" --passL:"-lm" src/nim_status_client.nim $(ENV_SCRIPT) nim c $(NIM_PARAMS) --passL:"$(STATUSGO)" --passL:"-lm" src/nim_status_client.nim
_APPIMAGE_TOOL := appimagetool-x86_64.AppImage
APPIMAGE_TOOL := tmp/linux/tools/$(_APPIMAGE_TOOL)
$(APPIMAGE_TOOL):
rm -rf tmp/linux
mkdir -p tmp/linux/tools
wget https://github.com/AppImage/AppImageKit/releases/download/continuous/$(_APPIMAGE_TOOL)
mv $(_APPIMAGE_TOOL) tmp/linux/tools/
chmod +x $(APPIMAGE_TOOL)
APPIMAGE := pkg/NimStatusClient-x86_64.AppImage
$(APPIMAGE): nim_status_client $(APPIMAGE_TOOL) nim-status.desktop
rm -rf pkg/*.AppImage
mkdir -p tmp/linux/dist/usr/bin
mkdir -p tmp/linux/dist/usr/lib
mkdir -p tmp/linux/dist/usr/qml
# General Files
cp bin/nim_status_client tmp/linux/dist/usr/bin
cp nim-status.desktop tmp/linux/dist/.
cp status.svg tmp/linux/dist/status.svg
cp -R ui tmp/linux/dist/usr/.
echo -e $(BUILD_MSG) "AppImage"
linuxdeployqt tmp/linux/dist/nim-status.desktop -no-translations -no-copy-copyright-files -qmldir=tmp/linux/dist/usr/ui -qmlimport=${QTDIR}/gcc_64/qml -bundle-non-qt-libs
rm tmp/linux/dist/AppRun
cp AppRun tmp/linux/dist/.
mkdir -p pkg
$(APPIMAGE_TOOL) tmp/linux/dist $(APPIMAGE)
DMG_TOOL := node_modules/.bin/create-dmg
$(DMG_TOOL):
npm i
MACOS_OUTER_BUNDLE := tmp/macos/dist/Status.app
MACOS_INNER_BUNDLE := $(MACOS_OUTER_BUNDLE)/Contents/Frameworks/QtWebEngineCore.framework/Versions/Current/Helpers/QtWebEngineProcess.app
DMG := pkg/Status.dmg
# it's not required to set MACOS_KEYCHAIN if MACOS_CODESIGN_IDENT can be found
# in e.g. your login keychain; this environment variable is primarily useful
# for CI; when specified MACOS_KEYCHAIN should be the path to a preferred
# keychain database file
ifneq ($(MACOS_KEYCHAIN),)
MACOS_KEYCHAIN_OPT := --keychain "$(MACOS_KEYCHAIN)"
endif
$(DMG): nim_status_client $(DMG_TOOL)
rm -rf tmp/macos pkg/*.dmg
mkdir -p $(MACOS_OUTER_BUNDLE)/Contents/MacOS
mkdir -p $(MACOS_OUTER_BUNDLE)/Contents/Resources
cp Info.plist $(MACOS_OUTER_BUNDLE)/Contents/
cp bin/nim_status_client $(MACOS_OUTER_BUNDLE)/Contents/MacOS/
cp nim_status_client.sh $(MACOS_OUTER_BUNDLE)/Contents/MacOS/
chmod +x $(MACOS_OUTER_BUNDLE)/Contents/MacOS/nim_status_client.sh
cp status-icon.icns $(MACOS_OUTER_BUNDLE)/Contents/Resources/
cp -R ui $(MACOS_OUTER_BUNDLE)/Contents/
macdeployqt \
$(MACOS_OUTER_BUNDLE) \
-executable=$(MACOS_OUTER_BUNDLE)/Contents/MacOS/nim_status_client \
-qmldir=ui
cp Info.runner.plist $(MACOS_OUTER_BUNDLE)/Contents/Info.plist
macdeployqt \
$(MACOS_INNER_BUNDLE) \
-executable=$(MACOS_INNER_BUNDLE)/Contents/MacOS/QtWebEngineProcess
# if MACOS_CODESIGN_IDENT is not set then the outer and inner .app
# bundles are not signed
[ -z "$(MACOS_CODESIGN_IDENT)" ] || \
codesign \
--sign "$(MACOS_CODESIGN_IDENT)" \
$(MACOS_KEYCHAIN_OPT) \
--options runtime \
--deep \
--force \
--verbose=4 \
$(MACOS_OUTER_BUNDLE)
[ -z "$(MACOS_CODESIGN_IDENT)" ] || \
codesign \
--sign "$(MACOS_CODESIGN_IDENT)" \
$(MACOS_KEYCHAIN_OPT) \
--entitlements QtWebEngineProcess.plist \
--options runtime \
--deep \
--force \
--verbose=4 \
$(MACOS_INNER_BUNDLE)
mkdir -p pkg
# See: https://github.com/sindresorhus/create-dmg#dmg-icon
# GraphicsMagick must be installed for create-dmg to make the custom
# DMG icon based on app icon, but should otherwise work without it
npx create-dmg \
--identity="NOBODY" \
$(MACOS_OUTER_BUNDLE) \
pkg || true
# `|| true` is used above because code signing will be done manually
# below (to allow for MACOS_KEYCHAIN_OPT) but create-dmg doesn't have
# an option to not attempt signing. To work around that limitation an
# unlikely identity (NOBODY) is specified; this results in a non-zero
# exit code even though the .dmg is created successfully (just not code
# signed); if the above command failed to create a .dmg then the
# following command should result in a non-zero exit code
mv "`ls pkg/*.dmg`" pkg/Status.dmg
# if MACOS_CODESIGN_IDENT is not set then the .dmg is not signed
[ -z "$(MACOS_CODESIGN_IDENT)" ] || \
codesign \
--sign "$(MACOS_CODESIGN_IDENT)" \
$(MACOS_KEYCHAIN_OPT) \
--verbose=4 \
pkg/Status.dmg
pkg: $(PKG_TARGET)
pkg-linux: $(APPIMAGE)
pkg-macos: $(DMG)
clean: | clean-common
rm -rf bin/* node_modules pkg/* tmp/* $(STATUSGO)
+ $(MAKE) -C vendor/DOtherSide/build --no-print-directory clean
run: run:
LD_LIBRARY_PATH="$(QT5_LIBDIR)" ./bin/nim_status_client LD_LIBRARY_PATH="$(QT5_LIBDIR)" ./bin/nim_status_client
APPIMAGE := NimStatusClient-x86_64.AppImage
$(APPIMAGE): $(DEFAULT_TARGET) $(APPIMAGETOOL) nim-status.desktop
rm -rf tmp/dist
mkdir -p tmp/dist/usr/bin
mkdir -p tmp/dist/usr/lib
mkdir -p tmp/dist/usr/qml
# General Files
cp bin/nim_status_client tmp/dist/usr/bin
cp nim-status.desktop tmp/dist/.
cp status.svg tmp/dist/status.svg
cp -R ui tmp/dist/usr/.
# Libraries
cp vendor/DOtherSide/build/lib/libDOtherSide* tmp/dist/usr/lib/.
# QML Plugins due to bug with linuxdeployqt finding qmlimportscanner
# This list is obtained with qmlimportscanner -rootPath ui/ -importPath /opt/qt/5.12.6/gcc_64/qml/
mkdir -p tmp/dist/usr/qml/Qt/labs/
mkdir -p tmp/dist/usr/qml/QtQuick
cp -R /opt/qt/5.12.6/gcc_64/qml/Qt/labs/platform tmp/dist/usr/qml/Qt/labs/.
cp -R /opt/qt/5.12.6/gcc_64/qml/QtQuick.2 tmp/dist/usr/qml/.
cp -R /opt/qt/5.12.6/gcc_64/qml/QtGraphicalEffects tmp/dist/usr/qml/.
cp -R /opt/qt/5.12.6/gcc_64/qml/QtQuick/{Controls,Controls.2,Extras,Layouts,Templates.2,Window.2} tmp/dist/usr/qml/QtQuick/.
echo -e $(BUILD_MSG) "AppImage"
linuxdeployqt tmp/dist/nim-status.desktop -no-translations -no-copy-copyright-files -qmldir=tmp/dist/usr/ui -bundle-non-qt-libs
rm tmp/dist/AppRun
cp AppRun tmp/dist/.
./$(APPIMAGETOOL) tmp/dist
appimage: $(APPIMAGE)
clean: | clean-common
rm -rf $(APPIMAGE) bin/* tmp/dist $(STATUSGO)
+ $(MAKE) -C vendor/DOtherSide --no-print-directory clean
endif # "variables.mk" was not included endif # "variables.mk" was not included

8
QtWebEngineProcess.plist Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.disable-executable-page-protection</key>
<true/>
</dict>
</plist>

View File

@ -1,8 +1,11 @@
#!/bin/bash #!/bin/bash
# This script assumes $PWD is the same dir in which this script is located
docker run -it --rm --device /dev/fuse \ docker run -it --rm --device /dev/fuse \
-v $PWD:/nim-status-client:Z \ -v "${PWD}:/nim-status-client:Z" \
-w /nim-status-client \ -w /nim-status-client \
--cap-add SYS_ADMIN \ --cap-add SYS_ADMIN \
--privileged \ --privileged \
a12e/docker-qt:5.12-gcc_64 \ a12e/docker-qt:5.14-gcc_64 \
sh docker-linux-app-image.sh ./docker-linux-app-image.sh

View File

@ -6,28 +6,6 @@ if defined(release):
else: else:
switch("nimcache", "nimcache/debug/$projectName") switch("nimcache", "nimcache/debug/$projectName")
proc linkLib(name: string): string =
var resLib = name
when defined(macosx):
# In macOS Catalina, unversioned libraries may be broken stubs, so we need to
# find a versioned one: https://github.com/status-im/nim-status-client/pull/209
var matches: seq[string]
for path in listFiles("/usr/lib"):
# /usr/lib/libcrypto.0.9.8.dylib
let file = path[9..^1]
# libcrypto.0.9.8.dylib
if file.startsWith("lib" & name) and file != "lib" & name & ".dylib":
matches.add(path)
matches.sort(order = SortOrder.Descending)
if matches.len > 0:
resLib = matches[0]
# Passing "/usr/lib/libcrypto.44.dylib" directly to the linker works for
# dynamic linking.
return resLib
return "-l" & resLib
--threads:on --threads:on
--opt:speed # -O3 --opt:speed # -O3
--debugger:native # passes "-g" to the C compiler --debugger:native # passes "-g" to the C compiler
@ -36,16 +14,22 @@ proc linkLib(name: string): string =
if defined(macosx): if defined(macosx):
--tlsEmulation:off --tlsEmulation:off
switch("passL", "-lstdc++")
# DYLD_LIBRARY_PATH doesn't seem to work with Qt5 # DYLD_LIBRARY_PATH doesn't seem to work with Qt5
switch("passL", "-rpath" & " " & getEnv("QT5_LIBDIR")) switch("passL", "-rpath" & " " & getEnv("QT5_LIBDIR"))
switch("passL", "-lstdc++") # statically linke these libs
# dynamically link these libs, since we're opting out of dlopen() switch("passL", "bottles/openssl/lib/libcrypto.a")
switch("passL", linkLib("crypto")) switch("passL", "bottles/openssl/lib/libssl.a")
switch("passL", linkLib("ssl")) switch("passL", "bottles/pcre/lib/libpcre.a")
# https://code.videolan.org/videolan/VLCKit/-/issues/232 # https://code.videolan.org/videolan/VLCKit/-/issues/232
switch("passL", "-Wl,-no_compact_unwind") switch("passL", "-Wl,-no_compact_unwind")
# set the minimum supported macOS version to 10.13
switch("passC", "-mmacosx-version-min=10.13")
else: else:
switch("passL", linkLib("crypto") & " " & linkLib("ssl")) # dynamically link these libs, since we're opting out of dlopen() # dynamically link these libs, since we're opting out of dlopen()
switch("passL", "-Wl,-as-needed") # don't link libraries we're not actually using switch("passL", "-lcrypto")
switch("passL", "-lssl")
# don't link libraries we're not actually using
switch("passL", "-Wl,-as-needed")
--define:chronicles_line_numbers # useful when debugging --define:chronicles_line_numbers # useful when debugging

View File

@ -1,27 +1,27 @@
#!/bin/sh #!/bin/bash
# Installing prerequisites
# Probably should be part of a dockerfile # Probably should be part of a dockerfile
sudo apt update sudo apt update
sudo apt install -y software-properties-common sudo apt install -y software-properties-common
sudo add-apt-repository -y ppa:git-core/ppa sudo add-apt-repository -y ppa:git-core/ppa
sudo apt update sudo apt update
sudo apt install -y --fix-missing cmake build-essential git libpcre3-dev libssl-dev git sudo apt install -y --fix-missing build-essential cmake git libpcre3-dev
rm -Rf tmp
make clean
# Installing GO # Installing GO
# Probably should be part of a dockerfile # Probably should be part of a dockerfile
wget https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz wget https://dl.google.com/go/go1.14.4.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.14.2.linux-amd64.tar.gz sudo tar -C /usr/local -xzf go1.14.4.linux-amd64.tar.gz
rm ./go1.14.2.linux-amd64.tar.gz rm ./go1.14.4.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin export PATH="/usr/local/go/bin:${PATH}"
# the minor Qt version keeps getting updated inside the Docker image # $QT_PATH and $QT_PLATFORM are provided by the docker image
cd /nim-status-client/ # $QT_PATH/$QT_VERSION/$QT_PLATFORM/bin is already prepended to $PATH
export PKG_CONFIG_PATH="$(echo /opt/qt/*/gcc_64/lib/pkgconfig)" # However $QT_VERSION is not exposed to environment so set it here
export LD_LIBRARY_PATH="$(echo /opt/qt/*/gcc_64/lib/)" export QT_VERSION=$(basename $(echo "${QT_PATH}/*"))
export QTDIR="${QT_PATH}/${QT_VERSION}"
make appimage # $OPENSSL_PREFIX is provided by the docker image
export LIBRARY_PATH="${OPENSSL_PREFIX}/lib:${LIBRARY_PATH}"
rm -Rf tmp export LD_LIBRARY_PATH="${QTDIR}/${QT_PLATFORM}/lib:${LD_LIBRARY_PATH}"
make clean; git clean -dfx && rm -rf vendor/*
make pkg V=1

4
nim_status_client.sh Normal file
View File

@ -0,0 +1,4 @@
#!/bin/bash
cd "${0%/*}"
./nim_status_client

1163
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

12
package.json Normal file
View File

@ -0,0 +1,12 @@
{
"name": "nim-status-client",
"version": "0.0.0",
"private": true,
"files": [],
"devDependencies": {
"create-dmg": "5.3.0"
},
"engines": {
"node": ">=8"
}
}

BIN
status-icon.icns Normal file

Binary file not shown.

View File

@ -1,5 +1,5 @@
import QtQuick 2.13 import QtQuick 2.13
import "./Components" import "./components"
import "../../../imports" import "../../../imports"
import "../../../shared" import "../../../shared"

View File

@ -4,7 +4,7 @@ import QtQuick.Layouts 1.13
import QtGraphicalEffects 1.13 import QtGraphicalEffects 1.13
import "../../../imports" import "../../../imports"
import "../../../shared" import "../../../shared"
import "./Components" import "./components"
Item { Item {
property int selectedAccount: 0 property int selectedAccount: 0

View File

@ -4,7 +4,7 @@ import QtQuick.Controls 2.13
//import Qt.labs.platform 1.1 //import Qt.labs.platform 1.1
import "../../../imports" import "../../../imports"
import "../../../shared" import "../../../shared"
import "./Components" import "./components"
Item { Item {
function open() { function open() {

View File

@ -4,7 +4,7 @@ import QtQuick.Controls 2.13
//import Qt.labs.platform 1.1 //import Qt.labs.platform 1.1
import "../../../imports" import "../../../imports"
import "../../../shared" import "../../../shared"
import "./Components" import "./components"
Item { Item {
function open() { function open() {

View File

@ -2,7 +2,7 @@ import QtQuick 2.13
import QtQuick.Controls 2.13 import QtQuick.Controls 2.13
import "../../../imports" import "../../../imports"
import "../../../shared" import "../../../shared"
import "./Components" import "./components"
ModalPopup { ModalPopup {
id: popup id: popup

View File

@ -24,7 +24,7 @@ Item {
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: 16 anchors.rightMargin: 16
anchors.topMargin: 16 anchors.topMargin: 16
source: "../../img/close.svg" source: "../../../../shared/img/close.svg"
MouseArea { MouseArea {
id: closeModalMouseArea id: closeModalMouseArea
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor

View File

@ -27,7 +27,7 @@ SOURCES = *.qml \
app/AppLayouts/Profile/Sections/*.qml \ app/AppLayouts/Profile/Sections/*.qml \
app/AppLayouts/Profile/Sections/Contacts/*.qml \ app/AppLayouts/Profile/Sections/Contacts/*.qml \
app/AppLayouts/Wallet/*.qml \ app/AppLayouts/Wallet/*.qml \
app/AppLayouts/Wallet/Components/*.qml \ app/AppLayouts/Wallet/components/*.qml \
app/AppLayouts/Wallet/data/*.qml \ app/AppLayouts/Wallet/data/*.qml \
} }
@ -108,17 +108,17 @@ DISTFILES += \
app/AppLayouts/Wallet/AddCustomTokenModal.qml \ app/AppLayouts/Wallet/AddCustomTokenModal.qml \
app/AppLayouts/Wallet/AssetsTab.qml \ app/AppLayouts/Wallet/AssetsTab.qml \
app/AppLayouts/Wallet/CollectiblesTab.qml \ app/AppLayouts/Wallet/CollectiblesTab.qml \
app/AppLayouts/Wallet/Components/AccountSettingsModal.qml \ app/AppLayouts/Wallet/components/AccountSettingsModal.qml \
app/AppLayouts/Wallet/Components/AddAccount.qml \ app/AppLayouts/Wallet/components/AddAccount.qml \
app/AppLayouts/Wallet/Components/AddAccountWithPrivateKey.qml \ app/AppLayouts/Wallet/components/AddAccountWithPrivateKey.qml \
app/AppLayouts/Wallet/Components/AddAccountWithSeed.qml \ app/AppLayouts/Wallet/components/AddAccountWithSeed.qml \
app/AppLayouts/Wallet/Components/AddWatchOnlyAccount \ app/AppLayouts/Wallet/components/AddWatchOnlyAccount \
app/AppLayouts/Wallet/Components/AddWatchOnlyAccount.qml \ app/AppLayouts/Wallet/components/AddWatchOnlyAccount.qml \
app/AppLayouts/Wallet/Components/GenerateAccountModal.qml \ app/AppLayouts/Wallet/components/GenerateAccountModal.qml \
app/AppLayouts/Wallet/Components/SendModalContent.qml \ app/AppLayouts/Wallet/components/SendModalContent.qml \
app/AppLayouts/Wallet/Components/SetCurrencyModalContent.qml \ app/AppLayouts/Wallet/components/SetCurrencyModalContent.qml \
app/AppLayouts/Wallet/Components/TokenSettingsModalContent.qml \ app/AppLayouts/Wallet/components/TokenSettingsModalContent.qml \
app/AppLayouts/Wallet/Components/qmldir \ app/AppLayouts/Wallet/components/qmldir \
app/AppLayouts/Wallet/HistoryTab.qml \ app/AppLayouts/Wallet/HistoryTab.qml \
app/AppLayouts/Profile/Sections/AboutContainer.qml \ app/AppLayouts/Profile/Sections/AboutContainer.qml \
app/AppLayouts/Profile/Sections/AdvancedContainer.qml \ app/AppLayouts/Profile/Sections/AdvancedContainer.qml \
@ -149,7 +149,6 @@ DISTFILES += \
app/img/arrow-btn-inactive.svg \ app/img/arrow-btn-inactive.svg \
app/img/compass.svg \ app/img/compass.svg \
app/img/compassActive.svg \ app/img/compassActive.svg \
app/img/close.svg \
app/img/group_chat.svg \ app/img/group_chat.svg \
app/img/hash.svg \ app/img/hash.svg \
app/img/message.svg \ app/img/message.svg \
@ -211,5 +210,6 @@ DISTFILES += \
shared/StyledTextEdit.qml \ shared/StyledTextEdit.qml \
shared/StyledTextField.qml \ shared/StyledTextField.qml \
shared/TextWithLabel.qml \ shared/TextWithLabel.qml \
shared/img/close.svg \
shared/img/status-logo.png \
shared/qmldir shared/qmldir

View File

@ -115,22 +115,22 @@
<context> <context>
<name>AddAccount</name> <name>AddAccount</name>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccount.qml" line="94"/> <location filename="app/AppLayouts/Wallet/components/AddAccount.qml" line="94"/>
<source>Generate an account</source> <source>Generate an account</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccount.qml" line="101"/> <location filename="app/AppLayouts/Wallet/components/AddAccount.qml" line="101"/>
<source>Add a watch-only address</source> <source>Add a watch-only address</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccount.qml" line="108"/> <location filename="app/AppLayouts/Wallet/components/AddAccount.qml" line="108"/>
<source>Enter a seed phrase</source> <source>Enter a seed phrase</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccount.qml" line="115"/> <location filename="app/AppLayouts/Wallet/components/AddAccount.qml" line="115"/>
<source>Enter a private key</source> <source>Enter a private key</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -138,47 +138,47 @@
<context> <context>
<name>AddAccountWithPrivateKey</name> <name>AddAccountWithPrivateKey</name>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithPrivateKey.qml" line="7"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithPrivateKey.qml" line="7"/>
<source>Add account from private key</source> <source>Add account from private key</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithPrivateKey.qml" line="20"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithPrivateKey.qml" line="20"/>
<source>Enter your password</source> <source>Enter your password</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithPrivateKey.qml" line="21"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithPrivateKey.qml" line="21"/>
<source>Password</source> <source>Password</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithPrivateKey.qml" line="30"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithPrivateKey.qml" line="30"/>
<source>Paste the contents of your private key</source> <source>Paste the contents of your private key</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithPrivateKey.qml" line="31"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithPrivateKey.qml" line="31"/>
<source>Private key</source> <source>Private key</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithPrivateKey.qml" line="39"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithPrivateKey.qml" line="39"/>
<source>Enter an account name...</source> <source>Enter an account name...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithPrivateKey.qml" line="40"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithPrivateKey.qml" line="40"/>
<source>Account name</source> <source>Account name</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithPrivateKey.qml" line="48"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithPrivateKey.qml" line="48"/>
<source>Account color</source> <source>Account color</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithPrivateKey.qml" line="66"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithPrivateKey.qml" line="66"/>
<source>Add account &gt;</source> <source>Add account &gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -186,42 +186,42 @@
<context> <context>
<name>AddAccountWithSeed</name> <name>AddAccountWithSeed</name>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithSeed.qml" line="17"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithSeed.qml" line="17"/>
<source>Add account with a seed phrase</source> <source>Add account with a seed phrase</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithSeed.qml" line="21"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithSeed.qml" line="21"/>
<source>Enter your password</source> <source>Enter your password</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithSeed.qml" line="22"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithSeed.qml" line="22"/>
<source>Password</source> <source>Password</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithSeed.qml" line="31"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithSeed.qml" line="31"/>
<source>Enter your seed phrase, separate words with commas or spaces...</source> <source>Enter your seed phrase, separate words with commas or spaces...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithSeed.qml" line="32"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithSeed.qml" line="32"/>
<source>Seed phrase</source> <source>Seed phrase</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithSeed.qml" line="40"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithSeed.qml" line="40"/>
<source>Enter an account name...</source> <source>Enter an account name...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithSeed.qml" line="41"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithSeed.qml" line="41"/>
<source>Account name</source> <source>Account name</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithSeed.qml" line="49"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithSeed.qml" line="49"/>
<source>Account color</source> <source>Account color</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -277,32 +277,32 @@
<context> <context>
<name>AddWatchOnlyAccount</name> <name>AddWatchOnlyAccount</name>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddWatchOnlyAccount.qml" line="7"/> <location filename="app/AppLayouts/Wallet/components/AddWatchOnlyAccount.qml" line="7"/>
<source>Add a watch-only account</source> <source>Add a watch-only account</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddWatchOnlyAccount.qml" line="20"/> <location filename="app/AppLayouts/Wallet/components/AddWatchOnlyAccount.qml" line="20"/>
<source>Enter address...</source> <source>Enter address...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddWatchOnlyAccount.qml" line="21"/> <location filename="app/AppLayouts/Wallet/components/AddWatchOnlyAccount.qml" line="21"/>
<source>Account address</source> <source>Account address</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddWatchOnlyAccount.qml" line="28"/> <location filename="app/AppLayouts/Wallet/components/AddWatchOnlyAccount.qml" line="28"/>
<source>Enter an account name...</source> <source>Enter an account name...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddWatchOnlyAccount.qml" line="29"/> <location filename="app/AppLayouts/Wallet/components/AddWatchOnlyAccount.qml" line="29"/>
<source>Account name</source> <source>Account name</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddWatchOnlyAccount.qml" line="37"/> <location filename="app/AppLayouts/Wallet/components/AddWatchOnlyAccount.qml" line="37"/>
<source>Account color</source> <source>Account color</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -396,32 +396,32 @@
<context> <context>
<name>GenerateAccountModal</name> <name>GenerateAccountModal</name>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/GenerateAccountModal.qml" line="7"/> <location filename="app/AppLayouts/Wallet/components/GenerateAccountModal.qml" line="7"/>
<source>Generate an account</source> <source>Generate an account</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/GenerateAccountModal.qml" line="19"/> <location filename="app/AppLayouts/Wallet/components/GenerateAccountModal.qml" line="19"/>
<source>Enter your password</source> <source>Enter your password</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/GenerateAccountModal.qml" line="20"/> <location filename="app/AppLayouts/Wallet/components/GenerateAccountModal.qml" line="20"/>
<source>Password</source> <source>Password</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/GenerateAccountModal.qml" line="28"/> <location filename="app/AppLayouts/Wallet/components/GenerateAccountModal.qml" line="28"/>
<source>Enter an account name...</source> <source>Enter an account name...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/GenerateAccountModal.qml" line="29"/> <location filename="app/AppLayouts/Wallet/components/GenerateAccountModal.qml" line="29"/>
<source>Account name</source> <source>Account name</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/GenerateAccountModal.qml" line="37"/> <location filename="app/AppLayouts/Wallet/components/GenerateAccountModal.qml" line="37"/>
<source>Account color</source> <source>Account color</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -694,17 +694,17 @@
<context> <context>
<name>SendModalContent</name> <name>SendModalContent</name>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/SendModalContent.qml" line="59"/> <location filename="app/AppLayouts/Wallet/components/SendModalContent.qml" line="59"/>
<source>Enter ETH</source> <source>Enter ETH</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/SendModalContent.qml" line="66"/> <location filename="app/AppLayouts/Wallet/components/SendModalContent.qml" line="66"/>
<source>Send from (account)</source> <source>Send from (account)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/SendModalContent.qml" line="79"/> <location filename="app/AppLayouts/Wallet/components/SendModalContent.qml" line="79"/>
<source>Send to</source> <source>Send to</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -790,57 +790,57 @@
<context> <context>
<name>TransactionModal</name> <name>TransactionModal</name>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/TransactionModal.qml" line="8"/> <location filename="app/AppLayouts/Wallet/components/TransactionModal.qml" line="8"/>
<source>Transaction Details</source> <source>Transaction Details</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/TransactionModal.qml" line="22"/> <location filename="app/AppLayouts/Wallet/components/TransactionModal.qml" line="22"/>
<source>9999 Confirmations</source> <source>9999 Confirmations</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/TransactionModal.qml" line="28"/> <location filename="app/AppLayouts/Wallet/components/TransactionModal.qml" line="28"/>
<source>When the transaction has 12 confirmations you can consider it settled.</source> <source>When the transaction has 12 confirmations you can consider it settled.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/TransactionModal.qml" line="57"/> <location filename="app/AppLayouts/Wallet/components/TransactionModal.qml" line="57"/>
<source>Block</source> <source>Block</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/TransactionModal.qml" line="82"/> <location filename="app/AppLayouts/Wallet/components/TransactionModal.qml" line="82"/>
<source>Hash</source> <source>Hash</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/TransactionModal.qml" line="109"/> <location filename="app/AppLayouts/Wallet/components/TransactionModal.qml" line="109"/>
<source>From</source> <source>From</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/TransactionModal.qml" line="136"/> <location filename="app/AppLayouts/Wallet/components/TransactionModal.qml" line="136"/>
<source>To</source> <source>To</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/TransactionModal.qml" line="163"/> <location filename="app/AppLayouts/Wallet/components/TransactionModal.qml" line="163"/>
<source>Gas limit</source> <source>Gas limit</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/TransactionModal.qml" line="188"/> <location filename="app/AppLayouts/Wallet/components/TransactionModal.qml" line="188"/>
<source>Gas price</source> <source>Gas price</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/TransactionModal.qml" line="213"/> <location filename="app/AppLayouts/Wallet/components/TransactionModal.qml" line="213"/>
<source>Gas used</source> <source>Gas used</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/TransactionModal.qml" line="238"/> <location filename="app/AppLayouts/Wallet/components/TransactionModal.qml" line="238"/>
<source>Nonce</source> <source>Nonce</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>

View File

@ -115,22 +115,22 @@
<context> <context>
<name>AddAccount</name> <name>AddAccount</name>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccount.qml" line="94"/> <location filename="app/AppLayouts/Wallet/components/AddAccount.qml" line="94"/>
<source>Generate an account</source> <source>Generate an account</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccount.qml" line="101"/> <location filename="app/AppLayouts/Wallet/components/AddAccount.qml" line="101"/>
<source>Add a watch-only address</source> <source>Add a watch-only address</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccount.qml" line="108"/> <location filename="app/AppLayouts/Wallet/components/AddAccount.qml" line="108"/>
<source>Enter a seed phrase</source> <source>Enter a seed phrase</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccount.qml" line="115"/> <location filename="app/AppLayouts/Wallet/components/AddAccount.qml" line="115"/>
<source>Enter a private key</source> <source>Enter a private key</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -138,47 +138,47 @@
<context> <context>
<name>AddAccountWithPrivateKey</name> <name>AddAccountWithPrivateKey</name>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithPrivateKey.qml" line="7"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithPrivateKey.qml" line="7"/>
<source>Add account from private key</source> <source>Add account from private key</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithPrivateKey.qml" line="20"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithPrivateKey.qml" line="20"/>
<source>Enter your password</source> <source>Enter your password</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithPrivateKey.qml" line="21"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithPrivateKey.qml" line="21"/>
<source>Password</source> <source>Password</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithPrivateKey.qml" line="30"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithPrivateKey.qml" line="30"/>
<source>Paste the contents of your private key</source> <source>Paste the contents of your private key</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithPrivateKey.qml" line="31"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithPrivateKey.qml" line="31"/>
<source>Private key</source> <source>Private key</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithPrivateKey.qml" line="39"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithPrivateKey.qml" line="39"/>
<source>Enter an account name...</source> <source>Enter an account name...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithPrivateKey.qml" line="40"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithPrivateKey.qml" line="40"/>
<source>Account name</source> <source>Account name</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithPrivateKey.qml" line="48"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithPrivateKey.qml" line="48"/>
<source>Account color</source> <source>Account color</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithPrivateKey.qml" line="66"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithPrivateKey.qml" line="66"/>
<source>Add account &gt;</source> <source>Add account &gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -186,42 +186,42 @@
<context> <context>
<name>AddAccountWithSeed</name> <name>AddAccountWithSeed</name>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithSeed.qml" line="17"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithSeed.qml" line="17"/>
<source>Add account with a seed phrase</source> <source>Add account with a seed phrase</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithSeed.qml" line="21"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithSeed.qml" line="21"/>
<source>Enter your password</source> <source>Enter your password</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithSeed.qml" line="22"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithSeed.qml" line="22"/>
<source>Password</source> <source>Password</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithSeed.qml" line="31"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithSeed.qml" line="31"/>
<source>Enter your seed phrase, separate words with commas or spaces...</source> <source>Enter your seed phrase, separate words with commas or spaces...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithSeed.qml" line="32"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithSeed.qml" line="32"/>
<source>Seed phrase</source> <source>Seed phrase</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithSeed.qml" line="40"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithSeed.qml" line="40"/>
<source>Enter an account name...</source> <source>Enter an account name...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithSeed.qml" line="41"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithSeed.qml" line="41"/>
<source>Account name</source> <source>Account name</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddAccountWithSeed.qml" line="49"/> <location filename="app/AppLayouts/Wallet/components/AddAccountWithSeed.qml" line="49"/>
<source>Account color</source> <source>Account color</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -277,32 +277,32 @@
<context> <context>
<name>AddWatchOnlyAccount</name> <name>AddWatchOnlyAccount</name>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddWatchOnlyAccount.qml" line="7"/> <location filename="app/AppLayouts/Wallet/components/AddWatchOnlyAccount.qml" line="7"/>
<source>Add a watch-only account</source> <source>Add a watch-only account</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddWatchOnlyAccount.qml" line="20"/> <location filename="app/AppLayouts/Wallet/components/AddWatchOnlyAccount.qml" line="20"/>
<source>Enter address...</source> <source>Enter address...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddWatchOnlyAccount.qml" line="21"/> <location filename="app/AppLayouts/Wallet/components/AddWatchOnlyAccount.qml" line="21"/>
<source>Account address</source> <source>Account address</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddWatchOnlyAccount.qml" line="28"/> <location filename="app/AppLayouts/Wallet/components/AddWatchOnlyAccount.qml" line="28"/>
<source>Enter an account name...</source> <source>Enter an account name...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddWatchOnlyAccount.qml" line="29"/> <location filename="app/AppLayouts/Wallet/components/AddWatchOnlyAccount.qml" line="29"/>
<source>Account name</source> <source>Account name</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/AddWatchOnlyAccount.qml" line="37"/> <location filename="app/AppLayouts/Wallet/components/AddWatchOnlyAccount.qml" line="37"/>
<source>Account color</source> <source>Account color</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -396,32 +396,32 @@
<context> <context>
<name>GenerateAccountModal</name> <name>GenerateAccountModal</name>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/GenerateAccountModal.qml" line="7"/> <location filename="app/AppLayouts/Wallet/components/GenerateAccountModal.qml" line="7"/>
<source>Generate an account</source> <source>Generate an account</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/GenerateAccountModal.qml" line="19"/> <location filename="app/AppLayouts/Wallet/components/GenerateAccountModal.qml" line="19"/>
<source>Enter your password</source> <source>Enter your password</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/GenerateAccountModal.qml" line="20"/> <location filename="app/AppLayouts/Wallet/components/GenerateAccountModal.qml" line="20"/>
<source>Password</source> <source>Password</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/GenerateAccountModal.qml" line="28"/> <location filename="app/AppLayouts/Wallet/components/GenerateAccountModal.qml" line="28"/>
<source>Enter an account name...</source> <source>Enter an account name...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/GenerateAccountModal.qml" line="29"/> <location filename="app/AppLayouts/Wallet/components/GenerateAccountModal.qml" line="29"/>
<source>Account name</source> <source>Account name</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/GenerateAccountModal.qml" line="37"/> <location filename="app/AppLayouts/Wallet/components/GenerateAccountModal.qml" line="37"/>
<source>Account color</source> <source>Account color</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -694,17 +694,17 @@
<context> <context>
<name>SendModalContent</name> <name>SendModalContent</name>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/SendModalContent.qml" line="59"/> <location filename="app/AppLayouts/Wallet/components/SendModalContent.qml" line="59"/>
<source>Enter ETH</source> <source>Enter ETH</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/SendModalContent.qml" line="66"/> <location filename="app/AppLayouts/Wallet/components/SendModalContent.qml" line="66"/>
<source>Send from (account)</source> <source>Send from (account)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/SendModalContent.qml" line="79"/> <location filename="app/AppLayouts/Wallet/components/SendModalContent.qml" line="79"/>
<source>Send to</source> <source>Send to</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -790,57 +790,57 @@
<context> <context>
<name>TransactionModal</name> <name>TransactionModal</name>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/TransactionModal.qml" line="8"/> <location filename="app/AppLayouts/Wallet/components/TransactionModal.qml" line="8"/>
<source>Transaction Details</source> <source>Transaction Details</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/TransactionModal.qml" line="22"/> <location filename="app/AppLayouts/Wallet/components/TransactionModal.qml" line="22"/>
<source>9999 Confirmations</source> <source>9999 Confirmations</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/TransactionModal.qml" line="28"/> <location filename="app/AppLayouts/Wallet/components/TransactionModal.qml" line="28"/>
<source>When the transaction has 12 confirmations you can consider it settled.</source> <source>When the transaction has 12 confirmations you can consider it settled.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/TransactionModal.qml" line="57"/> <location filename="app/AppLayouts/Wallet/components/TransactionModal.qml" line="57"/>
<source>Block</source> <source>Block</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/TransactionModal.qml" line="82"/> <location filename="app/AppLayouts/Wallet/components/TransactionModal.qml" line="82"/>
<source>Hash</source> <source>Hash</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/TransactionModal.qml" line="109"/> <location filename="app/AppLayouts/Wallet/components/TransactionModal.qml" line="109"/>
<source>From</source> <source>From</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/TransactionModal.qml" line="136"/> <location filename="app/AppLayouts/Wallet/components/TransactionModal.qml" line="136"/>
<source>To</source> <source>To</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/TransactionModal.qml" line="163"/> <location filename="app/AppLayouts/Wallet/components/TransactionModal.qml" line="163"/>
<source>Gas limit</source> <source>Gas limit</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/TransactionModal.qml" line="188"/> <location filename="app/AppLayouts/Wallet/components/TransactionModal.qml" line="188"/>
<source>Gas price</source> <source>Gas price</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/TransactionModal.qml" line="213"/> <location filename="app/AppLayouts/Wallet/components/TransactionModal.qml" line="213"/>
<source>Gas used</source> <source>Gas used</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="app/AppLayouts/Wallet/Components/TransactionModal.qml" line="238"/> <location filename="app/AppLayouts/Wallet/components/TransactionModal.qml" line="238"/>
<source>Nonce</source> <source>Nonce</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>