jcwallet/src/manage/WalletManage.ts
2022-11-10 22:22:28 +08:00

104 lines
3.3 KiB
TypeScript

import { hdkey } from "ethereumjs-wallet";
import { generateMnemonic, mnemonicToSeedSync } from "bip39";
import { loadMnemonic, saveMnemonic } from "./DataManage";
import { NativeSvr } from "../services/NativeSvr";
import { getWalletInfo, googleAuth, uploadWalletInfo } from "../api/WalletApi";
import { WalletEnv } from "../config/WalletEnv";
import { md5Hash, sha1Hash } from "../util/crypto.util";
import { retry } from "../util/promise.util";
import { MAX_TRY_COUNT, MAX_UPLOAD_COUNT } from "../config/constants";
export function newAccount(password: string, index: number) {
const mnemonic = loadMnemonic(password);
const seed = mnemonicToSeedSync(mnemonic);
const hdWallet = hdkey.fromMasterSeed(seed);
const keyPair1 = hdWallet.derivePath(`m/44'/60'/0'/0/${index}`);
const w1 = keyPair1.getWallet();
return {
address: w1.getAddressString(),
privateKey: w1.getPrivateKeyString(),
};
}
export function newMnemonic(password: string) {
let mnemonic = generateMnemonic();
saveMnemonic(mnemonic, password);
return mnemonic;
}
export function restoreWalletByMnemonic(mnemonic: string, password: string) {
saveMnemonic(mnemonic, password);
}
export async function loadInternalWallet() {
let res: any = await new NativeSvr().signWithGoogle();
console.log("native res: " + res);
let tokenRes = await googleAuth(res);
console.log("wallet token: " + tokenRes.data?.token);
if (tokenRes.errcode || !tokenRes.data?.token) {
return;
}
new WalletEnv().token = tokenRes.data.token;
let infoRes = await retry(() => getWalletInfo(), MAX_TRY_COUNT);
if (infoRes.errcode) {
return;
}
console.log("wallet info: " + JSON.stringify(infoRes.data));
let seed = infoRes.data.oid + infoRes.data.is + infoRes.data.salt;
let seedHash = md5Hash(seed);
let address;
let idHash = md5Hash(infoRes.data.oid);
if (!infoRes.data.key) {
let time = Date.now();
//@ts-ignore
console.log(jsb.generateWallet);
//@ts-ignore
let strWallet = jsb.generateWallet(idHash, seedHash);
console.log("generate wallet cost: " + (Date.now() - time) / 1000);
console.log("native wallet info: " + strWallet);
let walletInfo = JSON.parse(strWallet);
address = walletInfo.address;
setImmediate(function () {
retry(
() => uploadWalletInfo({ key: walletInfo.master }),
MAX_UPLOAD_COUNT
);
});
} else {
let localSKey = localStorage.getItem("cebg_wallet_s_" + idHash);
let localBKey = localStorage.getItem("cebg_wallet_b_" + idHash);
if (localSKey || localBKey) {
//@ts-ignore
let strWallet = jsb.prepareWallet(idHash, seedHash, infoRes.data.key);
let walletInfo = JSON.parse(strWallet);
address = walletInfo.address;
} else {
let qrResult = await new NativeSvr().restoreKey(idHash);
//@ts-ignore
let strWallet = jsb.restoreWallet(
idHash,
seedHash,
infoRes.data.key,
qrResult
);
console.log("restore native wallet info: " + strWallet);
let walletInfo = JSON.parse(strWallet);
address = walletInfo.address;
setImmediate(function () {
retry(
() => uploadWalletInfo({ key: walletInfo.master }),
MAX_UPLOAD_COUNT
);
});
}
}
return address;
}
export function walletSign(str: string) {
//@ts-ignore
let result = jsb.walletSign(str);
return result;
}