ADAMANT различает статусы доставки сообщений и статусы криптовалютных переводов. Сообщения отслеживаются внутри блокчейна ADAMANT, в то время как переводы проверяются в родном блокчейне каждого токена. Основной принцип конфиденциальности: ADAMANT никогда не будет реализовывать статус «прочитано» для сообщений, поскольку это раскрыло бы активность получателя.
Статусы сообщений
Входящие сообщения всегда считаются доставленными, поскольку они считываются напрямую из блокчейна, поэтому для них не отображается никакой статус. Исходящие сообщения проходят три этапа: Отправляется (в ожидании), Доставлено на узел (узел принял транзакцию) и В блокчейне (дополнительное подтверждение после того, как блок стал известен). Переход от «Отправляется» к «Доставлено» должен происходить быстро для плавного пользовательского интерфейса. Статусы обновляются как в списке чатов, так и внутри отдельных чатов.
Когда сокеты включены, они возвращают неподтверждённые транзакции сразу после их поступления на узел. В этот момент такие поля, как block_timestamp, height, blockId и confirmations, имеют значение null. Сокеты дублируют ответы REST API — сообщения приходят мгновенно через сокет, в то время как REST предоставляет обновления каждые ~10 секунд (SOCKET_ENABLED_TIMEOUT) в качестве резервного механизма надёжности. ADAMANT намеренно не использует статус «Доставлено получателю», поскольку это противоречит философии приватности и технически ненадёжно, когда получатель находится в оффлайне.
Если доставка на узел не удалась или блокчейн отклонил транзакцию, сообщение помечается как Не отправлено.
Статусы криптовалютных переводов
Для всех криптовалютных переводов ADAMANT отображает статус транзакции в собственном блокчейне токена. Это касается как входящих, так и исходящих переводов. Рабочий процесс: Ожидание → Зарегистрировано → Успешно / Неудачно / Несоответствие.
Перевод начинается как Ожидание (отправка или проверка). Как только узел подтверждает существование транзакции, она становится Зарегистрированной. Затем ADAMANT продолжает проверку до достижения окончательного статуса: Успешно (подтверждено в сети), Неудачно (отклонено сетью) или Несоответствие (обнаружено несоответствие). Правила проверки транзакций для каждой монеты определены в репозитории adamant-wallets в разделе txFetchInfo. Спецификация задокументирована в AIP-12.
Для переводов ADM статус приходит непосредственно с транзакцией: если confirmations > 0, перевод помечается как Успешный; если confirmations = 0, он остаётся в статусе Ожидание или Зарегистрировано.
Механизм фоновой проверки статуса
Для блокчейнов, отличных от ADM, проверка статуса требует дополнительных запросов к узлу или API. ADAMANT использует фоновый механизм, который проверяет только те транзакции, которые видны пользователю, и останавливается после получения окончательного статуса. Частота проверки зависит от возраста транзакции (Новая или Старая), а система ограничивает количество попыток для транзакций в статусе Ожидание, в то время как для Зарегистрированных разрешено неограниченное количество попыток. Проверки выполняются только при наличии сетевого подключения и доступности узлов соответствующей монеты, чтобы избежать бесполезных попыток в оффлайне.
Транзакция классифицируется как Новая, если она была только что отправлена из приложения или если её временная метка попадает в пороговое значение X минут от текущего времени. В противном случае она считается Старой. Порог может быть статической константой или рассчитываться для каждой монеты отдельно:
const isNew = (admTransferTimestamp) =>
Date.now() - admTransferTimestamp < newPendingTxFetchAttempts * newPendingTxFetchInterval;
Это различие обеспечивает более частую проверку новых транзакций, в то время как старые проверяются реже.
Пример: перевод Bitcoin
Константы из adamant-wallets:
"txFetchInfo": {
"newPendingInterval": 10000,
"oldPendingInterval": 3000,
"registeredInterval": 40000,
"newPendingAttempts": 20,
"oldPendingAttempts": 3
}
Для Новой в статусе Ожидание транзакции приложение проверяет каждые 10 секунд (newPendingInterval) до 20 попыток (newPendingAttempts), что даёт общий интервал около 200 секунд. Если узел обнаруживает транзакцию (даже с 0 подтверждений), она становится Зарегистрированной. Если после всех попыток транзакция остаётся невидимой, она помечается как Неудачно.
Для транзакций в статусе Зарегистрировано приложение проверяет каждые 40 секунд (registeredInterval) с неограниченным числом попыток, пока транзакция не будет подтверждена (≥1 подтверждение) или пока узел не вернёт ошибку.
Пользователь может вручную повторить проверку транзакции, нажав на значок статуса в чате, что сбросит её в статус Ожидание и запустит новый цикл проверки. Статусы транзакций не хранятся локально; при входе по паролю, PIN-коду или отпечатку пальца они проверяются заново с нуля.
Обнаружение несоответствий
Перевод помечается как Несоответствие, когда данные, записанные в сообщении ADAMANT, не совпадают с данными, полученными из блокчейна токена. Несоответствие фиксируется, если выполняется одно из следующих условий: сумма отличается более чем на ~0,1–0,5%, отличается адрес отправителя, отличается адрес получателя или временная метка сообщения и временная метка транзакции в блокчейне отличаются более чем на 3 часа.
Существуют два дополнительных особых случая. Если монета не поддерживается (например, xrp_transaction), приложение не может проверить перевод и отображает сообщение о том, что криптовалюта не поддерживается. Если обнаружен дубликат хеша транзакции — то есть тот же хеш TX уже встречался в загруженной транзакции — перевод помечается как Несоответствие, чтобы предотвратить ситуацию, при которой одна транзакция в блокчейне учитывается несколько раз в чате.
Причины несоответствия упорядочены по приоритету: неверный хеш транзакции, дублированная транзакция, несовпадение адреса отправителя, несовпадение адреса получателя, неверная сумма, невозможность получить адрес отправителя, невозможность получить адрес получателя, значительное расхождение по времени, общая ошибка проверки. Каждая причина включает предупреждение о мошенничестве, где это уместно.
Демонстрация интерфейса
Скриншоты ниже иллюстрируют прогресс статуса перевода в ADAMANT PWA и клиенте iOS.
DASH в чате PWA-dev v4.9.0 — 2025-03-04
| После подтверждения перевода (~10 сек) | Перевод отображается в чате как Ожидание | Детали перевода — Ожидание (~2 мин) |
|---|---|---|
![]() | ![]() | ![]() |
| Подтверждено без деталей (~5 сек) | Подтверждено с деталями — Окончательно | |
|---|---|---|
![]() | ![]() |
DASH в чате iOS v3.11.0 — 2025-03-04
| После подтверждения (~3 сек) | Перевод отображается в чате как Ожидание | Детали перевода — Ожидание (~2 мин) |
|---|---|---|
![]() | ![]() | ![]() |
| Подтверждено с деталями — Окончательно | ||
|---|---|---|
![]() |








