Как задать точную границу срока получения актива в Sui
Таймер клиента может достичь нуля раньше, чем транзакция увидит подходящее сетевое время. Задайте условие выдачи в Move и проверьте границу в единицах системных часов.
Заимствуйте общий объект Clock
Общий системный Clock находится по адресу 0x6 и показывает миллисекунды. В пользовательской транзакции передавайте его как неизменяемую ссылку. Функция ниже открывает получение точно в указанный срок, включая равенство.
public fun can_claim(clock: &sui::clock::Clock, deadline_ms: u64): bool {
clock.timestamp_ms() >= deadline_ms
}
Проверьте моменты до, на и после границы
Для границы 5000 значения 4999, 5000 и 5001 дают false, true и true. Если интерфейс хранит секунды Unix, переведите их в миллисекунды ровно один раз. При разборе преждевременного отказа сравните сетевое время исполнения с дедлайном. Локальные часы устройства не определяют время, увиденное контрактом.