import Bitcore from "bitcore-lib" import Mnemonic from "bitcore-mnemonic" import secp256k1 from 'secp256k1' import { Address, pubToAddress, toBuffer, toChecksumAddress, intToBuffer } from 'ethereumjs-util' import coinType from './networks.js' import basex from 'base-x' export default class Wallet { static coinType = coinType /** * 生成助记词 * @param {Object} lang */ static generateMnemonic(lang) { if (lang) { return (new Mnemonic(this.getLanguage(lang))).toString(); } else { return (new Mnemonic()).toString(); } } /** * 验证助记词 * @param {Object} code * @param {Object} lang */ static validMnemonic(code, lang) { if (lang) { return Mnemonic.isValid(code, this.getLanguage(lang)); } else { return Mnemonic.isValid(code); } } /** * 获取助记词字典 * @param {Object} lang */ static getLanguage(lang) { return Mnemonic.Words[lang] } /** * 转成硬钱包私钥 * @param {Object} code */ static toHDPrivateKey(code) { return (new Mnemonic(code)).toHDPrivateKey() } /** * 验证地址是否合法 * @param {Object} addr */ static isValidAddress(addr) { return Bitcore.Address.isValid(addr) } /** * 硬钱包私钥转成对应网络的 地址 和 私钥 * @param {Object} hdPrivateKey * @param {Object} type */ static HDPrivateKeyToAddress(hdPrivateKey, type) { const derived = hdPrivateKey.derive("m/44'/" + type.type + "'/0'/0/0"); if (type.type === 195) { const ethAddr = this.getEthereumAddress(derived) const addressBuffer = Buffer.concat([intToBuffer(0x41), ethAddr.buf], 21) return { address: Bitcore.encoding.Base58Check.encode(addressBuffer), public_key: derived.privateKey.publicKey.toString(), private_key: derived.privateKey.toString() } } if (type.type === 144) { let addr = derived.privateKey.toAddress(type.network).toString() let deco = Bitcore.encoding.Base58.decode(addr) return { address: basex('rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz').encode(deco), public_key: derived.privateKey.publicKey.toString(), private_key: derived.privateKey.toString() } } if (this.networkIsEthereum(type)) { return { address: toChecksumAddress(this.getEthereumAddress(derived).toString()), public_key: derived.privateKey.publicKey.toString(), private_key: derived.privateKey.toString() } } return { address: derived.privateKey.toAddress(type.network).toString(), public_key: derived.privateKey.publicKey.toString(), private_key: derived.privateKey.toString() } } /** * 以太坊地址格式转换 * @param {Object} derived */ static getEthereumAddress(derived) { const publicKey = derived.hdPublicKey.publicKey.toBuffer() const ethPublicKey = secp256k1.publicKeyConvert(publicKey, false) .slice(1) return Address.fromPublicKey(toBuffer(ethPublicKey)) } /** * 是否是以太坊网络 * @param {Object} type */ static networkIsEthereum(type) { return type.isEthereum } }