@tatumio/tatum-v1
Version:
Tatum API client allows browsers and Node.js clients to interact with Tatum API.
117 lines • 10.9 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.sendLitecoinTransaction = exports.prepareLitecoinSignedTransaction = exports.signLitecoinKMSTransaction = void 0;
const bignumber_js_1 = __importDefault(require("bignumber.js"));
// @ts-ignore
const bitcore_lib_ltc_1 = require("bitcore-lib-ltc");
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 Ltc 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_ltc_1.Transaction();
const privateKeysToSign = [];
if (fromAddress) {
for (const item of fromAddress) {
const txs = await blockchain_1.ltcGetTxForAccount(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.ltcGetUTXO(t.hash, i);
tx.from({
txId: t.hash,
outputIndex: i,
script: bitcore_lib_ltc_1.Script.fromAddress(item.address).toString(),
satoshis: Number(new bignumber_js_1.default(o.value).multipliedBy(100000000).toFixed(8, bignumber_js_1.default.ROUND_FLOOR)),
});
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.ltcGetTransaction(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 : ((_b = t.vout) === null || _b === void 0 ? void 0 : _b[item.index].value) || 0;
tx.from({
txId: item.txHash,
outputIndex: item.index,
script: bitcore_lib_ltc_1.Script.fromAddress(address).toString(),
satoshis: Number(new bignumber_js_1.default(value).multipliedBy(100000000).toFixed(8, bignumber_js_1.default.ROUND_FLOOR)),
});
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_ltc_1.PrivateKey.fromWIF(item));
}
return tx.serialize(true);
};
/**
* Sign Litecoin 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 signLitecoinKMSTransaction = async (tx, privateKeys, testnet) => {
if (tx.chain !== model_1.Currency.LTC) {
throw Error('Unsupported chain.');
}
const builder = new bitcore_lib_ltc_1.Transaction(JSON.parse(tx.serializedTransaction));
for (const privateKey of privateKeys) {
builder.sign(bitcore_lib_ltc_1.PrivateKey.fromWIF(privateKey));
}
return builder.serialize(true);
};
exports.signLitecoinKMSTransaction = signLitecoinKMSTransaction;
/**
* Sign Litcoin 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 prepareLitecoinSignedTransaction = async (testnet, body) => {
return prepareSignedTransaction(body);
};
exports.prepareLitecoinSignedTransaction = prepareLitecoinSignedTransaction;
/**
* Send Litecoin 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 sendLitecoinTransaction = async (testnet, body) => {
return blockchain_1.ltcBroadcast(await exports.prepareLitecoinSignedTransaction(testnet, body));
};
exports.sendLitecoinTransaction = sendLitecoinTransaction;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl0ZWNvaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdHJhbnNhY3Rpb24vbGl0ZWNvaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsZ0VBQW9DO0FBQ3BDLGFBQWE7QUFDYixxREFBaUU7QUFDakUsOENBQStGO0FBQy9GLDhDQUFpRDtBQUNqRCxvQ0FBaUU7QUFDakUsd0ZBQXFGO0FBRXJGOzs7R0FHRztBQUNILE1BQU0sd0JBQXdCLEdBQUcsS0FBSyxFQUFFLElBQThCLEVBQUUsRUFBRTs7SUFDeEUsTUFBTSxvQkFBWSxDQUFDLElBQUksRUFBRSxtREFBd0IsQ0FBQyxDQUFBO0lBQ2xELE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQTtJQUMxQyxNQUFNLEVBQUUsR0FBRyxJQUFJLDZCQUFXLEVBQUUsQ0FBQTtJQUU1QixNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQTtJQUM1QixJQUFJLFdBQVcsRUFBRTtRQUNmLEtBQUssTUFBTSxJQUFJLElBQUksV0FBVyxFQUFFO1lBQzlCLE1BQU0sR0FBRyxHQUFHLE1BQU0sK0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ2xELEtBQUssTUFBTSxDQUFDLElBQUksR0FBRyxFQUFFO2dCQUNuQixLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUssQ0FBQyxDQUFDLE9BQTBCLENBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQzVELElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFO3dCQUM5QixTQUFRO3FCQUNUO29CQUNELElBQUk7d0JBQ0YsTUFBTSx1QkFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUE7d0JBQzNCLEVBQUUsQ0FBQyxJQUFJLENBQUM7NEJBQ04sSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJOzRCQUNaLFdBQVcsRUFBRSxDQUFDOzRCQUNkLE1BQU0sRUFBRSx3QkFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFOzRCQUNuRCxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksc0JBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsc0JBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQzt5QkFDbkcsQ0FBQyxDQUFBO3dCQUNGLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtxQkFDNUQ7b0JBQUMsT0FBTyxDQUFDLEVBQUU7d0JBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtxQkFDNUI7aUJBQ0Y7YUFDRjtTQUNGO0tBQ0Y7U0FBTSxJQUFJLFFBQVEsRUFBRTtRQUNuQixLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsRUFBRTtZQUMzQixNQUFNLENBQUMsR0FBRyxNQUFNLDhCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUM5QyxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQUEsQ0FBQyxDQUFDLElBQUksMENBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQzFHLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQSxNQUFBLENBQUMsQ0FBQyxJQUFJLDBDQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxLQUFJLENBQUMsQ0FBQTtZQUN2RixFQUFFLENBQUMsSUFBSSxDQUFDO2dCQUNOLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDakIsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUN2QixNQUFNLEVBQUUsd0JBQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFO2dCQUM5QyxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksc0JBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxzQkFBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ2pHLENBQUMsQ0FBQTtZQUNGLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtTQUM1RDtLQUNGO0lBQ0QsS0FBSyxNQUFNLElBQUksSUFBSSxFQUFFLEVBQUU7UUFDckIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLHNCQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLHNCQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2pIO0lBRUQsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDbEMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDN0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxzQkFBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxzQkFBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtLQUNsRztJQUVELElBQUksQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRTtRQUN4RixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUE7S0FDekU7SUFFRCxLQUFLLE1BQU0sSUFBSSxJQUFJLGlCQUFpQixFQUFFO1FBQ3BDLEVBQUUsQ0FBQyxJQUFJLENBQUMsNEJBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtLQUNsQztJQUNELE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUMzQixDQUFDLENBQUE7QUFFRDs7Ozs7O0dBTUc7QUFDSSxNQUFNLDBCQUEwQixHQUFHLEtBQUssRUFBRSxFQUFrQixFQUFFLFdBQXFCLEVBQUUsT0FBZ0IsRUFBRSxFQUFFO0lBQzlHLElBQUksRUFBRSxDQUFDLEtBQUssS0FBSyxnQkFBUSxDQUFDLEdBQUcsRUFBRTtRQUM3QixNQUFNLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO0tBQ2xDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSw2QkFBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQTtJQUNyRSxLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRTtRQUNwQyxPQUFPLENBQUMsSUFBSSxDQUFDLDRCQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7S0FDN0M7SUFDRCxPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDaEMsQ0FBQyxDQUFBO0FBVFksUUFBQSwwQkFBMEIsOEJBU3RDO0FBRUQ7Ozs7O0dBS0c7QUFDSSxNQUFNLGdDQUFnQyxHQUFHLEtBQUssRUFBRSxPQUFnQixFQUFFLElBQThCLEVBQUUsRUFBRTtJQUN6RyxPQUFPLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ3ZDLENBQUMsQ0FBQTtBQUZZLFFBQUEsZ0NBQWdDLG9DQUU1QztBQUVEOzs7Ozs7R0FNRztBQUNJLE1BQU0sdUJBQXVCLEdBQUcsS0FBSyxFQUFFLE9BQWdCLEVBQUUsSUFBOEIsRUFBRSxFQUFFO0lBQ2hHLE9BQU8seUJBQVksQ0FBQyxNQUFNLHdDQUFnQyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO0FBQzVFLENBQUMsQ0FBQTtBQUZZLFFBQUEsdUJBQXVCLDJCQUVuQyJ9