Bugfix: Prevent crash if transactionData can not be parsed

This commit is contained in:
minibits-cash
2025-06-27 09:58:20 +02:00
parent 9a6d0dc7fe
commit 33723cc831
7 changed files with 59 additions and 34 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "minibits_wallet",
"version": "0.2.2-beta.21",
"version": "0.2.2-beta.22",
"private": true,
"scripts": {
"android:clean": "cd android && ./gradlew clean",
+6 -2
View File
@@ -839,8 +839,12 @@ export const SendScreen = observer(function SendScreen({ route }: Props) {
if(!transaction || !transaction.data) {
return
}
const updated = JSON.parse(transaction.data)
let updated = []
try {
updated = JSON.parse(transaction.data)
} catch (e) {}
if(updated.length > 2) {
updated[2].sentToRelays = relaysToShareTo
+10 -2
View File
@@ -538,7 +538,11 @@ export const TopupScreen = observer(function TopupScreen({ route }: Props) {
return
}
const updated = JSON.parse(transaction.data)
let updated = []
try {
updated = JSON.parse(transaction.data)
} catch (e) {}
if (updated.length > 1) {
updated[1].sentToRelays = relaysToShareTo
@@ -593,7 +597,11 @@ export const TopupScreen = observer(function TopupScreen({ route }: Props) {
)
}
const updated = JSON.parse(transaction.data)
let updated = []
try {
updated = JSON.parse(transaction.data)
} catch (e) {}
updated.push({
status: TransactionStatus.ERROR,
+12 -22
View File
@@ -594,17 +594,17 @@ const ReceiveInfoBlock = function (props: {
// In case of error status, allow the retry for specific error messages
if(transaction.status === TransactionStatus.ERROR) {
const auditTrail = JSON.parse(transaction.data)
let auditTrail = getAuditTrail(transaction)
const errorRecord = auditTrail.find(
(record: any) => record.status === 'ERROR',
)
const {error} = errorRecord
if(error && error.message) {
if(error.message.toLowerCase().includes('network') ||
error.message.toLowerCase().includes('gateway') ||
error.message.toLowerCase().includes('outputs')) {
if(errorRecord) {
const {error} = errorRecord
if(error.message && ['network', 'gateway', 'outputs'].some(word => error.message.toLowerCase().includes(word))) {
setIsRetriable(true)
if(error.message.toLowerCase().includes('outputs')) {
@@ -1711,7 +1711,7 @@ const TransferInfoBlock = function (props: {
log.trace('[onRevertPreparedTransfer]', {tId: transaction.id})
const pendingProofs = proofsStore.getByTransactionId(transaction.id!, true) // PREPARED should always pending
const transactionData = isDataParsable ? JSON.parse(transaction.data) : []
const transactionData = getAuditTrail(transaction)
if(pendingProofs.length > 0) {
// remove it from pending proofs in the wallet
@@ -1998,22 +1998,12 @@ export const TranItem = function (props: {
const getAuditTrail = function (transaction: Transaction) {
let data = []
try {
const data = JSON.parse(transaction.data)
data = JSON.parse(transaction.data)
} catch (e) {}
if (data && isArray(data)) {
return data
/* for (const item of data) {
if(item.status === TransactionStatus.ERROR) {
return item
}
}*/
}
return false
} catch (e) {
// silent
return false
}
return data
}
+11 -2
View File
@@ -286,7 +286,11 @@ export const receiveOfflineCompleteTask = async function (
throw new AppError(Err.VALIDATION_ERROR, 'Could not retrieve transaction.', {transactionId})
}
const transactionData = JSON.parse(transaction.data)
let transactionData = []
try {
transactionData = JSON.parse(transaction.data)
} catch (e) {}
if (!transaction.inputToken) {
throw new AppError(Err.VALIDATION_ERROR, 'Could not find ecash token to redeem', {caller: 'receiveOfflineComplete'})
@@ -366,7 +370,12 @@ export const receiveOfflineCompleteTask = async function (
// release lock
if(transaction) {
const transactionData = JSON.parse(transaction.data)
let transactionData = []
try {
transactionData = JSON.parse(transaction.data)
} catch (e) {}
transactionData.push({
status: TransactionStatus.ERROR,
error: WalletUtils.formatError(e),
+6 -1
View File
@@ -24,7 +24,12 @@ export const revertTask = async function (
): Promise<TransactionTaskResult> {
const transactionData = JSON.parse(transaction.data)
let transactionData = []
try {
transactionData = JSON.parse(transaction.data)
} catch (e) {}
const unit = transaction.unit as MintUnit
try {
+13 -4
View File
@@ -1174,12 +1174,17 @@ const handleInFlightByMintTask = async function (mint: Mint): Promise<WalletTask
for(const inFlight of counter.inFlightRequests) {
const transaction = transactionsStore.findById(inFlight.transactionId)
const transactionData = JSON.parse(transaction.data)
if(!transaction) {
counter.removeInFlightRequest(inFlight.transactionId)
continue
}
let transactionData = []
try {
transactionData = JSON.parse(transaction.data)
} catch (e) {}
const {mint, unit} = transaction
@@ -1583,8 +1588,13 @@ const handlePendingTopupTask = async function (params: {transaction: Transaction
} = transaction
log.trace('[handlePendingTopupTask] start', transaction)
let transactionData = []
try {
transactionData = JSON.parse(transaction.data)
} catch (e) {}
const transactionData = JSON.parse(transaction.data)
const mintInstance = mintsStore.findByUrl(mintUrl as string)
try {
@@ -1800,8 +1810,7 @@ const recoverMintQuote = async function (params: {mintUrl: string, mintQuote: st
}
// store tx in db and in the model
const transaction = await transactionsStore.addTransaction(newTransaction)
const transactionId = transaction.id
const transactioData = JSON.parse(transaction.data)
const transactionId = transaction.id
let proofs: CashuProof[] = []