Как задать точную границу срока получения актива в 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, переведите их в миллисекунды ровно один раз. При разборе преждевременного отказа сравните сетевое время исполнения с дедлайном. Локальные часы устройства не определяют время, увиденное контрактом.

Источники