UNPKG

@tatumio/tatum-v1

Version:

Tatum API client allows browsers and Node.js clients to interact with Tatum API.

95 lines 9.24 kB
"use strict"; 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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