feat: replace view-key monitor with TX proof verification

Remove v2 view-key payment monitor (privacy concern — nobody should
enter their private view key on a website). Replace with TX proof
verification where the sender provides TX Hash + TX Key from their
wallet. The proof is cryptographically verified client-side and
stored with the invoice for persistent "Paid" status.

- Remove monitor.js and all view-key monitoring UI/logic
- Add TX proof section: sender enters TX Hash + TX Key
- Client-side verification via check_tx_key equivalent (noble-curves)
- api/verify.php stores/retrieves payment proofs per invoice
- Short URL redirect now includes invoice code for status lookup
- Invoice link shows "Paid" badge once proof is verified
- Deadline badges (7/14/30 days) for payment terms
This commit is contained in:
Alexander Schmidt
2026-03-25 09:37:09 +01:00
parent 1acf990943
commit 32245fccdf
9 changed files with 318 additions and 696 deletions

56
i18n.js
View File

@@ -29,22 +29,18 @@ var I18n = (function () {
countdown_remaining_days: 'Zahlungsfrist: {d} Tage, {h}:{m}:{s}',
countdown_remaining_hours: 'Zahlungsfrist: {h}:{m}:{s}',
rates_offline: 'Kurse nicht verfügbar — nur XMR-Betrag möglich',
btn_monitor: 'Zahlung überwachen',
label_view_key: 'Privater View-Key',
placeholder_view_key: '64 Hex-Zeichen...',
hint_view_key: 'Der View-Key verlässt nie deinen Browser',
btn_start_monitor: 'Überwachung starten',
btn_stop_monitor: 'Überwachung beenden',
monitor_connecting: 'Verbinde mit Node...',
monitor_scanning: 'Scanne Mempool...',
monitor_waiting: 'Warte auf Zahlung...',
monitor_mempool: 'Zahlung erkannt (unbestätigt)',
monitor_confirmed: 'Zahlung bestätigt',
monitor_confirmations: '{n}/10 Bestätigungen',
monitor_underpaid: 'Unterzahlung erkannt',
monitor_underpaid_detail: 'Erwartet: {expected} XMR — Erhalten: {received} XMR',
monitor_node_error: 'Node nicht erreichbar — versuche nächsten...',
monitor_loading: 'Lade Kryptografie-Modul...'
btn_prove_payment: 'Zahlung nachweisen',
label_tx_hash: 'Transaction ID (TX Hash)',
placeholder_tx_hash: '64 Hex-Zeichen...',
label_tx_key: 'Transaction Key (TX Key)',
placeholder_tx_key: '64 Hex-Zeichen...',
btn_verify_proof: 'Zahlung verifizieren',
proof_verifying: 'Verifiziere...',
proof_verified: 'Zahlung bestätigt: {amount} XMR',
proof_no_match: 'Kein passender Output gefunden — TX Key oder Adresse stimmt nicht',
proof_tx_not_found: 'Transaktion nicht gefunden',
proof_error: 'Fehler bei der Verifizierung',
status_paid: 'Bezahlt'
},
en: {
subtitle: 'Monero payment request in seconds',
@@ -68,22 +64,18 @@ var I18n = (function () {
countdown_remaining_days: 'Deadline: {d} days, {h}:{m}:{s}',
countdown_remaining_hours: 'Deadline: {h}:{m}:{s}',
rates_offline: 'Rates unavailable — XMR amount only',
btn_monitor: 'Monitor payment',
label_view_key: 'Private view key',
placeholder_view_key: '64 hex characters...',
hint_view_key: 'Your view key never leaves your browser',
btn_start_monitor: 'Start monitoring',
btn_stop_monitor: 'Stop monitoring',
monitor_connecting: 'Connecting to node...',
monitor_scanning: 'Scanning mempool...',
monitor_waiting: 'Waiting for payment...',
monitor_mempool: 'Payment detected (unconfirmed)',
monitor_confirmed: 'Payment confirmed',
monitor_confirmations: '{n}/10 confirmations',
monitor_underpaid: 'Underpayment detected',
monitor_underpaid_detail: 'Expected: {expected} XMR — Received: {received} XMR',
monitor_node_error: 'Node unreachable — trying next...',
monitor_loading: 'Loading crypto module...'
btn_prove_payment: 'Prove payment',
label_tx_hash: 'Transaction ID (TX Hash)',
placeholder_tx_hash: '64 hex characters...',
label_tx_key: 'Transaction Key (TX Key)',
placeholder_tx_key: '64 hex characters...',
btn_verify_proof: 'Verify payment',
proof_verifying: 'Verifying...',
proof_verified: 'Payment confirmed: {amount} XMR',
proof_no_match: 'No matching output found — TX key or address mismatch',
proof_tx_not_found: 'Transaction not found',
proof_error: 'Verification error',
status_paid: 'Paid'
}
};