Compare commits
18 Commits
59d7833668
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
86b4040c9b | ||
|
|
2abff1fe06 | ||
|
|
21f3a75aa5 | ||
|
|
a1b3add2a6 | ||
|
|
5ff5ebf910 | ||
|
|
6e6cf33bf1 | ||
|
|
ac294874bf | ||
|
|
52fd1d784f | ||
|
|
be4cf0e49a | ||
|
|
fc813368cc | ||
|
|
2294bfabe7 | ||
|
|
2dd7c84246 | ||
|
|
5a43cc1114 | ||
|
|
91dadfd35e | ||
|
|
4f38322c92 | ||
|
|
5e6a9d5743 | ||
|
|
b6f6f3f4da | ||
|
|
e6195d1e98 |
134
.github/workflows/build-ios-testflight.yml
vendored
@@ -90,9 +90,19 @@ jobs:
|
|||||||
export PATH="$HOME/.cargo/bin:$PATH"
|
export PATH="$HOME/.cargo/bin:$PATH"
|
||||||
fi
|
fi
|
||||||
rm -rf "$HOME/.rustup/downloads"/*.partial 2>/dev/null || true
|
rm -rf "$HOME/.rustup/downloads"/*.partial 2>/dev/null || true
|
||||||
|
# Stable + iOS targets (most plugins use these)
|
||||||
rustup target add aarch64-apple-ios
|
rustup target add aarch64-apple-ios
|
||||||
rustup target add aarch64-apple-ios-sim
|
rustup target add aarch64-apple-ios-sim
|
||||||
rustup target add x86_64-apple-ios
|
rustup target add x86_64-apple-ios
|
||||||
|
# Nightly + iOS targets — at least one plugin (sp_scanner / payjoin
|
||||||
|
# / something in the cargokit chain) builds its rust component
|
||||||
|
# with +nightly. The TestFlight archive bombs at "Missing manifest
|
||||||
|
# in toolchain 'nightly-aarch64-apple-darwin'" if nightly isn't
|
||||||
|
# installed alongside stable.
|
||||||
|
rustup toolchain install nightly --profile minimal
|
||||||
|
rustup target add aarch64-apple-ios --toolchain nightly
|
||||||
|
rustup target add aarch64-apple-ios-sim --toolchain nightly
|
||||||
|
rustup target add x86_64-apple-ios --toolchain nightly
|
||||||
rustup show
|
rustup show
|
||||||
|
|
||||||
- name: Install Go + gomobile (if missing)
|
- name: Install Go + gomobile (if missing)
|
||||||
@@ -134,6 +144,25 @@ jobs:
|
|||||||
tar -xzf torch_dart.tar.gz -C torch_dart
|
tar -xzf torch_dart.tar.gz -C torch_dart
|
||||||
rm torch_dart.tar.gz
|
rm torch_dart.tar.gz
|
||||||
popd
|
popd
|
||||||
|
# LibTorch.xcframework ships with a lie: each slice's Info.plist
|
||||||
|
# claims MinimumOSVersion=12.0, but the Mach-O LC_BUILD_VERSION
|
||||||
|
# in the binaries says 13.0 (device) and 14.0 (simulator).
|
||||||
|
# Apple's TestFlight validator catches this mismatch and rejects
|
||||||
|
# the upload with ITMS-90208. Patch the Info.plists to match
|
||||||
|
# the actual binary build versions.
|
||||||
|
DEVICE_PLIST=scripts/torch_dart/ios/LibTorch.xcframework/ios-arm64/LibTorch.framework/Info.plist
|
||||||
|
SIM_PLIST=scripts/torch_dart/ios/LibTorch.xcframework/ios-arm64-simulator/LibTorch.framework/Info.plist
|
||||||
|
for entry in "$DEVICE_PLIST:13.0" "$SIM_PLIST:14.0"; do
|
||||||
|
plist="${entry%:*}"
|
||||||
|
min="${entry#*:}"
|
||||||
|
if [[ -f "$plist" ]]; then
|
||||||
|
plutil -replace MinimumOSVersion -string "$min" "$plist"
|
||||||
|
echo "patched $plist -> MinimumOSVersion $min"
|
||||||
|
plutil -p "$plist" | grep -E "MinimumOSVersion|CFBundleName" || true
|
||||||
|
else
|
||||||
|
echo "WARNING: $plist not found"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
- name: Fetch prebuilt reown_flutter
|
- name: Fetch prebuilt reown_flutter
|
||||||
run: |
|
run: |
|
||||||
@@ -208,6 +237,40 @@ jobs:
|
|||||||
lib/.secrets.g.dart
|
lib/.secrets.g.dart
|
||||||
|
|
||||||
# ---- Apple signing setup --------------------------------------------
|
# ---- Apple signing setup --------------------------------------------
|
||||||
|
- name: Sanity-check Apple secrets are reaching the runner
|
||||||
|
env:
|
||||||
|
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
||||||
|
APPLE_KEY_ID: ${{ secrets.APPLE_KEY_ID }}
|
||||||
|
APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }}
|
||||||
|
APPLE_API_KEY_P8_BASE64: ${{ secrets.APPLE_API_KEY_P8_BASE64 }}
|
||||||
|
APPLE_DIST_CERT_P12_BASE64: ${{ secrets.APPLE_DIST_CERT_P12_BASE64 }}
|
||||||
|
APPLE_DIST_CERT_P12_PASSWORD: ${{ secrets.APPLE_DIST_CERT_P12_PASSWORD }}
|
||||||
|
APPLE_PROVISIONING_PROFILE_BASE64: ${{ secrets.APPLE_PROVISIONING_PROFILE_BASE64 }}
|
||||||
|
APPLE_KEYCHAIN_PASSWORD: ${{ secrets.APPLE_KEYCHAIN_PASSWORD }}
|
||||||
|
run: |
|
||||||
|
# Print LENGTHS only — never the secret values. Length 0 means the
|
||||||
|
# secret isn't actually reaching the runner (most often: secret is
|
||||||
|
# set on a different Gitea repo than this workflow is running in).
|
||||||
|
set +e
|
||||||
|
echo "APPLE_TEAM_ID length: ${#APPLE_TEAM_ID}"
|
||||||
|
echo "APPLE_KEY_ID length: ${#APPLE_KEY_ID}"
|
||||||
|
echo "APPLE_ISSUER_ID length: ${#APPLE_ISSUER_ID}"
|
||||||
|
echo "APPLE_API_KEY_P8_BASE64 length: ${#APPLE_API_KEY_P8_BASE64}"
|
||||||
|
echo "APPLE_DIST_CERT_P12_BASE64 length: ${#APPLE_DIST_CERT_P12_BASE64}"
|
||||||
|
echo "APPLE_DIST_CERT_P12_PASSWORD length: ${#APPLE_DIST_CERT_P12_PASSWORD}"
|
||||||
|
echo "APPLE_PROVISIONING_PROFILE_BASE64 length: ${#APPLE_PROVISIONING_PROFILE_BASE64}"
|
||||||
|
echo "APPLE_KEYCHAIN_PASSWORD length: ${#APPLE_KEYCHAIN_PASSWORD}"
|
||||||
|
set -e
|
||||||
|
# Fail fast on any zero-length secret so we don't waste time on the
|
||||||
|
# subsequent steps.
|
||||||
|
for n in TEAM_ID KEY_ID ISSUER_ID API_KEY_P8_BASE64 DIST_CERT_P12_BASE64 DIST_CERT_P12_PASSWORD PROVISIONING_PROFILE_BASE64 KEYCHAIN_PASSWORD; do
|
||||||
|
var="APPLE_$n"
|
||||||
|
if [[ -z "${!var}" ]]; then
|
||||||
|
echo "FATAL: $var is empty — set it as a Gitea repo secret on the repo this workflow runs in (Builds/hash-wallet)."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
- name: Create temp keychain + import distribution cert
|
- name: Create temp keychain + import distribution cert
|
||||||
env:
|
env:
|
||||||
APPLE_DIST_CERT_P12_BASE64: ${{ secrets.APPLE_DIST_CERT_P12_BASE64 }}
|
APPLE_DIST_CERT_P12_BASE64: ${{ secrets.APPLE_DIST_CERT_P12_BASE64 }}
|
||||||
@@ -222,9 +285,22 @@ jobs:
|
|||||||
security unlock-keychain -p "$APPLE_KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
|
security unlock-keychain -p "$APPLE_KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
|
||||||
# Add to user search list so codesign can find it
|
# Add to user search list so codesign can find it
|
||||||
security list-keychains -d user -s "$KEYCHAIN_PATH" $(security list-keychains -d user | sed 's/"//g')
|
security list-keychains -d user -s "$KEYCHAIN_PATH" $(security list-keychains -d user | sed 's/"//g')
|
||||||
# Import the .p12
|
# Decode the user-uploaded .p12 directly. macOS Keychain Access
|
||||||
|
# exports .p12 with legacy PKCS12 crypto (RC2-40-CBC, PBE-SHA1)
|
||||||
|
# which is exactly what `security import` expects — no openssl
|
||||||
|
# conversion needed. Earlier attempts to "convert to legacy"
|
||||||
|
# via openssl 3.x failed because openssl 3.x has RC2-40-CBC
|
||||||
|
# disabled by default; that was a non-problem we made for
|
||||||
|
# ourselves. The original "Unknown format" failure was caused
|
||||||
|
# by a truncated base64 secret value, since fixed by re-pasting
|
||||||
|
# the secret via Gitea's API.
|
||||||
P12="$RUNNER_TEMP/dist.p12"
|
P12="$RUNNER_TEMP/dist.p12"
|
||||||
echo "$APPLE_DIST_CERT_P12_BASE64" | base64 -d > "$P12"
|
echo "$APPLE_DIST_CERT_P12_BASE64" | openssl base64 -d -A > "$P12"
|
||||||
|
echo "=== decoded .p12 ==="
|
||||||
|
ls -la "$P12"
|
||||||
|
xxd "$P12" | head -1
|
||||||
|
file "$P12" || true
|
||||||
|
|
||||||
security import "$P12" -k "$KEYCHAIN_PATH" -P "$APPLE_DIST_CERT_P12_PASSWORD" \
|
security import "$P12" -k "$KEYCHAIN_PATH" -P "$APPLE_DIST_CERT_P12_PASSWORD" \
|
||||||
-T /usr/bin/codesign -T /usr/bin/security
|
-T /usr/bin/codesign -T /usr/bin/security
|
||||||
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$APPLE_KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
|
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$APPLE_KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
|
||||||
@@ -240,7 +316,7 @@ jobs:
|
|||||||
PROFILES_DIR="$HOME/Library/MobileDevice/Provisioning Profiles"
|
PROFILES_DIR="$HOME/Library/MobileDevice/Provisioning Profiles"
|
||||||
mkdir -p "$PROFILES_DIR"
|
mkdir -p "$PROFILES_DIR"
|
||||||
PROFILE="$RUNNER_TEMP/Hash_Wallet.mobileprovision"
|
PROFILE="$RUNNER_TEMP/Hash_Wallet.mobileprovision"
|
||||||
echo "$APPLE_PROVISIONING_PROFILE_BASE64" | base64 -d > "$PROFILE"
|
echo "$APPLE_PROVISIONING_PROFILE_BASE64" | openssl base64 -d -A > "$PROFILE"
|
||||||
|
|
||||||
# Parse the .mobileprovision to get its UUID + Name (CMS-decoded plist).
|
# Parse the .mobileprovision to get its UUID + Name (CMS-decoded plist).
|
||||||
PROFILE_UUID=$(security cms -D -i "$PROFILE" | plutil -extract UUID raw -o - -)
|
PROFILE_UUID=$(security cms -D -i "$PROFILE" | plutil -extract UUID raw -o - -)
|
||||||
@@ -261,9 +337,29 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
set -e
|
set -e
|
||||||
mkdir -p "$HOME/.appstoreconnect/private_keys"
|
mkdir -p "$HOME/.appstoreconnect/private_keys"
|
||||||
echo "$APPLE_API_KEY_P8_BASE64" | base64 -d > "$HOME/.appstoreconnect/private_keys/AuthKey_${APPLE_KEY_ID}.p8"
|
P8="$HOME/.appstoreconnect/private_keys/AuthKey_${APPLE_KEY_ID}.p8"
|
||||||
|
echo "$APPLE_API_KEY_P8_BASE64" | openssl base64 -d -A > "$P8"
|
||||||
ls -la "$HOME/.appstoreconnect/private_keys/"
|
ls -la "$HOME/.appstoreconnect/private_keys/"
|
||||||
|
|
||||||
|
# Diagnostics — verify the PEM file is well-formed without
|
||||||
|
# printing the private key body. A valid AuthKey .p8 must:
|
||||||
|
# - Start with "-----BEGIN PRIVATE KEY-----"
|
||||||
|
# - End with "-----END PRIVATE KEY-----"
|
||||||
|
# - openssl pkey -in file -noout must succeed (real ASN.1 parse)
|
||||||
|
echo "=== .p8 first/last lines (no key body) ==="
|
||||||
|
head -1 "$P8"
|
||||||
|
tail -1 "$P8"
|
||||||
|
echo "=== openssl parse check (silent on success) ==="
|
||||||
|
if openssl pkey -in "$P8" -noout 2>&1; then
|
||||||
|
echo "OK — .p8 parses as a valid EC private key"
|
||||||
|
else
|
||||||
|
echo "FATAL: .p8 doesn't parse — secret likely truncated or wrong content"
|
||||||
|
echo "Re-paste APPLE_API_KEY_P8_BASE64 via the Gitea API (same flow"
|
||||||
|
echo "as the .p12 re-paste); the file decoded to:"
|
||||||
|
wc -c "$P8"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# ---- Flutter init + codegen + pod install ---------------------------
|
# ---- Flutter init + codegen + pod install ---------------------------
|
||||||
- name: Initialize Flutter SDK (iOS precache)
|
- name: Initialize Flutter SDK (iOS precache)
|
||||||
run: |
|
run: |
|
||||||
@@ -284,6 +380,36 @@ jobs:
|
|||||||
cd ios
|
cd ios
|
||||||
pod install --repo-update
|
pod install --repo-update
|
||||||
|
|
||||||
|
# ---- Override signing in project.pbxproj for the archive step -------
|
||||||
|
# The committed Release config uses Automatic signing + "Apple
|
||||||
|
# Development" identity (set up for local dev where Xcode is signed
|
||||||
|
# into an Apple ID). On CI we have only the cert + provisioning
|
||||||
|
# profile we installed in the temp keychain; no Xcode account.
|
||||||
|
#
|
||||||
|
# First attempt was an xcconfig append, but Xcode build-setting
|
||||||
|
# precedence puts target-level pbxproj settings ABOVE xcconfig —
|
||||||
|
# so the pbxproj values won and the build did Automatic signing
|
||||||
|
# anyway. Patch the Release config in pbxproj directly, only
|
||||||
|
# within the Runner target block (id 97C147071CF9000F007C117D);
|
||||||
|
# leaves Debug/Profile configs untouched so local builds stay
|
||||||
|
# on Automatic signing.
|
||||||
|
- name: Override signing settings in pbxproj for archive
|
||||||
|
env:
|
||||||
|
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
||||||
|
run: |
|
||||||
|
set -x
|
||||||
|
PBX=ios/Runner.xcodeproj/project.pbxproj
|
||||||
|
# BSD sed (macOS): -i '' for in-place, regex range scoped to
|
||||||
|
# the Runner target's Release config by its stable UUID.
|
||||||
|
sed -i '' "/97C147071CF9000F007C117D \/\* Release/,/name = Release;/ {
|
||||||
|
s/CODE_SIGN_IDENTITY = \"Apple Development\";/CODE_SIGN_IDENTITY = \"Apple Distribution\";/
|
||||||
|
s/CODE_SIGN_STYLE = Automatic;/CODE_SIGN_STYLE = Manual;/
|
||||||
|
s/DEVELOPMENT_TEAM = [A-Z0-9]\{1,\};/DEVELOPMENT_TEAM = ${APPLE_TEAM_ID};/
|
||||||
|
s|PROVISIONING_PROFILE_SPECIFIER = \"\";|PROVISIONING_PROFILE_SPECIFIER = \"${PROFILE_NAME}\";|
|
||||||
|
}" "$PBX"
|
||||||
|
echo "=== patched Runner Release config ==="
|
||||||
|
sed -n '/97C147071CF9000F007C117D \/\* Release/,/name = Release;/p' "$PBX"
|
||||||
|
|
||||||
# ---- Generate ExportOptions.plist + build IPA -----------------------
|
# ---- Generate ExportOptions.plist + build IPA -----------------------
|
||||||
- name: Write ExportOptions.plist
|
- name: Write ExportOptions.plist
|
||||||
env:
|
env:
|
||||||
|
|||||||
82
.github/workflows/build-linux.yml
vendored
@@ -168,18 +168,86 @@ jobs:
|
|||||||
- name: Build Linux app
|
- name: Build Linux app
|
||||||
run: flutter build linux --dart-define-from-file=env.json --release
|
run: flutter build linux --dart-define-from-file=env.json --release
|
||||||
|
|
||||||
- name: Compress release bundle
|
# ---- Package as AppImage --------------------------------------------
|
||||||
|
# Self-contained .AppImage is the user-facing Linux deliverable: single
|
||||||
|
# file, double-click to run, no install, works on any glibc Linux from
|
||||||
|
# the last few years. appimagetool is run with --appimage-extract-and-run
|
||||||
|
# so it works inside the container without FUSE.
|
||||||
|
- name: Stage AppDir
|
||||||
run: |
|
run: |
|
||||||
pushd build/linux/x64/release
|
set -e -x
|
||||||
zip -r hash_wallet_linux_${{ github.sha }}.zip bundle
|
REL=build/linux/x64/release
|
||||||
popd
|
APPDIR=$REL/Hash_Bags.AppDir
|
||||||
|
rm -rf "$APPDIR"
|
||||||
|
mkdir -p "$APPDIR/usr/bin" \
|
||||||
|
"$APPDIR/usr/share/applications" \
|
||||||
|
"$APPDIR/usr/share/icons/hicolor/256x256/apps"
|
||||||
|
|
||||||
|
# The whole Flutter Linux bundle (binary + data/ + lib/) lives
|
||||||
|
# under usr/bin/. The Flutter binary has RPATH=$ORIGIN/lib, so
|
||||||
|
# plugin/native libs in usr/bin/lib/ resolve naturally.
|
||||||
|
cp -r "$REL/bundle"/* "$APPDIR/usr/bin/"
|
||||||
|
|
||||||
|
# Icon: scale the iOS marketing icon to 256 if convert is around,
|
||||||
|
# else copy as-is (appimagetool only requires that AppDir root and
|
||||||
|
# the hicolor path contain a same-named PNG).
|
||||||
|
ICON_SRC=assets/images/ios_icons/hashwallet_ios_icons/Icon-App-1024x1024@1x.png
|
||||||
|
ICON_DEST="$APPDIR/usr/share/icons/hicolor/256x256/apps/hash_bags.png"
|
||||||
|
if command -v convert >/dev/null 2>&1; then
|
||||||
|
convert "$ICON_SRC" -resize 256x256 "$ICON_DEST"
|
||||||
|
else
|
||||||
|
cp "$ICON_SRC" "$ICON_DEST"
|
||||||
|
fi
|
||||||
|
cp "$ICON_DEST" "$APPDIR/hash_bags.png"
|
||||||
|
|
||||||
|
# .desktop file (at both canonical locations; appimagetool checks both)
|
||||||
|
cat > "$APPDIR/hash_bags.desktop" <<'DESKTOP'
|
||||||
|
[Desktop Entry]
|
||||||
|
Name=Hash Bags
|
||||||
|
Comment=Non-custodial multi-chain crypto wallet
|
||||||
|
Exec=hash_wallet
|
||||||
|
Icon=hash_bags
|
||||||
|
Type=Application
|
||||||
|
Categories=Office;Finance;
|
||||||
|
Terminal=false
|
||||||
|
DESKTOP
|
||||||
|
# Strip the leading whitespace from the heredoc
|
||||||
|
sed -i 's/^ //' "$APPDIR/hash_bags.desktop"
|
||||||
|
cp "$APPDIR/hash_bags.desktop" "$APPDIR/usr/share/applications/"
|
||||||
|
|
||||||
|
# AppRun: the entry point AppImage executes. Adds the bundled lib/
|
||||||
|
# dir to LD_LIBRARY_PATH and exec's the Flutter binary.
|
||||||
|
cat > "$APPDIR/AppRun" <<'APPRUN'
|
||||||
|
#!/bin/bash
|
||||||
|
HERE="$(dirname "$(readlink -f "${0}")")"
|
||||||
|
export LD_LIBRARY_PATH="${HERE}/usr/bin/lib:${LD_LIBRARY_PATH}"
|
||||||
|
exec "${HERE}/usr/bin/hash_wallet" "$@"
|
||||||
|
APPRUN
|
||||||
|
sed -i 's/^ //' "$APPDIR/AppRun"
|
||||||
|
chmod +x "$APPDIR/AppRun"
|
||||||
|
|
||||||
|
ls -la "$APPDIR"
|
||||||
|
|
||||||
|
- name: Build AppImage
|
||||||
|
run: |
|
||||||
|
set -e -x
|
||||||
|
REL=build/linux/x64/release
|
||||||
|
wget -q https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage -O /tmp/appimagetool
|
||||||
|
chmod +x /tmp/appimagetool
|
||||||
|
# --appimage-extract-and-run avoids the FUSE requirement (no fusermount
|
||||||
|
# in the build container). ARCH= tells appimagetool which arch tag to
|
||||||
|
# embed in the filename.
|
||||||
|
ARCH=x86_64 /tmp/appimagetool --appimage-extract-and-run \
|
||||||
|
"$REL/Hash_Bags.AppDir" \
|
||||||
|
"$REL/Hash_Bags-x86_64.AppImage"
|
||||||
|
ls -la "$REL"/*.AppImage
|
||||||
|
|
||||||
# actions/upload-artifact@v4 uses an HTTP API that Gitea Actions does
|
# actions/upload-artifact@v4 uses an HTTP API that Gitea Actions does
|
||||||
# not implement (only the v1/v3 wire format). Pinned to @v3 for Gitea
|
# not implement (only the v1/v3 wire format). Pinned to @v3 for Gitea
|
||||||
# compatibility — also works on GitHub Actions.
|
# compatibility — also works on GitHub Actions.
|
||||||
- name: Upload artifact
|
- name: Upload AppImage artifact
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: hash-wallet-linux-${{ github.sha }}
|
name: hash-wallet-linux-appimage-${{ github.sha }}
|
||||||
path: build/linux/x64/release/hash_wallet_linux_*.zip
|
path: build/linux/x64/release/Hash_Bags-x86_64.AppImage
|
||||||
retention-days: 14
|
retention-days: 14
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 591 B |
|
Before Width: | Height: | Size: 1019 B |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 1019 B |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 9.4 KiB |
|
Before Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 201 KiB |
|
Before Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 325 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 9.6 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 385 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 7.9 KiB |
|
Before Width: | Height: | Size: 9.6 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 123 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 5.9 KiB |
BIN
assets/images/ios_icons/hashwallet_ios_icons/AppIcon-20@2x.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
BIN
assets/images/ios_icons/hashwallet_ios_icons/AppIcon-20@3x.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
assets/images/ios_icons/hashwallet_ios_icons/AppIcon-20~ipad.png
Normal file
|
After Width: | Height: | Size: 609 B |
BIN
assets/images/ios_icons/hashwallet_ios_icons/AppIcon-29.png
Normal file
|
After Width: | Height: | Size: 852 B |
BIN
assets/images/ios_icons/hashwallet_ios_icons/AppIcon-29@2x.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
BIN
assets/images/ios_icons/hashwallet_ios_icons/AppIcon-29@3x.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
assets/images/ios_icons/hashwallet_ios_icons/AppIcon-29~ipad.png
Normal file
|
After Width: | Height: | Size: 852 B |
BIN
assets/images/ios_icons/hashwallet_ios_icons/AppIcon-40@2x.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
BIN
assets/images/ios_icons/hashwallet_ios_icons/AppIcon-40@3x.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
assets/images/ios_icons/hashwallet_ios_icons/AppIcon-40~ipad.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 3.1 KiB |
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 4.3 KiB |
BIN
assets/images/ios_icons/hashwallet_ios_icons/AppIcon@2x.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
assets/images/ios_icons/hashwallet_ios_icons/AppIcon@2x~ipad.png
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
assets/images/ios_icons/hashwallet_ios_icons/AppIcon@3x.png
Normal file
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 33 KiB |
BIN
assets/images/ios_icons/hashwallet_ios_icons/AppIcon~ipad.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 3.0 KiB |