feat(wallet): prepare master for new release 8.7.0#800
Conversation
Why: - consolidate the local explore redesign work into a single reviewable changeset - keep the where-to-spend and all-locations flows aligned after the sheet, navigation, and pagination updates - bump the build number to 14 for the next app build What: - add custom where-to-spend navigation bar assets and related SwiftUI navigation updates - finalize merchant details and all-locations redesign flows, including native sheet behavior and map integration - add paginated all-locations loading, real total counts, infinite scroll, and segmented-bar visibility fixes - update project build settings to 8.6.0 (14) Validation: - build was not reliably runnable in this environment because xcodebuild was blocked by CoreSimulatorService issues
Why: - keep paginated all-locations results deterministic across pages - preserve the current radius when navigating between all-locations and details What: - add a stable secondary sort for all-locations pagination - validate coordinates in the all-locations count path - pass the current search radius back into merchant details - narrow POIDetailsViewController initializer visibility to internal Validation: - no reliable xcodebuild validation was available in this environment because CoreSimulatorService remained unavailable
Why: - improve SwapKit conversion UX and error surfacing across quote, preview, and submit flows What: - curate supported assets, preserve identifier casing, and expand chain coverage - split indicative quote fetching from full swap execution and improve preview refresh behavior - surface clearer fee and invalid destination address messaging, plus related UI/localization updates Validation: - full build/tests were not run in this session before committing
Why: - keep the current swap flow changes together in one commit - preserve the current project version state from the working tree What: - harden Maya and SwapKit pending, status, address, and validation flows - include the current project and localization updates that are part of the staged state Validation: - not run (not requested)
Why: - refine the SwapKit portal presentation and supporting assets - keep the current staged project wiring together with the ui update What: - update swap portal screens, copy, and illustrations - replace the svg portal illustration with png assets and include the current project file changes Validation: - not run (not requested)
Why: - reduce receive-target overshoot in swap previews - restore missing long-tail token icons in select-coin flow What: - use fixed-fee-aware gross-up and preview convergence for receive-target quotes - keep preview purchase amount anchored to the entered target - load remote token icons from the SwapKit CDN with jsupa fallback - update swapkit-related image assets used by the flow Validation: - git diff --cached --stat - git diff --check on updated swap files - swiftc -parse on updated Swift files - xcodebuild -list -project DashWallet.xcodeproj
Add isConfirming flag to prevent multiple confirmations when rapidly tapping Continue. Re-arm flag when returning from previous screen and in error cases. Add guard in SwapFlowCoordinator to prevent duplicate ConvertVC navigation.
- Import and use DashUIKit components (NavigationBar, MenuItem, MenuViewModifier) - Update color references to use DashUIKit theming (Color.dash.primaryBackground) - Refactor action cards to use DashUIKit MenuItem component - Update styling to use MenuViewModifier for consistent appearance
- Remove FrameReader, LocationReader, ScrollViewWithOnScrollChanged from project - Remove SearchBar component (now in DashUIKit) - Update LocalCurrencyView to use DashUIKit components - Update SelectCoinView to use DashUIKit components - Update project configuration for DashUIKit integration
- Remove DashSwitch and RadioButtonRow (now in DashUIKit) - Remove CoinRowView component - Update POIDetailsView to use DashUIKit components - Update MerchantFiltersView with DashUIKit integration - Update TerritoryPickerView with new component structure - Update TransactionFilterDialog to use DashUIKit components - Update SelectCoinView with DashUIKit imports and usage - Update project configuration for new dependencies
…tive
The hardcoded-hex-secret-literal rule matched only lowercase [0-9a-f], so an uppercase hex secret (e.g. return @"DA72F…") would slip through undetected. Add the (?i) flag so hex literals are caught regardless of casing. 24-char pbxproj UUIDs remain excluded by the {40} / {40,64} length bounds, not the character class (verified: uppercase and lowercase 40-hex literals flagged, 24-char UUID not).
# Conflicts: # DashWallet.xcodeproj/project.pbxproj # DashWallet/Sources/Infrastructure/Database/DatabaseConnection.swift # DashWallet/Sources/UI/Home/Views/HomeView.swift
Replaces the XCLocalSwiftPackageReference (../Packages/DashUIKit) carried by the DashDEX stack so the project resolves from a public remote instead of a sibling checkout. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
# Conflicts: # DashWallet.xcodeproj/project.pbxproj # DashWallet/Sources/Models/Explore Dash/Services/GeoRestrictionService.swift
# Conflicts: # DashWallet.xcodeproj/project.pbxproj # DashWallet/Sources/UI/Maya/Convert/Components/MayaAmountView.swift
# Conflicts: # DashWallet.xcodeproj/project.pbxproj # DashWallet/Sources/UI/Maya/Convert/Components/MayaAmountView.swift
# Conflicts: # .gitignore # DashWallet.xcodeproj/project.pbxproj
…iles The Sources phases of both app targets still referenced F4C40609...0001/0002, but the PBXBuildFile objects were lost while resolving the release-branch merges. CocoaPods silently discards such dangling refs, which would have dropped the migration from the build and broken DatabaseConnection.migrations(). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
HomeViewController gained UIHostingController/Color usage from the CrowdNode balance reminder but never imported SwiftUI — DashUIKit does not re-export it, so the file did not compile. DashSyncCurrentCommit had been rolled back to 3b28f981 by the DashDEX branch, losing master's 13fc5bea. Point it at DashSync master (d3c1497a), which is the first commit carrying DSWallet.lockedBalance that BalanceModel already requires. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The provider refunds a deposit that is even one base unit short of the quoted amount, while an overpayment of one unit is accepted. Truncating meant a quoted 5.701673 USDC was deposited as 5.701672 and refunded. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Only dashwallet linked DashUIKit, and neither target declared it in packageProductDependencies — so the dashpay scheme failed to resolve the module for the many sources shared by both targets (e.g. LocalCurrencyView). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
# Conflicts: # .gitignore
transactionRowIcons only read metadata.icon (the merchant logo bitmap), so rows whose provider supplies a named icon instead — SwapOrderMetadataProvider sets transaction-convert, CoinbaseMetadataProvider sets transaction-coinbase.received — fell through to the generic send arrow. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sync bookkeeping is per-network (kExploreDatabaseLastVersion_Mainnet/_Testnet) but both networks share a single explore.db on disk. After switching chains the saved version for the new network already read as up to date and the file check passed, so the app kept serving the other network's merchants — testnet users saw the mainnet database (no Brinker, fewer merchants than Android). Record which network the installed database belongs to and force a download when it differs. Existing installs have no marker, so they refresh once on next launch. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
activeTopViewController() returns the top-most controller, which may be the PIN prompt itself — DSRequestPinViewController is a DWAlertController and reports no presentedViewController, so the existing guard let the reminder present over it. That broke the PIN's dismissal and let its completion fire twice, tripping NSParameterAssert(completion) in DashSync. The pending-reminder retry already re-attempts every 0.5s, so the sheet simply waits for the PIN to be dismissed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The DashDEX stack had already moved this row to DashUIKit; it was reverted during the release merge because the component had no way to show the "Locked" status that fix/locked-rewards-flow shipped. DashUIKit now carries trailingStatusText, so the row moves over for real — TransactionPreview was only a typealias for the generic MenuItem, which is why the row's typography drifted from the design. Also restores Package.resolved, dropped by the chore/secrets-hardening merge. DashUIKit is pinned to a branch, so without it every build floats to whatever import/final points at. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
# Conflicts: # DashWallet.xcodeproj/project.pbxproj # DashWallet/Sources/UI/Coinbase/Transfer Amount/TransferAmountViewController.swift # DashWallet/Sources/UI/Maya/Convert/Components/MayaAmountView.swift # DashWallet/Sources/UI/Swap/Convert/SwapConvertView.swift # DashWallet/Sources/UI/SwiftUI Components/Geometry Readers/FrameReader.swift # DashWallet/Sources/UI/SwiftUI Components/Geometry Readers/ScaleToFitWidth.swift
Swept into the coinbase merge by a git add -A. The pod graph is unchanged (spec checksums and PODFILE CHECKSUM are identical); only the tool-version stamp moved, and bumping it would oblige every dev and CI to run 1.16.2. Not a release decision. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The buy matcher required tx.timestamp >= order.timestamp. An unconfirmed tx reports when the wallet first saw it, but a mined one reports its block's timestamp, which only has to beat the median of the last 11 blocks and so can sit minutes earlier. The match therefore vanished the moment the tx confirmed and the row fell back from "Converted · USDC/DASH" to a plain "Received". Give the block clock two hours of slack; the receive address and the ±5% amount check are what actually disambiguate the transaction. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The archive unzipped straight over the live explore.db and the -wal/-shm sidecars of the old database were left in place, so SQLite replayed that WAL against the new file: 'database disk image is malformed'. The reconnect only ran afterwards. Post databaseWillBeUpdatedNotification first so the connection releases the file, then delete the sidecars, then unzip. Queries return [] during the window. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
fix/coinbase-receive-summary carried its own DashUIKit wiring; the merge kept our build-file object but auto-merged their reference into dashpay's Frameworks phase, leaving it pointing at nothing. CocoaPods discards such refs silently — the same failure mode that dropped the migration build files earlier. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
….7.0 # Conflicts: # DashWallet.xcodeproj/project.pbxproj # DashWallet/Sources/Application/Tools.swift # DashWallet/Sources/UI/Maya/Convert/MayaConvertView.swift # DashWallet/Sources/UI/Maya/OrderPreview/OrderPreviewViewModel.swift # DashWallet/Sources/UI/Swap/Convert/MayaAmountFormatter.swift # DashWallet/Sources/UI/Swap/Convert/SwapConvertViewModel.swift # DashWallet/Sources/UI/SwiftUI Components/Geometry Readers/FrameReader.swift # DashWallet/Sources/UI/SwiftUI Components/NumericKeyboardView.swift # DashWallet/ar.lproj/Localizable.strings # DashWallet/bg.lproj/Localizable.strings # DashWallet/ca.lproj/Localizable.strings # DashWallet/cs.lproj/Localizable.strings # DashWallet/da.lproj/Localizable.strings # DashWallet/de.lproj/Localizable.strings # DashWallet/el.lproj/Localizable.strings # DashWallet/eo.lproj/Localizable.strings # DashWallet/es.lproj/Localizable.strings # DashWallet/et.lproj/Localizable.strings # DashWallet/fa.lproj/Localizable.strings # DashWallet/fi.lproj/Localizable.strings # DashWallet/fil.lproj/Localizable.strings # DashWallet/fr.lproj/Localizable.strings # DashWallet/hr.lproj/Localizable.strings # DashWallet/hu.lproj/Localizable.strings # DashWallet/id.lproj/Localizable.strings # DashWallet/it.lproj/Localizable.strings # DashWallet/ja.lproj/Localizable.strings # DashWallet/ko.lproj/Localizable.strings # DashWallet/mk.lproj/Localizable.strings # DashWallet/ms.lproj/Localizable.strings # DashWallet/nb.lproj/Localizable.strings # DashWallet/nl.lproj/Localizable.strings # DashWallet/pl.lproj/Localizable.strings # DashWallet/pt.lproj/Localizable.strings # DashWallet/ro.lproj/Localizable.strings # DashWallet/ru.lproj/Localizable.strings # DashWallet/sk.lproj/Localizable.strings # DashWallet/sl.lproj/Localizable.strings # DashWallet/sl_SI.lproj/Localizable.strings # DashWallet/sq.lproj/Localizable.strings # DashWallet/sr.lproj/Localizable.strings # DashWallet/sv.lproj/Localizable.strings # DashWallet/th.lproj/Localizable.strings # DashWallet/tr.lproj/Localizable.strings # DashWallet/uk.lproj/Localizable.strings # DashWallet/vi.lproj/Localizable.strings # DashWallet/zh.lproj/Localizable.strings # DashWallet/zh_TW.lproj/Localizable.strings
The DashDEX branch wired refund-addresses.csv into DashWalletScreenshotsUITests' Resources, but the file was never committed, so every test target failed to build: 'refund-addresses.csv couldn't be opened because there is no such file'. The UI test that reads it already fails with a clear message when it is absent. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
DWUpholdMainnetConstants.m hardcoded the Uphold mainnet clientID/clientSecret on the DashDEX branch, which is pushed to this public repo. The credentials have been rotated, so the values in history are dead, and chore/secrets-hardening moved the constants to the gitignored Uphold-Info.plist. Recording both fingerprints — the commit as it landed on feat/dash-dex-impr and as rewritten into this branch — so the pre-commit hook and CI stop flagging them. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The amount-paste branch added the file to dashwallet only, so dashpay failed with 'cannot find MayaAmountFormatter in scope' — every other file in that folder has a build file per target. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Important Review skippedToo many files! This PR contains 286 files, which is 136 over the limit of 150. To get a review, narrow the scope: Upgrade to a paid plan to raise the limit. ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (38)
📒 Files selected for processing (286)
You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
configureAndStart set previewLayer.session on the main queue while startRunning() ran on sessionQueue. Assigning the session mutates the capture graph (-[AVCaptureSession _addVideoPreviewLayer:]); running that concurrently with startRunning made AVFoundation throw and abort (SIGABRT on tapping Scan). Attach the preview layer first, then start the session only once that has finished, so the two never touch the graph at the same time. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
When a transaction is the DASH leg of a DashDEX swap, the details sheet shows a second explorer card below "View in Block Explorer" — "View in Maya Explorer" or "View in NEAR Explorer" depending on the order's provider. It's its own card, styled identically to the Dash one; ordinary transactions are unchanged. Provider classification mirrors SwapTrackingService.trackingRoute, and the two explorers key on different identifiers (Maya on the tx hash, NEAR on the deposit address). The card is hidden until that identifier is available, so no dead links. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
PR #5 (import/final) landed on dashpay/DashUIKit master (046f0875), which carries everything the release needs — TransactionView.trailingStatusText and the NumericKeyboardLocaleSupport tests. Point the app at the stable master branch instead of the import/final feature branch. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Issue being fixed or feature implemented
What was done?
How Has This Been Tested?
Breaking Changes
Checklist:
For repository code-owners and collaborators only