Как ограничить административную возможность Sui одним пулом

Требование типа capability может защищать функцию, но ненамеренно разрешать изменение любого пула того же модуля. Привяжите выдаваемый объект полномочий к конкретной цели.

Сохраните ID пула при выдаче полномочий

При создании пула в определяющем модуле запишите в поле pool его object::id. Функция pause заимствует AdminCap и сравнивает сохранённый ID перед изменением общего Pool.

public struct AdminCap has key { id: UID, pool: ID }
public fun pause(cap: &AdminCap, pool: &mut Pool) {
    assert!(cap.pool == object::id(pool), 0);
    pool.paused = true;
}

Проверьте доступ к соседнему экземпляру

В тесте Move создайте пулы A и B. Попробуйте применить полномочия A к B и ожидайте ошибку. Затем примените их к A и проверьте paused. Проверьте также конструкторы и делегированную выдачу: сравнение при вызове полезно лишь при верной привязке в момент выдачи.

Источники