127 lines
3.6 KiB
JavaScript
127 lines
3.6 KiB
JavaScript
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
|
|
}
|
|
|
|
}
|