@tatumio/tatum-v1
Version:
Tatum API client allows browsers and Node.js clients to interact with Tatum API.
122 lines • 8.69 kB
JavaScript
;
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.prepareXrpSignedOffchainTransaction = exports.signXrpOffchainKMSTransaction = exports.sendXrpOffchainTransaction = void 0;
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const ripple_lib_1 = require("ripple-lib");
const blockchain_1 = require("../blockchain");
const tatum_1 = require("../connector/tatum");
const model_1 = require("../model");
const common_1 = require("./common");
/**
* Send Xrp transaction from Tatum Ledger account 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 or id of the withdrawal, if it was not cancelled automatically
*/
const sendXrpOffchainTransaction = async (testnet, body) => {
await tatum_1.validateBody(body, model_1.TransferXrpOffchain);
const { account, secret } = body, withdrawal = __rest(body, ["account", "secret"]);
if (!withdrawal.fee) {
withdrawal.fee = new bignumber_js_1.default((await blockchain_1.xrpGetFee()).drops.base_fee).dividedBy(1000000).toString();
}
const acc = await blockchain_1.xrpGetAccountInfo(account);
const { id } = await common_1.offchainStoreWithdrawal(withdrawal);
const { amount, fee, address, } = withdrawal;
let txData;
try {
txData = await exports.prepareXrpSignedOffchainTransaction(testnet, amount, address, secret, acc, fee, withdrawal.sourceTag, withdrawal.attr);
}
catch (e) {
console.error(e);
await common_1.offchainCancelWithdrawal(id);
throw e;
}
try {
return Object.assign(Object.assign({}, await common_1.offchainBroadcast({ txData, withdrawalId: id, currency: model_1.Currency.XRP })), { id });
}
catch (e) {
console.error(e);
try {
await common_1.offchainCancelWithdrawal(id);
}
catch (e1) {
console.log(e);
return { id };
}
throw e;
}
};
exports.sendXrpOffchainTransaction = sendXrpOffchainTransaction;
/**
* Sign Xrp pending transaction from Tatum KMS
* @param tx pending transaction from KMS
* @param secret secret key to sign transaction with.
* @returns transaction data to be broadcast to blockchain.
*/
const signXrpOffchainKMSTransaction = async (tx, secret) => {
if (tx.chain !== model_1.Currency.XRP) {
throw Error('Unsupported chain.');
}
const rippleAPI = new ripple_lib_1.RippleAPI();
return rippleAPI.sign(tx.serializedTransaction, secret).signedTransaction;
};
exports.signXrpOffchainKMSTransaction = signXrpOffchainKMSTransaction;
/**
* Sign Xrp transaction with private keys locally. Nothing is broadcast to the blockchain.
* @param testnet mainnet or testnet version
* @param amount amount to send
* @param address recipient address
* @param secret secret to sign transaction with
* @param account Xrp source account
* @param fee fee to pay
* @param sourceTag source tag to include in transaction
* @param destinationTag
* @returns transaction data to be broadcast to blockchain.
*/
const prepareXrpSignedOffchainTransaction = async (testnet, amount, address, secret, account, fee, sourceTag, destinationTag) => {
const currency = 'XRP';
const payment = {
source: {
address: account.account_data.Account,
maxAmount: {
currency,
value: amount,
},
tag: sourceTag,
},
destination: {
address,
amount: {
currency,
value: amount,
},
},
};
if (destinationTag) {
payment.destination.tag = parseInt(destinationTag);
}
const rippleAPI = new ripple_lib_1.RippleAPI();
const prepared = await rippleAPI.preparePayment(account.account_data.Account, payment, {
fee: `${fee}`,
sequence: account.account_data.Sequence,
maxLedgerVersion: (account.ledger_current_index || account.ledger_index) + 500,
});
return (await rippleAPI.sign(prepared.txJSON, secret)).signedTransaction;
};
exports.prepareXrpSignedOffchainTransaction = prepareXrpSignedOffchainTransaction;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHJwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL29mZmNoYWluL3hycC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdFQUFvQztBQUNwQywyQ0FBb0M7QUFDcEMsOENBQTBEO0FBQzFELDhDQUErQztBQUMvQyxvQ0FBc0U7QUFDdEUscUNBQTZGO0FBRTdGOzs7Ozs7R0FNRztBQUNJLE1BQU0sMEJBQTBCLEdBQUcsS0FBSyxFQUFFLE9BQWdCLEVBQUUsSUFBeUIsRUFBRSxFQUFFO0lBQzVGLE1BQU0sb0JBQVksQ0FBQyxJQUFJLEVBQUUsMkJBQW1CLENBQUMsQ0FBQTtJQUM3QyxNQUFNLEVBQ0YsT0FBTyxFQUFFLE1BQU0sS0FDZixJQUFJLEVBRGdCLFVBQVUsVUFDOUIsSUFBSSxFQUZGLHFCQUVMLENBQU8sQ0FBQTtJQUNSLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2pCLFVBQVUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxzQkFBUyxDQUFDLENBQUMsTUFBTSxzQkFBUyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFBO0tBQ25HO0lBQ0QsTUFBTSxHQUFHLEdBQUcsTUFBTSw4QkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUM1QyxNQUFNLEVBQUMsRUFBRSxFQUFDLEdBQUcsTUFBTSxnQ0FBdUIsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUN0RCxNQUFNLEVBQ0YsTUFBTSxFQUFFLEdBQUcsRUFBRSxPQUFPLEdBQ3ZCLEdBQUcsVUFBVSxDQUFBO0lBRWQsSUFBSSxNQUFNLENBQUE7SUFDVixJQUFJO1FBQ0EsTUFBTSxHQUFHLE1BQU0sMkNBQW1DLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFD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