diff --git a/main/app/handlers/addressGenerator.js b/main/app/handlers/addressGenerator.js new file mode 100644 index 0000000..d5679d0 --- /dev/null +++ b/main/app/handlers/addressGenerator.js @@ -0,0 +1,18 @@ +const {mnemonicToSeedSync} = require("bip39"); +const {fromSeed} = require("bip32"); +const {ECPair} = require("@bitcoin-dot-com/bitcoincashjs2-lib"); +const {isMainThread, parentPort} = require("worker_threads"); +if (isMainThread) { + throw new Error('Its not a worker'); +} + +parentPort.on("message", async (seedPhrase) => { + const seed = mnemonicToSeedSync(seedPhrase) + const node = fromSeed(seed) + for (let i = 0; i < 20; i++) { + const child = node.derivePath("m/44'/0'/0'/0/" + i) + parentPort.postMessage((child)) + //parentPort.postMessage(ECPair.fromWIF(child.toWIF()).getAddress()) + } +}); + diff --git a/main/app/handlers/wallet.js b/main/app/handlers/wallet.js index 71979ce..6243585 100644 --- a/main/app/handlers/wallet.js +++ b/main/app/handlers/wallet.js @@ -1,13 +1,21 @@ const {ipcMain} = require("electron"); const path = require("path"); -const {Handlers} = require("../../common/util"); +const {Handlers, Listeners} = require("../../common/util"); const {GetWalletInfo} = require("../../data/tables"); const menu = require("../../menu"); const {SetWallet, GetWallet, SetMenu, GetWindow, CreateWindow, eConf} = require("../window"); +const {Worker} = require("worker_threads"); const WalletHandlers = () => { ipcMain.handle(Handlers.GetWallet, async (e) => GetWallet(e.sender.id)) ipcMain.handle(Handlers.GetWalletInfo, async (e, addresses) => GetWalletInfo(eConf(e), addresses)) + ipcMain.on(Handlers.GenerateAddresses, (e, seedPhrase) => { + let w = new Worker(path.resolve(__dirname,"addressGenerator.js")) + w.postMessage(seedPhrase) + w.on("message", (event) => { + e.sender.send(Listeners.AddressGenerated, event.data) + }) + }) ipcMain.on(Handlers.StoreWallet, (e, wallet, filename, password) => { SetWallet(e.sender.id, {wallet, filename, password}) }) diff --git a/main/common/util/handlers.js b/main/common/util/handlers.js index 8521bd1..11e71d3 100644 --- a/main/common/util/handlers.js +++ b/main/common/util/handlers.js @@ -29,6 +29,7 @@ const Handlers = { GetWallet: "get-wallet", WalletLoaded: "wallet-loaded", GetWalletInfo: "get-wallet-info", + GenerateAddresses: "generate-addresses", GraphQL: "graphql", GraphQLSubscribe: "graphql-subscribe", GraphQLSubscribeClose: "graphql-subscribe-close", @@ -57,6 +58,7 @@ const Listeners = { GraphQLClosePrefix: "graphql-close-", GraphQLDataPrefix: "graphql-data-", GraphQLOpenPrefix: "graphql-open-", + AddressGenerated: "address-generated", } module.exports = { diff --git a/main/preload/wallet.js b/main/preload/wallet.js index 6cfa477..6dae9c8 100644 --- a/main/preload/wallet.js +++ b/main/preload/wallet.js @@ -1,7 +1,7 @@ const fs = require("fs/promises") const CryptoJS = require("crypto-js"); const {ipcRenderer} = require("electron"); -const {Handlers, Dir} = require("../common/util"); +const {Handlers, Dir, Listeners} = require("../common/util"); const {decryptWallet, getPathForWallet, fileExists} = require("./common"); const path = require("path"); const fsOriginal = require("fs"); @@ -83,6 +83,18 @@ module.exports = { }, getPassword: async () => (await ipcRenderer.invoke(Handlers.GetWallet)).password, getWalletInfo: async (addresses) => ipcRenderer.invoke(Handlers.GetWalletInfo, addresses), + getAddresses: (seedPhrase) => { + return new Promise((resolve, reject) => { + let addressList = [] + ipcRenderer.on(Listeners.AddressGenerated, (evt, data) => { + addressList.push(data) + if (addressList.length === 20) { + resolve(addressList) + } + }) + ipcRenderer.send(Handlers.GenerateAddresses, seedPhrase) + }) + }, getWallet: async () => (await ipcRenderer.invoke(Handlers.GetWallet)).wallet, getWalletFile: async (walletName) => await fs.readFile(getPathForWallet(walletName), {encoding: "utf8"}), setWallet: async (wallet, filename, password) => diff --git a/renderer/components/modal/modals/address.js b/renderer/components/modal/modals/address.js index ffec382..9f0f563 100644 --- a/renderer/components/modal/modals/address.js +++ b/renderer/components/modal/modals/address.js @@ -16,7 +16,7 @@ const AddressModal = ({onClose, setLastUpdate}) => { setError("Error, cannot add addresses directly to a wallet with keys") return } else if(wallet.keys.length > 0){ - const convertedKeys = GetAddresses("", keys) + const convertedKeys = await GetAddresses("", keys) await window.electron.addAddresses(convertedKeys) await window.electron.addKeys(keys) } else{ @@ -25,7 +25,7 @@ const AddressModal = ({onClose, setLastUpdate}) => { setLastUpdate((new Date()).toISOString()) onClose() } - + return (
diff --git a/renderer/components/util/addresses.js b/renderer/components/util/addresses.js index f4849f5..c1956c1 100644 --- a/renderer/components/util/addresses.js +++ b/renderer/components/util/addresses.js @@ -1,16 +1,14 @@ +import * as path from "path"; + const {mnemonicToSeedSync} = require("bip39"); const {fromSeed} = require("bip32"); const {ECPair} = require("@bitcoin-dot-com/bitcoincashjs2-lib"); -const GetAddresses = (seedPhrase, keyList) => { +const GetAddresses = async (seedPhrase, keyList) => { let addressList = [] if (seedPhrase && seedPhrase.length) { - const seed = mnemonicToSeedSync(seedPhrase) - const node = fromSeed(seed) - for (let i = 0; i < 20; i++) { - const child = node.derivePath("m/44'/0'/0'/0/" + i) - addressList.push(ECPair.fromWIF(child.toWIF()).getAddress()) - } + addressList = await window.electron.getAddresses(seedPhrase) + console.log(addressList) } if (keyList && keyList.length) { for (let i = 0; i < keyList.length; i++) { diff --git a/renderer/components/util/wallet.js b/renderer/components/util/wallet.js index 299c6f5..4cf866c 100644 --- a/renderer/components/util/wallet.js +++ b/renderer/components/util/wallet.js @@ -3,7 +3,7 @@ import GetAddresses from "./addresses"; const GetWallet = async () => { let wallet = await window.electron.getWallet() if (!wallet.addresses || !wallet.addresses.length) { - const addressList = GetAddresses(wallet.seed, wallet.keys) + const addressList = await GetAddresses(wallet.seed, wallet.keys) await window.electron.addAddresses(addressList) wallet = await window.electron.getWallet() }