You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
187 lines
4.9 KiB
187 lines
4.9 KiB
const tronweb = require('tronweb')
|
|
const bip39 = require('bip39');
|
|
const bip32 = require('bip32');
|
|
const util = require('ethereumjs-util')
|
|
const ethers = require('ethers')
|
|
const bitcoin = require('bitcoinjs-lib')
|
|
let Tx = require('ethereumjs-tx');
|
|
const WAValidator = require('wallet-address-validator');
|
|
const sha256= require('js-sha256').sha256;
|
|
|
|
|
|
|
|
let token = {
|
|
// 获取助记词
|
|
generateMnemonic: function() {
|
|
return bip39.generateMnemonic();
|
|
},
|
|
|
|
//获取Child
|
|
getPrivateKey: function(mnemonic, hdpath) {
|
|
if (mnemonic.split(" ").length % 12 > 0) {
|
|
throw new Error("mnemonic error");
|
|
}
|
|
let seed = bip39.mnemonicToSeedSync(mnemonic);
|
|
const node = bip32.fromSeed(seed);
|
|
const child = node.derivePath(hdpath);
|
|
let privateKey = util.bufferToHex(child.privateKey);
|
|
return privateKey;
|
|
|
|
},
|
|
//根据助记词生成以太坊ETH的钱包信息
|
|
generateEth: function(mnemonic) {
|
|
|
|
|
|
let privateKey = this.getPrivateKey(mnemonic, "m/44'/60'/0'/0/0");
|
|
|
|
let wallet = new ethers.Wallet(privateKey);
|
|
let address = wallet.address;
|
|
return {
|
|
'privateKey': privateKey,
|
|
'address': address
|
|
};
|
|
},
|
|
//根据助记词生成波场TRON的钱包信息
|
|
generateTron: function(mnemonic) {
|
|
let privateKey = this.getPrivateKey(mnemonic, "m/44'/195'/0'/0/0");
|
|
privateKey = privateKey.replace('0x', '');
|
|
let address = tronweb.address.fromPrivateKey(privateKey);
|
|
return {
|
|
'privateKey': privateKey,
|
|
'address': address
|
|
};
|
|
},
|
|
//根据助记词生成比特币BTC钱包信息
|
|
generateBtc: function(mnemonic) {
|
|
if (mnemonic.split(" ").length % 12 > 0) {
|
|
throw new Error("mnemonic error");
|
|
}
|
|
let seed = bip39.mnemonicToSeedSync(mnemonic);
|
|
const node = bip32.fromSeed(seed);
|
|
const keyPair = node.derivePath("m/44'/195'/0'/0/0");
|
|
const privateKey = keyPair.toWIF();
|
|
console.log("BTC私钥:", privateKey)
|
|
let address = bitcoin.payments.p2sh({
|
|
redeem: bitcoin.payments.p2wpkh({
|
|
pubkey: keyPair.publicKey
|
|
})
|
|
});
|
|
|
|
//bitcoin.payments.p2pkh({ pubkey: child.publicKey })
|
|
//console.log(address.fromScriptHash({pubkey: keyPair.publicKey}))
|
|
return {
|
|
'privateKey': privateKey,
|
|
'address': address.address
|
|
};
|
|
},
|
|
//导入比特币BTC私钥
|
|
importBtcPrivateKey: function(privateKey) {
|
|
let keyPair = new bitcoin.ECPair.fromWIF(privateKey);
|
|
let address = bitcoin.payments.p2sh({
|
|
redeem: bitcoin.payments.p2wpkh({
|
|
pubkey: keyPair.publicKey
|
|
})
|
|
});
|
|
//console.log(address.fromScriptHash({pubkey: keyPair.publicKey}))
|
|
return {
|
|
'privateKey': privateKey,
|
|
'address': address.address
|
|
};
|
|
},
|
|
//导入以太坊ETH私钥
|
|
importEthPrivateKey: function(privateKey) {
|
|
let wallet = new ethers.Wallet(privateKey);
|
|
let address = wallet.address;
|
|
return {
|
|
'privateKey': wallet.privateKey,
|
|
'address': address
|
|
};
|
|
},
|
|
//导入波场TRON私钥
|
|
importTronPrivateKey: function(privateKey) {
|
|
privateKey = privateKey.replace('0x', '');
|
|
let address = tronweb.address.fromPrivateKey(privateKey);
|
|
return {
|
|
'privateKey': privateKey,
|
|
'address': address
|
|
};
|
|
},
|
|
validateBtc: function(address) {
|
|
let valid = WAValidator.validate(address, 'BTC');
|
|
console.log(valid, 'BTC')
|
|
return valid;
|
|
},
|
|
validateEth: function(address) {
|
|
let valid = WAValidator.validate(address, 'ETH');
|
|
console.log(valid, 'eth')
|
|
return valid;
|
|
},
|
|
validateTrx: function(base58Str) {
|
|
if (typeof(base58Str) !== 'string')
|
|
return false;
|
|
|
|
if (base58Str.length !== 34)
|
|
return false;
|
|
|
|
let address = this.decode58(base58Str);
|
|
|
|
if (address.length !== 25)
|
|
return false;
|
|
|
|
if (address[0] !== 0x41)
|
|
return false;
|
|
|
|
// const checkSum = address.slice(21);
|
|
// address = address.slice(0, 21);
|
|
|
|
// const hash0 = sha256.sha256(address);
|
|
// const hash1 = sha256.sha256(hash0);
|
|
// const checkSum1 = hash1.slice(0, 4);
|
|
// console.log(hash1)
|
|
// console.log(address,1111)
|
|
// console.log(checkSum1)
|
|
// console.log(checkSum)
|
|
// if (checkSum[0] == checkSum1[0] && checkSum[1] == checkSum1[1] && checkSum[2] ==
|
|
// checkSum1[2] && checkSum[3] == checkSum1[3]
|
|
// ) {
|
|
return true
|
|
// }
|
|
|
|
// return false;
|
|
},
|
|
decode58: function (string) {
|
|
|
|
var ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
|
|
var ALPHABET_MAP = {};
|
|
var BASE = 58;
|
|
for (var i = 0; i < ALPHABET.length; i++) {
|
|
ALPHABET_MAP[ALPHABET.charAt(i)] = i;
|
|
}
|
|
if (string.length === 0) return [];
|
|
var i,
|
|
j,
|
|
bytes = [0];
|
|
for (i = 0; i < string.length; i++) {
|
|
var c = string[i];
|
|
// c是不是ALPHABET_MAP的key
|
|
if (!(c in ALPHABET_MAP)) throw new Error('Non-base58 character');
|
|
for (j = 0; j < bytes.length; j++) bytes[j] *= BASE;
|
|
bytes[0] += ALPHABET_MAP[c];
|
|
var carry = 0;
|
|
for (j = 0; j < bytes.length; ++j) {
|
|
bytes[j] += carry;
|
|
carry = bytes[j] >> 8;
|
|
// 0xff --> 11111111
|
|
bytes[j] &= 0xff;
|
|
}
|
|
while (carry) {
|
|
bytes.push(carry & 0xff);
|
|
carry >>= 8;
|
|
}
|
|
}
|
|
// deal with leading zeros
|
|
for (i = 0; string[i] === '1' && i < string.length - 1; i++) bytes.push(0);
|
|
return bytes.reverse();
|
|
}
|
|
}
|
|
export default token
|
|
|