zkverifyjs
Version:
Submit proofs to zkVerify and query proof state with ease using our npm package.
149 lines • 5.52 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.handleTransaction = void 0;
exports.performSignAndSend = performSignAndSend;
const enums_js_1 = require("../../enums.js");
const index_js_1 = require("./errors/index.js");
const index_js_2 = require("../helpers/index.js");
const index_js_3 = require("./transactionInfo/index.js");
const index_js_4 = require("./handlers/index.js");
/**
* Handles transaction execution, signing, and event handling.
*/
const handleTransaction = async (api, submitExtrinsic, account, signer, emitter, options, transactionType, batchCount) => {
const transactionInfo = (0, index_js_3.initializeTransactionInfo)(transactionType, options, batchCount);
let resolveTx;
let rejectTx;
const txPromise = new Promise((res, rej) => {
resolveTx = res;
rejectTx = rej;
});
let unsubscribeFn;
let isCompleted = false;
const cleanupTransaction = () => {
if (unsubscribeFn) {
try {
unsubscribeFn();
}
catch (err) {
console.debug('Error during transaction cleanup:', err);
}
unsubscribeFn = undefined;
}
};
const handleUnsubscribeFn = (fn) => {
if (typeof fn !== 'function')
return;
if (isCompleted) {
try {
fn();
}
catch (err) {
console.debug('Error during late transaction cleanup:', err);
}
return;
}
unsubscribeFn = fn;
};
const cancelTransaction = (error) => {
isCompleted = true;
cleanupTransaction();
if (transactionInfo.status !== enums_js_1.TransactionStatus.Error) {
transactionInfo.status = enums_js_1.TransactionStatus.Error;
try {
const errObj = error instanceof Error ? error : new Error(String(error));
(0, index_js_1.handleError)(emitter, api, transactionInfo, errObj, true);
}
catch (err) {
rejectTx(err);
return;
}
}
rejectTx(error);
};
const finalizeTransaction = async (result) => {
if (transactionInfo.status === enums_js_1.TransactionStatus.Error)
return;
try {
await (0, index_js_4.handleFinalized)(api, transactionInfo, result.dispatchError, emitter, transactionType);
isCompleted = true;
cleanupTransaction();
resolveTx(transactionInfo);
}
catch (error) {
cancelTransaction(error);
}
};
try {
const unsubscribeResult = performSignAndSend(submitExtrinsic, account, signer ? { signer, nonce: options.nonce } : { nonce: options.nonce }, async (result) => {
try {
if (transactionInfo.status === enums_js_1.TransactionStatus.Error)
return;
if (result.status.isBroadcast) {
const txHash = result.txHash.toString();
transactionInfo.txHash = txHash;
(0, index_js_2.safeEmit)(emitter, enums_js_1.ZkVerifyEvents.Broadcast, {
txHash,
});
}
if (result.status.isInBlock) {
if (!transactionInfo.txHash) {
transactionInfo.txHash = result.txHash.toString();
}
transactionInfo.blockHash = result.status.asInBlock.toString();
await (0, index_js_4.handleInBlock)(api, result.events, transactionInfo, emitter, transactionType);
}
if (result.status.isFinalized) {
await finalizeTransaction(result);
}
else if (result.status.isInvalid) {
throw new Error('Transaction is invalid.');
}
}
catch (error) {
try {
cancelTransaction(error);
}
catch (cancelError) {
console.debug('Error during transaction cancellation:', cancelError);
}
}
});
if (typeof unsubscribeResult === 'function') {
handleUnsubscribeFn(unsubscribeResult);
}
else if (unsubscribeResult &&
typeof unsubscribeResult.then === 'function') {
void (async () => {
try {
handleUnsubscribeFn(await unsubscribeResult);
}
catch (error) {
if (!isCompleted) {
cancelTransaction(error);
}
}
})();
}
}
catch (error) {
cancelTransaction(error);
}
return txPromise;
};
exports.handleTransaction = handleTransaction;
/**
* Handles signing and sending transactions.
*/
function performSignAndSend(submitExtrinsic, account, options, callback) {
if (typeof account === 'string' && options?.signer) {
return submitExtrinsic.signAndSend(account, options, callback);
}
else if (typeof account !== 'string') {
return options
? submitExtrinsic.signAndSend(account, options, callback)
: submitExtrinsic.signAndSend(account, callback);
}
throw new Error('Unsupported account or signer type.');
}
//# sourceMappingURL=index.js.map