From 986e793b143b84110ffffafebbb81fd35714002c Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Fri, 10 Jul 2026 17:59:27 +0200 Subject: [PATCH 1/4] feat(lightning): show route fee for probe results --- Bitkit.xcodeproj/project.pbxproj | 2 +- .../xcshareddata/swiftpm/Package.resolved | 4 +-- Bitkit/Services/LightningService.swift | 10 ++++--- Bitkit/ViewModels/AppViewModel.swift | 4 +-- Bitkit/ViewModels/WalletViewModel.swift | 26 ++++++++++++------- .../Settings/ProbingTool/ProbeResult.swift | 2 +- .../ProbingTool/ProbeResultSectionView.swift | 6 ++--- .../ProbingTool/ProbingToolScreen.swift | 12 +++------ changelog.d/next/622.fixed.md | 1 + 9 files changed, 35 insertions(+), 32 deletions(-) create mode 100644 changelog.d/next/622.fixed.md diff --git a/Bitkit.xcodeproj/project.pbxproj b/Bitkit.xcodeproj/project.pbxproj index 2f873a92e..1ad95235a 100644 --- a/Bitkit.xcodeproj/project.pbxproj +++ b/Bitkit.xcodeproj/project.pbxproj @@ -1193,7 +1193,7 @@ repositoryURL = "https://github.com/synonymdev/ldk-node"; requirement = { kind = exactVersion; - version = "0.7.0-rc.39"; + version = "0.7.0-rc.53"; }; }; 96DEA0382DE8BBA1009932BF /* XCRemoteSwiftPackageReference "bitkit-core" */ = { diff --git a/Bitkit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Bitkit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index a1debc138..8596703ee 100644 --- a/Bitkit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Bitkit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -24,8 +24,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/synonymdev/ldk-node", "state" : { - "revision" : "c3593aebb7efe2605c08e40fee7a72d382d44401", - "version" : "0.7.0-rc.39" + "revision" : "f53a13e11d74296bea82c4fb616bad79901969b5", + "version" : "0.7.0-rc.53" } }, { diff --git a/Bitkit/Services/LightningService.swift b/Bitkit/Services/LightningService.swift index 07b272257..1712b8cdd 100644 --- a/Bitkit/Services/LightningService.swift +++ b/Bitkit/Services/LightningService.swift @@ -1245,12 +1245,14 @@ extension LightningService { Logger.info( "🫰 Payment claimable: paymentId: \(paymentId) paymentHash: \(paymentHash) claimableAmountMsat: \(claimableAmountMsat)" ) - case let .probeSuccessful(paymentId, paymentHash): - Logger.info("🤑 Probe successful: paymentId: \(paymentId) paymentHash: \(paymentHash)") - case let .probeFailed(paymentId, paymentHash, shortChannelId): + case let .probeSuccessful(paymentId, paymentHash, routeFeeMsat): + let routeFeeText = routeFeeMsat.map(String.init) ?? "unknown" + Logger.info("🤑 Probe successful: paymentId: \(paymentId) paymentHash: \(paymentHash) routeFeeMsat: \(routeFeeText)") + case let .probeFailed(paymentId, paymentHash, shortChannelId, routeFeeMsat): + let routeFeeText = routeFeeMsat.map(String.init) ?? "unknown" Logger .info( - "❌ Probe failed: paymentId: \(paymentId) paymentHash: \(paymentHash) shortChannelId: \(String(describing: shortChannelId))" + "❌ Probe failed: paymentId: \(paymentId) paymentHash: \(paymentHash) shortChannelId: \(String(describing: shortChannelId)) routeFeeMsat: \(routeFeeText)" ) // Payment claimable doesn't need activity update - it's still pending // The payment will be updated when it succeeds or fails via paymentSuccessful/paymentFailed events diff --git a/Bitkit/ViewModels/AppViewModel.swift b/Bitkit/ViewModels/AppViewModel.swift index 5c471c135..6267ad977 100644 --- a/Bitkit/ViewModels/AppViewModel.swift +++ b/Bitkit/ViewModels/AppViewModel.swift @@ -914,9 +914,9 @@ extension AppViewModel { break case .paymentForwarded: break - case .probeSuccessful(paymentId: _, paymentHash: _): + case .probeSuccessful(paymentId: _, paymentHash: _, routeFeeMsat: _): break - case .probeFailed(paymentId: _, paymentHash: _, shortChannelId: _): + case .probeFailed(paymentId: _, paymentHash: _, shortChannelId: _, routeFeeMsat: _): break // MARK: New Onchain Transaction Events diff --git a/Bitkit/ViewModels/WalletViewModel.swift b/Bitkit/ViewModels/WalletViewModel.swift index f6681de68..5b1f7b547 100644 --- a/Bitkit/ViewModels/WalletViewModel.swift +++ b/Bitkit/ViewModels/WalletViewModel.swift @@ -198,19 +198,21 @@ class WalletViewModel: ObservableObject { // Handle specific events for targeted UI updates switch event { - case let .probeSuccessful(paymentId, paymentHash: paymentHash): + case let .probeSuccessful(paymentId, paymentHash: paymentHash, routeFeeMsat: routeFeeMsat): self.cacheProbeOutcome( success: true, paymentId: paymentId, paymentHash: paymentHash, - shortChannelId: nil + shortChannelId: nil, + routeFeeMsat: routeFeeMsat ) - case let .probeFailed(paymentId, paymentHash: paymentHash, shortChannelId: shortChannelId): + case let .probeFailed(paymentId, paymentHash: paymentHash, shortChannelId: shortChannelId, routeFeeMsat: routeFeeMsat): self.cacheProbeOutcome( success: false, paymentId: paymentId, paymentHash: paymentHash, - shortChannelId: shortChannelId + shortChannelId: shortChannelId, + routeFeeMsat: routeFeeMsat ) case let .paymentReceived(_, paymentHash, _, _): self.bolt11 = "" @@ -693,6 +695,7 @@ class WalletViewModel: ObservableObject { let paymentId: PaymentId let paymentHash: PaymentHash let shortChannelId: UInt64? + let routeFeeMsat: UInt64? } /// Waits for probe results that match one of the returned probe `paymentId`s. @@ -717,7 +720,7 @@ class WalletViewModel: ObservableObject { addOnEvent(id: eventId) { event in guard !resumed else { return } switch event { - case let .probeSuccessful(paymentId, paymentHash: paymentHash): + case let .probeSuccessful(paymentId, paymentHash: paymentHash, routeFeeMsat: routeFeeMsat): guard pendingPaymentIds.contains(paymentId) else { return } resumed = true self.removeOnEvent(id: eventId) @@ -725,15 +728,17 @@ class WalletViewModel: ObservableObject { success: true, paymentId: paymentId, paymentHash: paymentHash, - shortChannelId: nil + shortChannelId: nil, + routeFeeMsat: routeFeeMsat )) - case let .probeFailed(paymentId, paymentHash: paymentHash, shortChannelId: shortChannelId): + case let .probeFailed(paymentId, paymentHash: paymentHash, shortChannelId: shortChannelId, routeFeeMsat: routeFeeMsat): guard pendingPaymentIds.remove(paymentId) != nil else { return } lastFailure = .init( success: false, paymentId: paymentId, paymentHash: paymentHash, - shortChannelId: shortChannelId + shortChannelId: shortChannelId, + routeFeeMsat: routeFeeMsat ) if pendingPaymentIds.isEmpty, let lastFailure { resumed = true @@ -747,12 +752,13 @@ class WalletViewModel: ObservableObject { } } - private func cacheProbeOutcome(success: Bool, paymentId: PaymentId, paymentHash: PaymentHash, shortChannelId: UInt64?) { + private func cacheProbeOutcome(success: Bool, paymentId: PaymentId, paymentHash: PaymentHash, shortChannelId: UInt64?, routeFeeMsat: UInt64?) { probeOutcomes[paymentId] = ProbeOutcome( success: success, paymentId: paymentId, paymentHash: paymentHash, - shortChannelId: shortChannelId + shortChannelId: shortChannelId, + routeFeeMsat: routeFeeMsat ) } diff --git a/Bitkit/Views/Settings/ProbingTool/ProbeResult.swift b/Bitkit/Views/Settings/ProbingTool/ProbeResult.swift index b2363d0a8..43e4fa083 100644 --- a/Bitkit/Views/Settings/ProbingTool/ProbeResult.swift +++ b/Bitkit/Views/Settings/ProbingTool/ProbeResult.swift @@ -3,6 +3,6 @@ import Foundation struct ProbeResult { let success: Bool let durationMs: Int - let estimatedFeeSats: UInt64? + let routeFeeMsat: UInt64? let errorMessage: String? } diff --git a/Bitkit/Views/Settings/ProbingTool/ProbeResultSectionView.swift b/Bitkit/Views/Settings/ProbingTool/ProbeResultSectionView.swift index ed0f4fde5..63f8029ca 100644 --- a/Bitkit/Views/Settings/ProbingTool/ProbeResultSectionView.swift +++ b/Bitkit/Views/Settings/ProbingTool/ProbeResultSectionView.swift @@ -27,13 +27,13 @@ struct ProbeResultSectionView: View { } .font(.subheadline) - if let fee = result.estimatedFeeSats { + if let fee = result.routeFeeMsat { HStack { Image(systemName: "bitcoinsign.circle") .foregroundStyle(.secondary) - Text("Estimated Fee") + Text("Route Fee") Spacer() - Text("\(fee) sats") + Text("\(fee) msat") .foregroundStyle(.secondary) } .font(.subheadline) diff --git a/Bitkit/Views/Settings/ProbingTool/ProbingToolScreen.swift b/Bitkit/Views/Settings/ProbingTool/ProbingToolScreen.swift index ee1d76a81..48ea43d84 100644 --- a/Bitkit/Views/Settings/ProbingTool/ProbingToolScreen.swift +++ b/Bitkit/Views/Settings/ProbingTool/ProbingToolScreen.swift @@ -249,17 +249,11 @@ struct ProbingToolScreen: View { let durationMs = Int(Date().timeIntervalSince(start) * 1000) if resolved.success { - let estimatedFee: UInt64? = switch target { - case let .invoice(bolt11, _): - try? await lightningService.estimateRoutingFees(bolt11: bolt11, amountSats: amountSatsValue) - case .nodeId: - nil - } await MainActor.run { probeResult = ProbeResult( success: true, durationMs: durationMs, - estimatedFeeSats: estimatedFee, + routeFeeMsat: resolved.routeFeeMsat, errorMessage: nil ) } @@ -271,7 +265,7 @@ struct ProbingToolScreen: View { probeResult = ProbeResult( success: false, durationMs: durationMs, - estimatedFeeSats: nil, + routeFeeMsat: resolved.routeFeeMsat, errorMessage: message ) } @@ -283,7 +277,7 @@ struct ProbingToolScreen: View { probeResult = ProbeResult( success: false, durationMs: durationMs, - estimatedFeeSats: nil, + routeFeeMsat: nil, errorMessage: error.localizedDescription ) } diff --git a/changelog.d/next/622.fixed.md b/changelog.d/next/622.fixed.md new file mode 100644 index 000000000..1d1f9ec45 --- /dev/null +++ b/changelog.d/next/622.fixed.md @@ -0,0 +1 @@ +Improved Lightning probe route fee reporting. From 32a378b774ed7581115cadd904f74f28667d2548 Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Tue, 14 Jul 2026 15:58:25 +0200 Subject: [PATCH 2/4] fix: tune lightning probe routing (#623) * fix: tune lightning probe routing * fix: avoid scorer config startup crash --- Bitkit/Services/LightningService.swift | 39 +++++++++++++++++++ Bitkit/ViewModels/WalletViewModel.swift | 8 ++-- .../ProbingTool/ProbingToolScreen.swift | 2 +- changelog.d/next/623.fixed.md | 1 + 4 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 changelog.d/next/623.fixed.md diff --git a/Bitkit/Services/LightningService.swift b/Bitkit/Services/LightningService.swift index 1712b8cdd..35dce50c4 100644 --- a/Bitkit/Services/LightningService.swift +++ b/Bitkit/Services/LightningService.swift @@ -28,6 +28,26 @@ class LightningService { static var shared = LightningService() + private static let scoringBasePenaltyMsat: UInt64 = 50000 + private static let scoringLiquidityPenaltyMultiplierMsat: UInt64 = 10000 + private static let scoringLiquidityPenaltyAmountMultiplierMsat: UInt64 = 10000 + private static let scoringHistoricalLiquidityPenaltyAmountMultiplierMsat: UInt64 = 20000 + private static let scoringConsideredImpossiblePenaltyMsat: UInt64 = 1_000_000_000_000 + private static let scoringProbingDiversityPenaltyMsat: UInt64 = 60000 + + private static let defaultScoringFeeParameters = ScoringFeeParameters( + basePenaltyMsat: 1024, + basePenaltyAmountMultiplierMsat: 131_072, + liquidityPenaltyMultiplierMsat: 0, + liquidityPenaltyAmountMultiplierMsat: 0, + historicalLiquidityPenaltyMultiplierMsat: 10000, + historicalLiquidityPenaltyAmountMultiplierMsat: 1250, + antiProbingPenaltyMsat: 250, + consideredImpossiblePenaltyMsat: 100_000_000_000, + linearSuccessProbability: false, + probingDiversityPenaltyMsat: 0 + ) + private init() {} /// Flag and lock to prevent concurrent setup calls @@ -107,6 +127,8 @@ class LightningService { builder.setPathfindingScoresSource(url: scorerUrl) } + builder.setScoringFeeParams(params: Self.scoringFeeParameters(config: config)) + // Configure gossip source from current settings configureGossipSource(builder: builder, rgsServerUrl: rgsServerUrl) @@ -1571,6 +1593,23 @@ extension LightningService { // MARK: - Probing + private static func scoringFeeParameters(config: Config) -> ScoringFeeParameters { + let defaultParameters = config.scoringFeeParams ?? defaultScoringFeeParameters + + return ScoringFeeParameters( + basePenaltyMsat: scoringBasePenaltyMsat, + basePenaltyAmountMultiplierMsat: defaultParameters.basePenaltyAmountMultiplierMsat, + liquidityPenaltyMultiplierMsat: scoringLiquidityPenaltyMultiplierMsat, + liquidityPenaltyAmountMultiplierMsat: scoringLiquidityPenaltyAmountMultiplierMsat, + historicalLiquidityPenaltyMultiplierMsat: defaultParameters.historicalLiquidityPenaltyMultiplierMsat, + historicalLiquidityPenaltyAmountMultiplierMsat: scoringHistoricalLiquidityPenaltyAmountMultiplierMsat, + antiProbingPenaltyMsat: defaultParameters.antiProbingPenaltyMsat, + consideredImpossiblePenaltyMsat: scoringConsideredImpossiblePenaltyMsat, + linearSuccessProbability: defaultParameters.linearSuccessProbability, + probingDiversityPenaltyMsat: scoringProbingDiversityPenaltyMsat + ) + } + /// Sends a probe to test if a payment route exists for the given invoice. /// - Parameters: /// - bolt11: The Lightning invoice string (BOLT 11) diff --git a/Bitkit/ViewModels/WalletViewModel.swift b/Bitkit/ViewModels/WalletViewModel.swift index 5b1f7b547..d651eb765 100644 --- a/Bitkit/ViewModels/WalletViewModel.swift +++ b/Bitkit/ViewModels/WalletViewModel.swift @@ -211,7 +211,7 @@ class WalletViewModel: ObservableObject { success: false, paymentId: paymentId, paymentHash: paymentHash, - shortChannelId: shortChannelId, + shortChannelId: shortChannelId.map(String.init), routeFeeMsat: routeFeeMsat ) case let .paymentReceived(_, paymentHash, _, _): @@ -694,7 +694,7 @@ class WalletViewModel: ObservableObject { let success: Bool let paymentId: PaymentId let paymentHash: PaymentHash - let shortChannelId: UInt64? + let shortChannelId: String? let routeFeeMsat: UInt64? } @@ -737,7 +737,7 @@ class WalletViewModel: ObservableObject { success: false, paymentId: paymentId, paymentHash: paymentHash, - shortChannelId: shortChannelId, + shortChannelId: shortChannelId.map(String.init), routeFeeMsat: routeFeeMsat ) if pendingPaymentIds.isEmpty, let lastFailure { @@ -752,7 +752,7 @@ class WalletViewModel: ObservableObject { } } - private func cacheProbeOutcome(success: Bool, paymentId: PaymentId, paymentHash: PaymentHash, shortChannelId: UInt64?, routeFeeMsat: UInt64?) { + private func cacheProbeOutcome(success: Bool, paymentId: PaymentId, paymentHash: PaymentHash, shortChannelId: String?, routeFeeMsat: UInt64?) { probeOutcomes[paymentId] = ProbeOutcome( success: success, paymentId: paymentId, diff --git a/Bitkit/Views/Settings/ProbingTool/ProbingToolScreen.swift b/Bitkit/Views/Settings/ProbingTool/ProbingToolScreen.swift index 48ea43d84..0fc8600cf 100644 --- a/Bitkit/Views/Settings/ProbingTool/ProbingToolScreen.swift +++ b/Bitkit/Views/Settings/ProbingTool/ProbingToolScreen.swift @@ -259,7 +259,7 @@ struct ProbingToolScreen: View { } app.toast(type: .success, title: "Probe Successful", description: "Route verified in \(durationMs) ms") } else { - let scidText = resolved.shortChannelId.map(String.init) ?? "unknown" + let scidText = resolved.shortChannelId ?? "unknown" let message = "Hash: \(resolved.paymentHash), SCID: \(scidText)" await MainActor.run { probeResult = ProbeResult( diff --git a/changelog.d/next/623.fixed.md b/changelog.d/next/623.fixed.md new file mode 100644 index 000000000..f397e0c62 --- /dev/null +++ b/changelog.d/next/623.fixed.md @@ -0,0 +1 @@ +Improved Lightning payment route selection reliability. From b873fb45348a0dde04fab62f614debe293f4f53f Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Tue, 14 Jul 2026 16:19:26 +0200 Subject: [PATCH 3/4] chore: update changelog --- changelog.d/{next => hotfix}/622.fixed.md | 0 changelog.d/{next => hotfix}/623.fixed.md | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename changelog.d/{next => hotfix}/622.fixed.md (100%) rename changelog.d/{next => hotfix}/623.fixed.md (100%) diff --git a/changelog.d/next/622.fixed.md b/changelog.d/hotfix/622.fixed.md similarity index 100% rename from changelog.d/next/622.fixed.md rename to changelog.d/hotfix/622.fixed.md diff --git a/changelog.d/next/623.fixed.md b/changelog.d/hotfix/623.fixed.md similarity index 100% rename from changelog.d/next/623.fixed.md rename to changelog.d/hotfix/623.fixed.md From ef149f71b9632c92ae815e0785f5c0f12f9f0813 Mon Sep 17 00:00:00 2001 From: Philipp Walter Date: Tue, 14 Jul 2026 16:23:56 +0200 Subject: [PATCH 4/4] chore: version 2.3.2 --- Bitkit.xcodeproj/project.pbxproj | 24 ++++++++++++------------ CHANGELOG.md | 9 ++++++++- changelog.d/hotfix/622.fixed.md | 1 - changelog.d/hotfix/623.fixed.md | 1 - 4 files changed, 20 insertions(+), 15 deletions(-) delete mode 100644 changelog.d/hotfix/622.fixed.md delete mode 100644 changelog.d/hotfix/623.fixed.md diff --git a/Bitkit.xcodeproj/project.pbxproj b/Bitkit.xcodeproj/project.pbxproj index 1ad95235a..9033548be 100644 --- a/Bitkit.xcodeproj/project.pbxproj +++ b/Bitkit.xcodeproj/project.pbxproj @@ -679,7 +679,7 @@ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; CODE_SIGN_ENTITLEMENTS = BitkitWidgetExtension.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 192; + CURRENT_PROJECT_VERSION = 193; DEVELOPMENT_TEAM = KYH47R284B; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = BitkitWidget/Info.plist; @@ -691,7 +691,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 2.3.1; + MARKETING_VERSION = 2.3.2; PRODUCT_BUNDLE_IDENTIFIER = to.bitkit.widget; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -712,7 +712,7 @@ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; CODE_SIGN_ENTITLEMENTS = BitkitWidgetExtension.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 192; + CURRENT_PROJECT_VERSION = 193; DEVELOPMENT_TEAM = KYH47R284B; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = BitkitWidget/Info.plist; @@ -724,7 +724,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 2.3.1; + MARKETING_VERSION = 2.3.2; PRODUCT_BUNDLE_IDENTIFIER = to.bitkit.widget; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -744,7 +744,7 @@ buildSettings = { CODE_SIGN_ENTITLEMENTS = BitkitNotification/BitkitNotification.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 192; + CURRENT_PROJECT_VERSION = 193; DEVELOPMENT_TEAM = KYH47R284B; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = BitkitNotification/Info.plist; @@ -756,7 +756,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 2.3.1; + MARKETING_VERSION = 2.3.2; OTHER_LDFLAGS = ( "-framework", CoreBluetooth, @@ -776,7 +776,7 @@ buildSettings = { CODE_SIGN_ENTITLEMENTS = BitkitNotification/BitkitNotification.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 192; + CURRENT_PROJECT_VERSION = 193; DEVELOPMENT_TEAM = KYH47R284B; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = BitkitNotification/Info.plist; @@ -788,7 +788,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 2.3.1; + MARKETING_VERSION = 2.3.2; OTHER_LDFLAGS = ( "-framework", CoreBluetooth, @@ -926,7 +926,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = Bitkit/Bitkit.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 192; + CURRENT_PROJECT_VERSION = 193; DEVELOPMENT_ASSET_PATHS = "\"Bitkit/Preview Content\""; DEVELOPMENT_TEAM = KYH47R284B; ENABLE_HARDENED_RUNTIME = YES; @@ -953,7 +953,7 @@ LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 2.3.1; + MARKETING_VERSION = 2.3.2; OTHER_LDFLAGS = ( "-framework", CoreBluetooth, @@ -975,7 +975,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = Bitkit/Bitkit.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 192; + CURRENT_PROJECT_VERSION = 193; DEVELOPMENT_ASSET_PATHS = "\"Bitkit/Preview Content\""; DEVELOPMENT_TEAM = KYH47R284B; ENABLE_HARDENED_RUNTIME = YES; @@ -1002,7 +1002,7 @@ LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 2.3.1; + MARKETING_VERSION = 2.3.2; OTHER_LDFLAGS = ( "-framework", CoreBluetooth, diff --git a/CHANGELOG.md b/CHANGELOG.md index de6a117c7..9f206fa40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [2.3.2] - 2026-07-14 + +### Fixed +- Improved Lightning probe route fee reporting. #622 +- Improved Lightning payment route selection reliability. #623 + ## [2.3.1] - 2026-06-26 ### Fixed @@ -59,7 +65,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix keyboard and UI issues in the calculator widget #513 - Preserve msat precision for LNURL pay, withdraw callbacks and bolt11 #512 -[Unreleased]: https://github.com/synonymdev/bitkit-ios/compare/v2.3.1...HEAD +[Unreleased]: https://github.com/synonymdev/bitkit-ios/compare/v2.3.2...HEAD +[2.3.2]: https://github.com/synonymdev/bitkit-ios/compare/v2.3.1...v2.3.2 [2.3.1]: https://github.com/synonymdev/bitkit-ios/compare/v2.3.0...v2.3.1 [2.3.0]: https://github.com/synonymdev/bitkit-ios/compare/v2.2.1...v2.3.0 [2.2.1]: https://github.com/synonymdev/bitkit-ios/compare/v2.2.0...v2.2.1 diff --git a/changelog.d/hotfix/622.fixed.md b/changelog.d/hotfix/622.fixed.md deleted file mode 100644 index 1d1f9ec45..000000000 --- a/changelog.d/hotfix/622.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Improved Lightning probe route fee reporting. diff --git a/changelog.d/hotfix/623.fixed.md b/changelog.d/hotfix/623.fixed.md deleted file mode 100644 index f397e0c62..000000000 --- a/changelog.d/hotfix/623.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Improved Lightning payment route selection reliability.