Как вычислить адрес производного объекта Sui до его создания

Сервис билетов может заранее сообщать адрес билета без отдельного реестра случайных ID. В Sui адрес выводится из родителя и типизированного ключа.

Используйте точный тип ключа из контракта

В модуле родительского объекта сравните расчёт с UID, который вернул claim. В примере у Ticket единственное поле — UID. Готовый билет нужно вернуть или передать по правилам приложения.

let predicted = sui::derived_object::derive_address(parent.id.to_inner(), 42u64);
let uid = sui::derived_object::claim(&mut parent.id, 42u64);
assert!(uid.to_address() == predicted, 0);
let ticket = Ticket { id: uid };

Считайте выдачу постоянным резервированием

Число 42 типа u64 отличается от UTF-8 строки «42». Для формирования ссылок сохраняйте ID родителя, тип и значение ключа. Удаление билета не снимает отметку родителя о выдаче. Повторный claim с тем же типизированным ключом завершается ошибкой. Для нового билета понадобится отдельный ключ.

Источники