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