商城下单购买,品类接口,钱包依赖
This commit is contained in:
126
wallet/Wallet.js
Normal file
126
wallet/Wallet.js
Normal file
@@ -0,0 +1,126 @@
|
||||
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
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user