diff --git a/package.json b/package.json index 0226bfd..8d35774 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nostr_quantum_preparation", - "version": "0.0.36", + "version": "0.0.37", "description": "A migration strategy for bringing post-quantum security to Nostr without breaking the social graph, without requiring consensus on a single post-quantum algorithm, and without forcing existing users to abandon their identities.", "main": "index.js", "scripts": { diff --git a/www/js/index-app.mjs b/www/js/index-app.mjs index 710f7b8..3739bdb 100644 --- a/www/js/index-app.mjs +++ b/www/js/index-app.mjs @@ -16,6 +16,7 @@ bytesToBase64, base64ToBytes, bytesToHex, + hexToNpub, PQ_KEY_INFO, NIP_QR_KIND, buildUpgradedEvent, @@ -1308,7 +1309,7 @@ const saved = loadPendingOts(); if (!saved || !saved.confirmedPublished) { setStatus(document.getElementById('pqOtsStatus'), 'success', 'Bitcoin attestation verified. Publishing new kind 9999 with confirmed proof...'); - await publishUpgradedEvent(pendingOtsBytes); + await publishUpgradedEvent(pendingOtsBytes, att ? att.height : null, att ? att.time : null); } } else if (isOtsConfirmed(pendingOtsBytes)) { // Structural check found a Bitcoin attestation tag but full @@ -1340,7 +1341,7 @@ otsPollInterval = setInterval(poll, 60000); } - async function publishUpgradedEvent(upgradedOtsBytes) { + async function publishUpgradedEvent(upgradedOtsBytes, bitcoinHeight = null, bitcoinTime = null) { const otsStatus = document.getElementById('pqOtsStatus'); try { otsLog('Building upgraded proof carrier with confirmed OTS proof...'); @@ -1375,6 +1376,46 @@ kind1Event }); + // Publish a kind 1 reply announcing the confirmed attestation. + // This is a regular Nostr text note (reply to the original kind 1 + // announcement) so it shows up in feeds/thread views. It only needs + // the secp256k1 signature — no PQ signatures. + if (kind1Event && kind1Event.id) { + try { + otsLog('Publishing kind 1 reply announcing confirmed attestation...'); + const npub = hexToNpub(currentPubkey); + const dateStr = bitcoinTime + ? new Date(bitcoinTime * 1000).toISOString().substring(0, 19) + : 'unknown'; + const blockStr = bitcoinHeight ? `Bitcoin block ${bitcoinHeight} (mined ${dateStr} UTC)` : 'a Bitcoin block'; + const replyContent = `✅ The OpenTimestamps proof for my post-quantum key attestation has been confirmed in ${blockStr}. The link between my current Nostr identity and my post-quantum keys is now anchored to the Bitcoin blockchain and cannot be backdated. + +Verify it here: https://laantungir.net/quantum-prep/verify.html?npub=${npub} + +This is a reply to my original attestation announcement. The confirmed proof is carried in a new kind 9999 event referencing the original.`; + const replyTemplate = { + kind: 1, + content: replyContent, + tags: [ + ['e', kind1Event.id, '', 'root'], + ['e', validatedEvent.id, '', 'mention'] + ], + pubkey: currentPubkey, + created_at: Math.floor(Date.now() / 1000) + }; + const replySigned = await window.nostr.signEvent(replyTemplate); + const replyValidated = validateSignerOutput(replySigned, replyTemplate, currentPubkey); + const replyResults = await publishToRelays(replyValidated, relayUrls); + const replyOk = replyResults.filter(r => r.success).length; + const replyFail = replyResults.filter(r => !r.success).length; + otsLog(`Kind 1 reply published. Successful: ${replyOk}; failed: ${replyFail}.`); + } catch (replyErr) { + // The upgraded proof carrier is already published; a failed reply + // is non-fatal — log it but don't fail the whole operation. + otsLog(`WARNING: kind 1 reply failed: ${replyErr.message}`); + } + } + setStatus(otsStatus, 'success', `Upgraded proof carrier published to ${successCount} relays. Timestamping complete.`); setStepDone(6); setStepActive(7); diff --git a/www/js/version.json b/www/js/version.json index 535ba4f..eaca92a 100644 --- a/www/js/version.json +++ b/www/js/version.json @@ -1,5 +1,5 @@ { - "VERSION": "v0.0.36", - "VERSION_NUMBER": "0.0.36", - "BUILD_DATE": "2026-07-27T20:31:02.763Z" + "VERSION": "v0.0.37", + "VERSION_NUMBER": "0.0.37", + "BUILD_DATE": "2026-07-27T21:08:31.939Z" }