Как обязать завершить временную выдачу актива в 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: каждая может снять обязательство.

Источники