diff --git a/src/nostrMiddleware.ts b/src/nostrMiddleware.ts index cac2662c..e2fa3b6d 100644 --- a/src/nostrMiddleware.ts +++ b/src/nostrMiddleware.ts @@ -49,6 +49,12 @@ export default (serverMethods: Types.ServerMethods, mainHandler: Main, nostrSett } if (event.kind === 21001) { const offerReq = j as NofferData + log("🎯 [NOSTR EVENT] Received offer request (kind 21001)", { + fromPub: event.pub, + appId: event.appId, + eventId: event.id, + offer: offerReq.offer + }) mainHandler.offerManager.handleNip69Noffer(offerReq, event) return } else if (event.kind === 21002) { diff --git a/src/services/main/offerManager.ts b/src/services/main/offerManager.ts index 2601ebf0..65b44e93 100644 --- a/src/services/main/offerManager.ts +++ b/src/services/main/offerManager.ts @@ -39,7 +39,7 @@ export class OfferManager { storage: Storage lnd: LND liquidityManager: LiquidityManager - logger = getLogger({ component: 'DebitManager' }) + logger = getLogger({ component: 'OfferManager' }) constructor(storage: Storage, settings: MainSettings, lnd: LND, applicationManager: ApplicationManager, productManager: ProductManager, liquidityManager: LiquidityManager) { this.storage = storage this.settings = settings @@ -152,15 +152,46 @@ export class OfferManager { } async handleNip69Noffer(offerReq: NofferData, event: NostrEvent) { + this.logger("📥 [OFFER REQUEST] Received offer request", { + fromPub: event.pub, + appId: event.appId, + eventId: event.id, + offer: offerReq.offer, + amount: offerReq.amount_sats, + payerData: offerReq.payer_data + }) + const offerInvoice = await this.getNofferInvoice(offerReq, event.appId) + if (!offerInvoice.success) { const code = offerInvoice.code + this.logger("❌ [OFFER REJECTED] Offer request failed", { + fromPub: event.pub, + eventId: event.id, + code, + error: codeToMessage(code), + max: offerInvoice.max + }) const e = newNofferResponse(JSON.stringify({ code, error: codeToMessage(code), range: { min: 10, max: offerInvoice.max } }), event) this.nostrSend({ type: 'app', appId: event.appId }, { type: 'event', event: e, encrypt: { toPub: event.pub } }) return } + + this.logger("✅ [OFFER SUCCESS] Generated invoice for offer request", { + fromPub: event.pub, + eventId: event.id, + invoice: offerInvoice.invoice.substring(0, 50) + "...", + offer: offerReq.offer + }) + const e = newNofferResponse(JSON.stringify({ bolt11: offerInvoice.invoice }), event) this.nostrSend({ type: 'app', appId: event.appId }, { type: 'event', event: e, encrypt: { toPub: event.pub } }) + + this.logger("📤 [OFFER RESPONSE] Sent offer response", { + toPub: event.pub, + eventId: event.id, + responseEventId: "generated" + }) return } @@ -200,7 +231,7 @@ export class OfferManager { } const { passed, validated } = this.ValidateExpectedData(userOffer, offerReq.payer_data) if (!passed) { - console.log("Invalid expected data", validated) + this.logger("Invalid expected data", validated || {}) return { success: false, code: 1, max: remote } } const res = await this.applicationManager.AddAppUserInvoice(appId, { diff --git a/src/services/nostr/handler.ts b/src/services/nostr/handler.ts index 553c8d6f..0a0fdb34 100644 --- a/src/services/nostr/handler.ts +++ b/src/services/nostr/handler.ts @@ -188,11 +188,20 @@ export default class Handler { relay.close() this.Connect() }) + + const appIds = Object.keys(this.apps) + log("🔍 [NOSTR SUBSCRIPTION] Setting up subscription", { + since: Math.ceil(Date.now() / 1000), + kinds: supportedKinds, + appIds: appIds, + listeningForPubkeys: appIds + }) + const sub = relay.subscribe([ { since: Math.ceil(Date.now() / 1000), kinds: supportedKinds, - '#p': Object.keys(this.apps), + '#p': appIds, } ], { oneose: () => {