feat: send paykit payment proofs - #683
Conversation
This comment has been minimized.
This comment has been minimized.
8801387 to
c5d04c7
Compare
ovitrif
left a comment
There was a problem hiding this comment.
On-chain payment proofs cannot recover after a store-load failure, so a successful send can still leave the requester without proof.
ovitrif
left a comment
There was a problem hiding this comment.
QA Notes
Ran on iPhone 17 Pro simulator and Pixel_9a emulator on regtest.
- iOS created a private request for Android, Android paid, and iOS recorded the proof against that request.
- Android created a private request for iOS, iOS paid, and Android recorded the proof against that request.
Approve.
01c4164 to
bcf1d8a
Compare
|
Added the cross-platform proof-state hardening in c3f2d8c: corrupt persisted proof state is discarded instead of permanently blocking reconciliation, empty state removes the Keychain entry, and the frequent refresh path returns before calling Paykit when there is nothing to reconcile. The full payment-proof suite passes 22/22 on the restacked subscriptions head. |
c3f2d8c to
281b865
Compare
|
Follow-up after the final cleanup: the hardening commit is now |
|
CI note: the remaining |
jvsena42
left a comment
There was a problem hiding this comment.
Found some points that worth a double check
281b865 to
e66771b
Compare
|
Retested latest revision, iPhone 17 sim ↔ Pixel emu (same session as android #1178). Amount edit on pay (iOS only) Recording: Screen.Recording.2026-09-01.at.16.08.22.movRequest lists don’t match
Not amount-keyed overwrite in the app list — IDs are Screenshot (Payment Requests list): Logs: Proofs still queued on the successful pays (LN + on-chain both ways). Amount pad / list drift look like follow-ups, not a proofs blocker. |
|
Thanks — I reproduced the amountless-endpoint route issue and fixed it in signed commit I also reran a clean iOS ↔ Android session with two successful requests in each direction. Both apps ended with the same four history rows, and each remote request transitioned to paid after the payer logged the proof as queued. In this path, “queued” means durably accepted by the SDK outbox for delivery, not stuck. I could not reproduce the history divergence or an undelivered proof on the clean current heads, so I have not added a speculative mapping change. Please retest the current head once the fresh checks finish. |
ovitrif
left a comment
There was a problem hiding this comment.
The Payment Request dismiss control still ignores shouldExpand, so the card actions are not equal-width.
Hardware-funded incoming on-chain pays still skip proof prepare and complete, so those broadcasts never send a proof.
|
Fixed both points in signed commit
Focused simulator verification passes: |

This PR sends a Paykit payment proof back to the requester after Bitkit successfully pays an incoming private payment request.
Description
This PR is stacked on #676. Companion Android PR: synonymdev/bitkit-android#1178
Linked Issues/Tasks
N/A
Screenshot / Video
N/A — there are no UI changes.
QA Notes
Manual Tests
Automated Checks
PaykitPaymentProofServiceTests.swift: 8 tests cover restart retry, duplicate suppression, invalid Lightning preimage rejection, failed-payment cleanup, exact on-chain proof submission, overlapping retries, wallet-store clearing, and completed-proof persistence failure.git diff --checkpassed.