Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
202 commits
Select commit Hold shift + click to select a range
f098d77
Initial commit
voisine Oct 5, 2016
bec95ab
Initial commit
kcw-grunt Jan 8, 2025
033e2b4
refactor: squash history to single commit
Mar 10, 2025
ffde0c3
Updated gitignore with new filenames
kcw-grunt Mar 13, 2025
b777660
Still not finding BRCore
kcw-grunt Mar 13, 2025
9bd0e17
update config
kcw-grunt Mar 23, 2025
81a790b
removed nettle
kcw-grunt Mar 23, 2025
aaa4898
removed the unbound and cleaned
kcw-grunt Mar 23, 2025
d3033b6
moved files to br-swift
kcw-grunt Mar 23, 2025
99a810c
WIP import BRCore
kcw-grunt Mar 23, 2025
70dd809
update gitignore
kcw-grunt Mar 23, 2025
91be511
removed the TE xcscheme
kcw-grunt Mar 25, 2025
6deffa0
Updated to Xcode 16
kcw-grunt Mar 25, 2025
9fca681
readdded launch resources
kcw-grunt Mar 25, 2025
6575eb1
remove wrong ver of core
kcw-grunt Mar 26, 2025
053a803
remove wrong ver of data
kcw-grunt Mar 26, 2025
23aeed8
STASHING WIP
kcw-grunt Mar 27, 2025
2ee8248
Removed the data submodules
kcw-grunt Apr 11, 2025
23d9a06
WIP...BRCore found but extensions not found
kcw-grunt Apr 11, 2025
a650fd7
DID IT DID!!!!!
kcw-grunt Apr 11, 2025
947996d
Merge remote-tracking branch 'origin/techdebt/kcw-debugging' into dev…
kcw-grunt Apr 11, 2025
af0127b
debugged the tests
kcw-grunt Apr 11, 2025
df725b5
updated the .gitignore
kcw-grunt Apr 11, 2025
9ca7400
version bump
kcw-grunt Apr 11, 2025
1ae396c
Removed Today Extension
kcw-grunt Apr 11, 2025
16b1527
Added localized strings
kcw-grunt Apr 11, 2025
b81f721
Polished the welcome start view to match Android
kcw-grunt Apr 16, 2025
b986a11
Set user theme mode globally
kcw-grunt Apr 17, 2025
4ba7964
update brand images
kcw-grunt Apr 17, 2025
a91d807
Implement dark light mode in Start classes
kcw-grunt Apr 17, 2025
c433ffb
Fixed tests
kcw-grunt Apr 17, 2025
39df6a7
Merge pull request #1 from gruntsoftware/feat/update-welcome-view-iss…
kcw-grunt Apr 20, 2025
bfc9580
Replaced UIColor and Color with Brainwallet Color theme (#2)
kcw-grunt Apr 20, 2025
6eb3ffa
Epic/gtm color ops fixes (#4)
kcw-grunt May 5, 2025
4f1aac7
chore: ios: Fix smells comply with App Store (#5)
kcw-grunt May 8, 2025
1e5a745
πŸŽ₯ Epic/gtm refactor core library (#6)
kcw-grunt May 10, 2025
7cd4092
🧰 Fix/confirm seed words submit (#9)
kcw-grunt May 11, 2025
551a91f
πŸ“½οΈ Epic/ Add storekit private lib (#7)
kcw-grunt May 11, 2025
1fded25
πŸŽ₯ Epic/add more swift UI views prior to Localizations (#8)
kcw-grunt May 13, 2025
3158686
🧰 Fix/add localizations (#10)
kcw-grunt May 14, 2025
0358b7c
Removed the wipe wallet button (#14)
kcw-grunt May 23, 2025
53a8808
🧰 Fix: Made Scanning work again (#15)
kcw-grunt May 27, 2025
39ed329
Add a animated shape for Send (#17)
kcw-grunt May 28, 2025
fdd2851
✨ Worked in the Full SwiftUI with LockScreen (#16)
kcw-grunt May 29, 2025
62e2b33
per @hassanashraf92 notes (#19)
kcw-grunt May 30, 2025
3379daf
Refactored to remove strong parent = child references to avoid πŸ§Ÿβ€β™‚οΈ (…
kcw-grunt May 30, 2025
6e177f0
❇️ chore/fetch moonpay countries+ signed buy url (#20)
kcw-grunt Jun 2, 2025
132086f
change file location
kcw-grunt Jun 2, 2025
3ab66ec
chore: Polish UI (#22)
kcw-grunt Jun 4, 2025
0673d43
build bump
kcw-grunt Jun 4, 2025
90eeb2c
fix: ios: Add wipe button UI polishes (#25)
kcw-grunt Jun 6, 2025
8b1c8ca
Added more defensive steps in Wallet Coordinator (#26)
kcw-grunt Jun 7, 2025
3369301
Fix/localization polishes (#27)
kcw-grunt Jun 7, 2025
88f937c
Added agent string encryp (#29)
kcw-grunt Jun 8, 2025
8e8d5d1
🧰 ✨ Chore/currency set defaults polish (#30)
kcw-grunt Jun 9, 2025
5e251b3
build bump
kcw-grunt Jun 9, 2025
a1623aa
πŸš€[Release v3.3.1] Merge into Main (#28)
kcw-grunt Jun 9, 2025
8c70a43
✨ Feat/add buy receive inlockscreen (#32)
kcw-grunt Jun 12, 2025
42caee6
build bump
kcw-grunt Jun 12, 2025
5fb4522
Fix/UI feedback send receive (#35)
kcw-grunt Jun 14, 2025
468cc7b
small polish (#34)
kcw-grunt Jun 14, 2025
ae61a68
admin push
kcw-grunt Jun 17, 2025
82fc5c1
🧰 Fix Debug price recv (#37)
kcw-grunt Jun 19, 2025
806c18c
🧰 Fix/theme preferred settings (#40)
kcw-grunt Jun 20, 2025
af6d1d4
build a bump
kcw-grunt Jun 22, 2025
5016629
❇️ Chore/polish localizations (#42)
kcw-grunt Jun 23, 2025
973f4fc
chore: ios: add unique ID to externalid (#44)
kcw-grunt Jun 23, 2025
b851f1f
build bump
kcw-grunt Jun 23, 2025
4de5b28
πŸš€[Release v3.4.2] Merge into Main (#43)
kcw-grunt Jun 30, 2025
0dac4ea
Chore/activate test coverage (#49)
kcw-grunt Jun 30, 2025
d418124
Chore/refactor firebase analytics (#48)
kcw-grunt Jun 30, 2025
e6a7347
Epic/settings migration (#50)
kcw-grunt Jul 2, 2025
dd2bcf1
πŸš€[Release v3.5.0] Merge into Main (#51)
kcw-grunt Jul 5, 2025
5ad3361
🧰 fix: Removed the thread blocking seen in the lock screen trx. loa…
kcw-grunt Jul 7, 2025
d749bb0
Updated localizations (#54)
kcw-grunt Jul 7, 2025
302b735
Fix/login view crash (#55)
kcw-grunt Jul 15, 2025
9b5d675
🦾 Chore/migrate ready onboarding (#58)
kcw-grunt Jul 18, 2025
35b9898
refactor crash in WalletManager+Auth
kcw-grunt Jul 18, 2025
a9d4dcc
Merge branch 'main' into release/v3.6.0
kcw-grunt Jul 18, 2025
f22553b
πŸš€[Release v3.6.0] Merge into Main (#59)
kcw-grunt Jul 20, 2025
7ea16e8
config working (#60)
kcw-grunt Jul 25, 2025
4924897
deleted empty dirs
kcw-grunt Jul 27, 2025
efa17b6
πŸ“Έ Reorganized test structure Added Screenshots (#61)
kcw-grunt Jul 29, 2025
9c52e21
Techdebt/add private submodule 175 (#62)
kcw-grunt Aug 15, 2025
ae57680
Create PULL_REQUEST_TEMPLATE.md
kcw-grunt Aug 19, 2025
a713d62
Techdebt/add private submodule 175 (#63)
kcw-grunt Aug 19, 2025
e8ca760
Fix/refactor welcome ready restore 216 (#64)
kcw-grunt Aug 27, 2025
fae42c0
Remove erroneous yml
kcw-grunt Aug 27, 2025
7c1dbe3
Feat/add fcm with topics 233 (#67)
kcw-grunt Aug 29, 2025
2cf872a
πŸš€[Release v3.7.0] Merge into Main (#68)
kcw-grunt Sep 23, 2025
c79081b
Techdebt/connect games (#69)
kcw-grunt Sep 29, 2025
07312b6
Release/v3.8.2 (#70)
kcw-grunt Oct 1, 2025
9a1443b
Add nightly bento build
kcw-grunt Oct 1, 2025
430db2d
Merge Release/v3.8.2 into Develop (#73)
kcw-grunt Oct 29, 2025
8154eb8
Update README for improved description (#78)
kcw-grunt Jan 23, 2026
4fa462d
MAJOR Bento MERGE (#77)
kcw-grunt Jan 24, 2026
0c1f5f7
Feat/tutorials send receive walkthrough (#80)
kcw-grunt Jan 26, 2026
590190e
Readded an empty class
kcw-grunt Jan 26, 2026
c82bc91
Merge branch 'main' into develop
kcw-grunt Jan 26, 2026
705f3fa
refactored Export Classes
kcw-grunt Jan 26, 2026
58e9b80
Update format
kcw-grunt Jan 26, 2026
24f66af
Beta Release [ πŸš€ ] Merge Develop into Main (#81)
kcw-grunt Jan 26, 2026
7671485
Udpated config.yml
kcw-grunt Jan 27, 2026
e322d68
Techdebt/polish tutorials (#82)
kcw-grunt Jan 31, 2026
c4fba29
Techdebt/polish game hub (#83)
kcw-grunt Feb 2, 2026
27e5c98
Release/v3.9.0 (#85)
kcw-grunt Feb 9, 2026
e25da7e
Merge Release/v3.9.0 into develop (#86)
kcw-grunt Feb 10, 2026
0cf114e
Techdebt/fixes various (#87)
kcw-grunt Feb 10, 2026
f894f62
bump project version
kcw-grunt Feb 10, 2026
e47a7cc
Techdebt/add tests (#88)
kcw-grunt Feb 12, 2026
e034a57
πŸš€ Release/v3.9.1 (#89)
kcw-grunt Feb 16, 2026
c5d2bd1
Release/v3.9.1 (#90)
kcw-grunt Feb 16, 2026
c4f0ef5
Feat/add emoji picker (#92)
kcw-grunt Feb 23, 2026
19df480
version bump
kcw-grunt Mar 2, 2026
4b15d3d
Create workflows
kcw-grunt Apr 13, 2026
2609a95
moved the pr summary
kcw-grunt Apr 13, 2026
d2c4659
Fixes a linking error with an upgrade of iOS 26.4
kcw-grunt Apr 15, 2026
eceea5e
Added module reference the UnitTests Target
kcw-grunt Apr 15, 2026
72c3168
version bump
kcw-grunt Apr 15, 2026
c3a723a
Added scripts
kcw-grunt Apr 16, 2026
008828a
version bump
kcw-grunt Apr 15, 2026
ed6b680
Added scripts
kcw-grunt Apr 16, 2026
98e0aee
Small update to trigger translate
kcw-grunt Apr 16, 2026
cec7c61
removed sync for pr
kcw-grunt Apr 16, 2026
7221913
Added Thai and Dutch to Brainwallet: iOS (#95)
kcw-grunt Apr 16, 2026
b35f26f
πŸš€ Release/v3.9.3 (#93)
kcw-grunt Apr 19, 2026
a65afd5
Release/v3.9.2 (#99)
kcw-grunt Apr 19, 2026
7424590
πŸŽ›οΈ Techdebt/test xcode cloud (#101)
kcw-grunt Apr 26, 2026
40255af
Add gamehub carousel (#103)
kcw-grunt Apr 26, 2026
69045ba
: ✨ πŸ›οΈ Added the shop background and artwork (#105)
kcw-grunt Apr 27, 2026
9995093
Re-orgged the image assets to resolve conflicts
kcw-grunt Apr 27, 2026
52ff8e4
Merge branch 'main' into develop
kcw-grunt Apr 27, 2026
f93c3ed
version bump
kcw-grunt Apr 27, 2026
7090d88
Feat/reorg onboarding notifications reviews (#107)
kcw-grunt Apr 28, 2026
1e5b3cc
version bump
kcw-grunt Apr 28, 2026
c2f25e4
Techdebt/update fpf core (#109)
kcw-grunt May 3, 2026
178d2c8
Feat/add shop remote (#110)
kcw-grunt May 10, 2026
01eda61
version bump
kcw-grunt May 10, 2026
e88fefb
πŸš€ Release: v3.9.5 (#111)
kcw-grunt May 11, 2026
846c2b5
Fix/remove amzn add local (#112)
kcw-grunt May 24, 2026
e1cd011
Fix/remove amzn add local (#114)
kcw-grunt May 29, 2026
579c074
Techdebt/update core (#115)
kcw-grunt Jun 7, 2026
5ec5bf4
Techdebt/update core (#116)
kcw-grunt Jun 8, 2026
7319cee
Release/v3.9.7 (#117)
kcw-grunt Jun 14, 2026
1365acb
Merge branch 'main' into develop
kcw-grunt Jun 14, 2026
5031456
cleaned up merge
kcw-grunt Jun 14, 2026
230fe63
RC (#122)
kcw-grunt Jul 7, 2026
de2be8a
Fallinmoji closed branch (#123)
kcw-grunt Jul 7, 2026
ec142f4
Cleaned up the bw-gdlib
kcw-grunt Jul 7, 2026
ade5c36
Merged the bw
kcw-grunt Jul 7, 2026
f91a689
Release/v3.9.10 (#124)
kcw-grunt Jul 7, 2026
465bd29
Convert Game Font to LilitaOne (#125)
kcw-grunt Jul 10, 2026
772efbc
Added long press gesture (#126)
kcw-grunt Jul 10, 2026
9108459
Merge branch 'main' into release/v3.9.11
kcw-grunt Jul 10, 2026
c144728
version bump
kcw-grunt Jul 11, 2026
312ba1e
Release/v3.9.11 (#127)
kcw-grunt Jul 17, 2026
02f8d42
Migrate Set Emojis UI to SwiftUI (#129)
grunt-claude-bot Jul 25, 2026
2c66e2d
Fix CircleCI Ruby version mismatch (#130)
grunt-claude-bot Jul 25, 2026
6d2f4d5
version bump
kcw-grunt Jul 25, 2026
9e56b9a
Fix inverted Game Hub tab entry and refresh emoji-delete UI (#131)
grunt-claude-bot Jul 26, 2026
9cdedd3
Merge branch 'main' into release/v3.9.13
grunt-claude-bot Jul 26, 2026
1169ddd
bump
kcw-grunt Jul 26, 2026
911ab74
chore(i18n): auto-translate missing iOS xcstrings [skip ci] (#134)
grunt-claude-bot Jul 26, 2026
87bec5f
Run auto-translate-ios workflow on pull_request, not just push
grunt-claude-bot Jul 26, 2026
cc37ffb
Fix BWIOSGdx/MoonPay language handoff and remove dead force-unwrap he…
grunt-claude-bot Jul 26, 2026
71a583b
Stop forcibly overriding device language on every launch
grunt-claude-bot Jul 26, 2026
f3d7c42
Deleted dupe AppDelegate
kcw-grunt Jul 26, 2026
bbfcf14
Remove Bundle.setLanguage runtime override mechanism entirely
grunt-claude-bot Jul 26, 2026
80ce64e
Remove conflicting fr-FR/es/fa locale entries from Localizable.xcstrings
grunt-claude-bot Jul 26, 2026
8d5b307
Clean up locale debug print and orphaned fa.lproj
grunt-claude-bot Jul 26, 2026
ef977eb
Fix main brainwallet scheme's hardcoded App Language override
grunt-claude-bot Jul 26, 2026
34cd306
Left the script commented out for robovm install
kcw-grunt Jul 26, 2026
22ef3a3
docs: restructure README for external visitors (#136)
grunt-claude-bot Jul 29, 2026
bd1fa97
docs: README restructure for external visitors (#137)
grunt-claude-bot Jul 29, 2026
566c0cb
Merge branch 'main' into release/v3.9.13
kcw-grunt Jul 29, 2026
cdc0d1b
update skills
kcw-grunt Jul 30, 2026
b2d9291
Merge branch 'release/v3.9.13' into develop
kcw-grunt Jul 31, 2026
e229704
ci: add shields.io tests-passed badge (#138)
grunt-claude-bot Jul 31, 2026
f9789e0
Add requestReview() at balance-toggle and game-finish spots, matching…
kcw-grunt Jul 31, 2026
2482dcb
Revert "Add requestReview() at balance-toggle and game-finish spots, …
kcw-grunt Jul 31, 2026
1d38cf2
Add requestReview() at balance-toggle and game-finish spots, matching…
grunt-claude-bot Jul 31, 2026
f6e7856
Register BalanceBentoReviewPolicy.swift in the Xcode project (#140)
grunt-claude-bot Jul 31, 2026
d743839
Fix MoonPay signing requests missing the user's IP address (#141)
grunt-claude-bot Aug 1, 2026
ef1bda5
πŸ› Fix native SIGSEGV crash + report integrity warnings to Crashlytics…
grunt-claude-bot Aug 8, 2026
a6d7cc1
Merge release/v3.9.13 into develop (#143)
grunt-claude-bot Aug 8, 2026
7b2456d
Merge release/v3.9.14 into develop (#145)
grunt-claude-bot Aug 9, 2026
c00c8ed
Remove duplicate/orphaned Legacy BW_BRClasses files, not referenced b…
grunt-claude-bot Aug 9, 2026
5b2202c
Remove redundant Facebook/Analytics logEvent calls for gamehub and to…
grunt-claude-bot Aug 10, 2026
5023486
Update bw-gdlib to v1.6.4 and forward game-exit analytics events (#150)
grunt-claude-bot Aug 11, 2026
de7ac68
Merge release/v3.9.15 into develop (#152)
grunt-claude-bot Aug 11, 2026
90bdc71
Fix Simulator launch crash + flaky LockScreenViewUITests (#153)
grunt-claude-bot Aug 13, 2026
a73ceea
Fix CircleCI + Xcode Cloud build failures (#154)
grunt-claude-bot Aug 13, 2026
8284e4e
Bump Modules/core: fix _peerThreadRoutine NULL threadCleanup crash (#…
grunt-claude-bot Aug 13, 2026
1c14e61
Bump bw-gdlib to v1.6.8, fix Simulator crash regression from re-added…
grunt-claude-bot Aug 13, 2026
e352cd6
chore: remove defunct code, resources, and dead files (#157)
grunt-claude-bot Aug 14, 2026
980cc07
chore: bump debug build to 2602303 (v3.9.16) (#158)
grunt-claude-bot Aug 14, 2026
071a684
fix: sync-duration analytics event never fired; log foreground time-t…
grunt-claude-bot Aug 14, 2026
adb9dc8
docs: add v3.9.16 release notes to README
kcw-grunt Aug 15, 2026
495d3ee
bump
kcw-grunt Aug 15, 2026
bacb136
chore: join main into release/v3.9.16-into-main for PR ancestry
kcw-grunt Aug 15, 2026
0219bc8
bump to 305
kcw-grunt Aug 15, 2026
79a4f53
bump to 306
kcw-grunt Aug 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
39 changes: 22 additions & 17 deletions .circleci/build-uitest-config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -89,26 +89,31 @@ jobs:
echo "$REMOTE_CONFIG_DEFAULTS" | base64 --decode > remote-config-defaults.plist
echo "$DEBUG_SERVICE_DATA" | base64 --decode > service-data.plist

# Verify GoogleService-Info.plist was created successfully
if [ ! -f "GoogleService-Info.plist" ]; then
echo "ERROR: GoogleService-Info.plist was not created!"
exit 1
fi

# Verify the file has content and is valid
if [ ! -s "GoogleService-Info.plist" ]; then
echo "ERROR: GoogleService-Info.plist is empty!"
exit 1
fi

# Fail fast on a bad env var here instead of a cryptic
# "unable to read input file as a property list" from xcodebuild's
# CopyPlistFile step later. Naming the broken var/file points
# straight at what to fix in CircleCI's project env vars.
check_plist() {
if [ ! -s "$2" ] || ! /usr/libexec/PlistBuddy -c "Print" "$2" >/dev/null 2>&1; then
echo "ERROR: $1 did not decode to a valid plist -- check its value in CircleCI's project env vars"
exit 1
fi
}
check_plist "GOOGLE_SERVICES_PLIST -> GoogleService-Info.plist" GoogleService-Info.plist
check_plist "REMOTE_CONFIG_DEFAULTS -> remote-config-defaults.plist" remote-config-defaults.plist
check_plist "DEBUG_SERVICE_DATA -> service-data.plist" service-data.plist

echo "GoogleService-Info.plist created successfully:"
ls -la GoogleService-Info.plist
echo "File size: $(wc -c < GoogleService-Info.plist) bytes"

# Display first few lines for debugging (avoid showing sensitive data)
echo "GoogleService-Info.plist structure:"
head -10 GoogleService-Info.plist

# Do NOT print file contents here -- this repo is public and
# CircleCI build logs for public GitHub repos are viewable
# without a CircleCI login by default, so dumping any lines of a
# decoded secret (this file's API_KEY, GOOGLE_APP_ID, etc.) would
# leak it. check_plist above already validates the content is a
# real plist without printing it; that's the right way to verify
# this, not head/cat.

# Also copy to brainwallet directory if needed
mkdir -p ./brainwallet
cp GoogleService-Info.plist ./brainwallet/PreLaunchResources/
Expand Down
44 changes: 29 additions & 15 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -86,26 +86,40 @@ jobs:
echo "$REMOTE_CONFIG_DEFAULTS" | base64 --decode > remote-config-defaults.plist
echo "$DEBUG_SERVICE_DATA" | base64 --decode > service-data.plist

# Verify GoogleService-Info.plist was created successfully
if [ ! -f "GoogleService-Info.plist" ]; then
echo "ERROR: GoogleService-Info.plist was not created!"
# Fail fast on a bad env var here instead of a cryptic
# "unable to read input file as a property list" from xcodebuild's
# CopyPlistFile step later (this exact failure mode hit Xcode
# Cloud build 431: DEBUG_SERVICE_DATA didn't decode to a valid
# plist). Naming the broken var/file points straight at what to
# fix in the CircleCI project env vars.
check_plist() {
if [ ! -s "$2" ] || ! /usr/libexec/PlistBuddy -c "Print" "$2" >/dev/null 2>&1; then
echo "ERROR: $1 did not decode to a valid plist -- check its value in CircleCI's project env vars"
exit 1
fi
}
check_plist "GOOGLE_SERVICES_PLIST -> GoogleService-Info.plist" GoogleService-Info.plist
check_plist "REMOTE_CONFIG_DEFAULTS -> remote-config-defaults.plist" remote-config-defaults.plist
check_plist "DEBUG_SERVICE_DATA -> service-data.plist" service-data.plist
# Brainwallet-StoreKit-v1.storekit is JSON (Xcode's StoreKit
# Configuration format), not a plist -- plutil -lint rejects JSON
# outright, so validate with a real JSON parser instead.
if [ ! -s "Brainwallet-StoreKit-v1.storekit" ] || ! python3 -m json.tool Brainwallet-StoreKit-v1.storekit >/dev/null 2>&1; then
echo "ERROR: BRAINWALLET_IOS_STOREKIT_V1_0_FILE -> Brainwallet-StoreKit-v1.storekit did not decode to valid JSON -- check its value in CircleCI's project env vars"
exit 1
fi

# Verify the file has content and is valid
if [ ! -s "GoogleService-Info.plist" ]; then
echo "ERROR: GoogleService-Info.plist is empty!"
exit 1
fi


echo "GoogleService-Info.plist created successfully:"
ls -la GoogleService-Info.plist
echo "File size: $(wc -c < GoogleService-Info.plist) bytes"

# Display first few lines for debugging (avoid showing sensitive data)
echo "GoogleService-Info.plist structure:"
head -10 GoogleService-Info.plist

# Do NOT print file contents here -- this repo is public and
# CircleCI build logs for public GitHub repos are viewable
# without a CircleCI login by default, so dumping any lines of a
# decoded secret (this file's API_KEY, GOOGLE_APP_ID, etc.) would
# leak it. check_plist above already validates the content is a
# real plist without printing it; that's the right way to verify
# this, not head/cat.

# Also copy to brainwallet directory if needed
mkdir -p ./brainwallet
cp Brainwallet-StoreKit-v1.storekit ./brainwallet/PreLaunchResources/
Expand Down
42 changes: 27 additions & 15 deletions .circleci/daily-develop-config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -89,26 +89,38 @@ jobs:
echo "$REMOTE_CONFIG_DEFAULTS" | base64 --decode > remote-config-defaults.plist
echo "$DEBUG_SERVICE_DATA" | base64 --decode > service-data.plist

# Verify GoogleService-Info.plist was created successfully
if [ ! -f "GoogleService-Info.plist" ]; then
echo "ERROR: GoogleService-Info.plist was not created!"
# Fail fast on a bad env var here instead of a cryptic
# "unable to read input file as a property list" from xcodebuild's
# CopyPlistFile step later. Naming the broken var/file points
# straight at what to fix in CircleCI's project env vars.
check_plist() {
if [ ! -s "$2" ] || ! /usr/libexec/PlistBuddy -c "Print" "$2" >/dev/null 2>&1; then
echo "ERROR: $1 did not decode to a valid plist -- check its value in CircleCI's project env vars"
exit 1
fi
}
check_plist "GOOGLE_SERVICES_PLIST -> GoogleService-Info.plist" GoogleService-Info.plist
check_plist "REMOTE_CONFIG_DEFAULTS -> remote-config-defaults.plist" remote-config-defaults.plist
check_plist "DEBUG_SERVICE_DATA -> service-data.plist" service-data.plist
# Brainwallet-StoreKit-v1.storekit is JSON (Xcode's StoreKit
# Configuration format), not a plist -- plutil -lint rejects JSON
# outright, so validate with a real JSON parser instead.
if [ ! -s "Brainwallet-StoreKit-v1.storekit" ] || ! python3 -m json.tool Brainwallet-StoreKit-v1.storekit >/dev/null 2>&1; then
echo "ERROR: BRAINWALLET_IOS_STOREKIT_V1_0_FILE -> Brainwallet-StoreKit-v1.storekit did not decode to valid JSON -- check its value in CircleCI's project env vars"
exit 1
fi

# Verify the file has content and is valid
if [ ! -s "GoogleService-Info.plist" ]; then
echo "ERROR: GoogleService-Info.plist is empty!"
exit 1
fi


echo "GoogleService-Info.plist created successfully:"
ls -la GoogleService-Info.plist
echo "File size: $(wc -c < GoogleService-Info.plist) bytes"

# Display first few lines for debugging (avoid showing sensitive data)
echo "GoogleService-Info.plist structure:"
head -10 GoogleService-Info.plist

# Do NOT print file contents here -- this repo is public and
# CircleCI build logs for public GitHub repos are viewable
# without a CircleCI login by default, so dumping any lines of a
# decoded secret (this file's API_KEY, GOOGLE_APP_ID, etc.) would
# leak it. check_plist above already validates the content is a
# real plist without printing it; that's the right way to verify
# this, not head/cat.

# Also copy to brainwallet directory if needed
mkdir -p ./brainwallet
cp Brainwallet-StoreKit-v1.storekit ./brainwallet/PreLaunchResources/
Expand Down
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -69,5 +69,9 @@ GoogleService-Info.plist
Brainwallet-StoreKit-v1.storekit
/fastlane/report.xml
**/fastlane/test_output/
## Games protection
## Games protection
brainwallet/PreLaunchResources/topics_schema.plist

# App Store Connect API credentials (asc-metadata-upload skill)
.claude/skills/asc-metadata-upload/.env
*.p8
10 changes: 7 additions & 3 deletions BrainwalletUITests/LockScreenViewUITests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,13 @@ final class LockScreenViewUITests: XCTestCase {
XCTAssertTrue(app.descendants(matching: .any)["Lock Screen Footer View"].exists)

app.activate()
app/*@START_MENU_TOKEN@*/.buttons["moon.stars"]/*[[".otherElements",".buttons[\"Clear Night\"]",".buttons[\"moon.stars\"]"],[[[-1,2],[-1,1],[-1,0,1]],[[-1,2],[-1,1]]],[0]]@END_MENU_TOKEN@*/.firstMatch.tap()
app/*@START_MENU_TOKEN@*/.buttons["sun.max"]/*[[".otherElements",".buttons[\"Brightness Higher\"]",".buttons[\"sun.max\"]"],[[[-1,2],[-1,1],[-1,0,1]],[[-1,2],[-1,1]]],[0]]@END_MENU_TOKEN@*/.firstMatch.tap()
app/*@START_MENU_TOKEN@*/.buttons["qrcode"]/*[[".otherElements",".buttons[\"Qr Code\"]",".buttons[\"qrcode\"]"],[[[-1,2],[-1,1],[-1,0,1]],[[-1,2],[-1,1]]],[0]]@END_MENU_TOKEN@*/.firstMatch.tap()
// Theme toggle: both taps hit the same button (its SF Symbol/label flips
// between "moon.stars"/"Clear Night" and "sun.max"/"Brightness Higher"
// depending on state), so key off its stable accessibilityIdentifier
// instead of the state-dependent auto-generated label.
app.buttons["Theme Preference Button"].firstMatch.tap()
app.buttons["Theme Preference Button"].firstMatch.tap()
app.buttons["QR Code Button"].firstMatch.tap()

let element = app/*@START_MENU_TOKEN@*/.buttons["8"]/*[[".otherElements.buttons[\"8\"]",".buttons[\"8\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/.firstMatch
element.swipeDown()
Expand Down
18 changes: 14 additions & 4 deletions BrainwalletUnitTests/Buy Receive Tests/NewReceiveTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -178,15 +178,25 @@ class NewReceiveViewModelTests: XCTestCase {
// MARK: - Date Formatter Tests

func testISO8601DateFormatterFormat() {
// Test the date formatter configuration
// Test the date formatter configuration.
// Pinned to en_US_POSIX + UTC rather than Locale.current/the system
// time zone: this test asserts an English month abbreviation ("jun")
// for a date defined in UTC, so both the locale AND the time zone
// need to be deterministic. Locale alone isn't enough -- the test
// date is June 1 00:00:00 UTC, which is still May 31 in any zone
// west of UTC (e.g. US Pacific/Eastern), so without pinning
// .timeZone this failed on Xcode Cloud's build agent even after
// fixing the locale, since its system time zone renders this same
// instant as "31 May" rather than "01 Jun".
let formatter = DateFormatter()
formatter.locale = Locale.current
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(identifier: "UTC")
formatter.dateFormat = "dd MMM yyyy HH:mm:ss"

// Test with a known date
let testDate = Date(timeIntervalSince1970: 1717200000) // June 1, 2024 00:00:00 UTC
let formattedString = formatter.string(from: testDate).lowercased()

XCTAssertFalse(formattedString.isEmpty)
XCTAssertTrue(formattedString.contains("2024"))
XCTAssertTrue(formattedString.contains("jun"))
Expand Down
Loading
Loading