@tatumio/tatum-v1
Version:
Tatum API client allows browsers and Node.js clients to interact with Tatum API.
95 lines • 9.24 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.prepareBitcoinCashSignedTransaction = exports.signBitcoinCashKMSTransaction = exports.sendBitcoinCashTransaction = void 0;
const bignumber_js_1 = __importDefault(require("bignumber.js"));
// @ts-ignore
const coininfo_1 = __importDefault(require("coininfo"));
const blockchain_1 = require("../blockchain");
const tatum_1 = require("../connector/tatum");
const model_1 = require("../model");
const wallet_1 = require("../wallet");
const { ECSignature, Transaction, ECPair, TransactionBuilder,
// tslint:disable-next-line:no-var-requires
} = require('@tatumio/bitcoincashjs2-lib');
const getAddress = (address) => {
try {
return wallet_1.toLegacyAddress(address);
}
catch (e) {
return address;
}
};
/**
* Send Bitcoin Cash transaction to the blockchain. This method broadcasts signed transaction to the blockchain.
* This operation is irreversible.
* @param testnet mainnet or testnet version
* @param body content of the transaction to broadcast
* @returns transaction id of the transaction in the blockchain
*/
const sendBitcoinCashTransaction = async (testnet, body) => {
return blockchain_1.bcashBroadcast(await exports.prepareBitcoinCashSignedTransaction(testnet, body));
};
exports.sendBitcoinCashTransaction = sendBitcoinCashTransaction;
/**
* Sign Bitcoin Cash pending transaction from Tatum KMS
* @param tx pending transaction from KMS
* @param privateKeys private keys to sign transaction with.
* @param testnet mainnet or testnet version
* @returns transaction data to be broadcast to blockchain.
*/
const signBitcoinCashKMSTransaction = async (tx, privateKeys, testnet) => {
if (tx.chain !== model_1.Currency.BCH) {
throw Error('Unsupported chain.');
}
const [data, amountsToDecode] = tx.serializedTransaction.split(':');
const transaction = Transaction.fromHex(data);
const amountsToSign = JSON.parse(amountsToDecode);
const network = testnet ? coininfo_1.default.bitcoincash.test.toBitcoinJS() : coininfo_1.default.bitcoincash.main.toBitcoinJS();
const builder = TransactionBuilder.fromTransaction(transaction, network);
for (const [i, privateKey] of privateKeys.entries()) {
const ecPair = ECPair.fromWIF(privateKey, network);
builder.sign(i, ecPair, undefined, 0x01, amountsToSign[i], undefined, ECSignature.SCHNORR);
}
return builder.build().toHex();
};
exports.signBitcoinCashKMSTransaction = signBitcoinCashKMSTransaction;
/**
* Sign Bitcoin Cash transaction with private keys locally. Nothing is broadcast to the blockchain.
* @param testnet mainnet or testnet version
* @param body content of the transaction to broadcast
* @returns transaction data to be broadcast to blockchain.
*/
const prepareBitcoinCashSignedTransaction = async (testnet, body) => {
await tatum_1.validateBody(body, model_1.TransferBchBlockchain);
const { fromUTXO, to } = body;
const network = testnet ? coininfo_1.default.bitcoincash.test.toBitcoinJS() : coininfo_1.default.bitcoincash.main.toBitcoinJS();
const transactionBuilder = new TransactionBuilder(network);
const privateKeysToSign = [];
const amountToSign = [];
const txs = await getTransactions(fromUTXO.map(u => u.txHash));
for (const [i, item] of fromUTXO.entries()) {
transactionBuilder.addInput(item.txHash, item.index, 0xffffffff, null);
privateKeysToSign.push(item.privateKey);
amountToSign.push(Number(new bignumber_js_1.default(txs[i].vout[item.index].value).multipliedBy(100000000).toFixed(0, bignumber_js_1.default.ROUND_FLOOR)));
}
for (const item of to) {
transactionBuilder.addOutput(getAddress(item.address), Number(new bignumber_js_1.default(item.value).multipliedBy(100000000).toFixed(0, bignumber_js_1.default.ROUND_FLOOR)));
}
for (let i = 0; i < privateKeysToSign.length; i++) {
const ecPair = ECPair.fromWIF(privateKeysToSign[i], network);
transactionBuilder.sign(i, ecPair, undefined, 0x01, amountToSign[i], undefined, ECSignature.SCHNORR);
}
return transactionBuilder.build().toHex();
};
exports.prepareBitcoinCashSignedTransaction = prepareBitcoinCashSignedTransaction;
const getTransactions = async (txHash) => {
const result = [];
for (const tx of txHash) {
result.push(blockchain_1.bcashGetTransaction(tx));
}
return await Promise.all(result);
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmNhc2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdHJhbnNhY3Rpb24vYmNhc2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsZ0VBQW9DO0FBQ3BDLGFBQWE7QUFDYix3REFBK0I7QUFDL0IsOENBQWlFO0FBQ2pFLDhDQUErQztBQUMvQyxvQ0FBK0U7QUFDL0Usc0NBQXlDO0FBRXpDLE1BQU0sRUFDRixXQUFXLEVBQ1gsV0FBVyxFQUNYLE1BQU0sRUFDTixrQkFBa0I7QUFDdEIsMkNBQTJDO0VBQzFDLEdBQUcsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUE7QUFFMUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxPQUFlLEVBQUUsRUFBRTtJQUNuQyxJQUFJO1FBQ0EsT0FBTyx3QkFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0tBQ2xDO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDUixPQUFPLE9BQU8sQ0FBQTtLQUNqQjtBQUNMLENBQUMsQ0FBQTtBQUVEOzs7Ozs7R0FNRztBQUNJLE1BQU0sMEJBQTBCLEdBQUcsS0FBSyxFQUFFLE9BQWdCLEVBQUUsSUFBMkIsRUFBRSxFQUFFO0lBQzlGLE9BQU8sMkJBQWMsQ0FBQyxNQUFNLDJDQUFtQyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO0FBQ25GLENBQUMsQ0FBQTtBQUZZLFFBQUEsMEJBQTBCLDhCQUV0QztBQUVEOzs7Ozs7R0FNRztBQUNJLE1BQU0sNkJBQTZCLEdBQUcsS0FBSyxFQUFFLEVBQWtCLEVBQUUsV0FBcUIsRUFBRSxPQUFnQixFQUFFLEVBQUU7SUFDL0csSUFBSSxFQUFFLENBQUMsS0FBSyxLQUFLLGdCQUFRLENBQUMsR0FBRyxFQUFFO1FBQzNCLE1BQU0sS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUE7S0FDcEM7SUFDRCxNQUFNLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFL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