All checks were successful
check / check (push) Successful in 14s
Major changes: - Fetch token balances and tx history from Blockscout API (configurable) - Remove manual token discovery (discoverTokens) in favor of Blockscout - HD address gap scanning on mnemonic import - Duplicate mnemonic detection on wallet add - EIP-6963 multi-wallet discovery + selectedAddress updates in inpage - Two-tier balance refresh: 10s while popup open, 60s background - Fix $0.00 flash before prices load (return null when no prices) - No-layout-shift: min-height on total value element - Aligned balance columns (42ch address width, consistent USD column) - All errors use flash messages instead of off-screen error divs - Settings gear in global title bar, add-wallet moved to settings pane - Settings wells with light grey background, configurable Blockscout URL - Consistent "< Back" buttons top-left on all views - Address titles (Address 1.1, 1.2, etc.) on main and detail views - Send view shows current balance of selected asset - Clickable affordance policy added to README - Shortened mnemonic backup warning - Fix broken background script constant imports
56 lines
1.5 KiB
JavaScript
56 lines
1.5 KiB
JavaScript
// Wallet operations: mnemonic generation, HD derivation, signing.
|
|
// All crypto delegated to ethers.js.
|
|
|
|
const { Mnemonic, HDNodeWallet, Wallet } = require("ethers");
|
|
const { DEBUG, DEBUG_MNEMONIC, BIP44_ETH_PATH } = require("./constants");
|
|
|
|
function generateMnemonic() {
|
|
if (DEBUG) return DEBUG_MNEMONIC;
|
|
const m = Mnemonic.fromEntropy(
|
|
globalThis.crypto.getRandomValues(new Uint8Array(16)),
|
|
);
|
|
return m.phrase;
|
|
}
|
|
|
|
function deriveAddressFromXpub(xpub, index) {
|
|
const node = HDNodeWallet.fromExtendedKey(xpub);
|
|
return node.deriveChild(index).address;
|
|
}
|
|
|
|
function hdWalletFromMnemonic(mnemonic) {
|
|
const node = HDNodeWallet.fromPhrase(mnemonic, "", BIP44_ETH_PATH);
|
|
const xpub = node.neuter().extendedKey;
|
|
const firstAddress = node.deriveChild(0).address;
|
|
return { xpub, firstAddress };
|
|
}
|
|
|
|
function addressFromPrivateKey(key) {
|
|
const w = new Wallet(key);
|
|
return w.address;
|
|
}
|
|
|
|
function getSignerForAddress(walletData, addrIndex, decryptedSecret) {
|
|
if (walletData.type === "hd") {
|
|
const node = HDNodeWallet.fromPhrase(
|
|
decryptedSecret,
|
|
"",
|
|
BIP44_ETH_PATH,
|
|
);
|
|
return node.deriveChild(addrIndex);
|
|
}
|
|
return new Wallet(decryptedSecret);
|
|
}
|
|
|
|
function isValidMnemonic(mnemonic) {
|
|
return Mnemonic.isValidMnemonic(mnemonic);
|
|
}
|
|
|
|
module.exports = {
|
|
generateMnemonic,
|
|
deriveAddressFromXpub,
|
|
hdWalletFromMnemonic,
|
|
addressFromPrivateKey,
|
|
getSignerForAddress,
|
|
isValidMnemonic,
|
|
};
|