mirror of
https://github.com/luxfi/safe-ios.git
synced 2026-10-30 15:19:20 +00:00
78 lines
2.9 KiB
Swift
78 lines
2.9 KiB
Swift
//
|
|
// RelayedTransactionMonitor.swift
|
|
// Multisig
|
|
//
|
|
// Created by Mouaz on 4/8/23.
|
|
// Copyright © 2023 Gnosis Ltd. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
class RelayedTransactionMonitor {
|
|
static var globalTimer: Timer?
|
|
static let shared = RelayedTransactionMonitor()
|
|
private let gelatoService = App.shared.gelatoRelayService
|
|
|
|
static func scheduleMonitoring(repeatInterval: TimeInterval = 10, runImmediately: Bool = true) {
|
|
globalTimer?.invalidate()
|
|
|
|
globalTimer = Timer.scheduledTimer(withTimeInterval: repeatInterval, repeats: true, block: { _ in
|
|
Self.shared.queryTransactionStatuses()
|
|
})
|
|
|
|
if runImmediately {
|
|
Self.shared.queryTransactionStatuses()
|
|
}
|
|
}
|
|
|
|
static func stopMonitoring() {
|
|
globalTimer?.invalidate()
|
|
}
|
|
|
|
func queryTransactionStatuses() {
|
|
let context = App.shared.coreDataStack.viewContext
|
|
let statusPending = SCGModels.TxStatus.pending.rawValue
|
|
|
|
let fetchRequest = CDEthTransaction.fetchRequest()
|
|
fetchRequest.sortDescriptors = []
|
|
fetchRequest.predicate = NSPredicate(format: "taskId != nil AND status == %@", statusPending)
|
|
|
|
let cdEthTransactions: [CDEthTransaction]
|
|
|
|
do {
|
|
cdEthTransactions = try context.fetch(fetchRequest)
|
|
} catch {
|
|
LogService.shared.debug("Relayed transaction monitor: failed to fetch transactions: \(error)")
|
|
return
|
|
}
|
|
|
|
guard !cdEthTransactions.isEmpty else { return }
|
|
|
|
cdEthTransactions.forEach { cdTxData in
|
|
guard let taskId = cdTxData.taskId else { return }
|
|
_ = gelatoService.asyncStatus(taskId: taskId, completion: { result in
|
|
DispatchQueue.main.async {
|
|
switch result {
|
|
case .failure(_):
|
|
break
|
|
case .success(let status):
|
|
if let txHash = status.task.transactionHash, status.task.taskState == .success {
|
|
cdTxData.status = SCGModels.TxStatus.success.rawValue
|
|
cdTxData.ethTxHash = txHash
|
|
cdTxData.dateUpdatedAt = Date()
|
|
cdTxData.dateExecutedAt = Date()
|
|
App.shared.coreDataStack.saveContext()
|
|
NotificationCenter.default.post(name: .transactionDataInvalidated, object: nil)
|
|
} else if [RelayedTaskStatus.Status.cancelled, .reverted].contains(status.task.taskState) {
|
|
cdTxData.status = SCGModels.TxStatus.failed.rawValue
|
|
cdTxData.dateUpdatedAt = Date()
|
|
App.shared.coreDataStack.saveContext()
|
|
NotificationCenter.default.post(name: .transactionDataInvalidated, object: nil)
|
|
}
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
}
|