feat: add private payment requests - #1172
Conversation
This comment has been minimized.
This comment has been minimized.
ba7f745 to
e8183a5
Compare
ovitrif
left a comment
There was a problem hiding this comment.
Looks good. Durably queued requests stay confirmed after an identity change, and a consumed private payment list is never reused or replaced by public details.
5120677 to
7877465
Compare
Note this cc. @jvsena42 @piotr-iohk |
As far as paykit-server it would be good to have a staging deployment since paykit e2e tests are run against our staging regtest and also using staging homeserver (as far as I understand that was the plan, see: #1084 (comment))
|
af0aaa4 to
e2516e9
Compare
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
jvsena42
left a comment
There was a problem hiding this comment.
Review of the payment request flows. just compile and just test pass; the ComposeUi instrumented lane was run on a Pixel 9 AVD and all 15 new tests pass (after 864f008 fixed CreatePaymentRequestScreenTest querying a merged-semantics node). The 8 other failures in that lane reproduce on master and are unrelated.
Findings inline, roughly most-severe first. The SheetHost dismissEnabled work looks sound to me: programmatic hide() bypasses confirmValueChange, the disabled scrim sits under the sheet, and the inner NavHost BackHandlers still take priority over the swallowed sheet back handler.
ovitrif
left a comment
There was a problem hiding this comment.
List-driven Request Payment now starts on the form, and in-sheet back closes the sheet so you return to Payment Requests.
|
Flagging while QA’ing with the staging public-pay pubkys — not a prod issue (Paykit UI is still hidden). Enabling payments with contacts fail-closes with Unknown error if a saved contact’s receiver marker doesn’t parse (here: missing
In principle the same thing could happen with any broken / outdated profile marker, not only these fixtures. Recording attached. Same surface on iOS after #676 (toast there is Private Paykit is not available). Steps:
Screen.Recording.2026-08-26.at.10.12.34.mov |
|
Flagging from QA: paying a payment request that’s larger than the wallet balance. Same setup, two directions, both recordings attached:
Screen.Recording.2026-08-26.at.14.06.24.mov
Screen.Recording.2026-08-26.at.14.18.16.movSteps:
Expected: don’t enter confirm if the amount is above spendable. On Android, Dismiss should still work after a failed Pay (no already in progress loop). |
|
Addressed both QA findings in signed commit
The matching iOS fixes are isolated in synonymdev/bitkit-ios#684: malformed remote markers no longer block other contacts, and incoming request amounts are used during initial LN/on-chain balance validation so the standard insufficient Spending/Savings error appears before coin selection. Local verification: 193 focused Android tests passed; detekt completed successfully with only unrelated pre-existing findings. |
This PR adds private Paykit Payment Requests to Bitkit.
Description
0.1.0-rc44and adds local E2E homeserver configuration plus safe cold-start restoration for externally managed Pubky sessions.The request payload itself remains SDK-backed and durable; Bitkit persists only encrypted, identity-scoped presentation suppression, not a duplicate request queue. Payment proofs and receipts remain out of scope.
Dependencies:
41cda2567226a690a012770017d5e7c1d49e2a2b.Preview
N/A — proof recordings were completed locally and are intentionally not attached to the PR.
QA Notes
Manual Tests
Automated Checks
PaykitPaymentRequestRepoTest.kt: covers mapping, eligibility, proposal delivery, rejection, expiry, identity-scoped presentation state, and action serialization.PaykitSdkServiceTest.kt: covers exact identity enforcement and safe deferred session restoration.AppViewModelSendFlowTest.kt: covers automatic/manual presentation, sheet transitions, identity changes, newer-list retry, strict private resolution, and payment lifecycle races.PaymentRequestExpirationTest.kt: covers expiry selection and retained draft state.SheetHostTest.kt: covers locked sheet dismissal and scrim input isolation during durable proposal creation.git diff --check.