Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
464 commits
Select commit Hold shift + click to select a range
6d7c6f9
fix: spark transfer, send and exit backup edge cases
ovitrif Nov 10, 2026
0161e1e
docs: spark chain service url in transfer journeys
ovitrif Nov 10, 2026
f776a16
fix: sent payment contacts sendable for the concurrent test
ovitrif Nov 10, 2026
58c07a4
Merge remote-tracking branch 'origin/feat/breez-spark-lightning' into…
ovitrif Nov 10, 2026
9f251e6
fix: refused savings swipe, earlier node sends and claim cap clearing
ovitrif Nov 10, 2026
4d1e36a
Merge remote-tracking branch 'origin/feat/breez-spark-lightning' into…
ovitrif Nov 10, 2026
8da4289
docs: savings transfer mode doc comment
ovitrif Nov 10, 2026
ed5912d
fix: keep pending node payment hashes past the cap
ovitrif Nov 10, 2026
64e62fc
Merge remote-tracking branch 'origin/feat/breez-spark-lightning' into…
ovitrif Nov 10, 2026
67262f6
Merge remote-tracking branch 'origin/feat/breez-spark-lightning' into…
ovitrif Nov 10, 2026
f59bd84
fix: bound stored send hashes
ovitrif Nov 10, 2026
5e0159f
fix: show the move in flight as its wait times out
ovitrif Nov 10, 2026
0abf0ab
fix: keep an interrupted exit start in its transfer
ovitrif Nov 10, 2026
53871d5
fix: refuse a spark funding that changed after approval
ovitrif Nov 10, 2026
5a16d04
fix: retry spark activity that failed to save
ovitrif Nov 10, 2026
86432fa
fix: import a salvaged exit's kept data before its rebuild
ovitrif Nov 10, 2026
5261e49
fix: forget an unsettled move when the wallet is wiped
ovitrif Nov 10, 2026
0ce947b
fix: uniform move illustrations and bold inline amount
ovitrif Nov 10, 2026
2b6bf07
fix: offer spending on confirm while spark can pay an on-chain request
ovitrif Nov 10, 2026
c5f9f61
fix: publish a spark withdrawal's resolution only when its journal cl…
ovitrif Nov 10, 2026
4b9d3d0
fix: use the flat hourglass on exit steps
ovitrif Nov 10, 2026
1af9389
fix: align exit screens with the explore cell and accents
ovitrif Nov 10, 2026
8f5e15f
fix: keep a stale spark withdrawal settle off a retry's proof and all…
ovitrif Nov 10, 2026
430fa72
fix: keep paid send guards until their invoices expire
ovitrif Nov 10, 2026
cecb5bf
fix: drop node send hashes listed only as failed
ovitrif Nov 10, 2026
5aadc58
fix: withdraw spark to savings at the confirmed fee
ovitrif Nov 10, 2026
cd1f960
fix: trim send hashes by invoice expiry on both rails
ovitrif Nov 10, 2026
edeec8d
fix: claim an older spark funding only at its own approval
ovitrif Nov 10, 2026
8fcf7c5
fix: take the exit hourglass from the android vector
ovitrif Nov 10, 2026
7b73b66
fix: match the exit screens across apps
ovitrif Nov 10, 2026
844463b
docs: link the app status spark journey
ovitrif Nov 10, 2026
f881eee
fix: keep the step connector between the end dots
ovitrif Nov 10, 2026
f08bc70
fix: restore the funds moved copy and accent the repriced amount
ovitrif Nov 10, 2026
fbac31f
fix: align the spending speed picker with the fee rows
ovitrif Nov 10, 2026
d616257
fix: show the transfer minimum as a toast
ovitrif Nov 10, 2026
130f0ad
fix: savings intro spacing, button inset and image size
ovitrif Nov 10, 2026
24d436f
fix: savings availability title spacing
ovitrif Nov 10, 2026
c41e3a5
fix: savings confirm amounts, too-low error and disabled swipe
ovitrif Nov 10, 2026
fccaf82
fix: savings progress title, spacing and hidden button
ovitrif Nov 10, 2026
e02e641
fix: show the open connection count in advanced settings
ovitrif Nov 10, 2026
84b8dc1
fix: spending wallet transfer buttons and copy
ovitrif Nov 10, 2026
01fbfb5
fix: receive show details button and spending onboarding copy
ovitrif Nov 10, 2026
41dee37
Merge remote-tracking branch 'origin/feat/breez-spark-lightning' into…
ovitrif Nov 10, 2026
5ebff50
fix: match exit spacing and dialogs across apps
ovitrif Nov 10, 2026
e2f9a36
Merge remote-tracking branch 'origin/feat/breez-spark-lightning' into…
ovitrif Nov 10, 2026
d30664b
fix: leave a spark balance too small to move out of savings
ovitrif Nov 10, 2026
2b6b520
fix: trim unlisted expired send hashes and keep spark retries
ovitrif Nov 10, 2026
e84249f
fix: keep the move routing fee when spark settles first
ovitrif Nov 10, 2026
f143cc3
fix: keep a spark retry's hold through the activity sync
ovitrif Nov 10, 2026
d6f1c28
fix: list a spark deposit claimed early only once
ovitrif Nov 10, 2026
fb2025e
fix: keep the spark balance shown after a failed withdrawal
ovitrif Nov 10, 2026
6c382ac
fix: bind a fixed spark funding to its confirmed fee
ovitrif Nov 10, 2026
ed7630f
fix: clear the kept spark balance once spark syncs
ovitrif Nov 10, 2026
12d41bd
fix: keep a node retry's hold through an older listing
ovitrif Nov 10, 2026
d862c34
fix: draw the spending confirm coins at android's size
ovitrif Nov 10, 2026
d503736
fix: mark to spending as an estimate on the confirm screen
ovitrif Nov 10, 2026
658d1b2
fix: keep the savings confirm piggybank at full size
ovitrif Nov 10, 2026
49147d4
fix: size the receive on spending card to figma
ovitrif Nov 10, 2026
1c90b2c
fix: keep transfer closed after back while pricing
ovitrif Nov 10, 2026
a680181
fix: name the new max when a max transfer is refused
ovitrif Nov 10, 2026
b4f3e04
fix: show adding until a submitted claim settles
ovitrif Nov 10, 2026
9ed867b
Merge remote-tracking branch 'origin/feat/breez-spark-lightning' into…
ovitrif Nov 10, 2026
e8b1b94
Merge remote-tracking branch 'origin/feat/breez-spark-lightning' into…
ovitrif Nov 10, 2026
4b4b975
fix: keep the kept spark balance out of an exit
ovitrif Nov 10, 2026
09ab05f
fix: show later on payment successful like android
ovitrif Nov 10, 2026
be2c540
Merge remote-tracking branch 'origin/feat/breez-spark-lightning' into…
ovitrif Nov 10, 2026
6818189
fix: show spark as zero in spending during an exit
ovitrif Nov 10, 2026
c33ff3a
fix: keep a send that ends during a listing held
ovitrif Nov 10, 2026
2779677
fix: keep a send whose invoice never expires held
ovitrif Nov 10, 2026
b3de79c
fix: show adding until spark lists an automatic claim
ovitrif Nov 10, 2026
9f4ca45
docs: say a fixed spark funding's fee is bound too
ovitrif Nov 10, 2026
6bf2e29
fix: hide only the claimed output of a deposit tx
ovitrif Nov 10, 2026
0991055
fix: notify when the read spark balance recovers
ovitrif Nov 10, 2026
26a0bfc
Merge remote-tracking branch 'origin/feat/breez-spark-lightning' into…
ovitrif Nov 10, 2026
1483196
chore: leave the move to spark translations to a follow-up
ovitrif Nov 10, 2026
803bc6b
fix: treat spark's below-minimum quote refusal as too small
ovitrif Nov 10, 2026
5c9179b
fix: check the quote deadline right before a spark withdrawal sends
ovitrif Nov 10, 2026
6bb6134
fix: keep the funding source switchable on a spark route
ovitrif Nov 10, 2026
7be0484
fix: admit one rail's send of an invoice at a time
ovitrif Nov 10, 2026
a74211e
docs: move the expired-invoice comment onto its check
ovitrif Nov 10, 2026
172e564
fix: ask again for saved exit confirmations after a reorg
ovitrif Nov 10, 2026
1374063
fix: cap exit funding sends at the confirmed mining fee
ovitrif Nov 10, 2026
c1a7ee4
fix: keep the kept spark balance after a cancelled exit
ovitrif Nov 10, 2026
bb23267
chore: merge feat/breez-spark-lightning into feat/spark-emergency-exit
ovitrif Nov 10, 2026
76a1aee
test: pin the funding source control on a spark route
ovitrif Nov 10, 2026
70853ce
fix: keep an uncertain spark send pending until spark syncs
ovitrif Nov 10, 2026
e559574
fix: fail quickpay on a spark refusal
ovitrif Nov 10, 2026
5fbaeb5
fix: keep the transfer flag on a restored spark funding
ovitrif Nov 10, 2026
df96f3c
fix: show payment pending for a spark funding with an unknown outcome
ovitrif Nov 10, 2026
87fee72
fix: follow a kept funding that completes off the confirm screen
ovitrif Nov 10, 2026
48b2252
fix: approve the refused savings fee on the next fee bump confirm
ovitrif Nov 10, 2026
7968138
fix: keep the exit notification note above its buttons
ovitrif Nov 10, 2026
3311ff9
revert: keep the exit notification note above its buttons
ovitrif Nov 10, 2026
27b2ce1
fix: keep the exit notification note above its buttons
ovitrif Nov 10, 2026
d74b3f1
fix: read spark's payments only after its first sync
ovitrif Nov 10, 2026
ddac6c0
fix: keep an unknown spark send pending past an older failed row
ovitrif Nov 10, 2026
2e9524c
fix: end a spark send's unknown outcome on its payment event
ovitrif Nov 10, 2026
5a56f12
fix: keep a missing spark send pending until its invoice expires
ovitrif Nov 10, 2026
536144c
fix: approve the refused savings fee on the next exit start
ovitrif Nov 10, 2026
80394fc
fix: keep the kept spark balance from the exit start
ovitrif Nov 10, 2026
56b7ea0
fix: forget the kept spark balance on a wipe
ovitrif Nov 10, 2026
5e9ddd7
chore: merge feat/breez-spark-lightning into feat/spark-emergency-exit
ovitrif Nov 10, 2026
67a0707
fix: count spark as synced only after a sync this run
ovitrif Nov 10, 2026
ef4ff8a
fix: read spark's sync state before its payment list
ovitrif Nov 10, 2026
1d9b173
fix: start a new spark transfer when its amount changes
ovitrif Nov 10, 2026
2eea8e5
fix: keep a failed spark withdrawal open after a sync that never reac…
ovitrif Nov 10, 2026
cae1c29
fix: hold an unlisted spark send after a relaunch until its invoice e…
ovitrif Nov 10, 2026
8052698
chore: merge feat/breez-spark-lightning into feat/spark-emergency-exit
ovitrif Nov 10, 2026
a21a20d
fix: drop a paykit route quote once its source or amount changed
ovitrif Nov 10, 2026
6957828
fix: settle an unsent spark withdrawal's allowance before dropping it…
ovitrif Nov 10, 2026
01bfbd8
fix: cap the leftover sweep fee at bitkit's own rate
ovitrif Nov 10, 2026
2a203b4
fix: forget a savings payment only after three blocks unseen
ovitrif Nov 10, 2026
f352f9d
fix: withdraw spark to savings only when both read one chain
ovitrif Nov 10, 2026
eb434dc
fix: note a payment's rail only once its send is admitted
ovitrif Nov 10, 2026
5eab42d
fix: count spark as synced only once a wallet sync succeeded
ovitrif Nov 10, 2026
803edb2
chore: merge feat/breez-spark-lightning into feat/paykit-spark-route
ovitrif Nov 10, 2026
fb90070
fix: pay between spark wallets over lightning on regtest
ovitrif Nov 11, 2026
a1397f3
fix: keep an unresolved spark retry held across restarts
ovitrif Nov 11, 2026
e6678ae
chore: merge feat/breez-spark-lightning into feat/paykit-spark-route
ovitrif Nov 11, 2026
518bf31
chore: merge feat/breez-spark-lightning into feat/spark-emergency-exit
ovitrif Nov 11, 2026
88fb385
fix: hide boost on a pending spark withdrawal
ovitrif Nov 11, 2026
b96e53e
fix: restore the endpoint a paykit reroute picks
ovitrif Nov 11, 2026
2cbaa9e
fix: hold an unknown spark send until it settles
ovitrif Nov 11, 2026
4ea41b6
Merge remote-tracking branch 'origin/feat/breez-spark-lightning' into…
ovitrif Nov 11, 2026
6429e7b
fix: refuse a spark send once an exit holds spark
ovitrif Nov 11, 2026
270ae4c
fix: show spark exit funding amounts in bitcoin
ovitrif Nov 11, 2026
9a259f7
fix: keep counting what stays on spark during an exit
ovitrif Nov 11, 2026
246140b
fix: keep the valid generation over an unverified failed-only rebuild
ovitrif Nov 11, 2026
d840671
fix: never take a timelock reminder early without the tip
ovitrif Nov 11, 2026
b4a5944
fix: read a step already in the utxo set as accepted
ovitrif Nov 11, 2026
49cd36f
fix: stop driving a diverged generation during a top-up
ovitrif Nov 11, 2026
0dcda74
fix: keep the value of leaves the first build leaves behind
ovitrif Nov 11, 2026
267c8c9
fix: leave left-behind leaves out of the exit transfer
ovitrif Nov 11, 2026
8f724d9
fix: reconnect spark for a stalled exit
ovitrif Nov 11, 2026
599b963
fix: pay from savings only what the funding address lacks
ovitrif Nov 11, 2026
92c4f41
fix: drop a tapped exit notification with no result
ovitrif Nov 11, 2026
b619536
fix: report an exit that is no longer cancellable
ovitrif Nov 11, 2026
2ef82a8
fix: give a forgotten exit's funding address back
ovitrif Nov 11, 2026
5e21172
fix: delete the exit record's copies on wipe
ovitrif Nov 11, 2026
2fe70af
fix: show kept change recovery details once
ovitrif Nov 11, 2026
5f8e054
fix: cap the refused sweep rate on overflow
ovitrif Nov 11, 2026
daec38b
fix: validate a spark withdrawal against its debit and spark's balance
ovitrif Nov 11, 2026
ec8daf9
fix: check a rerouted lnurl's minimum before confirm
ovitrif Nov 11, 2026
f0d17cd
fix: let spark pay while the node is down
ovitrif Nov 11, 2026
f595d0d
fix: drop the spending balance after a full spark withdrawal
ovitrif Nov 11, 2026
f0f06df
fix: check a rerouted lnurl's maximum before confirm
ovitrif Nov 11, 2026
f513443
fix: keep kept fee change's recovery details reachable
ovitrif Nov 11, 2026
d745ec9
fix: refuse an exit start while a spark send is still active
ovitrif Nov 11, 2026
9b4f8d1
fix: leave lost leaves out of what stays on spark during an exit
ovitrif Nov 11, 2026
39cb071
fix: count left-behind leaves on spark
ovitrif Nov 11, 2026
17f16d1
Merge branch 'feat/breez-spark-lightning' into feat/spark-emergency-exit
ovitrif Nov 11, 2026
c097edb
fix: hold node sends of pre-restore invoices until spark lists its sends
ovitrif Nov 11, 2026
238abe5
fix: settle pending spark withdrawals and guard contact routing
ovitrif Nov 11, 2026
412ddd7
fix: offer the spark leg when lightning pays the lnurl minimum
ovitrif Nov 11, 2026
9f7afa9
fix: skip the spark quote when lightning pays a contact
ovitrif Nov 11, 2026
8f66a5d
fix: name the lnurl limit when no route pays a contact
ovitrif Nov 11, 2026
a2d84a7
fix: hold a pending spark withdrawal until spark completes it
ovitrif Nov 11, 2026
b261472
fix: route a mixed bitcoin contact through spark when no endpoint pays
ovitrif Nov 11, 2026
33236e6
Merge branch 'feat/breez-spark-lightning' into feat/paykit-spark-route
ovitrif Nov 11, 2026
f8c896b
fix: refresh wallet totals when the exit's amounts change
ovitrif Nov 11, 2026
27d38b3
Merge branch 'feat/breez-spark-lightning' into feat/spark-emergency-exit
ovitrif Nov 11, 2026
32b3379
fix: show the balance copy when spark's fee takes a contact payment p…
ovitrif Nov 11, 2026
ca16cb5
fix: keep spark's listed sends when the restore hold ends
ovitrif Nov 11, 2026
f08a0a9
fix: hold spark sends of pre-restore invoices until spark lists its s…
ovitrif Nov 11, 2026
baa00f8
test: wait for the send watch before emitting the rail failure
ovitrif Nov 11, 2026
aedeee5
fix: leave an open contact withdrawal off spark's transfers to savings
ovitrif Nov 11, 2026
1a3a179
fix: close a contact withdrawal spark refuses for a fee rise at once
ovitrif Nov 11, 2026
7ce626f
fix: keep a full withdrawal's zero balance until a later sync shows f…
ovitrif Nov 11, 2026
fb26d22
fix: end a move's late payment watch on wipe
ovitrif Nov 11, 2026
e24e37c
fix: refuse a spark contact leg while an earlier withdrawal settles
ovitrif Nov 11, 2026
da90a39
fix: keep confirm's first route refusal and block its payment
ovitrif Nov 11, 2026
0c4fe37
fix: reject out-of-range fee estimates
ovitrif Nov 11, 2026
147a20f
fix: pay the extra input fee when savings completes funding
ovitrif Nov 11, 2026
c741a30
fix: reset seen funding when the funding address changes
ovitrif Nov 11, 2026
da07aa6
fix: count left-behind leaves in what stays on spark
ovitrif Nov 11, 2026
a13da47
fix: rebuild on redo while a top-up is awaited
ovitrif Nov 11, 2026
198b0b9
feat: keep earlier exit addresses reachable
ovitrif Nov 11, 2026
0c47124
fix: keep the valid generation when funding an unverified rebuild
ovitrif Nov 11, 2026
b085864
fix: withdraw an unverified rebuild's fee ask once its steps read again
ovitrif Nov 11, 2026
32ccd35
fix: keep the valid generation when a rebuild leaves a recovered leaf…
ovitrif Nov 11, 2026
a78786d
fix: keep the retry clock after an unverified rebuild that adopts not…
ovitrif Nov 11, 2026
8354e2b
Merge remote-tracking branch 'origin/feat/breez-spark-lightning' into…
ovitrif Nov 11, 2026
cf3f96d
chore: merge feat/breez-spark-lightning into feat/spark-emergency-exit
ovitrif Nov 11, 2026
f0d06d9
fix: guard an unverified rebuild before saving it
ovitrif Nov 11, 2026
33766fb
fix: pay savings funding at least at the dust limit
ovitrif Nov 11, 2026
693c45a
fix: let a refused leftover sweep show once
ovitrif Nov 11, 2026
6e978ea
fix: read kept change at earlier exit addresses
ovitrif Nov 11, 2026
e728b65
docs: fix earlier exit address comments
ovitrif Nov 11, 2026
199729d
fix: refuse pre-restore invoices spark hasn't listed until they expire
ovitrif Nov 11, 2026
15b6925
fix: list kept change once its result was seen
ovitrif Nov 11, 2026
63a2f49
fix: keep addresses added during an earlier address refresh
ovitrif Nov 11, 2026
d1efd4f
fix: re-route when the source changes on confirm
ovitrif Nov 11, 2026
313c683
fix: confirm a spark withdrawal from the chain
ovitrif Nov 11, 2026
46ccee9
fix: resolve an lnurl the router picks
ovitrif Nov 11, 2026
c8d16ff
fix: show the request note on a spark leg
ovitrif Nov 11, 2026
23e71bd
fix: withdraw spark only at the fee the swipe approved
ovitrif Nov 11, 2026
18946a0
fix: return a node-paid invoice as paid after a restore
ovitrif Nov 11, 2026
437a979
fix: guard every rebuild over a valid exit generation
ovitrif Nov 11, 2026
fd9c887
test: keep the valid generation after a leaf is left behind
ovitrif Nov 11, 2026
1af56fc
fix: pace a funded unverified resume once a block
ovitrif Nov 11, 2026
d8a058c
fix: show a final sweep refusal again after a foreground tick
ovitrif Nov 11, 2026
78cacc0
fix: keep reading kept change at a reused address
ovitrif Nov 11, 2026
5176fa0
fix: keep the valid generation over an unexitable leaf
ovitrif Nov 11, 2026
754725c
fix: read the configured regtest chain in the exit
ovitrif Nov 11, 2026
15f76ba
fix: fund the exit from savings only on spark's chain
ovitrif Nov 11, 2026
c2346f3
fix: match a spark withdrawal by its idempotency key
ovitrif Nov 11, 2026
b72a025
Merge commit '18946a0f0' into HEAD
ovitrif Nov 11, 2026
3a772cc
Merge commit '18946a0f0' into HEAD
ovitrif Nov 11, 2026
7622b77
fix: back up the spark exit funding index
ovitrif Nov 11, 2026
fdfd7cd
fix: find the spark exit funding index after a restore without one
ovitrif Nov 11, 2026
9659b95
fix: back up the earlier spark exit addresses
ovitrif Nov 11, 2026
31be1fe
fix: watch earlier exits' funding that still holds coins after a restore
ovitrif Nov 11, 2026
a82a6ef
Merge pull request #1191 from synonymdev/feat/paykit-spark-route
ovitrif Nov 11, 2026
793be4a
chore: merge the spark base into the spark exit branch
ovitrif Nov 11, 2026
9fab00f
fix: refuse a contact withdrawal while an exit runs
ovitrif Nov 11, 2026
e1dbb0b
fix: build a kept fee bump at its rate
ovitrif Nov 11, 2026
16b7c66
fix: pay a higher fee from savings only on spark's chain
ovitrif Nov 11, 2026
07732c1
Merge pull request #1217 from synonymdev/feat/spark-emergency-exit
ovitrif Nov 12, 2026
4aa7f25
Merge remote-tracking branch 'origin/feat/breez-spark-lightning' into…
ovitrif Nov 12, 2026
1052049
Merge remote-tracking branch 'origin/feat/breez-spark-lightning' into…
ovitrif Nov 12, 2026
878e102
chore: merge the spark base with the emergency exit into move to spark
ovitrif Nov 12, 2026
6f9fdc6
Merge pull request #1256 from synonymdev/feat/spark-app-status
ovitrif Nov 12, 2026
3089fa4
Merge remote-tracking branch 'origin/feat/breez-spark-lightning' into…
ovitrif Nov 12, 2026
5ec8ec4
fix: lightning connection reads using spark only outside an exit
ovitrif Nov 12, 2026
743d263
Merge pull request #1212 from synonymdev/feat/move-to-spark
ovitrif Nov 12, 2026
5562ef0
Merge pull request #1257 from synonymdev/feat/spark-exit-app-status
ovitrif Nov 12, 2026
b0105fc
Merge remote-tracking branch 'origin/feat/breez-spark-lightning' into…
ovitrif Nov 12, 2026
5a4459f
refactor: use the existing spark usable check in app status
ovitrif Nov 12, 2026
09d8654
refactor: name the app status spark input isSparkUsable
ovitrif Nov 12, 2026
c07e4ce
docs: exit journey checks lightning connection stops reading using spark
ovitrif Nov 12, 2026
8fafd68
Merge pull request #1297 from synonymdev/fix/spark-exit-using-spark
ovitrif Nov 12, 2026
26a7b62
fix: confirm a spark payout the contact already spent
ovitrif Nov 12, 2026
ab71d26
Merge pull request #1299 from synonymdev/fix/spark-payout-spent-by-co…
ovitrif Nov 12, 2026
615e130
Merge remote-tracking branch 'origin/master' into HEAD
ovitrif Nov 12, 2026
e467a2f
fix: route contact payments on bitkit-core rc15
ovitrif Nov 12, 2026
9bfe85f
fix: confirm a spark payout from its transaction when electrum fails
ovitrif Nov 12, 2026
f53eb9d
fix: find a restored wallet's exit funding past its backed-up index
ovitrif Nov 12, 2026
82ec599
chore: bump breez sdk to 0.28.2
ovitrif Nov 12, 2026
8150b14
fix: wait a check before rebuilding over a step one read left unverified
ovitrif Nov 12, 2026
b01a099
Merge pull request #1304 from synonymdev/fix/spark-payout-electrum-fa…
ovitrif Nov 12, 2026
38447fb
fix: scan a pending restore before quoting and past a forgotten exit'…
ovitrif Nov 12, 2026
71f103f
fix: keep a late contact endpoint decode out of the next send
ovitrif Nov 12, 2026
bfa6268
fix: hold an unverified exit rebuild while any step just turned unver…
ovitrif Nov 12, 2026
0f9f29c
fix: end the exit funding scan at the top of the index range
ovitrif Nov 12, 2026
0869a9e
fix: skip a funded unverified exit rebuild once its step reads again
ovitrif Nov 12, 2026
cf14f5e
docs: say when an unread exit step's rebuild runs
ovitrif Nov 12, 2026
d594038
fix: hold a funded spark exit rebuild over a step sent on an earlier …
ovitrif Nov 12, 2026
31f8848
test: check the held spark exit resume adopted its payment
ovitrif Nov 12, 2026
fe3505b
Merge pull request #1305 from synonymdev/fix/spark-exit-restore-scan-…
ovitrif Nov 12, 2026
bbf02ca
Merge pull request #1306 from synonymdev/chore/breez-sdk-0.28.2
ovitrif Nov 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .agents/commands/release.md
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,8 @@ Print the path to the local draft. Store it for the summary. Slack posting is de

### 7. Build & Upload to TestFlight (optional)

Before archiving, `Secrets.xcconfig` must exist at the repo root with `BREEZ_API_KEY` set (copy `Secrets.xcconfig.template`). Release builds fail without it. Check with `grep -q '^BREEZ_API_KEY = .\+' Secrets.xcconfig`; if it fails, stop and ask the releaser for the key. Never print the key.

Use `AskUserQuestion`:

**Question:** `"Archive and upload to TestFlight?"`
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,5 @@ buildServer.json
# XcodeBuildMCP
.xcodebuildmcp/config.yaml

# Local build secrets
# Local build secrets (see Secrets.xcconfig.template)
Secrets.xcconfig
4 changes: 4 additions & 0 deletions Bitkit.xcconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
// Base settings for the Bitkit app target.
// Local secrets stay out of git: copy Secrets.xcconfig.template to Secrets.xcconfig and fill it in.
// Without it the app builds with Spark (Lightning without channels) off on mainnet.
#include? "Secrets.xcconfig"
42 changes: 42 additions & 0 deletions Bitkit.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
4AAB08CA2E1FE77600BA63DF /* Lottie in Frameworks */ = {isa = PBXBuildFile; productRef = 4AAB08C92E1FE77600BA63DF /* Lottie */; };
961058E32C355B5500E1F1D8 /* BitkitNotification.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 961058DC2C355B5500E1F1D8 /* BitkitNotification.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
968FDF162DFAFE230053CD7F /* LDKNode in Frameworks */ = {isa = PBXBuildFile; productRef = 9613018B2C5022D700878183 /* LDKNode */; };
72B5EE0000000000000000A3 /* BreezSdkSpark in Frameworks */ = {isa = PBXBuildFile; productRef = 72B5EE0000000000000000A2 /* BreezSdkSpark */; };
968FE1402DFB016B0053CD7F /* LDKNode in Frameworks */ = {isa = PBXBuildFile; productRef = 968FE13F2DFB016B0053CD7F /* LDKNode */; };
96DEA03A2DE8BBA1009932BF /* BitkitCore in Frameworks */ = {isa = PBXBuildFile; productRef = 96DEA0392DE8BBA1009932BF /* BitkitCore */; };
96DEA03C2DE8BBAB009932BF /* BitkitCore in Frameworks */ = {isa = PBXBuildFile; productRef = 96DEA03B2DE8BBAB009932BF /* BitkitCore */; };
Expand Down Expand Up @@ -77,6 +78,7 @@
/* End PBXCopyFilesBuildPhase section */

/* Begin PBXFileReference section */
B17C0F1A2EAE000000000001 /* Bitkit.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Bitkit.xcconfig; sourceTree = "<group>"; };
3D76260E4C9C4A53B1E4A001 /* CoreBluetooth.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreBluetooth.framework; path = System/Library/Frameworks/CoreBluetooth.framework; sourceTree = SDKROOT; };
4A319B4F2E8F24F2002B9AC9 /* BitkitWidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = BitkitWidgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
4A319B502E8F24F2002B9AC9 /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; };
Expand Down Expand Up @@ -266,6 +268,7 @@
buildActionMask = 2147483647;
files = (
182817C12F59A7F10055A441 /* Paykit in Frameworks */,
72B5EE0000000000000000A3 /* BreezSdkSpark in Frameworks */,
3D76260F4C9C4A53B1E4A001 /* CoreBluetooth.framework in Frameworks */,
968FDF162DFAFE230053CD7F /* LDKNode in Frameworks */,
18D65E002EB964B500252335 /* VssRustClientFfi in Frameworks */,
Expand Down Expand Up @@ -308,6 +311,7 @@
96FE1F582C2DE6AA006D0C8B = {
isa = PBXGroup;
children = (
B17C0F1A2EAE000000000001 /* Bitkit.xcconfig */,
4A319B6E2E8F25F6002B9AC9 /* BitkitWidgetExtension.entitlements */,
96A44E912CEF5EA700FBACFF /* Bitkit */,
96A44F4A2CEF5F4B00FBACFF /* BitkitTests */,
Expand Down Expand Up @@ -385,6 +389,7 @@
isa = PBXNativeTarget;
buildConfigurationList = 96FE1F862C2DE6AC006D0C8B /* Build configuration list for PBXNativeTarget "Bitkit" */;
buildPhases = (
B17C0F1A2EAE000000000002 /* Check Breez API Key */,
96FE1F5D2C2DE6AA006D0C8B /* Sources */,
96FE1F5E2C2DE6AA006D0C8B /* Frameworks */,
96FE1F5F2C2DE6AA006D0C8B /* Resources */,
Expand All @@ -410,6 +415,7 @@
4AAB08C92E1FE77600BA63DF /* Lottie */,
18D65DFF2EB964B500252335 /* VssRustClientFfi */,
182817C02F59A7F10055A441 /* Paykit */,
72B5EE0000000000000000A2 /* BreezSdkSpark */,
);
productName = Bitkit;
productReference = 96FE1F612C2DE6AA006D0C8B /* Bitkit.app */;
Expand Down Expand Up @@ -520,6 +526,7 @@
4AAB08C82E1FE77600BA63DF /* XCRemoteSwiftPackageReference "lottie-ios" */,
18D65DFE2EB9649F00252335 /* XCRemoteSwiftPackageReference "vss-rust-client-ffi" */,
182817BF2F59A7F10055A441 /* XCRemoteSwiftPackageReference "paykit-rs" */,
72B5EE0000000000000000A1 /* XCRemoteSwiftPackageReference "breez-sdk-spark-swift" */,
);
productRefGroup = 96FE1F622C2DE6AA006D0C8B /* Products */;
projectDirPath = "";
Expand Down Expand Up @@ -574,6 +581,26 @@
/* End PBXResourcesBuildPhase section */

/* Begin PBXShellScriptBuildPhase section */
B17C0F1A2EAE000000000002 /* Check Breez API Key */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "Check Breez API Key";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "if [ \"$CONFIGURATION\" = \"Release\" ] && [ -z \"$(echo \"${BREEZ_API_KEY}\" | tr -d ' ')\" ]; then\n echo \"error: BREEZ_API_KEY is empty. Copy Secrets.xcconfig.template to Secrets.xcconfig and set the key before a Release build or archive (Docs/RELEASE.md).\"\n exit 1\nfi\n";
showEnvVarsInLog = 0;
};
751000000000000000000001 /* Generate Plural Localizations */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
Expand Down Expand Up @@ -953,6 +980,7 @@
};
96FE1F872C2DE6AC006D0C8B /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = B17C0F1A2EAE000000000001 /* Bitkit.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
Expand Down Expand Up @@ -1006,6 +1034,7 @@
};
96FE1F882C2DE6AC006D0C8B /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = B17C0F1A2EAE000000000001 /* Bitkit.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
Expand Down Expand Up @@ -1228,6 +1257,14 @@
version = 4.6.1;
};
};
72B5EE0000000000000000A1 /* XCRemoteSwiftPackageReference "breez-sdk-spark-swift" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/breez/breez-sdk-spark-swift";
requirement = {
kind = exactVersion;
version = 0.28.2;
};
};
968FE13E2DFB016B0053CD7F /* XCRemoteSwiftPackageReference "ldk-node" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/synonymdev/ldk-node";
Expand Down Expand Up @@ -1275,6 +1312,11 @@
package = 4AAB08C82E1FE77600BA63DF /* XCRemoteSwiftPackageReference "lottie-ios" */;
productName = Lottie;
};
72B5EE0000000000000000A2 /* BreezSdkSpark */ = {
isa = XCSwiftPackageProductDependency;
package = 72B5EE0000000000000000A1 /* XCRemoteSwiftPackageReference "breez-sdk-spark-swift" */;
productName = BreezSdkSpark;
};
9613018B2C5022D700878183 /* LDKNode */ = {
isa = XCSwiftPackageProductDependency;
package = 968FE13E2DFB016B0053CD7F /* XCRemoteSwiftPackageReference "ldk-node" */;
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

60 changes: 60 additions & 0 deletions Bitkit/AppScene.swift
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,16 @@ enum IncomingPaykitPaymentRequestPresentationDispatcher {
return IncomingPaykitPaymentRequestPresentationFeedback(paymentDetailsPendingWasRequested: wasRequested)
}

/// Ends a presentation the user asked for once its payment details fail to resolve, so the send sheet stops loading
/// and the user sees why; the request stays in Payment Requests to try again. Automatic presentations keep retrying.
static func finishRequestedPresentationAfterResolutionFailure(
for request: PaykitPaymentRequest,
with manager: PaykitPaymentRequestManager
) -> IncomingPaykitPaymentRequestPresentationFeedback? {
guard manager.requestedPresentationId == request.id else { return nil }
return finishPendingPrivateLink(for: request, with: manager)
}

static func handleStateChange(
from previous: IncomingPaykitPaymentRequestPresentationState,
to current: IncomingPaykitPaymentRequestPresentationState,
Expand Down Expand Up @@ -599,6 +609,35 @@ struct AppScene: View {
await pubkyProfile.retrySessionRestoration()
}
.task(id: [scenePhase == .active, network.isConnected, wipeCoordinator.isGateUp]) { await pollIncomingPaykitPaymentRequests() }
.task(id: [scenePhase == .active, SparkExitManager.shared.needsDriving]) {
guard scenePhase == .active else { return }
await SparkExitManager.shared.runWhileActive()
}
.task(id: [
SparkExitManager.shared.opensProgress,
SparkExitManager.shared.showsResult,
SparkExitManager.shared.hasLoadedRecord,
isLockedForDeepLinks,
wallet.walletExists == true,
]) {
// A tapped exit notification opens the exit once the wallet is unlocked and its record is loaded.
let exit = SparkExitManager.shared
guard exit.opensProgress, wallet.walletExists == true, !isLockedForDeepLinks else { return }
switch SparkExitManager.notificationOpen(
opensProgress: exit.opensProgress,
showsResult: exit.showsResult,
hasLoadedRecord: exit.hasLoadedRecord
) {
case .wait:
return
case .drop:
exit.opensProgress = false
case .open:
exit.opensProgress = false
navigation.reset()
navigation.navigate(.sparkExitProgress)
}
}
.task(id: foregroundContactSession) {
shopContactImport?.task.cancel()
shopContactImport = nil
Expand Down Expand Up @@ -1801,6 +1840,20 @@ struct AppScene: View {
return
}
guard case let .opened(paymentTarget, privatePaymentContext, endpoints) = result else {
let isWaitingForUpdatedList = if case .waitingForUpdatedPaymentList = result {
true
} else {
false
}
if !isWaitingForUpdatedList,
let feedback = IncomingPaykitPaymentRequestPresentationDispatcher.finishRequestedPresentationAfterResolutionFailure(
for: request,
with: paykitPaymentRequestManager
)
{
presentIncomingPaykitPaymentRequestFeedback(feedback, for: request)
return
}
deferIncomingPaykitPaymentRequestPresentation(
request,
reason: result.incomingPaymentRequestFailureReason ?? .resolutionFailed
Expand Down Expand Up @@ -1928,6 +1981,13 @@ struct AppScene: View {
return
} catch {
guard isCurrentIncomingPaymentRequestPreparation(preparation) else { return }
if let feedback = IncomingPaykitPaymentRequestPresentationDispatcher.finishRequestedPresentationAfterResolutionFailure(
for: request,
with: paykitPaymentRequestManager
) {
presentIncomingPaykitPaymentRequestFeedback(feedback, for: request)
return
}
deferIncomingPaykitPaymentRequestPresentation(request, reason: .resolutionFailed)
return
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "coin-stack-x.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"images" : [
{
"filename" : "hourglass-simple.pdf",
"filename" : "hourglass-simple.svg",
"idiom" : "universal"
}
],
Expand All @@ -10,6 +10,7 @@
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true,
"template-rendering-intent" : "template"
}
}
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions Bitkit/BitkitApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ class AppDelegate: NSObject, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool
{
UNUserNotificationCenter.current().delegate = self
SparkExitManager.registerBackgroundTask()

// Check notification authorization status at launch and re-register with APN if granted
UNUserNotificationCenter.current().getNotificationSettings { settings in
Expand Down Expand Up @@ -163,6 +164,8 @@ extension AppDelegate: UNUserNotificationCenterDelegate {
PaykitSubscriptionNotificationTargetStore.save(target)
}
NotificationCenter.default.post(name: .paykitSubscriptionPaymentDue, object: nil, userInfo: userInfo)
} else if userInfo["bitkit_action"] as? String == SparkExitManager.notificationAction {
Task { @MainActor in SparkExitManager.shared.opensProgress = true }
} else {
PushNotificationManager.shared.handleNotification(userInfo)
}
Expand Down
6 changes: 5 additions & 1 deletion Bitkit/Components/FeeDisplayRow.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,16 @@ import SwiftUI
struct FeeDisplayRow: View {
let label: String
let amount: UInt64
/// Shown before the amount when it is a bound or an estimate ("±").
var prefix: String?
/// Shimmers the amount while it is being priced.
var isLoading = false

var body: some View {
VStack(alignment: .leading, spacing: 0) {
CaptionMText(label)
.padding(.bottom, 8)
MoneyText(sats: Int(amount), size: .bodySSB, symbol: true)
MoneyText(sats: Int(amount), size: .bodySSB, symbol: true, prefix: prefix, shimmer: isLoading)
.padding(.bottom, 16)
Divider()
}
Expand Down
Loading
Loading