Как закрыть Table в Sui, сохранив последний актив

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

Извлеките записи по известным ключам

В примере модуль владеет Table с ключами u64 и передаваемыми объектами-билетами. Предполагается, что ключ 23 — последняя запись. Извлеките значение и явно передайте его получателю с подтверждёнными полномочиями.

let ticket = table.remove(23u64);
transfer::public_transfer(ticket, recipient);
assert!(table.is_empty(), 0);
table.destroy_empty();

Проверьте счётчик перед закрытием

Если под ключом 29 остался второй билет, is_empty вернёт false и транзакция отменится. У Table есть длина, но нет итератора всех прикладных ключей. Ведите список ключей либо восстановите его по истории и сверьте количество. Крупную таблицу очищайте порциями до финального вызова закрытия.

Источники