Как обязать завершить временную выдачу актива в Sui
Модуль может выдать вместе с временно извлечённым активом квитанцию без способностей. Транзакция завершится, только если вызывающий использует квитанцию допустимым способом.
Свяжите квитанцию с хранилищем и обязательством
Пример показывает только проверки идентичности и суммы. В функции реального погашения выводите paid из фактически возвращённого актива. Если переданное пользователем число не связано с депозитом, даже линейная квитанция не обеспечит возврат.
public struct BorrowReceipt { vault: ID, due: u64 }
public fun finish(receipt: BorrowReceipt, vault: &Vault, paid: u64) {
let BorrowReceipt { vault: expected, due } = receipt;
assert!(expected == object::id(vault) && paid == due, 0);
}
Проверьте все пути погашения квитанции
Квитанция хранилища A на 50 единиц должна отклоняться хранилищем B и при депозите 49. Пропуск finish оставляет значение без возможности drop и срывает завершение транзакции. Проверьте каждую функцию определяющего модуля, которая разбирает BorrowReceipt: каждая может снять обязательство.