feat: add private payment requests - #1172
Conversation
Greptile SummaryThis PR adds private Paykit payment-request creation, incoming request presentation and history, rejection, identity-scoped suppression, and stricter private endpoint handling. It also upgrades Paykit and adds local E2E homeserver and stale-session initialization support.
Confidence Score: 4/5The identity-change creation race should be fixed before merging because it can create a request remotely while leaving the sender with no success or failure feedback. A successful SDK proposal can be excluded from sentRequests after an identity generation change, and the ViewModel then suppresses the only callback that advances the creation flow. Files Needing Attention: app/src/main/java/to/bitkit/repositories/PaykitPaymentRequestRepo.kt, app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt
|
| Filename | Overview |
|---|---|
| app/src/main/java/to/bitkit/repositories/PaykitPaymentRequestRepo.kt | Adds identity-scoped incoming/outgoing request state, proposal and rejection operations, expiry, target eligibility, and presentation persistence; successful proposals can be omitted from local sent state after an identity race. |
| app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt | Orchestrates request polling, automatic/manual presentation, retries, identity transitions, creation, and rejection; its conditional success callback can silently strand a completed proposal. |
| app/src/main/java/to/bitkit/services/PaykitSdkService.kt | Adds payment-request SDK operations, capability discovery, exact identity checks, and stale-session initialization recovery. |
| app/src/main/java/to/bitkit/ui/screens/paymentrequests/CreatePaymentRequestScreen.kt | Adds amount, note, expiry, recipient selection, and sent-state screens for outgoing requests. |
| app/src/main/java/to/bitkit/ui/screens/paymentrequests/PaymentRequestsScreen.kt | Adds incoming preview and complete incoming/sent request history with pay and reject actions. |
| app/src/main/java/to/bitkit/ui/components/SheetHost.kt | Adds sheet visibility callbacks and dismissal locking for durable request creation. |
| app/src/main/java/to/bitkit/repositories/PaykitPaymentRequestPresentationStore.kt | Persists encrypted, identity-scoped sets of already presented request identifiers. |
Sequence Diagram
sequenceDiagram
participant UI as Receive UI
participant VM as AppViewModel
participant Repo as PaymentRequestRepo
participant SDK as Paykit SDK
participant Peer as Contact
UI->>VM: createPaymentRequest(draft, target)
VM->>Repo: propose(...)
Repo->>SDK: proposePaymentRequest(...)
SDK-->>Peer: queue private request
Repo->>SDK: processPendingPrivateMessages()
Repo-->>VM: "Result<PaymentRequest>"
VM-->>UI: onCreated(request)
Reviews (1): Last reviewed commit: "feat: add private payment requests" | Re-trigger Greptile
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
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.