Skip to content

feat(wallet): prepare master for new release 8.7.0#800

Open
romchornyi wants to merge 144 commits into
masterfrom
feat/release-8.7.0
Open

feat(wallet): prepare master for new release 8.7.0#800
romchornyi wants to merge 144 commits into
masterfrom
feat/release-8.7.0

Conversation

@romchornyi

Copy link
Copy Markdown
Contributor

Issue being fixed or feature implemented

What was done?

How Has This Been Tested?

Breaking Changes

Checklist:

  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated relevant unit/integration/functional/e2e tests
  • I have made corresponding changes to the documentation

For repository code-owners and collaborators only

  • I have assigned this pull request to a milestone

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
jeanpierreroma and others added 26 commits July 14, 2026 12:44
…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>
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>
@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 286 files, which is 136 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: caeb2f07-9c65-4d23-bf21-6a2642659c87

📥 Commits

Reviewing files that changed from the base of the PR and between b1e024b and 2a80fa3.

⛔ Files ignored due to path filters (38)
  • DashWallet.xcworkspace/xcshareddata/swiftpm/Package.resolved is excluded by !**/Package.resolved
  • DashWallet/Resources/AppAssets.xcassets/Illustration/swapkit-illustration.imageset/illustration-dash-dex.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/Illustration/swapkit-illustration.imageset/illustration-dash-dex@2x.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/Illustration/swapkit-illustration.imageset/illustration-dash-dex@3x.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/Menu/menu-swapkit.imageset/dash-dex.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/Menu/menu-swapkit.imageset/dash-dex@2x.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/Menu/menu-swapkit.imageset/dash-dex@3x.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/Shortcuts/shortcut-bar-dash-dex.imageset/shortcut-bar-dash-dex.svg is excluded by !**/*.svg
  • DashWallet/Resources/AppAssets.xcassets/Shortcuts/shortcut-dash-dex.imageset/shortcut-dash-dex.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/Shortcuts/shortcut-dash-dex.imageset/shortcut-dash-dex@2x.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/Shortcuts/shortcut-dash-dex.imageset/shortcut-dash-dex@3x.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/app-review.imageset/app-review.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/app-review.imageset/app-review@2x.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/app-review.imageset/app-review@3x.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/dash-dex-buy.imageset/dash-dex-buy.svg is excluded by !**/*.svg
  • DashWallet/Resources/AppAssets.xcassets/dash-dex-illustration.imageset/dash-dex-illustration.svg is excluded by !**/*.svg
  • DashWallet/Resources/AppAssets.xcassets/dash-dex-sell.imageset/dash-dex-sell.svg is excluded by !**/*.svg
  • DashWallet/Resources/AppAssets.xcassets/logo.imageset/logo.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/logo.imageset/logo@2x.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/logo.imageset/logo@3x.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.arb.imageset/maya.coin.arb.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.btc.imageset/maya.coin.btc.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.dai.imageset/maya.coin.dai.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.eth.imageset/maya.coin.eth.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.gld.imageset/maya.coin.gld.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.kuji.imageset/maya.coin.kuji.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.leo.imageset/maya.coin.leo.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.link.imageset/maya.coin.link.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.pepe.imageset/maya.coin.pepe.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.rune.imageset/maya.coin.rune.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.tgt.imageset/maya.coin.tgt.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.usdc.imageset/maya.coin.usdc.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.usdt.imageset/maya.coin.usdt.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.wbtc.imageset/maya.coin.wbtc.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.wsteth.imageset/maya.coin.wsteth.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/support.imageset/support.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/support.imageset/support@2x.png is excluded by !**/*.png
  • DashWallet/Resources/AppAssets.xcassets/support.imageset/support@3x.png is excluded by !**/*.png
📒 Files selected for processing (286)
  • .githooks/pre-commit
  • .gitignore
  • .gitleaks.toml
  • .gitleaksignore
  • CLAUDE.md
  • DWUpholdMainnetConstants__Empty.m
  • DashPay/dashpay-info.plist
  • DashSyncCurrentCommit
  • DashWallet.xcodeproj/project.pbxproj
  • DashWallet/AppDelegate.m
  • DashWallet/Info.plist
  • DashWallet/Resources/AppAssets.xcassets/Illustration/swapkit-illustration.imageset/Contents.json
  • DashWallet/Resources/AppAssets.xcassets/Menu/menu-swapkit.imageset/Contents.json
  • DashWallet/Resources/AppAssets.xcassets/Navigation bar/navigationbar-back.imageset/Contents.json
  • DashWallet/Resources/AppAssets.xcassets/Navigation bar/navigationbar-close.imageset/Contents.json
  • DashWallet/Resources/AppAssets.xcassets/Shortcuts/shortcut-bar-dash-dex.imageset/Contents.json
  • DashWallet/Resources/AppAssets.xcassets/Shortcuts/shortcut-dash-dex.imageset/Contents.json
  • DashWallet/Resources/AppAssets.xcassets/app-review.imageset/Contents.json
  • DashWallet/Resources/AppAssets.xcassets/dash-dex-buy.imageset/Contents.json
  • DashWallet/Resources/AppAssets.xcassets/dash-dex-illustration.imageset/Contents.json
  • DashWallet/Resources/AppAssets.xcassets/dash-dex-sell.imageset/Contents.json
  • DashWallet/Resources/AppAssets.xcassets/logo.imageset/Contents.json
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.gld.imageset/Contents.json
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.kuji.imageset/Contents.json
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.leo.imageset/Contents.json
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.link.imageset/Contents.json
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.pepe.imageset/Contents.json
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.rune.imageset/Contents.json
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.tgt.imageset/Contents.json
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.usdc.imageset/Contents.json
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.usdt.imageset/Contents.json
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.wbtc.imageset/Contents.json
  • DashWallet/Resources/AppAssets.xcassets/maya.coin.wsteth.imageset/Contents.json
  • DashWallet/Resources/AppAssets.xcassets/support.imageset/Contents.json
  • DashWallet/Sources/Application/Tools.swift
  • DashWallet/Sources/Categories/Numbers+Dash.swift
  • DashWallet/Sources/Infrastructure/Currency Exchanger/CurrencyExchanger.swift
  • DashWallet/Sources/Infrastructure/Database/DatabaseConnection.swift
  • DashWallet/Sources/Infrastructure/Database/Migrations/AddSwapOrdersTable.swift
  • DashWallet/Sources/Infrastructure/NetworkStatusService.swift
  • DashWallet/Sources/Infrastructure/Networking/HTTPClient.swift
  • DashWallet/Sources/Models/Coinbase/Accounts/Account/CBAccount.swift
  • DashWallet/Sources/Models/Coinbase/Auth/CBAuth.swift
  • DashWallet/Sources/Models/Coinbase/Coinbase.swift
  • DashWallet/Sources/Models/Coinbase/Infrastructure/API/CoinbaseAPIEndpoint.swift
  • DashWallet/Sources/Models/Coinbase/Infrastructure/API/DTOs/Address/CoinbaseCreateAddressesRequest.swift
  • DashWallet/Sources/Models/CrowdNode/CrowdNode.swift
  • DashWallet/Sources/Models/CrowdNode/CrowdNodeBalanceReminder.swift
  • DashWallet/Sources/Models/Explore Dash/ExploreDash.swift
  • DashWallet/Sources/Models/Explore Dash/Infrastructure/DAO Impl/MerchantDAO.swift
  • DashWallet/Sources/Models/Explore Dash/Infrastructure/Database Connection/ExploreDatabaseConnection.swift
  • DashWallet/Sources/Models/Explore Dash/Model/Entites/ExplorePointOfUse+PreviewMock.swift
  • DashWallet/Sources/Models/Explore Dash/Model/Entites/ExplorePointOfUse.swift
  • DashWallet/Sources/Models/Explore Dash/Services/DashSpend/DashSpendError.swift
  • DashWallet/Sources/Models/Explore Dash/Services/ExploreDatabaseSyncManager.swift
  • DashWallet/Sources/Models/Maya/MayaAPIService.swift
  • DashWallet/Sources/Models/Maya/MayaAddressValidator.swift
  • DashWallet/Sources/Models/Maya/MayaCoinIconLoader.swift
  • DashWallet/Sources/Models/Maya/MayaConstants.swift
  • DashWallet/Sources/Models/Maya/MayaCryptoCurrency.swift
  • DashWallet/Sources/Models/Maya/MayaExchangeAddressProvider.swift
  • DashWallet/Sources/Models/Maya/MayaSwapProvider.swift
  • DashWallet/Sources/Models/Swap/BuyOrder.swift
  • DashWallet/Sources/Models/Swap/DAO/SwapOrdersDAO.swift
  • DashWallet/Sources/Models/Swap/ExchangeAddressProvider.swift
  • DashWallet/Sources/Models/Swap/RouteProvider.swift
  • DashWallet/Sources/Models/Swap/SwapAddressValidator.swift
  • DashWallet/Sources/Models/Swap/SwapBackend.swift
  • DashWallet/Sources/Models/Swap/SwapBuyTransactionMatcher.swift
  • DashWallet/Sources/Models/Swap/SwapCoinIconLoader.swift
  • DashWallet/Sources/Models/Swap/SwapCryptoCurrency.swift
  • DashWallet/Sources/Models/Swap/SwapDepositURIBuilder.swift
  • DashWallet/Sources/Models/Swap/SwapDirection.swift
  • DashWallet/Sources/Models/Swap/SwapExecutionData.swift
  • DashWallet/Sources/Models/Swap/SwapKitErrorCopy.swift
  • DashWallet/Sources/Models/Swap/SwapOrder.swift
  • DashWallet/Sources/Models/Swap/SwapPendingGate.swift
  • DashWallet/Sources/Models/Swap/SwapPool.swift
  • DashWallet/Sources/Models/Swap/SwapProvider.swift
  • DashWallet/Sources/Models/Swap/SwapTrackingService.swift
  • DashWallet/Sources/Models/SwapKit/SwapKitAPIService.swift
  • DashWallet/Sources/Models/SwapKit/SwapKitConstants.swift
  • DashWallet/Sources/Models/SwapKit/SwapKitEndpoint.swift
  • DashWallet/Sources/Models/SwapKit/SwapKitModels.swift
  • DashWallet/Sources/Models/SwapKit/SwapKitSwapProvider.swift
  • DashWallet/Sources/Models/Transactions/DSAccount+SpentInputCheck.h
  • DashWallet/Sources/Models/Transactions/DSAccount+SpentInputCheck.m
  • DashWallet/Sources/Models/Transactions/SendCoinsService.swift
  • DashWallet/Sources/Models/Uphold/DWUpholdConstants.m
  • DashWallet/Sources/Models/Uphold/DWUpholdMainnetConstants.m
  • DashWallet/Sources/UI/Buy Sell/BuySellPortalView.swift
  • DashWallet/Sources/UI/Buy Sell/BuySellPortalViewController.swift
  • DashWallet/Sources/UI/Buy Sell/IntegrationViewController.swift
  • DashWallet/Sources/UI/Buy Sell/Model/BuySellPortalModel.swift
  • DashWallet/Sources/UI/Buy Sell/Model/ServiceDataProvider.swift
  • DashWallet/Sources/UI/Coinbase/Base.lproj/Coinbase.storyboard
  • DashWallet/Sources/UI/Coinbase/Base/UIViewController+Coinbase.swift
  • DashWallet/Sources/UI/Coinbase/CoinbaseEntryPoint/IntegrationViewController+Coinbase.swift
  • DashWallet/Sources/UI/Coinbase/ServiceOverview/ServiceEntryPointModel.swift
  • DashWallet/Sources/UI/Coinbase/Transfer Amount/TransferAmountHostingController.swift
  • DashWallet/Sources/UI/Coinbase/Transfer Amount/TransferAmountView.swift
  • DashWallet/Sources/UI/Coinbase/Transfer Amount/TransferAmountViewController.swift
  • DashWallet/Sources/UI/Coinbase/Transfer Amount/TransferAmountViewModel.swift
  • DashWallet/Sources/UI/CrowdNode/BalanceReminder/CrowdNodeBalanceReminderBanner.swift
  • DashWallet/Sources/UI/CrowdNode/BalanceReminder/CrowdNodeBalanceReminderSheet.swift
  • DashWallet/Sources/UI/CrowdNode/BalanceReminder/CrowdNodeWithdrawalRouter.swift
  • DashWallet/Sources/UI/Explore Dash/ExploreMenuScreen.swift
  • DashWallet/Sources/UI/Explore Dash/ExploreViewController.swift
  • DashWallet/Sources/UI/Explore Dash/Merchants & ATMs/Details/POIDetailsViewController.swift
  • DashWallet/Sources/UI/Explore Dash/Merchants & ATMs/Details/Views/POIDetailsView.swift
  • DashWallet/Sources/UI/Explore Dash/Merchants & ATMs/Details/Views/POIDetailsViewModel.swift
  • DashWallet/Sources/UI/Explore Dash/Merchants & ATMs/List/AllMerchantLocations/AllMerchantLocationsView.swift
  • DashWallet/Sources/UI/Explore Dash/Merchants & ATMs/List/AllMerchantLocations/AllMerchantLocationsViewController.swift
  • DashWallet/Sources/UI/Explore Dash/Merchants & ATMs/List/AllMerchantLocations/AllMerchantLocationsViewModel.swift
  • DashWallet/Sources/UI/Explore Dash/Merchants & ATMs/List/AllMerchantLocations/Components/MerchantCellRow.swift
  • DashWallet/Sources/UI/Explore Dash/Merchants & ATMs/List/AllMerchantLocationsViewController.swift
  • DashWallet/Sources/UI/Explore Dash/Merchants & ATMs/List/Cells/MerchantItemCell.swift
  • DashWallet/Sources/UI/Explore Dash/Merchants & ATMs/List/Cells/PointOfUseItemCell.swift
  • DashWallet/Sources/UI/Explore Dash/Merchants & ATMs/List/ExplorePointOfUseListViewController.swift
  • DashWallet/Sources/UI/Explore Dash/Merchants & ATMs/List/Filters/MerchantFiltersView.swift
  • DashWallet/Sources/UI/Explore Dash/Merchants & ATMs/List/Filters/TerritoryPickerView.swift
  • DashWallet/Sources/UI/Explore Dash/Merchants & ATMs/List/MerchantListViewController.swift
  • DashWallet/Sources/UI/Explore Dash/Merchants & ATMs/List/Model/AllMerchantLocationsDataProvider.swift
  • DashWallet/Sources/UI/Explore Dash/Merchants & ATMs/List/Model/PointOfUseListModel.swift
  • DashWallet/Sources/UI/Explore Dash/Merchants & ATMs/List/Views/ExploreMapView.swift
  • DashWallet/Sources/UI/Explore Dash/Merchants & ATMs/List/Views/ListHandlerView.swift
  • DashWallet/Sources/UI/Explore Dash/Merchants & ATMs/List/Views/PointOfUseListEmptyResultsView.swift
  • DashWallet/Sources/UI/Explore Dash/Merchants & ATMs/List/Views/PointOfUseLocationServicePopup.swift
  • DashWallet/Sources/UI/Explore Dash/Views/DashSpend/Components/DashSpendAmountView.swift
  • DashWallet/Sources/UI/Explore Dash/Views/DashSpend/Components/DashSpendFlexibleContent.swift
  • DashWallet/Sources/UI/Explore Dash/Views/DashSpend/Components/DashSpendSinglePanel.swift
  • DashWallet/Sources/UI/Explore Dash/Views/DashSpend/DashSpendPayViewModel.swift
  • DashWallet/Sources/UI/Explore Dash/Views/DashSpend/DashSpendUserAuthScreen.swift
  • DashWallet/Sources/UI/Home/HomeViewController+Shortcuts.swift
  • DashWallet/Sources/UI/Home/HomeViewController.swift
  • DashWallet/Sources/UI/Home/Tx Metadata/CoinbaseMetadataProvider.swift
  • DashWallet/Sources/UI/Home/Tx Metadata/GiftCardMetadataProvider.swift
  • DashWallet/Sources/UI/Home/Tx Metadata/SwapOrderMetadataProvider.swift
  • DashWallet/Sources/UI/Home/Views/HomeView.swift
  • DashWallet/Sources/UI/Home/Views/HomeViewModel.swift
  • DashWallet/Sources/UI/Home/Views/MetadataProvider.swift
  • DashWallet/Sources/UI/Home/Views/Shortcuts/Models/ShortcutAction.swift
  • DashWallet/Sources/UI/Home/Views/Shortcuts/ShortcutsBarView.swift
  • DashWallet/Sources/UI/Home/Views/TransactionFilterDialog.swift
  • DashWallet/Sources/UI/Maya/Convert/Components/DashBalanceView.swift
  • DashWallet/Sources/UI/Maya/Convert/Components/DashPickerView.swift
  • DashWallet/Sources/UI/Maya/Convert/Components/EnterAmountView.swift
  • DashWallet/Sources/UI/Maya/Convert/Components/MayaAmountView.swift
  • DashWallet/Sources/UI/Maya/Convert/MayaConvertView.swift
  • DashWallet/Sources/UI/Maya/EnterAddress/EnterAddressView.swift
  • DashWallet/Sources/UI/Maya/MayaPortal/MayaPortalView.swift
  • DashWallet/Sources/UI/Maya/MayaPortal/MayaPortalViewController.swift
  • DashWallet/Sources/UI/Maya/MayaPortalView.swift
  • DashWallet/Sources/UI/Maya/MayaPortalViewController.swift
  • DashWallet/Sources/UI/Maya/OrderPreview/OrderPreviewViewModel.swift
  • DashWallet/Sources/UI/Maya/SelectCoin/Components/CoinRowView.swift
  • DashWallet/Sources/UI/Maya/SelectCoin/Components/HaltedToast.swift
  • DashWallet/Sources/UI/Maya/SelectCoin/Components/MayaCoinIconView.swift
  • DashWallet/Sources/UI/Maya/TransactionStatus/MayaTransactionSuccessView.swift
  • DashWallet/Sources/UI/Menu/Settings/About/About.storyboard
  • DashWallet/Sources/UI/Menu/Settings/About/AboutDashView.swift
  • DashWallet/Sources/UI/Menu/Settings/About/AboutDashViewModel.swift
  • DashWallet/Sources/UI/Menu/Settings/About/DWAboutViewController.m
  • DashWallet/Sources/UI/Menu/Settings/LocalCurrency/LocalCurrencyView.swift
  • DashWallet/Sources/UI/Menu/Settings/SettingsScreen.swift
  • DashWallet/Sources/UI/Payment Controller/Enter Amount/ProvideAmountViewController.swift
  • DashWallet/Sources/UI/Payments/Amount/BaseAmountViewController.swift
  • DashWallet/Sources/UI/Payments/Amount/Model/AmountObject.swift
  • DashWallet/Sources/UI/Payments/Amount/Model/BaseAmountModel.swift
  • DashWallet/Sources/UI/Payments/Amount/Model/Send/SendAmountModel.swift
  • DashWallet/Sources/UI/Payments/Amount/SendAmountScreen.swift
  • DashWallet/Sources/UI/Payments/Amount/SendAmountViewController.swift
  • DashWallet/Sources/UI/Payments/Amount/SpecifyAmountViewController.swift
  • DashWallet/Sources/UI/Payments/Amount/Validation/DWDecimalInputValidator.m
  • DashWallet/Sources/UI/Payments/PaymentModels/DWPaymentProcessor.m
  • DashWallet/Sources/UI/Swap/Buy/EnterAmount/BuyEnterAmountHostingController.swift
  • DashWallet/Sources/UI/Swap/Buy/EnterAmount/BuyEnterAmountView.swift
  • DashWallet/Sources/UI/Swap/Buy/EnterAmount/BuyEnterAmountViewModel.swift
  • DashWallet/Sources/UI/Swap/Buy/Receive/BuyReceiveHostingController.swift
  • DashWallet/Sources/UI/Swap/Buy/Receive/BuyReceiveView.swift
  • DashWallet/Sources/UI/Swap/Buy/Receive/BuyReceiveViewModel.swift
  • DashWallet/Sources/UI/Swap/Buy/RefundAddress/RefundAddressHostingController.swift
  • DashWallet/Sources/UI/Swap/Buy/RefundAddress/RefundAddressView.swift
  • DashWallet/Sources/UI/Swap/Buy/RefundAddress/RefundAddressViewModel.swift
  • DashWallet/Sources/UI/Swap/Convert/Components/SwapConvertCardRow.swift
  • DashWallet/Sources/UI/Swap/Convert/MayaAmountFormatter.swift
  • DashWallet/Sources/UI/Swap/Convert/SwapConvertAmount.swift
  • DashWallet/Sources/UI/Swap/Convert/SwapConvertHostingController.swift
  • DashWallet/Sources/UI/Swap/Convert/SwapConvertView.swift
  • DashWallet/Sources/UI/Swap/Convert/SwapConvertViewModel.swift
  • DashWallet/Sources/UI/Swap/DEXOfflineToastModifier.swift
  • DashWallet/Sources/UI/Swap/EnterAddress/Components/AddressSourceView.swift
  • DashWallet/Sources/UI/Swap/EnterAddress/EnterAddressHostingController.swift
  • DashWallet/Sources/UI/Swap/EnterAddress/EnterAddressView.swift
  • DashWallet/Sources/UI/Swap/EnterAddress/EnterAddressViewModel.swift
  • DashWallet/Sources/UI/Swap/OrderPreview/Components/OrderPreviewFeeRow.swift
  • DashWallet/Sources/UI/Swap/OrderPreview/Components/OrderPreviewTableRow.swift
  • DashWallet/Sources/UI/Swap/OrderPreview/Components/SwapFeeInfoSheet.swift
  • DashWallet/Sources/UI/Swap/OrderPreview/OrderPreviewHostingController.swift
  • DashWallet/Sources/UI/Swap/OrderPreview/OrderPreviewView.swift
  • DashWallet/Sources/UI/Swap/OrderPreview/OrderPreviewViewModel.swift
  • DashWallet/Sources/UI/Swap/QRScanner/GenericQRScannerController.swift
  • DashWallet/Sources/UI/Swap/QRScanner/GenericQRScannerView.swift
  • DashWallet/Sources/UI/Swap/QRScanner/QRCaptureView.swift
  • DashWallet/Sources/UI/Swap/SelectCoin/Components/SwapCoinIconView.swift
  • DashWallet/Sources/UI/Swap/SelectCoin/SelectCoinHostingController.swift
  • DashWallet/Sources/UI/Swap/SelectCoin/SelectCoinView.swift
  • DashWallet/Sources/UI/Swap/SelectCoin/SelectCoinViewModel.swift
  • DashWallet/Sources/UI/Swap/SwapFlowCoordinator.swift
  • DashWallet/Sources/UI/Swap/SwapMenuStyles.swift
  • DashWallet/Sources/UI/Swap/SwapPortalScaffold.swift
  • DashWallet/Sources/UI/Swap/TransactionStatus/SwapTransactionFailureView.swift
  • DashWallet/Sources/UI/Swap/TransactionStatus/SwapTransactionPendingView.swift
  • DashWallet/Sources/UI/Swap/TransactionStatus/SwapTransactionStatusHostingController.swift
  • DashWallet/Sources/UI/Swap/TransactionStatus/SwapTransactionSuccessView.swift
  • DashWallet/Sources/UI/SwapKit/SwapKitPortalView.swift
  • DashWallet/Sources/UI/SwapKit/SwapKitPortalViewController.swift
  • DashWallet/Sources/UI/SwiftUI Components/AddressFieldView.swift
  • DashWallet/Sources/UI/SwiftUI Components/DashSwitch.swift
  • DashWallet/Sources/UI/SwiftUI Components/Dialogs/ModalDialog.swift
  • DashWallet/Sources/UI/SwiftUI Components/Geometry Readers/FrameReader.swift
  • DashWallet/Sources/UI/SwiftUI Components/Geometry Readers/LocationReader.swift
  • DashWallet/Sources/UI/SwiftUI Components/Geometry Readers/ScaleToFitWidth.swift
  • DashWallet/Sources/UI/SwiftUI Components/Icon.swift
  • DashWallet/Sources/UI/SwiftUI Components/IconName+DashIconSource.swift
  • DashWallet/Sources/UI/SwiftUI Components/Illustrations/LoadingIllustration.swift
  • DashWallet/Sources/UI/SwiftUI Components/NumericKeyboardView.swift
  • DashWallet/Sources/UI/SwiftUI Components/RadioButtonRow.swift
  • DashWallet/Sources/UI/SwiftUI Components/ScrollViews/ScrollViewWithOnScrollChanged.swift
  • DashWallet/Sources/UI/SwiftUI Components/SearchBar.swift
  • DashWallet/Sources/UI/Tx/Details/Model/TxDetailModel.swift
  • DashWallet/Sources/UI/Tx/Details/TxDetailViewController.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/dashwallet-Bridging-Header.h
  • DashWallet/de.lproj/Localizable.strings
  • DashWallet/el.lproj/Localizable.strings
  • DashWallet/en.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-Hans.lproj/Localizable.strings
  • DashWallet/zh-Hant-TW.lproj/Localizable.strings
  • DashWallet/zh.lproj/Localizable.strings
  • DashWallet/zh_TW.lproj/Localizable.strings
  • DashWalletScreenshotsUITests/BuyReceiveFlowUITests.swift
  • DashWalletTests/AmountObjectTests.swift
  • DashWalletTests/DashAmountFormatterTests.swift
  • DashWalletTests/ExchangeAddressLookupContextTests.swift
  • DashWalletTests/PastedAmountNormalizationTests.swift
  • DashWalletTests/SwapAddressValidatorTests.swift
  • DashWalletTests/SwapKitQuoteDecodingTests.swift
  • DashWalletTests/swapkit_quote_response.json
  • Localizable.strings
  • tmpstrings/Localizable.strings

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/release-8.7.0

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

jeanpierreroma and others added 3 commits July 15, 2026 15:27
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants