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);
}