feat: implement NIP-A3 payment targets (kind 10133)

- Fix PaymentTargetTag.parse() missing tag.has(2) bounds check
- Add paymentTargets() method to PaymentTargetsEvent to read tags
- Add savePaymentTargets() and flow StateFlow to NipA3PaymentTargetsState
- Add savePaymentTargets() to Account for publishing kind 10133 events
- Create PaymentTargetsViewModel and PaymentTargetsScreen for settings UI
- Add EditPaymentTargets route and navigation entry
- Add Payment Targets row in AllSettingsScreen (wallet icon)
- Display other users' payment targets on their profile page
- Fetch kind 10133 when loading user profiles via UserProfileListKinds
- Add string resources for payment targets UI

https://claude.ai/code/session_018G4g1cChqjeNEM5TztD3FE
This commit is contained in:
Claude
2026-04-03 10:17:16 +00:00
parent 3d91fb75d4
commit 480542d46d
12 changed files with 457 additions and 3 deletions
@@ -35,11 +35,10 @@ class PaymentTargetTag {
ensure(tag.has(1)) { return null }
ensure(tag[0] == TAG_NAME) { return null }
ensure(tag[1].isNotEmpty()) { return null }
ensure(tag.has(2)) { return null }
ensure(tag[2].isNotEmpty()) { return null }
val paymentTarget = PaymentTarget(tag[1], tag[2])
return paymentTarget
return PaymentTarget(tag[1], tag[2])
}
fun assemble(paymentTarget: PaymentTarget) = arrayOf(TAG_NAME, paymentTarget.type, paymentTarget.authority)
@@ -34,6 +34,8 @@ class PaymentTargetsEvent(
content: String,
sig: HexKey,
) : BaseReplaceableEvent(id, pubKey, createdAt, KIND, tags, content, sig) {
fun paymentTargets(): List<PaymentTarget> = tags.mapNotNull { PaymentTargetTag.parse(it) }
companion object {
const val KIND = 10133