diff --git a/apps/machine/src/services/lightning.ts b/apps/machine/src/services/lightning.ts index 181c5dd..3f8b1ac 100644 --- a/apps/machine/src/services/lightning.ts +++ b/apps/machine/src/services/lightning.ts @@ -246,7 +246,8 @@ function registerLnurlSession( sessionId: string, linkId: string, uniqueHash: string, - satsAmount: number + satsAmount: number, + lightningPub: LightningPubClient ): void { console.log('[LNURL Session] Registering:', uniqueHash, 'for', satsAmount, 'sats') @@ -331,7 +332,10 @@ function startLnurlCompletionPolling( * Invalidate an active LNURL session by cash-in sessionId. * Stops polling and deletes the link on the server. */ -function invalidateLnurlSessionBySessionId(sessionId: string): void { +function invalidateLnurlSessionBySessionId( + sessionId: string, + lightningPub: LightningPubClient +): void { for (const [hash, session] of lnurlSessions.entries()) { if (session.sessionId === sessionId && session.status === 'active') { console.log('[LNURL Session] Invalidating previous session:', hash) @@ -1094,7 +1098,7 @@ function createATMServices( // Invalidate any previous LNURL session for this cash-in session // (shouldn't happen — LNURL is generated once — but guard against it) if (context.cashInSessionId) { - invalidateLnurlSessionBySessionId(context.cashInSessionId) + invalidateLnurlSessionBySessionId(context.cashInSessionId, lightningPub) } // Call the withdraw extension via Nostr RPC (encrypted) @@ -1124,7 +1128,8 @@ function createATMServices( context.cashInSessionId, response.link.id || '', response.link.unique_hash, - context.satsAmount + context.satsAmount, + lightningPub ) // Start polling for completion (still uses HTTP - no RPC alternative yet) diff --git a/apps/machine/src/stores/atm.ts b/apps/machine/src/stores/atm.ts index 5060beb..df29ae8 100644 --- a/apps/machine/src/stores/atm.ts +++ b/apps/machine/src/stores/atm.ts @@ -251,10 +251,11 @@ export const useAtmStore = defineStore('atm', () => { // Auto-advance past waitingForCashTaken when HAL is connected, // because HAL's dispenseCash already calls waitForBillsRemoved() + // before resolving (both direct HAL and IPC paths). if ( currentNested === 'waitingForCashTaken' && prevNestedState !== 'waitingForCashTaken' && - halServices.value + (halServices.value || isElectron) ) { console.log('[ATM] HAL active — bills already removed, auto-advancing') send({ type: 'CASH_DISPENSED' }) diff --git a/packages/state-machine/src/machine.ts b/packages/state-machine/src/machine.ts index 05b6651..873087b 100644 --- a/packages/state-machine/src/machine.ts +++ b/packages/state-machine/src/machine.ts @@ -703,6 +703,10 @@ export function createATMMachine( }, }, waitingForCashTaken: { + // Auto-advance after 30s — bills are already out, assume taken. + after: { + 30000: 'complete', + }, on: { CASH_DISPENSED: 'complete', TIMEOUT: 'complete', // Assume taken