Можно заложить такой функционал в смарт-контракт.
Например можно сделать пару функций типа grantAccess, revokeAccess, которые будут разрешать какому то кошельку (адресу) доступ к смарт контракту или отзывать разрешенный доступ.
В этих функциях сделать проверку, чтобы их мог вызывать только владелец кошелька или как вы решите.
А во всех остальных функциях смарт-контракта делать проверку выдавался ли ранее доступ или нет.
Примерная реализация:
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract ACL {
// тут храним кошельки, которые могут выдавать/отзывать полномочия админа.
mapping (address => bool) public admins;
// тут те, кому разрешен доступ
mapping (address => bool) public accessGranted;
constructor() {
// наделяем полномочиями админа того, кто деплоил контракт чтобы он потом мог выдать полномочия кому-то еще.
admins[msg.sender] = true;
}
function grantAdmin(address to) public {
require(admins[msg.sender] == true, "Forbidden");
admins[to] = true;
}
function revokeAdmin(address to) public {
require(admins[msg.sender] == true, "Forbidden");
delete admins[to];
}
function grantAccess(address to) public {
require(admins[msg.sender] == true, "Forbidden");
accessGranted[to] = true;
}
function revokeAccess(address to) public {
require(admins[msg.sender] == true, "Forbidden");
delete accessGranted[to];
}
// эта функция доступна всем
function publicOK() public pure returns (string memory) {
return "public OK";
}
// эта доступна только тем, кому был предоставлен доступ
function protectedOK() public view returns (string memory) {
require(accessGranted[msg.sender] == true, "Forbidden");
return "protected OK";
}
}