diff --git a/frontend/electron/main.cjs b/frontend/electron/main.cjs index e58ffbb..3a6b308 100644 --- a/frontend/electron/main.cjs +++ b/frontend/electron/main.cjs @@ -2,12 +2,20 @@ const { app, BrowserWindow, ipcMain, shell } = require('electron') const path = require('path') const { execFile } = require('child_process') const fs = require('fs') +const os = require('os') const isDev = process.env.NODE_ENV === 'development' const VITE_PORT = 5173 let mainWindow = null +// ── Wallet storage directory ─────────────────────────────────────────────────── +const WALLET_DIR = path.join(os.homedir(), '.wallet-generator', 'wallet') + +function ensureWalletDir() { + fs.mkdirSync(WALLET_DIR, { recursive: true }) +} + // ── Resolve Python executable ────────────────────────────────────────────────── function findPython() { const repoRoot = path.join(__dirname, '..', '..') @@ -21,9 +29,8 @@ function callPython(command, args = {}) { const python = findPython() const repoRoot = path.join(__dirname, '..', '..') const cliPath = path.join(repoRoot, 'src', 'cli.py') - const argsJson = JSON.stringify(args) - execFile(python, [cliPath, command, argsJson], { cwd: repoRoot }, (err, stdout, stderr) => { + execFile(python, [cliPath, command, JSON.stringify(args)], { cwd: repoRoot }, (err, stdout, stderr) => { if (err) { reject(new Error(stderr || err.message)); return } try { const result = JSON.parse(stdout.trim()) @@ -46,6 +53,18 @@ ipcMain.handle('p2sh', (_, args) => callPython('p2sh', args)) ipcMain.handle('p2wpkh', (_, args) => callPython('p2wpkh', args)) ipcMain.handle('p2tr', (_, args) => callPython('p2tr', args)) +ipcMain.handle('save-wallet', (_, { filename, data }) => { + ensureWalletDir() + const filePath = path.join(WALLET_DIR, filename) + fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8') + return filePath +}) + +ipcMain.handle('get-wallet-dir', () => { + ensureWalletDir() + return WALLET_DIR +}) + // ── Create window ────────────────────────────────────────────────────────────── function createWindow() { mainWindow = new BrowserWindow({ @@ -53,7 +72,7 @@ function createWindow() { height: 750, minWidth: 900, minHeight: 600, - title: 'Bitcoin Address Generator', + title: 'Wallet Generator', backgroundColor: '#0f1117', webPreferences: { nodeIntegration: false, diff --git a/frontend/electron/preload.cjs b/frontend/electron/preload.cjs index ca6ee31..09d8cc1 100644 --- a/frontend/electron/preload.cjs +++ b/frontend/electron/preload.cjs @@ -1,12 +1,14 @@ const { contextBridge, ipcRenderer } = require('electron') contextBridge.exposeInMainWorld('electronAPI', { - hdGenerate: (args) => ipcRenderer.invoke('hd-generate', args), - hdEncrypt: (args) => ipcRenderer.invoke('hd-encrypt', args), - hdDecrypt: (args) => ipcRenderer.invoke('hd-decrypt', args), - p2pk: (args) => ipcRenderer.invoke('p2pk', args), - p2pkh: (args) => ipcRenderer.invoke('p2pkh', args), - p2sh: (args) => ipcRenderer.invoke('p2sh', args), - p2wpkh: (args) => ipcRenderer.invoke('p2wpkh', args), - p2tr: (args) => ipcRenderer.invoke('p2tr', args), + hdGenerate: (args) => ipcRenderer.invoke('hd-generate', args), + hdEncrypt: (args) => ipcRenderer.invoke('hd-encrypt', args), + hdDecrypt: (args) => ipcRenderer.invoke('hd-decrypt', args), + p2pk: (args) => ipcRenderer.invoke('p2pk', args), + p2pkh: (args) => ipcRenderer.invoke('p2pkh', args), + p2sh: (args) => ipcRenderer.invoke('p2sh', args), + p2wpkh: (args) => ipcRenderer.invoke('p2wpkh', args), + p2tr: (args) => ipcRenderer.invoke('p2tr', args), + saveWallet: (filename, data) => ipcRenderer.invoke('save-wallet', { filename, data }), + getWalletDir: () => ipcRenderer.invoke('get-wallet-dir'), }) diff --git a/frontend/index.html b/frontend/index.html index 88fc975..e8c63f8 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -4,7 +4,7 @@ - Bitcoin Address Generator + Wallet Generator
diff --git a/frontend/package.json b/frontend/package.json index a9f7d9d..ebfa163 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,5 +1,5 @@ { - "name": "bitcoin-address-generator", + "name": "wallet-generator", "private": true, "version": "1.0.0", "type": "module", diff --git a/frontend/src/components/HDWallet.jsx b/frontend/src/components/HDWallet.jsx index 1865959..9a9ef1b 100644 --- a/frontend/src/components/HDWallet.jsx +++ b/frontend/src/components/HDWallet.jsx @@ -51,14 +51,10 @@ export default function HDWallet() { if (savePassword.trim()) { data = await window.electronAPI.hdEncrypt({ wallet, password: savePassword }) } - const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' }) - const url = URL.createObjectURL(blob) - const a = document.createElement('a') - a.href = url - a.download = `wallet_${form.network}_${form.bip_type}.json` - a.click() - URL.revokeObjectURL(url) - setSaveMsg(savePassword ? 'Wallet saved (encrypted).' : 'Wallet saved (unencrypted).') + const filename = `wallet_${form.network}_${form.bip_type}_${Date.now()}.json` + const savedPath = await window.electronAPI.saveWallet(filename, data) + const encrypted = savePassword ? ' (encrypted)' : '' + setSaveMsg(`Saved${encrypted}: ${savedPath}`) } catch (e) { setSaveMsg('Error: ' + e.message) } finally { diff --git a/frontend/src/components/Sidebar.jsx b/frontend/src/components/Sidebar.jsx index 1e32ec3..21da51a 100644 --- a/frontend/src/components/Sidebar.jsx +++ b/frontend/src/components/Sidebar.jsx @@ -17,7 +17,7 @@ export default function Sidebar({ active, onSelect }) { - BTC Generator + Wallet Generator