Реализация отслеживания статуса транзакции в мобильном криптокошельке

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.
Разработка и поддержка любых видов мобильных приложений:
Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Предлагаемые услуги
Показано 1 из 1 услугВсе 1735 услуг
Реализация отслеживания статуса транзакции в мобильном криптокошельке
Средняя
~2-3 рабочих дня
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1054
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    862
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    445

Реализация отслеживания статуса транзакции в мобильном криптокошельке

Транзакция отправлена — и пользователь смотрит на «Pending» статус следующие 10 минут. Это нормально для блокчейна, но ненормально — не получить уведомление, когда транзакция подтвердилась или зафейлилась. Отслеживание статуса транзакции — это real-time задача с несколькими уровнями: polling блокчейна, WebSocket-подключение, push-уведомление при финальном статусе.

Жизненный цикл транзакции

Ethereum-транзакция проходит через состояния: submitted → pending (mempool) → confirmed (1 confirmation) → finalized (12+ confirmations) → failed (reverted / dropped).

Bitcoin: mempool → 1 confirmation → 6 confirmations (finalized).

Solana — значительно быстрее: слоты по ~400ms, processed → confirmed → finalized за секунды.

На клиенте нужно показывать текущее состояние и количество подтверждений.

Стратегии получения статуса

Polling через node RPC. Самый простой вариант — проверять статус транзакции каждые N секунд:

// iOS — polling статуса ETH транзакции через JSON-RPC
func pollTransactionStatus(txHash: String) async throws -> TransactionStatus {
    let params: [AnyEncodable] = [txHash, false]
    let receipt = try await ethClient.call(method: "eth_getTransactionReceipt", params: params)

    if receipt == nil {
        return .pending // Ещё в mempool
    }

    let confirmations = try await getConfirmationsCount(txHash: txHash)
    return confirmations >= requiredConfirmations ? .confirmed : .confirmingWith(count: confirmations)
}

Polling каждые 3–5 секунд при открытом экране — нормально. В фоне — только через silent push или WebSocket.

WebSocket подписка через Alchemy / Infura / QuickNode. Более эффективный подход:

// Бэкенд — подписка на событие через Alchemy WebSocket
const { createAlchemyWeb3 } = require("@alch/alchemy-web3");
const web3 = createAlchemyWeb3(process.env.ALCHEMY_WS_URL);

async function watchTransaction(txHash, userId) {
    const subscription = web3.eth.subscribe('newBlockHeaders');

    subscription.on('data', async (blockHeader) => {
        const receipt = await web3.eth.getTransactionReceipt(txHash);
        if (receipt) {
            subscription.unsubscribe();
            await updateTransactionStatus(txHash, receipt.status ? 'confirmed' : 'failed');
            await sendPushNotification(userId, txHash, receipt.status);
        }
    });
}

Alchemy и Infura также предоставляют webhooks на подтверждение транзакции — бэкенд не держит постоянное WS-соединение.

Мобильный клиент: real-time UI

На клиенте — WebSocket соединение с собственным бэкендом для real-time статуса:

// Android — подписка на статус транзакции через WebSocket
class TransactionStatusSocket(
    private val token: String,
    private val okHttpClient: OkHttpClient
) {
    fun subscribe(txHash: String): Flow<TransactionStatus> = callbackFlow {
        val ws = okHttpClient.newWebSocket(
            Request.Builder()
                .url("wss://api.yourwallet.app/ws/tx/$txHash")
                .header("Authorization", "Bearer $token")
                .build(),
            object : WebSocketListener() {
                override fun onMessage(webSocket: WebSocket, text: String) {
                    val status = json.decodeFromString<TransactionStatusUpdate>(text)
                    trySend(status.status)
                    if (status.isFinal) close()
                }
                override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
                    close(t)
                }
            }
        )
        awaitClose { ws.close(1000, "Subscription ended") }
    }
}

Progress индикатор подтверждений

Для ETH — отображаем прогресс к 12 подтверждениям:

struct ConfirmationProgressView: View {
    let current: Int
    let required: Int = 12

    var body: some View {
        VStack(alignment: .leading, spacing: 4) {
            ProgressView(value: Double(min(current, required)), total: Double(required))
                .tint(current >= required ? .green : .orange)
            Text("\(current)/\(required) подтверждений")
                .font(.caption)
                .foregroundColor(.secondary)
        }
    }
}

Дизайн транзакции в разных статусах:

  • pending — анимированный spinner, жёлтый акцент
  • confirming — progress bar с количеством подтверждений
  • confirmed — зелёная галочка, анимация
  • failed — красный, причина ошибки если доступна (revert reason из receipt)

Push-уведомления при изменении статуса

При финальном статусе — push пользователю:

{
  "title": "Транзакция подтверждена",
  "body": "0.05 ETH отправлено на 0x742d...3B8C",
  "data": {
    "screen": "transaction_detail",
    "tx_hash": "0xabc123...",
    "status": "confirmed"
  }
}

Для failed транзакции — отдельный шаблон с описанием причины если она известна (revert reason или «dropped from mempool»).

Обработка dropped транзакций

Транзакция может «исчезнуть» из mempool если gas price был слишком низким. Через 15–30 минут без подтверждения — транзакция считается dropped. Нужно detectить это:

suspend fun checkDroppedTransactions() {
    val pendingTxs = transactionDao.getPendingOlderThan(minutes = 20)
    pendingTxs.forEach { tx ->
        val receipt = ethClient.getTransactionReceipt(tx.hash)
        if (receipt == null) {
            transactionDao.updateStatus(tx.hash, TransactionStatus.DROPPED)
            pushService.notifyUser(tx.userId, "Транзакция не попала в блок", tx.hash)
        }
    }
}

Сроки

Реализация отслеживания статуса транзакции с WebSocket real-time обновлениями, progress индикатором подтверждений, push при финальном статусе и обработкой dropped транзакций — 6–10 рабочих дней.