UNPKG

@tatumio/tatum-v1

Version:

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

118 lines 10.6 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.sendBitcoinTransaction = exports.prepareBitcoinSignedTransaction = exports.signBitcoinKMSTransaction = void 0; const bignumber_js_1 = __importDefault(require("bignumber.js")); // @ts-ignore const bitcore_lib_1 = require("bitcore-lib"); const blockchain_1 = require("../blockchain"); const tatum_1 = require("../connector/tatum"); const model_1 = require("../model"); const TransferBtcLtcBlockchain_1 = require("../model/request/TransferBtcLtcBlockchain"); /** * Prepare a signed Btc transaction with the private key locally. Nothing is broadcasted to the blockchain. * @returns raw transaction data in hex, to be broadcasted to blockchain. */ const prepareSignedTransaction = async (body) => { var _a, _b; await tatum_1.validateBody(body, TransferBtcLtcBlockchain_1.TransferBtcLtcBlockchain); const { fromUTXO, fromAddress, to } = body; const tx = new bitcore_lib_1.Transaction(); const privateKeysToSign = []; if (fromAddress) { for (const item of fromAddress) { const txs = await blockchain_1.btcGetTxForAccount(item.address); for (const t of txs) { for (const [i, o] of t.outputs.entries()) { if (o.address !== item.address) { continue; } try { await blockchain_1.btcGetUTXO(t.hash, i); tx.from({ txId: t.hash, outputIndex: i, script: bitcore_lib_1.Script.fromAddress(item.address).toString(), satoshis: o.value, }); privateKeysToSign.push(item.signatureId || item.privateKey); } catch (e) { console.error(e.toString()); } } } } } else if (fromUTXO) { for (const item of fromUTXO) { const t = await blockchain_1.btcGetTransaction(item.txHash); const address = t.outputs ? t.outputs[item.index].address : (_a = t.vout) === null || _a === void 0 ? void 0 : _a[item.index].scriptPubKey.addresses[0]; const value = t.outputs ? t.outputs[item.index].value : Number(new bignumber_js_1.default(((_b = t.vout) === null || _b === void 0 ? void 0 : _b[item.index].value) || 0).multipliedBy(100000000).toFixed(8, bignumber_js_1.default.ROUND_FLOOR)); tx.from({ txId: item.txHash, outputIndex: item.index, script: bitcore_lib_1.Script.fromAddress(address).toString(), satoshis: value, }); privateKeysToSign.push(item.signatureId || item.privateKey); } } for (const item of to) { tx.to(item.address, Number(new bignumber_js_1.default(item.value).multipliedBy(100000000).toFixed(8, bignumber_js_1.default.ROUND_FLOOR))); } if (body.changeAddress && body.fee) { tx.change(body.changeAddress); tx.fee(Number(new bignumber_js_1.default(body.fee).multipliedBy(100000000).toFixed(8, bignumber_js_1.default.ROUND_FLOOR))); } if ((fromAddress && fromAddress[0].signatureId) || (fromUTXO && fromUTXO[0].signatureId)) { return JSON.stringify({ txData: JSON.stringify(tx), privateKeysToSign }); } for (const item of privateKeysToSign) { tx.sign(bitcore_lib_1.PrivateKey.fromWIF(item)); } return tx.serialize(true); }; /** * Sign Bitcoin 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 signBitcoinKMSTransaction = async (tx, privateKeys) => { if (tx.chain !== model_1.Currency.BTC) { throw Error('Unsupported chain.'); } const builder = new bitcore_lib_1.Transaction(JSON.parse(tx.serializedTransaction)); for (const privateKey of privateKeys) { builder.sign(bitcore_lib_1.PrivateKey.fromWIF(privateKey)); } return builder.serialize(true); }; exports.signBitcoinKMSTransaction = signBitcoinKMSTransaction; /** * Sign Bitcoin 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 prepareBitcoinSignedTransaction = async (testnet, body) => { return prepareSignedTransaction(body); }; exports.prepareBitcoinSignedTransaction = prepareBitcoinSignedTransaction; /** * Send Bitcoin 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 sendBitcoinTransaction = async (testnet, body) => { return blockchain_1.btcBroadcast(await exports.prepareBitcoinSignedTransaction(testnet, body)); }; exports.sendBitcoinTransaction = sendBitcoinTransaction; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0Y29pbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90cmFuc2FjdGlvbi9iaXRjb2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdFQUFxQztBQUNyQyxhQUFhO0FBQ2IsNkNBQThEO0FBQzlELDhDQUFnRztBQUNoRyw4Q0FBa0Q7QUFDbEQsb0NBQWtFO0FBQ2xFLHdGQUFxRjtBQUVyRjs7O0dBR0c7QUFDSCxNQUFNLHdCQUF3QixHQUFHLEtBQUssRUFBRSxJQUE4QixFQUFFLEVBQUU7O0lBQ3hFLE1BQU0sb0JBQVksQ0FBQyxJQUFJLEVBQUUsbURBQXdCLENBQUMsQ0FBQztJQUNuRCxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFDM0MsTUFBTSxFQUFFLEdBQUcsSUFBSSx5QkFBVyxFQUFFLENBQUM7SUFFN0IsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7SUFDN0IsSUFBSSxXQUFXLEVBQUU7UUFDZixLQUFLLE1BQU0sSUFBSSxJQUFJLFdBQVcsRUFBRTtZQUM5QixNQUFNLEdBQUcsR0FBRyxNQUFNLCtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLEdBQUcsRUFBRTtnQkFDbkIsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFLLENBQUMsQ0FBQyxPQUEwQixDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUM1RCxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRTt3QkFDOUIsU0FBUTtxQkFDVDtvQkFDRCxJQUFJO3dCQUNGLE1BQU0sdUJBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFBO3dCQUMzQixFQUFFLENBQUMsSUFBSSxDQUFDOzRCQUNOLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTs0QkFD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