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