const { $, showView, showFlash } = require("./helpers"); const { hdWalletFromXprv, isValidXprv } = require("../../shared/wallet"); const { encryptWithPassword } = require("../../shared/vault"); const { state, saveState } = require("../../shared/state"); const { scanForAddresses } = require("../../shared/balances"); function show() { $("import-xprv-key").value = ""; $("import-xprv-password").value = ""; $("import-xprv-password-confirm").value = ""; showView("import-xprv"); } function init(ctx) { $("btn-import-xprv-confirm").addEventListener("click", async () => { const xprv = $("import-xprv-key").value.trim(); if (!xprv) { showFlash("Please enter your extended private key."); return; } if (!isValidXprv(xprv)) { showFlash("Invalid extended private key."); return; } let result; try { result = hdWalletFromXprv(xprv); } catch (e) { showFlash("Invalid extended private key."); return; } const { xpub, firstAddress } = result; const duplicate = state.wallets.find( (w) => (w.type === "hd" || w.type === "xprv") && w.addresses[0] && w.addresses[0].address.toLowerCase() === firstAddress.toLowerCase(), ); if (duplicate) { showFlash("This key is already added (" + duplicate.name + ")."); return; } const pw = $("import-xprv-password").value; const pw2 = $("import-xprv-password-confirm").value; if (!pw) { showFlash("Please choose a password."); return; } if (pw.length < 12) { showFlash("Password must be at least 12 characters."); return; } if (pw !== pw2) { showFlash("Passwords do not match."); return; } const encrypted = await encryptWithPassword(xprv, pw); const walletNum = state.wallets.length + 1; const wallet = { type: "xprv", name: "Wallet " + walletNum, xpub: xpub, encryptedSecret: encrypted, nextIndex: 1, addresses: [ { address: firstAddress, balance: "0.0000", tokenBalances: [] }, ], }; state.wallets.push(wallet); state.hasWallet = true; await saveState(); ctx.renderWalletList(); showView("main"); // Scan for used HD addresses beyond index 0. showFlash("Scanning for addresses...", 30000); const scan = await scanForAddresses(xpub, state.rpcUrl); if (scan.addresses.length > 1) { wallet.addresses = scan.addresses.map((a) => ({ address: a.address, balance: "0.0000", tokenBalances: [], })); wallet.nextIndex = scan.nextIndex; await saveState(); ctx.renderWalletList(); showFlash("Found " + scan.addresses.length + " addresses."); } else { showFlash("Ready.", 1000); } ctx.doRefreshAndRender(); }); $("btn-import-xprv-back").addEventListener("click", () => { if (!state.hasWallet) { showView("welcome"); } else { ctx.renderWalletList(); showView("main"); } }); } module.exports = { init, show };