diff --git a/.github/workflows/Xcode-build-analyze.yml b/.github/workflows/Xcode-build-analyze.yml index c0e0fef..bbdcb2d 100644 --- a/.github/workflows/Xcode-build-analyze.yml +++ b/.github/workflows/Xcode-build-analyze.yml @@ -22,20 +22,20 @@ jobs: xcodebuild -version - name: Resolve packages - run: xcodebuild -resolvePackageDependencies -project hellbender.xcodeproj -scheme hellbender + run: xcodebuild -resolvePackageDependencies -project birch.xcodeproj -scheme birch - name: Validate Package.resolved run: | - if ! git diff --quiet hellbender.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved; then + if ! git diff --quiet birch.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved; then echo "::error::Package.resolved has uncommitted changes after resolution. Commit the updated Package.resolved." - git diff hellbender.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved + git diff birch.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved exit 1 fi - name: Build env: - scheme: hellbender - file_to_build: hellbender.xcodeproj + scheme: birch + file_to_build: birch.xcodeproj filetype_parameter: project run: | xcodebuild clean build analyze -scheme "$scheme" -"$filetype_parameter" "$file_to_build" CODE_SIGNING_ALLOWED=NO | xcpretty && exit ${PIPESTATUS[0]} diff --git a/.github/workflows/Xcode-unit-tests.yml b/.github/workflows/Xcode-unit-tests.yml index 30fad91..fd876fd 100644 --- a/.github/workflows/Xcode-unit-tests.yml +++ b/.github/workflows/Xcode-unit-tests.yml @@ -17,4 +17,4 @@ jobs: - name: Run Unit Tests run: | - xcodebuild test -project hellbender.xcodeproj -scheme hellbender -destination 'platform=iOS Simulator,name=iPhone 17 Pro' -only-testing:hellbenderTests -parallel-testing-enabled NO CODE_SIGNING_ALLOWED=NO | xcpretty && exit ${PIPESTATUS[0]} + xcodebuild test -project birch.xcodeproj -scheme birch -destination 'platform=iOS Simulator,name=iPhone 17 Pro' -only-testing:birchTests -parallel-testing-enabled NO CODE_SIGNING_ALLOWED=NO | xcpretty && exit ${PIPESTATUS[0]} diff --git a/.github/workflows/reproducible-build-check.yml b/.github/workflows/reproducible-build-check.yml index 4c20664..1fdb687 100644 --- a/.github/workflows/reproducible-build-check.yml +++ b/.github/workflows/reproducible-build-check.yml @@ -23,12 +23,12 @@ jobs: - name: Build 1 run: | - DERIVED_DATA="/tmp/hellbender-build-1" + DERIVED_DATA="/tmp/birch-build-1" rm -rf "$DERIVED_DATA" xcodebuild archive \ - -scheme hellbender \ - -project hellbender.xcodeproj \ - -archivePath "$DERIVED_DATA/hellbender.xcarchive" \ + -scheme birch \ + -project birch.xcodeproj \ + -archivePath "$DERIVED_DATA/birch.xcarchive" \ -derivedDataPath "$DERIVED_DATA" \ -configuration Release \ CODE_SIGNING_ALLOWED=NO \ @@ -37,12 +37,12 @@ jobs: - name: Build 2 run: | - DERIVED_DATA="/tmp/hellbender-build-2" + DERIVED_DATA="/tmp/birch-build-2" rm -rf "$DERIVED_DATA" xcodebuild archive \ - -scheme hellbender \ - -project hellbender.xcodeproj \ - -archivePath "$DERIVED_DATA/hellbender.xcarchive" \ + -scheme birch \ + -project birch.xcodeproj \ + -archivePath "$DERIVED_DATA/birch.xcarchive" \ -derivedDataPath "$DERIVED_DATA" \ -configuration Release \ CODE_SIGNING_ALLOWED=NO \ @@ -51,13 +51,13 @@ jobs: - name: Normalize both builds run: | - APP1="/tmp/hellbender-build-1/hellbender.xcarchive/Products/Applications/hellbender.app" - APP2="/tmp/hellbender-build-2/hellbender.xcarchive/Products/Applications/hellbender.app" + APP1="/tmp/birch-build-1/birch.xcarchive/Products/Applications/birch.app" + APP2="/tmp/birch-build-2/birch.xcarchive/Products/Applications/birch.app" ./scripts/normalize-app.sh "$APP1" ./scripts/normalize-app.sh "$APP2" - name: Compare builds run: | - APP1="/tmp/hellbender-build-1/hellbender.xcarchive/Products/Applications/hellbender.app" - APP2="/tmp/hellbender-build-2/hellbender.xcarchive/Products/Applications/hellbender.app" + APP1="/tmp/birch-build-1/birch.xcarchive/Products/Applications/birch.app" + APP2="/tmp/birch-build-2/birch.xcarchive/Products/Applications/birch.app" ./scripts/compare-builds.sh "$APP1" "$APP2" diff --git a/Config/Hellbender.xcconfig b/Config/Birch.xcconfig similarity index 64% rename from Config/Hellbender.xcconfig rename to Config/Birch.xcconfig index 4925970..64a68f2 100644 --- a/Config/Hellbender.xcconfig +++ b/Config/Birch.xcconfig @@ -1,12 +1,14 @@ -// Hellbender.xcconfig — Target-level settings for the hellbender app target +// Birch.xcconfig — Target-level settings for the birch app target ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon +ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES = AppIcon-Dark +ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor CODE_SIGN_STYLE = Automatic CURRENT_PROJECT_VERSION = 23 -DEVELOPMENT_ASSET_PATHS = "hellbender/Preview Content" +DEVELOPMENT_ASSET_PATHS = "birch/Preview Content" GENERATE_INFOPLIST_FILE = NO -INFOPLIST_FILE = hellbender/Info.plist +INFOPLIST_FILE = birch/Info.plist IPHONEOS_DEPLOYMENT_TARGET = 18.6 LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks MARKETING_VERSION = 0.1.2 diff --git a/README.md b/README.md index 462a75e..a2c893b 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,29 @@

- Hellbender + Birch

-

Hellbender

+

Birch

Travel to your private keys and leave your laptop at home.

- Welcome - Setup Choice - New Wallet Multisig Config - Cosigner Import - Verify Wallet - Backup PDF/QR - Transactions - Send - Receive - UTXO + Welcome + Setup Choice + New Wallet Multisig Config + Cosigner Import + Verify Wallet + Backup PDF/QR + Transactions + Send + Receive + UTXO

--- -Hellbender is an iOS Bitcoin multisig coordinator written in Swift. It operates as a **watch-only wallet** — private keys never touch your phone. Coordinate signing across air-gapped hardware wallets using animated QR codes, bringing cold storage security with mobile convenience. +Birch is an iOS Bitcoin multisig coordinator written in Swift. It operates as a **watch-only wallet** — private keys never touch your phone. Coordinate signing across air-gapped hardware wallets using animated QR codes, bringing cold storage security with mobile convenience. ## Features @@ -65,7 +65,7 @@ All dependencies are managed via Swift Package Manager and resolve automatically git clone https://github.com/newtonick/hellbender-wallet.git cd hellbender-wallet ``` -2. Open `hellbender.xcodeproj` in Xcode +2. Open `birch.xcodeproj` in Xcode 3. SPM dependencies resolve automatically on first open 4. Build and run on a simulator or device @@ -77,7 +77,7 @@ GitHub Actions runs `xcodebuild clean build analyze` on every push and pull requ ### Reproducible Builds -Hellbender supports **functionally equivalent** reproducible builds. Given the same source code and Xcode version, two independent builds will produce the same compiled logic after normalization. Certain metadata bytes (Mach-O UUIDs, timestamps, build-machine identifiers) are expected to differ and are zeroed by the normalization step. +Birch supports **functionally equivalent** reproducible builds. Given the same source code and Xcode version, two independent builds will produce the same compiled logic after normalization. Certain metadata bytes (Mach-O UUIDs, timestamps, build-machine identifiers) are expected to differ and are zeroed by the normalization step. **What IS reproducible** (after normalization): all code-bearing sections, resources, and application logic. @@ -94,7 +94,7 @@ Hellbender supports **functionally equivalent** reproducible builds. Given the s ./scripts/build-release.sh ``` -This creates an unsigned archive at `/tmp/hellbender-build/hellbender.xcarchive`. +This creates an unsigned archive at `/tmp/birch-build/birch.xcarchive`. #### Verifying two builds @@ -111,7 +111,7 @@ The comparison exits 0 if the builds are functionally equivalent, 1 if code diff ## Generating Screenshots -Hellbender uses [`fastlane snapshot`](https://docs.fastlane.tools/actions/snapshot/) to generate marketing and App Store screenshots. A single UI test walks the app from Welcome through the main tabs, capturing every major screen on each configured device in both dark and light mode. +Birch uses [`fastlane snapshot`](https://docs.fastlane.tools/actions/snapshot/) to generate marketing and App Store screenshots. A single UI test walks the app from Welcome through the main tabs, capturing every major screen on each configured device in both dark and light mode. ### One-time setup @@ -188,7 +188,7 @@ fastlane/screenshots/ ### How it works -- [`hellbenderUITests/ScreenshotTests.swift`](hellbenderUITests/ScreenshotTests.swift) is a dedicated XCUITest that walks the app. It reuses the existing `-UITesting` launch argument (defined in `hellbender/hellbenderApp.swift`), which wipes `UserDefaults`/keychain and uses an in-memory SwiftData store so every run starts from a deterministic Welcome screen. +- [`birchUITests/ScreenshotTests.swift`](birchUITests/ScreenshotTests.swift) is a dedicated XCUITest that walks the app. It reuses the existing `-UITesting` launch argument (defined in `birch/birchApp.swift`), which wipes `UserDefaults`/keychain and uses an in-memory SwiftData store so every run starts from a deterministic Welcome screen. - The test imports a real testnet4 1-of-2 `wsh(sortedmulti(...))` descriptor with live history, waits for Electrum sync, then visits each screen. - Dark/light mode is driven by the simulator's OS appearance (`xcrun simctl ui ... appearance`). The app's `RootView` follows the OS when the theme is set to `.system`, which it is by default after the `-UITesting` wipe, so no app-side toggle is required. - The device matrix, scheme, status bar override, and other `snapshot` options live in [`fastlane/Snapfile`](fastlane/Snapfile). Device destinations (simulator OS version), the frameit pass, and the custom 13 mini ImageMagick composite all live in [`fastlane/Fastfile`](fastlane/Fastfile). @@ -196,14 +196,14 @@ fastlane/screenshots/ ### Customizing - **Add/remove devices:** edit both the `devices([...])` array in `fastlane/Snapfile` and the `DEVICES` hash in `fastlane/Fastfile`. -- **Change which screens are captured:** edit `testScreenshotTour` in `hellbenderUITests/ScreenshotTests.swift` and add or remove `snapshot("NN-Name")` calls. +- **Change which screens are captured:** edit `testScreenshotTour` in `birchUITests/ScreenshotTests.swift` and add or remove `snapshot("NN-Name")` calls. - **Skip framing:** remove the `frameit(...)` lines and the ImageMagick composite block (steps 4–7) from `fastlane/Fastfile` if you only need the bare PNGs. > **Known workaround** (contained in `fastlane/Fastfile`): `frameit` gem 2.232.2's bundled iPhone 13 Mini frame PNG has a ~3-pixel placement-offset bug that leaves a visible edge gap, so 13 mini is composited directly with ImageMagick instead. iPhone 16/17 device support is patched in via `scripts/patch-frameit.rb` (see setup step 4 above). ## Links -- **Website**: [hellbenderwallet.com](https://hellbenderwallet.com) +- **Website**: [birchwallet.app](https://birchwallet.app) - **TestFlight Beta**: [Join the beta](https://testflight.apple.com/join/PuHVwJDJ) - **Author**: [newtonick](https://github.com/newtonick/hellbender-wallet/) @@ -211,5 +211,5 @@ fastlane/screenshots/ MIT License — see [LICENSE](LICENSE) for details. -Hellbender's dependencies use permissive licenses compatible with MIT: +Birch's dependencies use permissive licenses compatible with MIT: bdk-swift (MIT/Apache-2.0), URKit (BSD-2-Clause-Patent), URUI (BSD-2-Clause-Patent), Bbqr (Apache-2.0). diff --git a/hellbender.xcodeproj/project.pbxproj b/birch.xcodeproj/project.pbxproj similarity index 81% rename from hellbender.xcodeproj/project.pbxproj rename to birch.xcodeproj/project.pbxproj index d8aa5d2..2abe21f 100644 --- a/hellbender.xcodeproj/project.pbxproj +++ b/birch.xcodeproj/project.pbxproj @@ -20,54 +20,54 @@ containerPortal = 3C9ACE1C2F5DED94009B00D0 /* Project object */; proxyType = 1; remoteGlobalIDString = 3C9ACE232F5DED94009B00D0; - remoteInfo = hellbender; + remoteInfo = birch; }; 3C9ACE3F2F5DED95009B00D0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 3C9ACE1C2F5DED94009B00D0 /* Project object */; proxyType = 1; remoteGlobalIDString = 3C9ACE232F5DED94009B00D0; - remoteInfo = hellbender; + remoteInfo = birch; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 3C9ACE242F5DED94009B00D0 /* hellbender.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = hellbender.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 3C9ACE342F5DED95009B00D0 /* hellbenderTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = hellbenderTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 3C9ACE3E2F5DED95009B00D0 /* hellbenderUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = hellbenderUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3C9ACE242F5DED94009B00D0 /* birch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = birch.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 3C9ACE342F5DED95009B00D0 /* birchTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = birchTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3C9ACE3E2F5DED95009B00D0 /* birchUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = birchUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; CC0000010000000000000001 /* Base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Base.xcconfig; sourceTree = ""; }; CC0000010000000000000002 /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; CC0000010000000000000003 /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - CC0000010000000000000004 /* Hellbender.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Hellbender.xcconfig; sourceTree = ""; }; + CC0000010000000000000004 /* Birch.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Birch.xcconfig; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ - CC0000010000000000000006 /* Exceptions for "hellbender" folder in "hellbender" target */ = { + CC0000010000000000000006 /* Exceptions for "birch" folder in "birch" target */ = { isa = PBXFileSystemSynchronizedBuildFileExceptionSet; membershipExceptions = ( Info.plist, ); - target = 3C9ACE232F5DED94009B00D0 /* hellbender */; + target = 3C9ACE232F5DED94009B00D0 /* birch */; }; /* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ /* Begin PBXFileSystemSynchronizedRootGroup section */ - 3C9ACE262F5DED94009B00D0 /* hellbender */ = { + 3C9ACE262F5DED94009B00D0 /* birch */ = { isa = PBXFileSystemSynchronizedRootGroup; exceptions = ( - CC0000010000000000000006 /* Exceptions for "hellbender" folder in "hellbender" target */, + CC0000010000000000000006 /* Exceptions for "birch" folder in "birch" target */, ); - path = hellbender; + path = birch; sourceTree = ""; }; - 3C9ACE372F5DED95009B00D0 /* hellbenderTests */ = { + 3C9ACE372F5DED95009B00D0 /* birchTests */ = { isa = PBXFileSystemSynchronizedRootGroup; - path = hellbenderTests; + path = birchTests; sourceTree = ""; }; - 3C9ACE412F5DED95009B00D0 /* hellbenderUITests */ = { + 3C9ACE412F5DED95009B00D0 /* birchUITests */ = { isa = PBXFileSystemSynchronizedRootGroup; - path = hellbenderUITests; + path = birchUITests; sourceTree = ""; }; /* End PBXFileSystemSynchronizedRootGroup section */ @@ -106,9 +106,9 @@ isa = PBXGroup; children = ( CC0000010000000000000005 /* Config */, - 3C9ACE262F5DED94009B00D0 /* hellbender */, - 3C9ACE372F5DED95009B00D0 /* hellbenderTests */, - 3C9ACE412F5DED95009B00D0 /* hellbenderUITests */, + 3C9ACE262F5DED94009B00D0 /* birch */, + 3C9ACE372F5DED95009B00D0 /* birchTests */, + 3C9ACE412F5DED95009B00D0 /* birchUITests */, 3C9ACE252F5DED94009B00D0 /* Products */, ); sourceTree = ""; @@ -116,9 +116,9 @@ 3C9ACE252F5DED94009B00D0 /* Products */ = { isa = PBXGroup; children = ( - 3C9ACE242F5DED94009B00D0 /* hellbender.app */, - 3C9ACE342F5DED95009B00D0 /* hellbenderTests.xctest */, - 3C9ACE3E2F5DED95009B00D0 /* hellbenderUITests.xctest */, + 3C9ACE242F5DED94009B00D0 /* birch.app */, + 3C9ACE342F5DED95009B00D0 /* birchTests.xctest */, + 3C9ACE3E2F5DED95009B00D0 /* birchUITests.xctest */, ); name = Products; sourceTree = ""; @@ -128,7 +128,7 @@ children = ( CC0000010000000000000001 /* Base.xcconfig */, CC0000010000000000000002 /* Debug.xcconfig */, - CC0000010000000000000004 /* Hellbender.xcconfig */, + CC0000010000000000000004 /* Birch.xcconfig */, CC0000010000000000000003 /* Release.xcconfig */, ); path = Config; @@ -137,9 +137,9 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 3C9ACE232F5DED94009B00D0 /* hellbender */ = { + 3C9ACE232F5DED94009B00D0 /* birch */ = { isa = PBXNativeTarget; - buildConfigurationList = 3C9ACE482F5DED95009B00D0 /* Build configuration list for PBXNativeTarget "hellbender" */; + buildConfigurationList = 3C9ACE482F5DED95009B00D0 /* Build configuration list for PBXNativeTarget "birch" */; buildPhases = ( 3C9ACE202F5DED94009B00D0 /* Sources */, 3C9ACE212F5DED94009B00D0 /* Frameworks */, @@ -150,9 +150,9 @@ dependencies = ( ); fileSystemSynchronizedGroups = ( - 3C9ACE262F5DED94009B00D0 /* hellbender */, + 3C9ACE262F5DED94009B00D0 /* birch */, ); - name = hellbender; + name = birch; packageProductDependencies = ( AA00000500000000000000D0 /* URKit */, AA00000800000000000000D0 /* URUI */, @@ -160,13 +160,13 @@ 3C1E1C452F7B0D99002FDAE2 /* BitcoinDevKit */, 3C1E1FA42F7B5F63002FDAE2 /* BitcoinDevKit */, ); - productName = hellbender; - productReference = 3C9ACE242F5DED94009B00D0 /* hellbender.app */; + productName = birch; + productReference = 3C9ACE242F5DED94009B00D0 /* birch.app */; productType = "com.apple.product-type.application"; }; - 3C9ACE332F5DED95009B00D0 /* hellbenderTests */ = { + 3C9ACE332F5DED95009B00D0 /* birchTests */ = { isa = PBXNativeTarget; - buildConfigurationList = 3C9ACE4B2F5DED95009B00D0 /* Build configuration list for PBXNativeTarget "hellbenderTests" */; + buildConfigurationList = 3C9ACE4B2F5DED95009B00D0 /* Build configuration list for PBXNativeTarget "birchTests" */; buildPhases = ( 3C9ACE302F5DED95009B00D0 /* Sources */, 3C9ACE312F5DED95009B00D0 /* Frameworks */, @@ -178,18 +178,18 @@ 3C9ACE362F5DED95009B00D0 /* PBXTargetDependency */, ); fileSystemSynchronizedGroups = ( - 3C9ACE372F5DED95009B00D0 /* hellbenderTests */, + 3C9ACE372F5DED95009B00D0 /* birchTests */, ); - name = hellbenderTests; + name = birchTests; packageProductDependencies = ( ); - productName = hellbenderTests; - productReference = 3C9ACE342F5DED95009B00D0 /* hellbenderTests.xctest */; + productName = birchTests; + productReference = 3C9ACE342F5DED95009B00D0 /* birchTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; - 3C9ACE3D2F5DED95009B00D0 /* hellbenderUITests */ = { + 3C9ACE3D2F5DED95009B00D0 /* birchUITests */ = { isa = PBXNativeTarget; - buildConfigurationList = 3C9ACE4E2F5DED95009B00D0 /* Build configuration list for PBXNativeTarget "hellbenderUITests" */; + buildConfigurationList = 3C9ACE4E2F5DED95009B00D0 /* Build configuration list for PBXNativeTarget "birchUITests" */; buildPhases = ( 3C9ACE3A2F5DED95009B00D0 /* Sources */, 3C9ACE3B2F5DED95009B00D0 /* Frameworks */, @@ -201,13 +201,13 @@ 3C9ACE402F5DED95009B00D0 /* PBXTargetDependency */, ); fileSystemSynchronizedGroups = ( - 3C9ACE412F5DED95009B00D0 /* hellbenderUITests */, + 3C9ACE412F5DED95009B00D0 /* birchUITests */, ); - name = hellbenderUITests; + name = birchUITests; packageProductDependencies = ( ); - productName = hellbenderUITests; - productReference = 3C9ACE3E2F5DED95009B00D0 /* hellbenderUITests.xctest */; + productName = birchUITests; + productReference = 3C9ACE3E2F5DED95009B00D0 /* birchUITests.xctest */; productType = "com.apple.product-type.bundle.ui-testing"; }; /* End PBXNativeTarget section */ @@ -233,7 +233,7 @@ }; }; }; - buildConfigurationList = 3C9ACE1F2F5DED94009B00D0 /* Build configuration list for PBXProject "hellbender" */; + buildConfigurationList = 3C9ACE1F2F5DED94009B00D0 /* Build configuration list for PBXProject "birch" */; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( @@ -253,9 +253,9 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 3C9ACE232F5DED94009B00D0 /* hellbender */, - 3C9ACE332F5DED95009B00D0 /* hellbenderTests */, - 3C9ACE3D2F5DED95009B00D0 /* hellbenderUITests */, + 3C9ACE232F5DED94009B00D0 /* birch */, + 3C9ACE332F5DED95009B00D0 /* birchTests */, + 3C9ACE3D2F5DED95009B00D0 /* birchUITests */, ); }; /* End PBXProject section */ @@ -311,12 +311,12 @@ /* Begin PBXTargetDependency section */ 3C9ACE362F5DED95009B00D0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 3C9ACE232F5DED94009B00D0 /* hellbender */; + target = 3C9ACE232F5DED94009B00D0 /* birch */; targetProxy = 3C9ACE352F5DED95009B00D0 /* PBXContainerItemProxy */; }; 3C9ACE402F5DED95009B00D0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 3C9ACE232F5DED94009B00D0 /* hellbender */; + target = 3C9ACE232F5DED94009B00D0 /* birch */; targetProxy = 3C9ACE3F2F5DED95009B00D0 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -326,6 +326,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = CC0000010000000000000002 /* Debug.xcconfig */; buildSettings = { + DEVELOPMENT_TEAM = ZW85AH743B; }; name = Debug; }; @@ -333,22 +334,25 @@ isa = XCBuildConfiguration; baseConfigurationReference = CC0000010000000000000003 /* Release.xcconfig */; buildSettings = { + DEVELOPMENT_TEAM = ZW85AH743B; }; name = Release; }; 3C9ACE492F5DED95009B00D0 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = CC0000010000000000000004 /* Hellbender.xcconfig */; + baseConfigurationReference = CC0000010000000000000004 /* Birch.xcconfig */; buildSettings = { - CURRENT_PROJECT_VERSION = 24; + CURRENT_PROJECT_VERSION = 25; + MARKETING_VERSION = 0.2.0; }; name = Debug; }; 3C9ACE4A2F5DED95009B00D0 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = CC0000010000000000000004 /* Hellbender.xcconfig */; + baseConfigurationReference = CC0000010000000000000004 /* Birch.xcconfig */; buildSettings = { - CURRENT_PROJECT_VERSION = 24; + CURRENT_PROJECT_VERSION = 25; + MARKETING_VERSION = 0.2.0; }; name = Release; }; @@ -366,7 +370,7 @@ SWIFT_EMIT_LOC_STRINGS = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/hellbender.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/hellbender"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/birch.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/birch"; }; name = Debug; }; @@ -384,7 +388,7 @@ SWIFT_EMIT_LOC_STRINGS = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/hellbender.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/hellbender"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/birch.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/birch"; }; name = Release; }; @@ -400,7 +404,7 @@ SWIFT_EMIT_LOC_STRINGS = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = hellbender; + TEST_TARGET_NAME = birch; }; name = Debug; }; @@ -416,14 +420,14 @@ SWIFT_EMIT_LOC_STRINGS = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = hellbender; + TEST_TARGET_NAME = birch; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 3C9ACE1F2F5DED94009B00D0 /* Build configuration list for PBXProject "hellbender" */ = { + 3C9ACE1F2F5DED94009B00D0 /* Build configuration list for PBXProject "birch" */ = { isa = XCConfigurationList; buildConfigurations = ( 3C9ACE462F5DED95009B00D0 /* Debug */, @@ -432,7 +436,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 3C9ACE482F5DED95009B00D0 /* Build configuration list for PBXNativeTarget "hellbender" */ = { + 3C9ACE482F5DED95009B00D0 /* Build configuration list for PBXNativeTarget "birch" */ = { isa = XCConfigurationList; buildConfigurations = ( 3C9ACE492F5DED95009B00D0 /* Debug */, @@ -441,7 +445,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 3C9ACE4B2F5DED95009B00D0 /* Build configuration list for PBXNativeTarget "hellbenderTests" */ = { + 3C9ACE4B2F5DED95009B00D0 /* Build configuration list for PBXNativeTarget "birchTests" */ = { isa = XCConfigurationList; buildConfigurations = ( 3C9ACE4C2F5DED95009B00D0 /* Debug */, @@ -450,7 +454,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 3C9ACE4E2F5DED95009B00D0 /* Build configuration list for PBXNativeTarget "hellbenderUITests" */ = { + 3C9ACE4E2F5DED95009B00D0 /* Build configuration list for PBXNativeTarget "birchUITests" */ = { isa = XCConfigurationList; buildConfigurations = ( 3C9ACE4F2F5DED95009B00D0 /* Debug */, diff --git a/hellbender.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/birch.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from hellbender.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to birch.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/hellbender.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/birch.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved similarity index 100% rename from hellbender.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved rename to birch.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved diff --git a/hellbender.xcodeproj/xcshareddata/xcschemes/hellbender.xcscheme b/birch.xcodeproj/xcshareddata/xcschemes/birch.xcscheme similarity index 78% rename from hellbender.xcodeproj/xcshareddata/xcschemes/hellbender.xcscheme rename to birch.xcodeproj/xcshareddata/xcschemes/birch.xcscheme index 492bf5b..aab8f75 100644 --- a/hellbender.xcodeproj/xcshareddata/xcschemes/hellbender.xcscheme +++ b/birch.xcodeproj/xcshareddata/xcschemes/birch.xcscheme @@ -16,9 +16,9 @@ + BuildableName = "birch.app" + BlueprintName = "birch" + ReferencedContainer = "container:birch.xcodeproj"> @@ -36,9 +36,9 @@ + BuildableName = "birchTests.xctest" + BlueprintName = "birchTests" + ReferencedContainer = "container:birch.xcodeproj"> + BuildableName = "birchUITests.xctest" + BlueprintName = "birchUITests" + ReferencedContainer = "container:birch.xcodeproj"> @@ -69,9 +69,9 @@ + BuildableName = "birch.app" + BlueprintName = "birch" + ReferencedContainer = "container:birch.xcodeproj"> @@ -86,9 +86,9 @@ + BuildableName = "birch.app" + BlueprintName = "birch" + ReferencedContainer = "container:birch.xcodeproj"> diff --git a/hellbender/Assets.xcassets/AccentColor.colorset/Contents.json b/birch/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from hellbender/Assets.xcassets/AccentColor.colorset/Contents.json rename to birch/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/birch/Assets.xcassets/AppIcon-Dark.appiconset/AppIcon.png b/birch/Assets.xcassets/AppIcon-Dark.appiconset/AppIcon.png new file mode 100644 index 0000000..7275064 Binary files /dev/null and b/birch/Assets.xcassets/AppIcon-Dark.appiconset/AppIcon.png differ diff --git a/birch/Assets.xcassets/AppIcon-Dark.appiconset/Contents.json b/birch/Assets.xcassets/AppIcon-Dark.appiconset/Contents.json new file mode 100644 index 0000000..cefcc87 --- /dev/null +++ b/birch/Assets.xcassets/AppIcon-Dark.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images" : [ + { + "filename" : "AppIcon.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/birch/Assets.xcassets/AppIcon.appiconset/AppIcon.png b/birch/Assets.xcassets/AppIcon.appiconset/AppIcon.png new file mode 100644 index 0000000..256e989 Binary files /dev/null and b/birch/Assets.xcassets/AppIcon.appiconset/AppIcon.png differ diff --git a/birch/Assets.xcassets/AppIcon.appiconset/Contents.json b/birch/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..cefcc87 --- /dev/null +++ b/birch/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images" : [ + { + "filename" : "AppIcon.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/birch/Assets.xcassets/AppIconPreviewDark.imageset/AppIcon.png b/birch/Assets.xcassets/AppIconPreviewDark.imageset/AppIcon.png new file mode 100644 index 0000000..7275064 Binary files /dev/null and b/birch/Assets.xcassets/AppIconPreviewDark.imageset/AppIcon.png differ diff --git a/hellbender/Assets.xcassets/WelcomeIcon.imageset/Contents.json b/birch/Assets.xcassets/AppIconPreviewDark.imageset/Contents.json similarity index 81% rename from hellbender/Assets.xcassets/WelcomeIcon.imageset/Contents.json rename to birch/Assets.xcassets/AppIconPreviewDark.imageset/Contents.json index 862e3d4..df110f9 100644 --- a/hellbender/Assets.xcassets/WelcomeIcon.imageset/Contents.json +++ b/birch/Assets.xcassets/AppIconPreviewDark.imageset/Contents.json @@ -6,12 +6,10 @@ "scale" : "1x" }, { - "filename" : "AppIcon.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "AppIcon.png", "idiom" : "universal", "scale" : "3x" } @@ -20,4 +18,4 @@ "author" : "xcode", "version" : 1 } -} \ No newline at end of file +} diff --git a/birch/Assets.xcassets/AppIconPreviewLight.imageset/AppIcon.png b/birch/Assets.xcassets/AppIconPreviewLight.imageset/AppIcon.png new file mode 100644 index 0000000..256e989 Binary files /dev/null and b/birch/Assets.xcassets/AppIconPreviewLight.imageset/AppIcon.png differ diff --git a/birch/Assets.xcassets/AppIconPreviewLight.imageset/Contents.json b/birch/Assets.xcassets/AppIconPreviewLight.imageset/Contents.json new file mode 100644 index 0000000..df110f9 --- /dev/null +++ b/birch/Assets.xcassets/AppIconPreviewLight.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "AppIcon.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/hellbender/Assets.xcassets/Contents.json b/birch/Assets.xcassets/Contents.json similarity index 100% rename from hellbender/Assets.xcassets/Contents.json rename to birch/Assets.xcassets/Contents.json diff --git a/hellbender/ContentView.swift b/birch/ContentView.swift similarity index 89% rename from hellbender/ContentView.swift rename to birch/ContentView.swift index 1f97626..a067e67 100644 --- a/hellbender/ContentView.swift +++ b/birch/ContentView.swift @@ -3,7 +3,7 @@ import OSLog import SwiftData import SwiftUI -private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "AppLifecycle") +private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "AppLifecycle") struct ContentView: View { @Query private var wallets: [WalletProfile] @@ -100,21 +100,26 @@ private struct PrivacyOverlayView: View { Color.hbBackground .ignoresSafeArea() - Image("WelcomeIcon") - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 120, height: 120) - .clipShape(RoundedRectangle(cornerRadius: 28, style: .continuous)) - .overlay( - RoundedRectangle(cornerRadius: 28, style: .continuous) - .stroke(Color.hbBackground, lineWidth: 24) - .blur(radius: 12) - .clipShape(RoundedRectangle(cornerRadius: 28, style: .continuous)) - ) - .overlay( - RoundedRectangle(cornerRadius: 28, style: .continuous) - .strokeBorder(Color.hbBorder.opacity(0.5), lineWidth: 1) - ) + VStack(spacing: 32) { + Spacer() + + ThemedAppIcon() + .aspectRatio(contentMode: .fit) + .frame(width: 120, height: 120) + .clipShape(RoundedRectangle(cornerRadius: 28, style: .continuous)) + .overlay( + RoundedRectangle(cornerRadius: 28, style: .continuous) + .stroke(Color.hbBackground, lineWidth: 24) + .blur(radius: 12) + .clipShape(RoundedRectangle(cornerRadius: 28, style: .continuous)) + ) + + Text("Birch Wallet") + .font(.hbDisplay(34)) + .foregroundStyle(Color.hbTextPrimary) + + Spacer() + } } } } diff --git a/hellbender/Extensions/BDK+Extensions.swift b/birch/Extensions/BDK+Extensions.swift similarity index 100% rename from hellbender/Extensions/BDK+Extensions.swift rename to birch/Extensions/BDK+Extensions.swift diff --git a/hellbender/Info.plist b/birch/Info.plist similarity index 61% rename from hellbender/Info.plist rename to birch/Info.plist index fa87107..dd468a2 100644 --- a/hellbender/Info.plist +++ b/birch/Info.plist @@ -5,9 +5,49 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName - Hellbender + Birch Wallet CFBundleExecutable $(EXECUTABLE_NAME) + CFBundleIcons + + CFBundlePrimaryIcon + + CFBundleIconName + AppIcon + + CFBundleAlternateIcons + + AppIcon-Dark + + CFBundleIconFiles + + AppIcon-Dark + + UIPrerenderedIcon + + + + + CFBundleIcons~ipad + + CFBundlePrimaryIcon + + CFBundleIconName + AppIcon + + CFBundleAlternateIcons + + AppIcon-Dark + + CFBundleIconFiles + + AppIcon-Dark + + UIPrerenderedIcon + + + + CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion @@ -23,9 +63,9 @@ LSApplicationCategoryType public.app-category.finance NSCameraUsageDescription - Hellbender needs camera access to scan QR codes for importing cosigner keys and signed PSBTs from hardware wallets. + Birch needs camera access to scan QR codes for importing cosigner keys and signed PSBTs from hardware wallets. NSFaceIDUsageDescription - Hellbender uses Face ID to securely unlock your wallet. + Birch uses Face ID to securely unlock your wallet. UIApplicationSceneManifest UIApplicationSupportsMultipleScenes diff --git a/hellbender/Models/AddressItem.swift b/birch/Models/AddressItem.swift similarity index 100% rename from hellbender/Models/AddressItem.swift rename to birch/Models/AddressItem.swift diff --git a/hellbender/Models/BIP329Record.swift b/birch/Models/BIP329Record.swift similarity index 100% rename from hellbender/Models/BIP329Record.swift rename to birch/Models/BIP329Record.swift diff --git a/hellbender/Models/BitcoinNetwork.swift b/birch/Models/BitcoinNetwork.swift similarity index 100% rename from hellbender/Models/BitcoinNetwork.swift rename to birch/Models/BitcoinNetwork.swift diff --git a/hellbender/Models/CosignerInfo.swift b/birch/Models/CosignerInfo.swift similarity index 100% rename from hellbender/Models/CosignerInfo.swift rename to birch/Models/CosignerInfo.swift diff --git a/hellbender/Models/FeePreset.swift b/birch/Models/FeePreset.swift similarity index 100% rename from hellbender/Models/FeePreset.swift rename to birch/Models/FeePreset.swift diff --git a/hellbender/Models/FrozenUTXO.swift b/birch/Models/FrozenUTXO.swift similarity index 100% rename from hellbender/Models/FrozenUTXO.swift rename to birch/Models/FrozenUTXO.swift diff --git a/hellbender/Models/PSBTFileDocument.swift b/birch/Models/PSBTFileDocument.swift similarity index 100% rename from hellbender/Models/PSBTFileDocument.swift rename to birch/Models/PSBTFileDocument.swift diff --git a/hellbender/Models/Recipient.swift b/birch/Models/Recipient.swift similarity index 100% rename from hellbender/Models/Recipient.swift rename to birch/Models/Recipient.swift diff --git a/hellbender/Models/SavedPSBT.swift b/birch/Models/SavedPSBT.swift similarity index 100% rename from hellbender/Models/SavedPSBT.swift rename to birch/Models/SavedPSBT.swift diff --git a/hellbender/Models/TransactionItem.swift b/birch/Models/TransactionItem.swift similarity index 100% rename from hellbender/Models/TransactionItem.swift rename to birch/Models/TransactionItem.swift diff --git a/hellbender/Models/UTXOItem.swift b/birch/Models/UTXOItem.swift similarity index 100% rename from hellbender/Models/UTXOItem.swift rename to birch/Models/UTXOItem.swift diff --git a/hellbender/Models/WalletLabel.swift b/birch/Models/WalletLabel.swift similarity index 100% rename from hellbender/Models/WalletLabel.swift rename to birch/Models/WalletLabel.swift diff --git a/hellbender/Models/WalletProfile.swift b/birch/Models/WalletProfile.swift similarity index 100% rename from hellbender/Models/WalletProfile.swift rename to birch/Models/WalletProfile.swift diff --git a/hellbender/Models/WalletSyncState.swift b/birch/Models/WalletSyncState.swift similarity index 100% rename from hellbender/Models/WalletSyncState.swift rename to birch/Models/WalletSyncState.swift diff --git a/hellbender/Preview Content/Preview Assets.xcassets/Contents.json b/birch/Preview Content/Preview Assets.xcassets/Contents.json similarity index 100% rename from hellbender/Preview Content/Preview Assets.xcassets/Contents.json rename to birch/Preview Content/Preview Assets.xcassets/Contents.json diff --git a/hellbender/Services/BitcoinService.swift b/birch/Services/BitcoinService.swift similarity index 99% rename from hellbender/Services/BitcoinService.swift rename to birch/Services/BitcoinService.swift index c2b4d02..fba8504 100644 --- a/hellbender/Services/BitcoinService.swift +++ b/birch/Services/BitcoinService.swift @@ -21,7 +21,7 @@ enum FeeSource: String, CaseIterable { } } -private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "BitcoinService") +private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "BitcoinService") @Observable @MainActor diff --git a/hellbender/Services/BitcoinServiceProtocol.swift b/birch/Services/BitcoinServiceProtocol.swift similarity index 100% rename from hellbender/Services/BitcoinServiceProtocol.swift rename to birch/Services/BitcoinServiceProtocol.swift diff --git a/hellbender/Services/DescriptorPDFGenerator.swift b/birch/Services/DescriptorPDFGenerator.swift similarity index 100% rename from hellbender/Services/DescriptorPDFGenerator.swift rename to birch/Services/DescriptorPDFGenerator.swift diff --git a/hellbender/Services/ElectrumConfig.swift b/birch/Services/ElectrumConfig.swift similarity index 100% rename from hellbender/Services/ElectrumConfig.swift rename to birch/Services/ElectrumConfig.swift diff --git a/hellbender/Services/FiatPriceService.swift b/birch/Services/FiatPriceService.swift similarity index 99% rename from hellbender/Services/FiatPriceService.swift rename to birch/Services/FiatPriceService.swift index bec1db6..0dad479 100644 --- a/hellbender/Services/FiatPriceService.swift +++ b/birch/Services/FiatPriceService.swift @@ -2,7 +2,7 @@ import Foundation import Observation import OSLog -private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "FiatPriceService") +private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "FiatPriceService") enum FiatSource: String, CaseIterable { case zeus diff --git a/hellbender/Services/LabelService.swift b/birch/Services/LabelService.swift similarity index 99% rename from hellbender/Services/LabelService.swift rename to birch/Services/LabelService.swift index 0171cee..6568b1e 100644 --- a/hellbender/Services/LabelService.swift +++ b/birch/Services/LabelService.swift @@ -2,7 +2,7 @@ import Foundation import OSLog import SwiftData -private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "LabelService") +private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "LabelService") /// Handles label propagation between transactions, UTXOs, and addresses. enum LabelService { diff --git a/hellbender/Services/QRVideoExporter.swift b/birch/Services/QRVideoExporter.swift similarity index 100% rename from hellbender/Services/QRVideoExporter.swift rename to birch/Services/QRVideoExporter.swift diff --git a/hellbender/Services/URService.swift b/birch/Services/URService.swift similarity index 100% rename from hellbender/Services/URService.swift rename to birch/Services/URService.swift diff --git a/hellbender/Utilities/AppError.swift b/birch/Utilities/AppError.swift similarity index 100% rename from hellbender/Utilities/AppError.swift rename to birch/Utilities/AppError.swift diff --git a/hellbender/Utilities/Constants.swift b/birch/Utilities/Constants.swift similarity index 98% rename from hellbender/Utilities/Constants.swift rename to birch/Utilities/Constants.swift index 047227e..48a6cf5 100644 --- a/hellbender/Utilities/Constants.swift +++ b/birch/Utilities/Constants.swift @@ -3,7 +3,7 @@ import Foundation enum Constants { // MARK: - App - static let appName = "Hellbender" + static let appName = "Birch" static let defaultNetwork: BitcoinNetwork = .testnet4 // MARK: - BIP48 P2WSH diff --git a/hellbender/Utilities/KeychainHelper.swift b/birch/Utilities/KeychainHelper.swift similarity index 100% rename from hellbender/Utilities/KeychainHelper.swift rename to birch/Utilities/KeychainHelper.swift diff --git a/hellbender/Utilities/LogExporter.swift b/birch/Utilities/LogExporter.swift similarity index 91% rename from hellbender/Utilities/LogExporter.swift rename to birch/Utilities/LogExporter.swift index e417d32..bcb1985 100644 --- a/hellbender/Utilities/LogExporter.swift +++ b/birch/Utilities/LogExporter.swift @@ -8,7 +8,7 @@ enum LogExporter { static func collectLogs(hours: Double = 1) throws -> String { let store = try OSLogStore(scope: .currentProcessIdentifier) let cutoff = store.position(date: Date().addingTimeInterval(-hours * 3600)) - let subsystem = Bundle.main.bundleIdentifier ?? "hellbender" + let subsystem = Bundle.main.bundleIdentifier ?? "birch" let entries = try store.getEntries(at: cutoff, matching: NSPredicate(format: "subsystem == %@", subsystem)) @@ -27,7 +27,7 @@ enum LogExporter { return "No log entries found in the last \(Int(hours)) hour(s)." } - let header = "Hellbender Logs — Exported \(formatter.string(from: Date()))\n" + let header = "Birch Logs — Exported \(formatter.string(from: Date()))\n" + "Entries: \(lines.count) (last \(Int(hours))h)\n" + String(repeating: "─", count: 60) + "\n" diff --git a/hellbender/ViewModels/AddressListViewModel.swift b/birch/ViewModels/AddressListViewModel.swift similarity index 100% rename from hellbender/ViewModels/AddressListViewModel.swift rename to birch/ViewModels/AddressListViewModel.swift diff --git a/hellbender/ViewModels/AppLockViewModel.swift b/birch/ViewModels/AppLockViewModel.swift similarity index 99% rename from hellbender/ViewModels/AppLockViewModel.swift rename to birch/ViewModels/AppLockViewModel.swift index 7c56edc..bedf837 100644 --- a/hellbender/ViewModels/AppLockViewModel.swift +++ b/birch/ViewModels/AppLockViewModel.swift @@ -4,7 +4,7 @@ import LocalAuthentication import OSLog import SwiftData -private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "AppLock") +private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "AppLock") @Observable @MainActor diff --git a/hellbender/ViewModels/BumpFeeViewModel.swift b/birch/ViewModels/BumpFeeViewModel.swift similarity index 99% rename from hellbender/ViewModels/BumpFeeViewModel.swift rename to birch/ViewModels/BumpFeeViewModel.swift index 4fdb2f8..99953d7 100644 --- a/hellbender/ViewModels/BumpFeeViewModel.swift +++ b/birch/ViewModels/BumpFeeViewModel.swift @@ -3,7 +3,7 @@ import Observation import OSLog import SwiftData -private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "BumpFeeViewModel") +private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "BumpFeeViewModel") @Observable @MainActor diff --git a/hellbender/ViewModels/PSBTFlowManaging.swift b/birch/ViewModels/PSBTFlowManaging.swift similarity index 100% rename from hellbender/ViewModels/PSBTFlowManaging.swift rename to birch/ViewModels/PSBTFlowManaging.swift diff --git a/hellbender/ViewModels/ReceiveViewModel.swift b/birch/ViewModels/ReceiveViewModel.swift similarity index 100% rename from hellbender/ViewModels/ReceiveViewModel.swift rename to birch/ViewModels/ReceiveViewModel.swift diff --git a/hellbender/ViewModels/SendViewModel.swift b/birch/ViewModels/SendViewModel.swift similarity index 99% rename from hellbender/ViewModels/SendViewModel.swift rename to birch/ViewModels/SendViewModel.swift index f4b8c74..5b2eb22 100644 --- a/hellbender/ViewModels/SendViewModel.swift +++ b/birch/ViewModels/SendViewModel.swift @@ -3,7 +3,7 @@ import Observation import OSLog import SwiftData -private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "SendViewModel") +private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "SendViewModel") @Observable @MainActor diff --git a/hellbender/ViewModels/SetupWizardViewModel.swift b/birch/ViewModels/SetupWizardViewModel.swift similarity index 100% rename from hellbender/ViewModels/SetupWizardViewModel.swift rename to birch/ViewModels/SetupWizardViewModel.swift diff --git a/hellbender/ViewModels/TransactionListViewModel.swift b/birch/ViewModels/TransactionListViewModel.swift similarity index 100% rename from hellbender/ViewModels/TransactionListViewModel.swift rename to birch/ViewModels/TransactionListViewModel.swift diff --git a/hellbender/ViewModels/UTXOListViewModel.swift b/birch/ViewModels/UTXOListViewModel.swift similarity index 100% rename from hellbender/ViewModels/UTXOListViewModel.swift rename to birch/ViewModels/UTXOListViewModel.swift diff --git a/hellbender/ViewModels/WalletManagerViewModel.swift b/birch/ViewModels/WalletManagerViewModel.swift similarity index 98% rename from hellbender/ViewModels/WalletManagerViewModel.swift rename to birch/ViewModels/WalletManagerViewModel.swift index d0c6830..6009e08 100644 --- a/hellbender/ViewModels/WalletManagerViewModel.swift +++ b/birch/ViewModels/WalletManagerViewModel.swift @@ -3,7 +3,7 @@ import Observation import OSLog import SwiftData -private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "WalletManager") +private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "WalletManager") @Observable @MainActor diff --git a/hellbender/Views/Components/BBQRDisplayView.swift b/birch/Views/Components/BBQRDisplayView.swift similarity index 98% rename from hellbender/Views/Components/BBQRDisplayView.swift rename to birch/Views/Components/BBQRDisplayView.swift index 226f73a..3f2dfe0 100644 --- a/hellbender/Views/Components/BBQRDisplayView.swift +++ b/birch/Views/Components/BBQRDisplayView.swift @@ -3,7 +3,7 @@ import CoreImage.CIFilterBuiltins import OSLog import SwiftUI -private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "BBQRDisplayView") +private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "BBQRDisplayView") struct BBQRDisplayView: View { let data: Data diff --git a/hellbender/Views/Components/CharWrapText.swift b/birch/Views/Components/CharWrapText.swift similarity index 100% rename from hellbender/Views/Components/CharWrapText.swift rename to birch/Views/Components/CharWrapText.swift diff --git a/hellbender/Views/Components/CosignerCardView.swift b/birch/Views/Components/CosignerCardView.swift similarity index 100% rename from hellbender/Views/Components/CosignerCardView.swift rename to birch/Views/Components/CosignerCardView.swift diff --git a/hellbender/Views/Components/PINPadView.swift b/birch/Views/Components/PINPadView.swift similarity index 100% rename from hellbender/Views/Components/PINPadView.swift rename to birch/Views/Components/PINPadView.swift diff --git a/hellbender/Views/Components/QRCodeView.swift b/birch/Views/Components/QRCodeView.swift similarity index 100% rename from hellbender/Views/Components/QRCodeView.swift rename to birch/Views/Components/QRCodeView.swift diff --git a/hellbender/Views/Components/Theme.swift b/birch/Views/Components/Theme.swift similarity index 88% rename from hellbender/Views/Components/Theme.swift rename to birch/Views/Components/Theme.swift index cbdbf57..cd6f1cb 100644 --- a/hellbender/Views/Components/Theme.swift +++ b/birch/Views/Components/Theme.swift @@ -78,17 +78,17 @@ struct HBTheme { ) static let birchLight = HBTheme( - background: Color(red: 0.929, green: 0.910, blue: 0.875), - surface: Color(red: 0.851, green: 0.824, blue: 0.773), - surfaceElevated: Color(red: 0.929, green: 0.910, blue: 0.875), - border: Color(red: 0.769, green: 0.741, blue: 0.690), - textPrimary: Color(red: 0.165, green: 0.145, blue: 0.125), - textSecondary: Color(red: 0.420, green: 0.380, blue: 0.345), - accent: Color(red: 0.769, green: 0.584, blue: 0.165), - heroBackground: Color(red: 0.851, green: 0.824, blue: 0.773), - success: Color(red: 0.353, green: 0.400, blue: 0.259), - error: Color(red: 0.549, green: 0.188, blue: 0.125), - secondaryAccent: Color(red: 0.353, green: 0.400, blue: 0.259), + background: Color(red: 0.949, green: 0.933, blue: 0.902), + surface: Color(red: 0.890, green: 0.867, blue: 0.827), + surfaceElevated: Color(red: 0.949, green: 0.933, blue: 0.902), + border: Color(red: 0.690, green: 0.663, blue: 0.616), + textPrimary: Color(red: 0.137, green: 0.122, blue: 0.106), + textSecondary: Color(red: 0.310, green: 0.282, blue: 0.251), + accent: Color(red: 0.698, green: 0.525, blue: 0.133), + heroBackground: Color(red: 0.890, green: 0.867, blue: 0.827), + success: Color(red: 0.278, green: 0.373, blue: 0.224), + error: Color(red: 0.600, green: 0.180, blue: 0.120), + secondaryAccent: Color(red: 0.278, green: 0.373, blue: 0.224), colorScheme: .light ) } @@ -105,8 +105,8 @@ enum AppTheme: String, CaseIterable { var displayName: String { switch self { case .system: "System" - case .dark: "Dark" - case .light: "Light" + case .dark: "Hellbender Dark" + case .light: "Hellbender Light" case .birchDark: "Birch Dark" case .birchLight: "Birch Light" } @@ -128,7 +128,7 @@ enum AppTheme: String, CaseIterable { @Observable final class ThemeManager { static let shared = ThemeManager() - private(set) var theme: HBTheme = .dark + private(set) var theme: HBTheme = .birchDark private init() { let saved = UserDefaults.standard.string(forKey: Constants.themeKey) ?? AppTheme.system.rawValue @@ -143,7 +143,7 @@ final class ThemeManager { /// Sets the displayed theme to the appropriate custom palette for the given OS color scheme. /// Only used when the System theme is selected — does not save to UserDefaults. func applySystemColorScheme(_ colorScheme: ColorScheme) { - theme = colorScheme == .dark ? .dark : .light + theme = colorScheme == .dark ? .birchDark : .birchLight } } @@ -288,6 +288,21 @@ extension View { } } +// MARK: - Themed App Icon + +/// Renders the app-icon artwork that matches the current theme's light/dark appearance. +/// Uses `AppIconPreviewLight` on light color schemes, `AppIconPreviewDark` on dark. +/// The theme is applied via `.preferredColorScheme` at the root, so this works for +/// all AppTheme cases (system, birch light/dark). +struct ThemedAppIcon: View { + @Environment(\.colorScheme) private var colorScheme + + var body: some View { + Image(colorScheme == .dark ? "AppIconPreviewDark" : "AppIconPreviewLight") + .resizable() + } +} + // MARK: - Network Badge struct NetworkBadge: View { diff --git a/hellbender/Views/Components/URDisplaySheet.swift b/birch/Views/Components/URDisplaySheet.swift similarity index 100% rename from hellbender/Views/Components/URDisplaySheet.swift rename to birch/Views/Components/URDisplaySheet.swift diff --git a/hellbender/Views/Components/URScannerSheet.swift b/birch/Views/Components/URScannerSheet.swift similarity index 99% rename from hellbender/Views/Components/URScannerSheet.swift rename to birch/Views/Components/URScannerSheet.swift index 96003bf..cea5125 100644 --- a/hellbender/Views/Components/URScannerSheet.swift +++ b/birch/Views/Components/URScannerSheet.swift @@ -6,7 +6,7 @@ import SwiftUI import URKit import URUI -private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "URScannerSheet") +private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "URScannerSheet") struct URScannerSheet: View { let onResult: (AppURResult) -> Void diff --git a/hellbender/Views/Main/Dashboard/ConnectionStatusView.swift b/birch/Views/Main/Dashboard/ConnectionStatusView.swift similarity index 99% rename from hellbender/Views/Main/Dashboard/ConnectionStatusView.swift rename to birch/Views/Main/Dashboard/ConnectionStatusView.swift index bbd24b2..5098fec 100644 --- a/hellbender/Views/Main/Dashboard/ConnectionStatusView.swift +++ b/birch/Views/Main/Dashboard/ConnectionStatusView.swift @@ -265,7 +265,7 @@ struct ConnectionStatusView: View { } private func copyDebugInfo() { - var lines = ["=== Hellbender Debug Info ==="] + var lines = ["=== Birch Debug Info ==="] lines.append("Timestamp: \(ISO8601DateFormatter().string(from: Date()))") // SwiftData wallet info diff --git a/hellbender/Views/Main/MainTabView.swift b/birch/Views/Main/MainTabView.swift similarity index 96% rename from hellbender/Views/Main/MainTabView.swift rename to birch/Views/Main/MainTabView.swift index 36162a9..a3ddcf4 100644 --- a/hellbender/Views/Main/MainTabView.swift +++ b/birch/Views/Main/MainTabView.swift @@ -2,7 +2,7 @@ import OSLog import SwiftData import SwiftUI -private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "Navigation") +private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "Navigation") struct MainTabView: View { @State private var selectedTab = 0 diff --git a/hellbender/Views/Main/Receive/AddressDetailView.swift b/birch/Views/Main/Receive/AddressDetailView.swift similarity index 100% rename from hellbender/Views/Main/Receive/AddressDetailView.swift rename to birch/Views/Main/Receive/AddressDetailView.swift diff --git a/hellbender/Views/Main/Receive/AddressListView.swift b/birch/Views/Main/Receive/AddressListView.swift similarity index 100% rename from hellbender/Views/Main/Receive/AddressListView.swift rename to birch/Views/Main/Receive/AddressListView.swift diff --git a/hellbender/Views/Main/Receive/ReceiveView.swift b/birch/Views/Main/Receive/ReceiveView.swift similarity index 100% rename from hellbender/Views/Main/Receive/ReceiveView.swift rename to birch/Views/Main/Receive/ReceiveView.swift diff --git a/hellbender/Views/Main/Send/BroadcastResultView.swift b/birch/Views/Main/Send/BroadcastResultView.swift similarity index 98% rename from hellbender/Views/Main/Send/BroadcastResultView.swift rename to birch/Views/Main/Send/BroadcastResultView.swift index e2430ec..fb1eacd 100644 --- a/hellbender/Views/Main/Send/BroadcastResultView.swift +++ b/birch/Views/Main/Send/BroadcastResultView.swift @@ -243,7 +243,7 @@ struct BroadcastResultView: View { walletID: walletID ) } catch { - Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "LabelService") + Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "LabelService") .error("Failed to propagate change label: \(error.localizedDescription)") } } diff --git a/hellbender/Views/Main/Send/PSBTDisplayView.swift b/birch/Views/Main/Send/PSBTDisplayView.swift similarity index 100% rename from hellbender/Views/Main/Send/PSBTDisplayView.swift rename to birch/Views/Main/Send/PSBTDisplayView.swift diff --git a/hellbender/Views/Main/Send/PSBTScanView.swift b/birch/Views/Main/Send/PSBTScanView.swift similarity index 100% rename from hellbender/Views/Main/Send/PSBTScanView.swift rename to birch/Views/Main/Send/PSBTScanView.swift diff --git a/hellbender/Views/Main/Send/SavedPSBTListView.swift b/birch/Views/Main/Send/SavedPSBTListView.swift similarity index 100% rename from hellbender/Views/Main/Send/SavedPSBTListView.swift rename to birch/Views/Main/Send/SavedPSBTListView.swift diff --git a/hellbender/Views/Main/Send/SendAmountView.swift b/birch/Views/Main/Send/SendAmountView.swift similarity index 100% rename from hellbender/Views/Main/Send/SendAmountView.swift rename to birch/Views/Main/Send/SendAmountView.swift diff --git a/hellbender/Views/Main/Send/SendFlowView.swift b/birch/Views/Main/Send/SendFlowView.swift similarity index 100% rename from hellbender/Views/Main/Send/SendFlowView.swift rename to birch/Views/Main/Send/SendFlowView.swift diff --git a/hellbender/Views/Main/Send/SendReviewView.swift b/birch/Views/Main/Send/SendReviewView.swift similarity index 100% rename from hellbender/Views/Main/Send/SendReviewView.swift rename to birch/Views/Main/Send/SendReviewView.swift diff --git a/hellbender/Views/Main/Settings/DescriptorPDFView.swift b/birch/Views/Main/Settings/DescriptorPDFView.swift similarity index 100% rename from hellbender/Views/Main/Settings/DescriptorPDFView.swift rename to birch/Views/Main/Settings/DescriptorPDFView.swift diff --git a/hellbender/Views/Main/Settings/SettingsView.swift b/birch/Views/Main/Settings/SettingsView.swift similarity index 85% rename from hellbender/Views/Main/Settings/SettingsView.swift rename to birch/Views/Main/Settings/SettingsView.swift index 609727c..95162d9 100644 --- a/hellbender/Views/Main/Settings/SettingsView.swift +++ b/birch/Views/Main/Settings/SettingsView.swift @@ -3,7 +3,7 @@ import OSLog import SwiftData import SwiftUI -private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "Settings") +private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "Settings") struct SettingsView: View { @Environment(\.modelContext) private var modelContext @@ -24,11 +24,6 @@ struct SettingsView: View { // Security AppLockSettingsSection() - // Appearance - Section("Appearance") { - AppearanceSettingsRow() - } - // Fee Estimation Section("Fee Estimation") { FeeSettingsRow() @@ -39,6 +34,16 @@ struct SettingsView: View { FiatSettingsRow() } + // Appearance + Section("Appearance") { + AppearanceSettingsRow() + } + + // App Icon + Section("App Icon") { + AppIconSettingsRow() + } + // About Section("About") { HStack { @@ -92,6 +97,108 @@ private struct AppearanceSettingsRow: View { } } +// MARK: - App Icon Settings + +private enum AppIconOption: String, CaseIterable, Identifiable { + case light + case dark + + var id: String { + rawValue + } + + /// Name passed to `UIApplication.setAlternateIconName`; `nil` selects the primary icon. + var alternateIconName: String? { + switch self { + case .light: nil + case .dark: "AppIcon-Dark" + } + } + + var displayName: String { + switch self { + case .light: "Light" + case .dark: "Dark" + } + } + + var previewAssetName: String { + switch self { + case .light: "AppIconPreviewLight" + case .dark: "AppIconPreviewDark" + } + } + + static var current: AppIconOption { + UIApplication.shared.alternateIconName == "AppIcon-Dark" ? .dark : .light + } +} + +private struct AppIconSettingsRow: View { + @State private var selected: AppIconOption = .current + + var body: some View { + HStack(spacing: 12) { + ForEach(AppIconOption.allCases) { option in + AppIconTile(option: option, isSelected: selected == option) { + select(option) + } + } + } + .listRowBackground(Color.hbSurface) + } + + private func select(_ option: AppIconOption) { + guard selected != option else { return } + UIApplication.shared.setAlternateIconName(option.alternateIconName) { error in + Task { @MainActor in + if let error { + logger.error("Failed to set app icon: \(error.localizedDescription, privacy: .public)") + } else { + logger.info("App icon changed to \(option.displayName, privacy: .public)") + selected = option + } + } + } + } +} + +private struct AppIconTile: View { + let option: AppIconOption + let isSelected: Bool + let onTap: () -> Void + + var body: some View { + Button(action: onTap) { + VStack(spacing: 8) { + Image(option.previewAssetName) + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 72, height: 72) + .clipShape(RoundedRectangle(cornerRadius: 16, style: .continuous)) + .overlay( + RoundedRectangle(cornerRadius: 16, style: .continuous) + .stroke(isSelected ? Color.hbBitcoinOrange : Color.hbBorder, lineWidth: isSelected ? 3 : 1) + ) + + HStack(spacing: 4) { + if isSelected { + Image(systemName: "checkmark.circle.fill") + .font(.system(size: 12)) + .foregroundStyle(Color.hbBitcoinOrange) + } + Text(option.displayName) + .font(.hbBody(13)) + .foregroundStyle(Color.hbTextPrimary) + } + } + .frame(maxWidth: .infinity) + .padding(.vertical, 8) + } + .buttonStyle(.plain) + } +} + // MARK: - Denomination Settings private struct DenominationSettingsRow: View { diff --git a/hellbender/Views/Main/Settings/UTXODetailView.swift b/birch/Views/Main/Settings/UTXODetailView.swift similarity index 99% rename from hellbender/Views/Main/Settings/UTXODetailView.swift rename to birch/Views/Main/Settings/UTXODetailView.swift index 6f841b0..a4f0f0d 100644 --- a/hellbender/Views/Main/Settings/UTXODetailView.swift +++ b/birch/Views/Main/Settings/UTXODetailView.swift @@ -2,7 +2,7 @@ import OSLog import SwiftData import SwiftUI -private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "UTXODetail") +private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "UTXODetail") struct UTXODetailView: View { let utxo: UTXOItem diff --git a/hellbender/Views/Main/Settings/UTXOListView.swift b/birch/Views/Main/Settings/UTXOListView.swift similarity index 100% rename from hellbender/Views/Main/Settings/UTXOListView.swift rename to birch/Views/Main/Settings/UTXOListView.swift diff --git a/hellbender/Views/Main/Settings/WalletInfoView.swift b/birch/Views/Main/Settings/WalletInfoView.swift similarity index 99% rename from hellbender/Views/Main/Settings/WalletInfoView.swift rename to birch/Views/Main/Settings/WalletInfoView.swift index 501374b..322e28a 100644 --- a/hellbender/Views/Main/Settings/WalletInfoView.swift +++ b/birch/Views/Main/Settings/WalletInfoView.swift @@ -3,7 +3,7 @@ import SwiftData import SwiftUI import URKit -private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "WalletInfo") +private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "WalletInfo") struct WalletInfoView: View { @Environment(\.modelContext) private var modelContext diff --git a/hellbender/Views/Main/Transactions/BumpFeeView.swift b/birch/Views/Main/Transactions/BumpFeeView.swift similarity index 100% rename from hellbender/Views/Main/Transactions/BumpFeeView.swift rename to birch/Views/Main/Transactions/BumpFeeView.swift diff --git a/hellbender/Views/Main/Transactions/TransactionDetailView.swift b/birch/Views/Main/Transactions/TransactionDetailView.swift similarity index 99% rename from hellbender/Views/Main/Transactions/TransactionDetailView.swift rename to birch/Views/Main/Transactions/TransactionDetailView.swift index 1bb926f..6189a00 100644 --- a/hellbender/Views/Main/Transactions/TransactionDetailView.swift +++ b/birch/Views/Main/Transactions/TransactionDetailView.swift @@ -2,7 +2,7 @@ import OSLog import SwiftData import SwiftUI -private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "TransactionDetailView") +private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "TransactionDetailView") struct TransactionDetailView: View { let transaction: TransactionItem diff --git a/hellbender/Views/Main/Transactions/TransactionListView.swift b/birch/Views/Main/Transactions/TransactionListView.swift similarity index 99% rename from hellbender/Views/Main/Transactions/TransactionListView.swift rename to birch/Views/Main/Transactions/TransactionListView.swift index 6aa0f25..a78e7d2 100644 --- a/hellbender/Views/Main/Transactions/TransactionListView.swift +++ b/birch/Views/Main/Transactions/TransactionListView.swift @@ -3,7 +3,7 @@ import SwiftData import SwiftUI import UniformTypeIdentifiers -private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "TransactionListView") +private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "TransactionListView") struct TransactionListView: View { @Query private var wallets: [WalletProfile] diff --git a/hellbender/Views/Main/Transactions/TransactionRowView.swift b/birch/Views/Main/Transactions/TransactionRowView.swift similarity index 100% rename from hellbender/Views/Main/Transactions/TransactionRowView.swift rename to birch/Views/Main/Transactions/TransactionRowView.swift diff --git a/hellbender/Views/Main/Transactions/WalletDashboardView.swift b/birch/Views/Main/Transactions/WalletDashboardView.swift similarity index 100% rename from hellbender/Views/Main/Transactions/WalletDashboardView.swift rename to birch/Views/Main/Transactions/WalletDashboardView.swift diff --git a/hellbender/Views/Setup/CosignerImportView.swift b/birch/Views/Setup/CosignerImportView.swift similarity index 100% rename from hellbender/Views/Setup/CosignerImportView.swift rename to birch/Views/Setup/CosignerImportView.swift diff --git a/hellbender/Views/Setup/DescriptorImportView.swift b/birch/Views/Setup/DescriptorImportView.swift similarity index 100% rename from hellbender/Views/Setup/DescriptorImportView.swift rename to birch/Views/Setup/DescriptorImportView.swift diff --git a/hellbender/Views/Setup/ElectrumServerSetupSection.swift b/birch/Views/Setup/ElectrumServerSetupSection.swift similarity index 100% rename from hellbender/Views/Setup/ElectrumServerSetupSection.swift rename to birch/Views/Setup/ElectrumServerSetupSection.swift diff --git a/hellbender/Views/Setup/MultisigConfigView.swift b/birch/Views/Setup/MultisigConfigView.swift similarity index 100% rename from hellbender/Views/Setup/MultisigConfigView.swift rename to birch/Views/Setup/MultisigConfigView.swift diff --git a/hellbender/Views/Setup/NumberPickerSheet.swift b/birch/Views/Setup/NumberPickerSheet.swift similarity index 100% rename from hellbender/Views/Setup/NumberPickerSheet.swift rename to birch/Views/Setup/NumberPickerSheet.swift diff --git a/hellbender/Views/Setup/SetupWizardView.swift b/birch/Views/Setup/SetupWizardView.swift similarity index 100% rename from hellbender/Views/Setup/SetupWizardView.swift rename to birch/Views/Setup/SetupWizardView.swift diff --git a/hellbender/Views/Setup/WalletCreationChoiceView.swift b/birch/Views/Setup/WalletCreationChoiceView.swift similarity index 100% rename from hellbender/Views/Setup/WalletCreationChoiceView.swift rename to birch/Views/Setup/WalletCreationChoiceView.swift diff --git a/hellbender/Views/Setup/WalletNameView.swift b/birch/Views/Setup/WalletNameView.swift similarity index 100% rename from hellbender/Views/Setup/WalletNameView.swift rename to birch/Views/Setup/WalletNameView.swift diff --git a/hellbender/Views/Setup/WalletReviewView.swift b/birch/Views/Setup/WalletReviewView.swift similarity index 100% rename from hellbender/Views/Setup/WalletReviewView.swift rename to birch/Views/Setup/WalletReviewView.swift diff --git a/hellbender/Views/Setup/WalletVerifyView.swift b/birch/Views/Setup/WalletVerifyView.swift similarity index 95% rename from hellbender/Views/Setup/WalletVerifyView.swift rename to birch/Views/Setup/WalletVerifyView.swift index 6e46a10..4f000ac 100644 --- a/hellbender/Views/Setup/WalletVerifyView.swift +++ b/birch/Views/Setup/WalletVerifyView.swift @@ -75,7 +75,7 @@ struct WalletVerifyView: View { .foregroundStyle(Color.hbTextPrimary) } - Text("The output descriptor is your **only** recovery path. If you lose Hellbender (phone dies, app deleted, data corrupted), the descriptor is the only thing needed to rebuild the wallet in any compatible coordinator (Sparrow, Nunchuk, etc.). Without it, you'd need to re-gather all cosigner xpubs and reconstruct the exact same configuration — which may not be possible.") + Text("The output descriptor is your **only** recovery path. If you lose Birch (phone dies, app deleted, data corrupted), the descriptor is the only thing needed to rebuild the wallet in any compatible coordinator (Sparrow, Nunchuk, etc.). Without it, you'd need to re-gather all cosigner xpubs and reconstruct the exact same configuration — which may not be possible.") .font(.hbBody(13)) .foregroundStyle(Color.hbTextSecondary) @@ -140,7 +140,7 @@ struct WalletVerifyView: View { .font(.hbHeadline) .foregroundStyle(Color.hbTextPrimary) - Text("Verifying your first receive address confirms that Hellbender built the correct output descriptor and will generate the same addresses as your cosigner devices. If the addresses don't match, funds sent to this wallet could be unspendable.") + Text("Verifying your first receive address confirms that Birch built the correct output descriptor and will generate the same addresses as your cosigner devices. If the addresses don't match, funds sent to this wallet could be unspendable.") .font(.hbBody(13)) .foregroundStyle(Color.hbTextSecondary) diff --git a/hellbender/Views/Setup/WelcomeStepView.swift b/birch/Views/Setup/WelcomeStepView.swift similarity index 88% rename from hellbender/Views/Setup/WelcomeStepView.swift rename to birch/Views/Setup/WelcomeStepView.swift index c68b763..557676f 100644 --- a/hellbender/Views/Setup/WelcomeStepView.swift +++ b/birch/Views/Setup/WelcomeStepView.swift @@ -8,8 +8,7 @@ struct WelcomeStepView: View { Spacer() // Icon - Image("WelcomeIcon") - .resizable() + ThemedAppIcon() .aspectRatio(contentMode: .fit) .frame(width: 120, height: 120) .clipShape(RoundedRectangle(cornerRadius: 28, style: .continuous)) @@ -19,13 +18,9 @@ struct WelcomeStepView: View { .blur(radius: 12) .clipShape(RoundedRectangle(cornerRadius: 28, style: .continuous)) ) - .overlay( - RoundedRectangle(cornerRadius: 28, style: .continuous) - .strokeBorder(Color.hbBorder.opacity(0.5), lineWidth: 1) - ) VStack(spacing: 12) { - Text("Hellbender Wallet") + Text("Birch Wallet") .font(.hbDisplay(34)) .foregroundStyle(Color.hbTextPrimary) diff --git a/hellbender/hellbenderApp.swift b/birch/birchApp.swift similarity index 98% rename from hellbender/hellbenderApp.swift rename to birch/birchApp.swift index afbe952..ca9d18f 100644 --- a/hellbender/hellbenderApp.swift +++ b/birch/birchApp.swift @@ -2,7 +2,7 @@ import SwiftData import SwiftUI @main -struct hellbenderApp: App { +struct birchApp: App { let modelContainer: ModelContainer init() { diff --git a/hellbenderTests/AddressDerivationTests.swift b/birchTests/AddressDerivationTests.swift similarity index 98% rename from hellbenderTests/AddressDerivationTests.swift rename to birchTests/AddressDerivationTests.swift index 2f84683..6eb08f2 100644 --- a/hellbenderTests/AddressDerivationTests.swift +++ b/birchTests/AddressDerivationTests.swift @@ -1,5 +1,5 @@ +@testable import birch import Foundation -@testable import hellbender import Testing @MainActor diff --git a/hellbenderTests/BumpFeeViewModelTests.swift b/birchTests/BumpFeeViewModelTests.swift similarity index 99% rename from hellbenderTests/BumpFeeViewModelTests.swift rename to birchTests/BumpFeeViewModelTests.swift index 011a751..5a1ae73 100644 --- a/hellbenderTests/BumpFeeViewModelTests.swift +++ b/birchTests/BumpFeeViewModelTests.swift @@ -1,5 +1,5 @@ +@testable import birch import Foundation -@testable import hellbender import Testing @MainActor diff --git a/hellbenderTests/CosignerValidationTests.swift b/birchTests/CosignerValidationTests.swift similarity index 99% rename from hellbenderTests/CosignerValidationTests.swift rename to birchTests/CosignerValidationTests.swift index bf07a47..d2298e8 100644 --- a/hellbenderTests/CosignerValidationTests.swift +++ b/birchTests/CosignerValidationTests.swift @@ -1,5 +1,5 @@ +@testable import birch import Foundation -@testable import hellbender import Testing @MainActor diff --git a/hellbenderTests/DescriptorTests.swift b/birchTests/DescriptorTests.swift similarity index 99% rename from hellbenderTests/DescriptorTests.swift rename to birchTests/DescriptorTests.swift index a9274af..0cdf228 100644 --- a/hellbenderTests/DescriptorTests.swift +++ b/birchTests/DescriptorTests.swift @@ -1,5 +1,5 @@ +@testable import birch import Foundation -@testable import hellbender import Testing import URKit diff --git a/hellbenderTests/ElectrumConfigTests.swift b/birchTests/ElectrumConfigTests.swift similarity index 98% rename from hellbenderTests/ElectrumConfigTests.swift rename to birchTests/ElectrumConfigTests.swift index ec33e73..0bcc3fd 100644 --- a/hellbenderTests/ElectrumConfigTests.swift +++ b/birchTests/ElectrumConfigTests.swift @@ -1,6 +1,6 @@ +@testable import birch import BitcoinDevKit import Foundation -@testable import hellbender import Testing struct ElectrumConfigTests { diff --git a/hellbenderTests/Fixtures/test_addresses.json b/birchTests/Fixtures/test_addresses.json similarity index 100% rename from hellbenderTests/Fixtures/test_addresses.json rename to birchTests/Fixtures/test_addresses.json diff --git a/hellbenderTests/Fixtures/test_descriptors.json b/birchTests/Fixtures/test_descriptors.json similarity index 100% rename from hellbenderTests/Fixtures/test_descriptors.json rename to birchTests/Fixtures/test_descriptors.json diff --git a/hellbenderTests/Fixtures/test_psbt_partial.txt b/birchTests/Fixtures/test_psbt_partial.txt similarity index 100% rename from hellbenderTests/Fixtures/test_psbt_partial.txt rename to birchTests/Fixtures/test_psbt_partial.txt diff --git a/hellbenderTests/Fixtures/test_psbt_unsigned.txt b/birchTests/Fixtures/test_psbt_unsigned.txt similarity index 100% rename from hellbenderTests/Fixtures/test_psbt_unsigned.txt rename to birchTests/Fixtures/test_psbt_unsigned.txt diff --git a/hellbenderTests/Fixtures/test_xpubs.json b/birchTests/Fixtures/test_xpubs.json similarity index 100% rename from hellbenderTests/Fixtures/test_xpubs.json rename to birchTests/Fixtures/test_xpubs.json diff --git a/hellbenderTests/LabelServiceExportTests.swift b/birchTests/LabelServiceExportTests.swift similarity index 98% rename from hellbenderTests/LabelServiceExportTests.swift rename to birchTests/LabelServiceExportTests.swift index 3c610ca..18f43ce 100644 --- a/hellbenderTests/LabelServiceExportTests.swift +++ b/birchTests/LabelServiceExportTests.swift @@ -1,5 +1,5 @@ +@testable import birch import Foundation -@testable import hellbender import Testing import URKit @@ -483,7 +483,7 @@ struct LabelServiceExportTests { {"fee":18,"height":126660,"label":"Testing 123","origin":"wsh(sortedmulti(1,[7a13a7b1/48h/1h/0h/2h],[30a36b52/48h/1h/0h/2h]))","ref":"9ffb2b905fd9974d76d8682d12eee200fd910da18322670a2525a307a83e5b1c","time":"2026-03-20T04:23:45Z","type":"tx","value":-5702} {"fee":18,"height":126626,"label":"Testing 2","origin":"wsh(sortedmulti(1,[7a13a7b1/48h/1h/0h/2h],[30a36b52/48h/1h/0h/2h]))","ref":"c59897e7fe50ce35fb8ef2b58ecc7c0180a762a4e0e841240d9fa37c2244bb74","time":"2026-03-19T19:44:53Z","type":"tx","value":-6863} {"fee":456,"height":126624,"label":"Another New Label from Sparrow","origin":"wsh(sortedmulti(1,[7a13a7b1/48h/1h/0h/2h],[30a36b52/48h/1h/0h/2h]))","ref":"bf05617c5dd16c26ca7dbc1daa13d4b1e8ffd8d1f50d770988dfaf1dd938adda","time":"2026-03-19T18:19:46Z","type":"tx","value":-5456} - {"fee":241,"height":126137,"label":"Hellbender Label!","origin":"wsh(sortedmulti(1,[7a13a7b1/48h/1h/0h/2h],[30a36b52/48h/1h/0h/2h]))","ref":"f9b837f77390e2c69d8a33c73501f32ec1a61fe29b2b77365da86025e8a20db3","time":"2026-03-16T02:18:41Z","type":"tx","value":-35923} + {"fee":241,"height":126137,"label":"Birch Label!","origin":"wsh(sortedmulti(1,[7a13a7b1/48h/1h/0h/2h],[30a36b52/48h/1h/0h/2h]))","ref":"f9b837f77390e2c69d8a33c73501f32ec1a61fe29b2b77365da86025e8a20db3","time":"2026-03-16T02:18:41Z","type":"tx","value":-35923} {"fee":331,"height":126043,"origin":"wsh(sortedmulti(1,[7a13a7b1/48h/1h/0h/2h],[30a36b52/48h/1h/0h/2h]))","ref":"d5135c176580a669b6080cc9c646520ba9dfd76494165d32cef66a1b4b710dcc","time":"2026-03-15T12:21:53Z","type":"tx","value":-25819} {"fee":325,"height":125745,"label":"a, a, a, a, a","origin":"wsh(sortedmulti(1,[7a13a7b1/48h/1h/0h/2h],[30a36b52/48h/1h/0h/2h]))","ref":"9ff56ff21d6ba4dc288e5bd70ac4b71a392b78ab5867e8459981f9fc9ffcba74","time":"2026-03-12T20:07:14Z","type":"tx","value":141265} {"fee":872,"height":125673,"origin":"wsh(sortedmulti(1,[7a13a7b1/48h/1h/0h/2h],[30a36b52/48h/1h/0h/2h]))","ref":"f7dc3c574a4f53060b244fa59708f0c30dbeb0a70192f846d9cd74ef278f19b9","time":"2026-03-12T06:05:01Z","type":"tx","value":-3217} diff --git a/hellbenderTests/Mocks/MockBitcoinService.swift b/birchTests/Mocks/MockBitcoinService.swift similarity index 99% rename from hellbenderTests/Mocks/MockBitcoinService.swift rename to birchTests/Mocks/MockBitcoinService.swift index 84be8f3..494ecfd 100644 --- a/hellbenderTests/Mocks/MockBitcoinService.swift +++ b/birchTests/Mocks/MockBitcoinService.swift @@ -1,5 +1,5 @@ +@testable import birch import Foundation -@testable import hellbender /// Configurable mock for testing ViewModels without BDK dependencies @MainActor diff --git a/hellbenderTests/PSBTTests.swift b/birchTests/PSBTTests.swift similarity index 99% rename from hellbenderTests/PSBTTests.swift rename to birchTests/PSBTTests.swift index f3411d7..e125862 100644 --- a/hellbenderTests/PSBTTests.swift +++ b/birchTests/PSBTTests.swift @@ -1,5 +1,5 @@ +@testable import birch import Foundation -@testable import hellbender import Testing @MainActor diff --git a/hellbenderTests/SendViewModelTests.swift b/birchTests/SendViewModelTests.swift similarity index 99% rename from hellbenderTests/SendViewModelTests.swift rename to birchTests/SendViewModelTests.swift index 442cdb1..6e89e15 100644 --- a/hellbenderTests/SendViewModelTests.swift +++ b/birchTests/SendViewModelTests.swift @@ -1,5 +1,5 @@ +@testable import birch import Foundation -@testable import hellbender import Testing @MainActor diff --git a/hellbenderTests/SigningFlowTests.swift b/birchTests/SigningFlowTests.swift similarity index 99% rename from hellbenderTests/SigningFlowTests.swift rename to birchTests/SigningFlowTests.swift index e499b40..5f4b694 100644 --- a/hellbenderTests/SigningFlowTests.swift +++ b/birchTests/SigningFlowTests.swift @@ -1,5 +1,5 @@ +@testable import birch import Foundation -@testable import hellbender import Testing @MainActor diff --git a/hellbenderTests/URServiceTests.swift b/birchTests/URServiceTests.swift similarity index 99% rename from hellbenderTests/URServiceTests.swift rename to birchTests/URServiceTests.swift index 15bb137..48d5059 100644 --- a/hellbenderTests/URServiceTests.swift +++ b/birchTests/URServiceTests.swift @@ -1,5 +1,5 @@ +@testable import birch import Foundation -@testable import hellbender import Testing struct URServiceTests { diff --git a/hellbenderTests/WalletProfileTests.swift b/birchTests/WalletProfileTests.swift similarity index 99% rename from hellbenderTests/WalletProfileTests.swift rename to birchTests/WalletProfileTests.swift index 939a98f..35b3a5f 100644 --- a/hellbenderTests/WalletProfileTests.swift +++ b/birchTests/WalletProfileTests.swift @@ -1,5 +1,5 @@ +@testable import birch import Foundation -@testable import hellbender import SwiftData import Testing diff --git a/hellbenderUITests/ScreenshotTests.swift b/birchUITests/ScreenshotTests.swift similarity index 99% rename from hellbenderUITests/ScreenshotTests.swift rename to birchUITests/ScreenshotTests.swift index acb3863..f92ff33 100644 --- a/hellbenderUITests/ScreenshotTests.swift +++ b/birchUITests/ScreenshotTests.swift @@ -1,12 +1,12 @@ // // ScreenshotTests.swift -// hellbenderUITests +// birchUITests // // Fastlane `snapshot` walker. Invoked by `bundle exec fastlane screenshots` // (see fastlane/Fastfile). Walks the app from Welcome through the main tabs, // calling `snapshot(...)` at each marketing stop. // -// Kept separate from hellbenderUITests.swift on purpose: the assertion-heavy +// Kept separate from birchUITests.swift on purpose: the assertion-heavy // setup test validates that the flow still works, and this test is purely for // capturing images. The descriptor-import sequence is duplicated (not shared) // so each test fails in isolation. @@ -48,7 +48,7 @@ final class ScreenshotTests: XCTestCase { // MARK: Walk the descriptor-import flow to reach a loaded wallet. - // (Mirrors hellbenderUITests.swift `testSetupWalletViaDescriptorImport`.) + // (Mirrors birchUITests.swift `testSetupWalletViaDescriptorImport`.) let importCard = app.staticTexts["Import Descriptor"] XCTAssertTrue(importCard.waitForExistence(timeout: 3), "Creation choice should show 'Import Descriptor' option") @@ -101,7 +101,7 @@ final class ScreenshotTests: XCTestCase { let nameField = app.textFields["My Wallet"] XCTAssertTrue(nameField.waitForExistence(timeout: 3), "Wallet name text field should exist") nameField.tap() - nameField.typeText("Hellbender") + nameField.typeText("Birch") // In descriptor-import mode the button reads "Create Wallet" (not "Next") // and skips the Review screen, going straight to the loaded wallet. diff --git a/hellbenderUITests/SnapshotHelper.swift b/birchUITests/SnapshotHelper.swift similarity index 100% rename from hellbenderUITests/SnapshotHelper.swift rename to birchUITests/SnapshotHelper.swift diff --git a/hellbenderUITests/hellbenderUITests.swift b/birchUITests/birchUITests.swift similarity index 97% rename from hellbenderUITests/hellbenderUITests.swift rename to birchUITests/birchUITests.swift index 13f1003..a9844b3 100644 --- a/hellbenderUITests/hellbenderUITests.swift +++ b/birchUITests/birchUITests.swift @@ -1,13 +1,13 @@ // -// hellbenderUITests.swift -// hellbenderUITests +// birchUITests.swift +// birchUITests // // Created by Nick Klockenga on 3/8/26. // import XCTest -final class hellbenderUITests: XCTestCase { +final class birchUITests: XCTestCase { var app: XCUIApplication! override func setUpWithError() throws { diff --git a/fastlane/Fastfile b/fastlane/Fastfile index b3a99ea..f0f2fe8 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -27,11 +27,11 @@ platform :ios do FileUtils.rm_rf(File.expand_path("screenshots/light", __dir__)) # ── 1. Build for testing once ──────────────────────────────────────── - # Produces hellbender.app, hellbenderUITests-Runner.app, and the + # Produces birch.app, birchUITests-Runner.app, and the # .xctestrun manifest that tells xcodebuild which apps to install. sh("xcodebuild build-for-testing " \ - "-scheme hellbender " \ - "-project ../hellbender.xcodeproj " \ + "-scheme birch " \ + "-project ../birch.xcodeproj " \ "-destination 'generic/platform=iOS Simulator' " \ "-derivedDataPath '#{DERIVED_DATA}' " \ "-parallel-testing-enabled NO " \ @@ -133,14 +133,14 @@ platform :ios do FileUtils.mkdir_p(SCREENSHOT_SRC) # Run the test with the explicit xctestrun manifest. - # This installs all DependentProductPaths (including hellbender.app) + # This installs all DependentProductPaths (including birch.app) # automatically — works around the Xcode 26 bug where # `xcodebuild build test` / `test-without-building -scheme` fail to # install the host app. sh("xcodebuild test-without-building " \ "-xctestrun '#{xctestrun_path}' " \ "-destination '#{destination}' " \ - "-only-testing:hellbenderUITests/ScreenshotTests/testScreenshotTour " \ + "-only-testing:birchUITests/ScreenshotTests/testScreenshotTour " \ "-parallel-testing-enabled NO") do |status| UI.error("Test failed on #{name} (#{mode} mode)") unless status.success? end diff --git a/fastlane/Snapfile b/fastlane/Snapfile index 734b16c..f06bba1 100644 --- a/fastlane/Snapfile +++ b/fastlane/Snapfile @@ -10,11 +10,11 @@ devices([ languages(["en-US"]) # Xcode scheme that contains the UI test target. -scheme("hellbender") +scheme("birch") # Only run the screenshot walker, not the assertion-heavy setup test. -test_target_name("hellbenderUITests") -only_testing(["hellbenderUITests/ScreenshotTests/testScreenshotTour"]) +test_target_name("birchUITests") +only_testing(["birchUITests/ScreenshotTests/testScreenshotTour"]) # Output directory is overridden per invocation in the Fastfile so we can split # dark and light into sibling directories. This value is the default. @@ -37,12 +37,12 @@ concurrent_simulators(false) # Fail fast — if one device fails, don't burn time on the rest. stop_after_first_error(true) -# Launch arg read by hellbenderApp.swift to wipe UserDefaults/keychain and +# Launch arg read by birchApp.swift to wipe UserDefaults/keychain and # use an in-memory SwiftData store. Every run starts at the Welcome screen. launch_arguments(["-UITesting"]) # Use project-local derived data instead of fastlane's default /tmp path. -# The temp path causes xcodebuild to skip installing hellbender.app on the +# The temp path causes xcodebuild to skip installing birch.app on the # simulator (only the test runner gets installed), triggering # "FBSApplicationLibrary returned nil" failures. derived_data_path("./build/DerivedData") diff --git a/hellbender/Assets.xcassets/AppIcon.appiconset/AppIcon.png b/hellbender/Assets.xcassets/AppIcon.appiconset/AppIcon.png deleted file mode 100644 index 9a2408a..0000000 Binary files a/hellbender/Assets.xcassets/AppIcon.appiconset/AppIcon.png and /dev/null differ diff --git a/hellbender/Assets.xcassets/AppIcon.appiconset/Contents.json b/hellbender/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 87d4015..0000000 --- a/hellbender/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "images" : [ - { - "filename" : "AppIcon.png", - "idiom" : "universal", - "platform" : "ios", - "size" : "1024x1024" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "filename" : "AppIcon.png", - "idiom" : "universal", - "platform" : "ios", - "size" : "1024x1024" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "tinted" - } - ], - "filename" : "AppIcon.png", - "idiom" : "universal", - "platform" : "ios", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/hellbender/Assets.xcassets/WelcomeIcon.imageset/AppIcon.png b/hellbender/Assets.xcassets/WelcomeIcon.imageset/AppIcon.png deleted file mode 100644 index 9a2408a..0000000 Binary files a/hellbender/Assets.xcassets/WelcomeIcon.imageset/AppIcon.png and /dev/null differ diff --git a/scripts/build-release.sh b/scripts/build-release.sh index 910c13e..e8b4da0 100755 --- a/scripts/build-release.sh +++ b/scripts/build-release.sh @@ -4,22 +4,22 @@ set -euo pipefail # build-release.sh — Produce a verifiable unsigned release archive. # Usage: ./scripts/build-release.sh # -# Output: /tmp/hellbender-build/hellbender.xcarchive +# Output: /tmp/birch-build/birch.xcarchive -DERIVED_DATA="/tmp/hellbender-build" +DERIVED_DATA="/tmp/birch-build" echo "==> Cleaning previous build artifacts..." rm -rf "$DERIVED_DATA" echo "==> Archiving (unsigned, Release configuration)..." xcodebuild archive \ - -scheme hellbender \ - -project hellbender.xcodeproj \ - -archivePath "$DERIVED_DATA/hellbender.xcarchive" \ + -scheme birch \ + -project birch.xcodeproj \ + -archivePath "$DERIVED_DATA/birch.xcarchive" \ -derivedDataPath "$DERIVED_DATA" \ -configuration Release \ CODE_SIGNING_ALLOWED=NO \ CODE_SIGN_IDENTITY="" \ | xcpretty && exit ${PIPESTATUS[0]} -echo "==> Archive complete: $DERIVED_DATA/hellbender.xcarchive" +echo "==> Archive complete: $DERIVED_DATA/birch.xcarchive" diff --git a/scripts/normalize-app.sh b/scripts/normalize-app.sh index 2ae4cc0..f27775a 100755 --- a/scripts/normalize-app.sh +++ b/scripts/normalize-app.sh @@ -6,11 +6,11 @@ set -euo pipefail # signatures, temp paths) so that two builds from the same source produce identical # normalized output. # -# Usage: ./scripts/normalize-app.sh +# Usage: ./scripts/normalize-app.sh # # Operates in-place on the .app bundle. Make a copy first if you need the original. -APP_PATH="${1:?Usage: normalize-app.sh }" +APP_PATH="${1:?Usage: normalize-app.sh }" if [ ! -d "$APP_PATH" ]; then echo "Error: $APP_PATH is not a directory" >&2 diff --git a/scripts/patch-frameit.rb b/scripts/patch-frameit.rb index 5da12b0..4c651d1 100644 --- a/scripts/patch-frameit.rb +++ b/scripts/patch-frameit.rb @@ -21,7 +21,7 @@ # Usage: # bundle exec ruby scripts/patch-frameit.rb -SENTINEL = "# PATCH: hellbender iPhone 17 frameit support" +SENTINEL = "# PATCH: birch iPhone 17 frameit support" EXPECTED_FASTLANE_VERSION = "2.232.2" # ── Locate gem files ──────────────────────────────────────────────────────────