stellar-plus
Version:
beta version of stellar-plus, an all-in-one sdk for the Stellar blockchain
81 lines (80 loc) • 3.69 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.diagnoseSubmitError = exports.extractDataFromSubmitTransactionError = void 0;
const stellar_sdk_1 = require("@stellar/stellar-sdk");
const axios_1 = require("axios");
const axios_2 = require("./axios");
const horizon_error_codes_1 = require("./horizon-error-codes");
const transaction_1 = require("./transaction");
const extractDataFromSubmitTransactionError = (response) => {
return Object.assign({}, response);
};
exports.extractDataFromSubmitTransactionError = extractDataFromSubmitTransactionError;
const diagnoseSubmitError = (error, tx) => {
const transactionData = tx ? (0, transaction_1.extractTransactionData)(tx) : undefined;
if (error instanceof axios_1.AxiosError) {
const axiosError = (0, axios_2.extractAxiosErrorInfo)(error);
if (axiosError.data && isHorizonErrorResponseData(axiosError.data)) {
const horizonError = axiosError.data;
const diagnostic = horizonError.status === 400 // Failed transaction, contains error codes
? reviewTransactionError(horizonError, tx)
: undefined;
return {
// Horizon Error
diagnostic,
meta: {
transactionData,
data: axiosError.data,
},
};
}
return {
// Axios Error
meta: {
message: axiosError.message,
transactionData,
data: axiosError.data,
},
};
}
return {
// Generic Error
meta: { error, transactionData },
};
};
exports.diagnoseSubmitError = diagnoseSubmitError;
const isHorizonErrorResponseData = (data) => {
if (typeof data === 'object' && data !== null) {
const potentialError = data; // Type assertion
return ('status' in potentialError && 'title' in potentialError && 'type' in potentialError && 'detail' in potentialError);
}
return false;
};
const reviewTransactionError = (errorData, tx) => {
const diagnostic = {};
if (errorData.extras && errorData.extras.result_codes) {
const codes = errorData.extras.result_codes;
// Transaction level errors
if (codes.transaction) {
diagnostic.transaction = Object.assign(Object.assign({ code: codes.transaction }, {
issue: 'Unknown transaction error',
suggestion: 'No suggestion available',
}), horizon_error_codes_1.transactionErrorMessages[codes.transaction]);
}
// Operation specific errors
if (codes.operations && codes.operations.length > 0) {
const envelope = tx && tx instanceof stellar_sdk_1.FeeBumpTransaction ? tx.innerTransaction : tx;
const operationDetails = envelope ? (0, transaction_1.extractOperationsData)(envelope.operations, false) : [];
diagnostic.operations = codes.operations.map((opCode, index) => {
var _a;
const operation = operationDetails[index].type;
const opDiagnostic = Object.assign(Object.assign(Object.assign({ code: opCode }, {
issue: `Unknown operation error: ${opCode}`,
suggestion: 'No suggestion available',
}), horizon_error_codes_1.operationErrorMessages[opCode]), (_a = horizon_error_codes_1.operationSpecificErrorMessages[operation]) === null || _a === void 0 ? void 0 : _a[opCode]);
return Object.assign({ operation: operation || undefined }, opDiagnostic);
});
}
}
return diagnostic;
};