RPC может вернуть подпись раньше подтверждения платежа. Перед новой отправкой необходимо установить состояние исходной транзакции.

Что подтверждает первоисточник

Документация sendTransaction различает принятие запроса RPC и подтверждение кластером. Метод возвращает первую подпись принятой транзакции; последующее состояние проверяют отдельно, в том числе через getSignatureStatuses. Solana RPC reference — sendTransaction ↗

Для обычной транзакции getLatestBlockhash возвращает blockhash вместе с lastValidBlockHeight. Эти значения относятся к одному контексту и должны храниться вместе. Solana RPC reference — getLatestBlockhash ↗

Что это меняет в анализе

Тайм-аут браузера не доказывает отсутствие платежа. Если исходная транзакция всё ещё может пройти, создание и подписание новой инструкции способно привести ко второму независимому переводу.

Повторная передача той же подписанной транзакции отличается от создания новой. Журнал должен фиксировать, какое действие произошло, вместо общей отметки «повтор».

Что проверить перед выводом

Руководство Solana рекомендует отслеживать высоту блока и последний допустимый блок. Истечение окна препятствует последующей обработке ещё не включённой транзакции, но не отменяет перевод, включённый раньше. Solana — Transaction Confirmation & Expiration ↗

Сохраняйте заказ, сеть, подпись, получателя, актив, сумму, blockhash и наблюдаемый результат. Durable-nonce транзакции имеют иной механизм действительности и требуют отдельного учёта. Solana — Transaction Confirmation & Expiration ↗