aboutsummaryrefslogtreecommitdiffstats
path: root/src/features/sync.js
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2026-07-06 00:08:34 -0700
committerAdam Soltys <[email protected]>2026-07-06 00:08:34 -0700
commit8e2ff4976db3d7586d7b9c993a94cf9bea071a12 (patch)
tree47a1bf687ef7bbbc3545f81f060edb782c056b5f /src/features/sync.js
parenta3783d7e7f53709a8f8352494b9e89583e46f85b (diff)
downloadcoinosv3-8e2ff4976db3d7586d7b9c993a94cf9bea071a12.tar.gz
coinosv3-8e2ff4976db3d7586d7b9c993a94cf9bea071a12.zip
Ark zaps PoC — a NIP-61-shaped zap protocol over arkoor
Lightning zaps are welded to LNURL+bolt11; nutzaps (NIP-61) proved the alternative shape, and ark fits it better than Cashu because delivery already exists (the mailbox). Draft protocol, kinds provisional: kind 10037 (replaceable) announces the wallet's ark address+network; the zap itself is a plain instant arkoor send; kind 9737 is the sender-signed receipt tagging recipient, amount, comment, and the delivered vtxo id — so the receipt is checkable against the actual payment, unlike a bare attestation. UX: paste an npub into Send and hal offers the zap (needs both the ark and sync features; npub decoding is inline bech32 so ark-only builds stay lean). The nostr layer gains generic publishEvent/fetchEvents, exposed through the sync seam as wallet.nostrPublish/nostrFetch. Proven on regtest against a mini NIP-01 relay: announce, resolve, zap 1,000 sats with a comment, instant receipt+delivery, vtxo match. Co-Authored-By: Claude Fable 5 <[email protected]>
Diffstat (limited to 'src/features/sync.js')
-rw-r--r--src/features/sync.js16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/features/sync.js b/src/features/sync.js
index f927aef..8349b5d 100644
--- a/src/features/sync.js
+++ b/src/features/sync.js
@@ -22,6 +22,22 @@ export function installSyncWallet(wallet) {
return this.nostr && this.nostr.sk ? this.nostr.sendDM(recipientPkHex, text) : false;
},
+ // Generic event publish/fetch on the configured sync relays — the seam
+ // other features (ark zaps) use to speak their own kinds. No-ops when
+ // sync is disabled or the wallet is offline.
+ async nostrPublish(partial) {
+ const sync = getSyncConfig();
+ if (this.offline || !sync.enabled || !this.nostr.sk) return null;
+ this.nostr.setRelays(sync.relays);
+ return this.nostr.publishEvent(partial);
+ },
+ async nostrFetch(filter, maxWait) {
+ const sync = getSyncConfig();
+ if (this.offline || !sync.enabled) return [];
+ this.nostr.setRelays(sync.relays);
+ return this.nostr.fetchEvents(filter, maxWait);
+ },
+
// Pull the latest state from Nostr; apply it if it's newer than what we have.
// Returns true if state was applied (so the caller can skip a full scan).
async syncFromNostr() {