diff --git a/www/cashu.html b/www/cashu.html index 4c1f1de..a655766 100644 --- a/www/cashu.html +++ b/www/cashu.html @@ -637,6 +637,7 @@
No proof check run yet.
+
@@ -728,7 +729,7 @@ import { initBlossomSection, updateBlossomSection } from './js/blossom-ui.mjs'; import { initAiSectionWithLocalConfig } from './js/ai-ui.mjs'; - import { createCashuWalletController } from './js/cashu-wallet.mjs?v=mint-discovery-3'; + import { createCashuWalletController } from './js/cashu-wallet.mjs?v=nip60-republish-1'; const versionInfo = await getVersion(); const VERSION = versionInfo.VERSION; @@ -2348,6 +2349,23 @@ } }); + const btnRepublishWallet = document.getElementById('btnRepublishWallet'); + btnRepublishWallet?.addEventListener('click', async () => { + try { + if (!walletController?.hasWallet?.()) { + setStatus('No wallet to republish', true); + return; + } + setStatus('Republishing wallet event (kind 17375)...'); + await walletController.republishWallet(); + await refreshAllWalletViews(); + setStatus('Wallet republished successfully'); + } catch (error) { + console.error('[cashu.html] Republish wallet failed:', error); + setStatus(error.message || 'Republish failed', true); + } + }); + btnSaveZapsSettings?.addEventListener('click', async () => { try { const amount = Number(inpZapDefaultAmount?.value || 0); diff --git a/www/js/cashu-wallet.mjs b/www/js/cashu-wallet.mjs index 7577049..eb7eb10 100644 --- a/www/js/cashu-wallet.mjs +++ b/www/js/cashu-wallet.mjs @@ -15,6 +15,7 @@ import { walletRemoveMint, walletGetTransactions, walletShutdown, + walletRepublish, walletPublishMintList, walletFetchMintList, onWalletStatus, @@ -397,6 +398,16 @@ export async function createCashuWalletController({ pubkey, relayUrls = [] } = { } } + async function republishWallet() { + await ensureWallet(); + const result = await walletRepublish(); + if (Array.isArray(result?.mints)) { + mintsCache = uniqueMints(result.mints); + } + applyBalancePayload(result || {}); + return { mints: [...mintsCache] }; + } + cleanupFns.push(onWalletStatus((payload) => { if (typeof payload?.hasWallet === 'boolean') { hasWalletCache = payload.hasWallet; @@ -431,6 +442,7 @@ export async function createCashuWalletController({ pubkey, relayUrls = [] } = { waitForDeposit, getTransactionHistory, publishMintList, + republishWallet, fetchRecipientMintList, onWalletEvent, subscribeTransactions, diff --git a/www/js/init-ndk.mjs b/www/js/init-ndk.mjs index 9367ec0..bc2dfa8 100644 --- a/www/js/init-ndk.mjs +++ b/www/js/init-ndk.mjs @@ -184,7 +184,7 @@ export async function initNDKPage(options = {}) { // All pages in www/ directory, so worker path is always the same. // Include explicit worker revision token so updated SharedWorker code is guaranteed to restart. - const WORKER_REVISION = 'nip60-tagarray-fix-1'; + const WORKER_REVISION = 'nip60-republish-1'; const workerPath = `./ndk-worker.js?v=${encodeURIComponent(VERSION)}&wr=${encodeURIComponent(WORKER_REVISION)}`; // Initialize NDK SharedWorker (shared across all tabs/pages) @@ -1425,6 +1425,10 @@ export function walletShutdown() { return sendWorkerRequest('walletShutdown', {}, 10000, 'walletShutdown timeout'); } +export function walletRepublish() { + return sendWorkerRequest('walletRepublish', {}, 45000, 'walletRepublish timeout'); +} + export function walletPublishMintList(relays = [], receiveMints = []) { return sendWorkerRequest('walletPublishMintList', { relays, receiveMints }, 25000, 'walletPublishMintList timeout'); } diff --git a/www/js/version.json b/www/js/version.json index 514421d..3eec6a4 100644 --- a/www/js/version.json +++ b/www/js/version.json @@ -1,5 +1,5 @@ { - "VERSION": "v0.7.20", - "VERSION_NUMBER": "0.7.20", - "BUILD_DATE": "2026-06-25T17:34:24.155Z" + "VERSION": "v0.7.21", + "VERSION_NUMBER": "0.7.21", + "BUILD_DATE": "2026-06-25T17:39:32.779Z" } diff --git a/www/ndk-worker.js b/www/ndk-worker.js index 1169d00..8c6eb49 100644 --- a/www/ndk-worker.js +++ b/www/ndk-worker.js @@ -4304,6 +4304,30 @@ async function handleWalletCheckProofs(requestId, port) { } } +async function handleWalletRepublish(requestId, port) { + try { + if (!ndk || !currentPubkey) { + port.postMessage({ type: 'response', requestId, error: 'NDK not ready' }); + return; + } + await ensureDirectWalletLoaded(); + await publishDirectProofs({ traceId: 'walletRepublish' }); + const payload = getWalletBalancePayload(); + port.postMessage({ + type: 'response', + requestId, + data: { + success: true, + mints: getDirectWalletMints(), + ...payload + } + }); + } catch (error) { + console.warn('[Worker] handleWalletRepublish failed:', error?.message || error); + port.postMessage({ type: 'response', requestId, error: error.message || 'Republish failed' }); + } +} + function handleWalletShutdown(requestId, port) { try { clearWalletListeners(); @@ -6500,7 +6524,11 @@ self.onconnect = (event) => { case 'walletCheckProofs': await handleWalletCheckProofs(requestId, port); break; - + + case 'walletRepublish': + await handleWalletRepublish(requestId, port); + break; + default: console.warn('[Worker] Unknown message type:', type); }