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