Compare commits
5 Commits
ff4b5ee24d
...
fix/116-ti
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
28f3a22c32 | ||
| 753fb5658a | |||
| bdb2031d46 | |||
| 25ecaee128 | |||
|
|
ca6e9054f9 |
@@ -11,6 +11,25 @@ const { encryptWithPassword } = require("../../shared/vault");
|
|||||||
const { state, saveState } = require("../../shared/state");
|
const { state, saveState } = require("../../shared/state");
|
||||||
const { scanForAddresses } = require("../../shared/balances");
|
const { scanForAddresses } = require("../../shared/balances");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if an address already exists in ANY wallet (hd, xprv, or key).
|
||||||
|
* Returns the wallet object if found, or undefined.
|
||||||
|
*/
|
||||||
|
function findWalletByAddress(addr) {
|
||||||
|
const lower = addr.toLowerCase();
|
||||||
|
return state.wallets.find((w) =>
|
||||||
|
w.addresses.some((a) => a.address.toLowerCase() === lower),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if an xpub already exists in any HD-type wallet (hd or xprv).
|
||||||
|
* Returns the wallet object if found, or undefined.
|
||||||
|
*/
|
||||||
|
function findWalletByXpub(xpub) {
|
||||||
|
return state.wallets.find((w) => w.xpub && w.xpub === xpub);
|
||||||
|
}
|
||||||
|
|
||||||
let currentMode = "mnemonic";
|
let currentMode = "mnemonic";
|
||||||
|
|
||||||
const MODES = ["mnemonic", "privkey", "xprv"];
|
const MODES = ["mnemonic", "privkey", "xprv"];
|
||||||
@@ -97,18 +116,18 @@ async function importMnemonic(ctx) {
|
|||||||
const pw = validatePassword();
|
const pw = validatePassword();
|
||||||
if (!pw) return;
|
if (!pw) return;
|
||||||
const { xpub, firstAddress } = hdWalletFromMnemonic(mnemonic);
|
const { xpub, firstAddress } = hdWalletFromMnemonic(mnemonic);
|
||||||
const duplicate = state.wallets.find(
|
const xpubDup = findWalletByXpub(xpub);
|
||||||
(w) =>
|
if (xpubDup) {
|
||||||
w.type === "hd" &&
|
|
||||||
w.addresses[0] &&
|
|
||||||
w.addresses[0].address.toLowerCase() === firstAddress.toLowerCase(),
|
|
||||||
);
|
|
||||||
if (duplicate) {
|
|
||||||
showFlash(
|
showFlash(
|
||||||
"This recovery phrase is already added (" + duplicate.name + ").",
|
"This recovery phrase is already added (" + xpubDup.name + ").",
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
const addrDup = findWalletByAddress(firstAddress);
|
||||||
|
if (addrDup) {
|
||||||
|
showFlash("Address already exists in wallet (" + addrDup.name + ").");
|
||||||
|
return;
|
||||||
|
}
|
||||||
const encrypted = await encryptWithPassword(mnemonic, pw);
|
const encrypted = await encryptWithPassword(mnemonic, pw);
|
||||||
const walletNum = state.wallets.length + 1;
|
const walletNum = state.wallets.length + 1;
|
||||||
const wallet = {
|
const wallet = {
|
||||||
@@ -162,15 +181,10 @@ async function importPrivateKey(ctx) {
|
|||||||
}
|
}
|
||||||
const pw = validatePassword();
|
const pw = validatePassword();
|
||||||
if (!pw) return;
|
if (!pw) return;
|
||||||
const duplicate = state.wallets.find(
|
const duplicate = findWalletByAddress(addr);
|
||||||
(w) =>
|
|
||||||
w.type === "key" &&
|
|
||||||
w.addresses[0] &&
|
|
||||||
w.addresses[0].address.toLowerCase() === addr.toLowerCase(),
|
|
||||||
);
|
|
||||||
if (duplicate) {
|
if (duplicate) {
|
||||||
showFlash(
|
showFlash(
|
||||||
"This private key is already added (" + duplicate.name + ").",
|
"This address already exists in wallet (" + duplicate.name + ").",
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -208,14 +222,14 @@ async function importXprvKey(ctx) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const { xpub, firstAddress } = result;
|
const { xpub, firstAddress } = result;
|
||||||
const duplicate = state.wallets.find(
|
const xpubDup = findWalletByXpub(xpub);
|
||||||
(w) =>
|
if (xpubDup) {
|
||||||
(w.type === "hd" || w.type === "xprv") &&
|
showFlash("This key is already added (" + xpubDup.name + ").");
|
||||||
w.addresses[0] &&
|
return;
|
||||||
w.addresses[0].address.toLowerCase() === firstAddress.toLowerCase(),
|
}
|
||||||
);
|
const addrDup = findWalletByAddress(firstAddress);
|
||||||
if (duplicate) {
|
if (addrDup) {
|
||||||
showFlash("This key is already added (" + duplicate.name + ").");
|
showFlash("Address already exists in wallet (" + addrDup.name + ").");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const pw = validatePassword();
|
const pw = validatePassword();
|
||||||
|
|||||||
@@ -95,6 +95,10 @@ function show() {
|
|||||||
function isoDate(timestamp) {
|
function isoDate(timestamp) {
|
||||||
const d = new Date(timestamp * 1000);
|
const d = new Date(timestamp * 1000);
|
||||||
const pad = (n) => String(n).padStart(2, "0");
|
const pad = (n) => String(n).padStart(2, "0");
|
||||||
|
const off = -d.getTimezoneOffset();
|
||||||
|
const sign = off >= 0 ? "+" : "-";
|
||||||
|
const absOff = Math.abs(off);
|
||||||
|
const tz = sign + pad(Math.floor(absOff / 60)) + ":" + pad(absOff % 60);
|
||||||
return (
|
return (
|
||||||
d.getFullYear() +
|
d.getFullYear() +
|
||||||
"-" +
|
"-" +
|
||||||
@@ -106,7 +110,8 @@ function isoDate(timestamp) {
|
|||||||
":" +
|
":" +
|
||||||
pad(d.getMinutes()) +
|
pad(d.getMinutes()) +
|
||||||
":" +
|
":" +
|
||||||
pad(d.getSeconds())
|
pad(d.getSeconds()) +
|
||||||
|
tz
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -48,6 +48,10 @@ function etherscanAddressLink(address) {
|
|||||||
function isoDate(timestamp) {
|
function isoDate(timestamp) {
|
||||||
const d = new Date(timestamp * 1000);
|
const d = new Date(timestamp * 1000);
|
||||||
const pad = (n) => String(n).padStart(2, "0");
|
const pad = (n) => String(n).padStart(2, "0");
|
||||||
|
const off = -d.getTimezoneOffset();
|
||||||
|
const sign = off >= 0 ? "+" : "-";
|
||||||
|
const absOff = Math.abs(off);
|
||||||
|
const tz = sign + pad(Math.floor(absOff / 60)) + ":" + pad(absOff % 60);
|
||||||
return (
|
return (
|
||||||
d.getFullYear() +
|
d.getFullYear() +
|
||||||
"-" +
|
"-" +
|
||||||
@@ -59,7 +63,8 @@ function isoDate(timestamp) {
|
|||||||
":" +
|
":" +
|
||||||
pad(d.getMinutes()) +
|
pad(d.getMinutes()) +
|
||||||
":" +
|
":" +
|
||||||
pad(d.getSeconds())
|
pad(d.getSeconds()) +
|
||||||
|
tz
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -226,6 +226,10 @@ function formatAddressHtml(address, ensName, maxLen, title) {
|
|||||||
function isoDate(timestamp) {
|
function isoDate(timestamp) {
|
||||||
const d = new Date(timestamp * 1000);
|
const d = new Date(timestamp * 1000);
|
||||||
const pad = (n) => String(n).padStart(2, "0");
|
const pad = (n) => String(n).padStart(2, "0");
|
||||||
|
const off = -d.getTimezoneOffset();
|
||||||
|
const sign = off >= 0 ? "+" : "-";
|
||||||
|
const absOff = Math.abs(off);
|
||||||
|
const tz = sign + pad(Math.floor(absOff / 60)) + ":" + pad(absOff % 60);
|
||||||
return (
|
return (
|
||||||
d.getFullYear() +
|
d.getFullYear() +
|
||||||
"-" +
|
"-" +
|
||||||
@@ -237,7 +241,8 @@ function isoDate(timestamp) {
|
|||||||
":" +
|
":" +
|
||||||
pad(d.getMinutes()) +
|
pad(d.getMinutes()) +
|
||||||
":" +
|
":" +
|
||||||
pad(d.getSeconds())
|
pad(d.getSeconds()) +
|
||||||
|
tz
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -487,7 +487,10 @@ function decode(data, toAddress) {
|
|||||||
const deadlineDate = new Date(Number(deadline) * 1000);
|
const deadlineDate = new Date(Number(deadline) * 1000);
|
||||||
details.push({
|
details.push({
|
||||||
label: "Deadline",
|
label: "Deadline",
|
||||||
value: deadlineDate.toISOString().replace("T", " ").slice(0, 19),
|
value: deadlineDate
|
||||||
|
.toISOString()
|
||||||
|
.replace("T", " ")
|
||||||
|
.replace(".000Z", "Z"),
|
||||||
});
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
Reference in New Issue
Block a user