@blockchain-api/bitcoin-js
Version:
Blockchain Api Bitcoin JS
122 lines • 5.19 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.signTxOffline = exports.isValidAddress = exports.generateAddressFromXPub = exports.generatePrivateKeyFromMnemonic = exports.generateAddressFromPrivatekey = exports.generateAddressFromMnemonic = exports.generateWallet = void 0;
const tslib_1 = require("tslib");
const bip39_1 = require("bip39");
const bip32_1 = require("bip32");
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
const bitcore_lib_1 = require("bitcore-lib");
/**
* Generate Bitcoin wallet
* @param testnet testnet or mainnet version of address
* @param mnemonic mnemonic seed to use
* @returns wallet
*/
const generateWallet = (mnemonic, path, network) => (0, tslib_1.__awaiter)(void 0, void 0, void 0, function* () {
const seedBuffer = yield (0, bip39_1.mnemonicToSeed)(mnemonic);
const hdwallet = (0, bip32_1.fromSeed)(seedBuffer, network);
const bip32Interface = hdwallet.derivePath(path);
return {
mnemonic: mnemonic,
accountExtPubkey: bip32Interface.neutered().toBase58(),
accountExtPrivatekey: bip32Interface.toBase58(),
bip32ExtPubkey: bip32Interface.derive(0).neutered().toBase58(),
bip32ExtPrivatekey: bip32Interface.derive(0).toBase58(),
};
});
exports.generateWallet = generateWallet;
/**
* Generate Bitcoin address from mnemonic
* @param testnet testnet or mainnet version of address
* @param mnemonic mnemonic seed to use
* @param i derivation index of address to generate. Up to 2^31 addresses can be generated.
* @returns blockchain address
*/
const generateAddressFromMnemonic = (path, mnemonic, i, network) => (0, tslib_1.__awaiter)(void 0, void 0, void 0, function* () {
const wallet = yield (0, exports.generateWallet)(mnemonic, path, network);
const w = (0, bip32_1.fromBase58)(wallet.bip32ExtPubkey, network).derivePath(String(i));
return bitcoinjs_lib_1.payments.p2pkh({ pubkey: w.publicKey, network }).address;
});
exports.generateAddressFromMnemonic = generateAddressFromMnemonic;
/**
* Convert Bitcoin Private Key to Address
* @param testnet testnet or mainnet version of address
* @param privkey private key to use
* @returns blockchain address
*/
const generateAddressFromPrivatekey = (privkey, network) => {
const keyPair = bitcoinjs_lib_1.ECPair.fromWIF(privkey, network);
return bitcoinjs_lib_1.payments.p2pkh({ pubkey: keyPair.publicKey, network }).address;
};
exports.generateAddressFromPrivatekey = generateAddressFromPrivatekey;
/**
* Generate Bitcoin private key from mnemonic seed
* @param testnet testnet or mainnet version of address
* @param mnemonic mnemonic to generate private key from
* @param i derivation index of private key to generate.
* @returns blockchain private key to the address
*/
const generatePrivateKeyFromMnemonic = (mnemonic, path, i, network) => (0, tslib_1.__awaiter)(void 0, void 0, void 0, function* () {
return (0, bip32_1.fromSeed)(yield (0, bip39_1.mnemonicToSeed)(mnemonic), network)
.derivePath(path)
.derive(i)
.toWIF();
});
exports.generatePrivateKeyFromMnemonic = generatePrivateKeyFromMnemonic;
/**
* Generate address from xpub
* @param currency type of blockchain
* @param testnet testnet or mainnet version of address
* @param xpub extended public key to generate address from
* @param i derivation index of address to generate. Up to 2^31 addresses can be generated.
* @returns blockchain address
*/
const generateAddressFromXPub = (xpub, i, network) => {
const w = (0, bip32_1.fromBase58)(xpub, network).derivePath(String(i));
return bitcoinjs_lib_1.payments.p2pkh({ pubkey: w.publicKey, network }).address;
};
exports.generateAddressFromXPub = generateAddressFromXPub;
/**
* Check bitcoin address is valid
* @param testnet testnet or mainnet version of address
* @param address bitcoin address
* @returns true || false
*/
const isValidAddress = (address, network) => {
try {
bitcoinjs_lib_1.address.toOutputScript(address, network);
return true;
}
catch (error) {
return false;
}
};
exports.isValidAddress = isValidAddress;
/**
* Sign bitcoin tx offline
* @param testnet testnet or mainnet version of address
* @param outputs transaction outputs
* @param privateKey sender private key
* @param toAddress receiver
* @param valueInBtc valut in btc
* @returns rawTx
*/
const signTxOffline = (outputs, privateKey, toAddress, value, network, changeAddress) => {
const utxos = outputs.map(x => {
return new bitcore_lib_1.Transaction.UnspentOutput({
txId: x.txHash,
outputIndex: x.index,
script: x.script,
satoshis: x.value
});
});
const tx = new bitcore_lib_1.Transaction()
.from(utxos)
.to(toAddress, value)
.change(changeAddress || (0, exports.generateAddressFromPrivatekey)(privateKey, network))
.sign(privateKey);
tx.verify();
return tx.serialize();
};
exports.signTxOffline = signTxOffline;
//# sourceMappingURL=index.js.map