refactor: add version for roles
This commit is contained in:
parent
ee520dcc73
commit
f6f48ba206
|
|
@ -2,7 +2,11 @@
|
||||||
|
|
||||||
pragma solidity ^0.8.7;
|
pragma solidity ^0.8.7;
|
||||||
|
|
||||||
|
import "@openzeppelin/contracts/utils/Counters.sol";
|
||||||
|
|
||||||
abstract contract FleekAccessControl {
|
abstract contract FleekAccessControl {
|
||||||
|
using Counters for Counters.Counter;
|
||||||
|
|
||||||
enum Roles {
|
enum Roles {
|
||||||
Owner,
|
Owner,
|
||||||
Controller
|
Controller
|
||||||
|
|
@ -13,11 +17,14 @@ abstract contract FleekAccessControl {
|
||||||
address[] members;
|
address[] members;
|
||||||
}
|
}
|
||||||
|
|
||||||
// _collectionRoles[role]
|
Counters.Counter private _collectionRolesVersion;
|
||||||
mapping(Roles => Role) private _collectionRoles;
|
// _collectionRoles[version][role]
|
||||||
|
mapping(uint256 => mapping(Roles => Role)) private _collectionRoles;
|
||||||
|
|
||||||
// _tokenRoles[tokenId][role]
|
mapping(uint256 => Counters.Counter) private _tokenRolesVersion;
|
||||||
mapping(uint256 => mapping(Roles => Role)) private _tokenRoles;
|
// _tokenRoles[tokenId][version][role]
|
||||||
|
mapping(uint256 => mapping(uint256 => mapping(Roles => Role)))
|
||||||
|
private _tokenRoles;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
_grantCollectionRole(Roles.Owner, msg.sender);
|
_grantCollectionRole(Roles.Owner, msg.sender);
|
||||||
|
|
@ -75,7 +82,9 @@ abstract contract FleekAccessControl {
|
||||||
Roles role,
|
Roles role,
|
||||||
address account
|
address account
|
||||||
) public view returns (bool) {
|
) public view returns (bool) {
|
||||||
return _collectionRoles[role].indexes[account] != 0;
|
uint256 currentVersion = _collectionRolesVersion.current();
|
||||||
|
|
||||||
|
return _collectionRoles[currentVersion][role].indexes[account] != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
function hasTokenRole(
|
function hasTokenRole(
|
||||||
|
|
@ -83,28 +92,33 @@ abstract contract FleekAccessControl {
|
||||||
Roles role,
|
Roles role,
|
||||||
address account
|
address account
|
||||||
) public view returns (bool) {
|
) public view returns (bool) {
|
||||||
return _tokenRoles[tokenId][role].indexes[account] != 0;
|
uint256 currentVersion = _tokenRolesVersion[tokenId].current();
|
||||||
|
return _tokenRoles[tokenId][currentVersion][role].indexes[account] != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getCollectionRoleMembers(
|
function getCollectionRoleMembers(
|
||||||
Roles role
|
Roles role
|
||||||
) public view returns (address[] memory) {
|
) public view returns (address[] memory) {
|
||||||
return _collectionRoles[role].members;
|
uint256 currentVersion = _collectionRolesVersion.current();
|
||||||
|
return _collectionRoles[currentVersion][role].members;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getTokenRoleMembers(
|
function getTokenRoleMembers(
|
||||||
uint256 tokenId,
|
uint256 tokenId,
|
||||||
Roles role
|
Roles role
|
||||||
) public view returns (address[] memory) {
|
) public view returns (address[] memory) {
|
||||||
return _tokenRoles[tokenId][role].members;
|
uint256 currentVersion = _tokenRolesVersion[tokenId].current();
|
||||||
|
return _tokenRoles[tokenId][currentVersion][role].members;
|
||||||
}
|
}
|
||||||
|
|
||||||
function _grantCollectionRole(Roles role, address account) internal {
|
function _grantCollectionRole(Roles role, address account) internal {
|
||||||
_grantRole(_collectionRoles[role], account);
|
uint256 currentVersion = _collectionRolesVersion.current();
|
||||||
|
_grantRole(_collectionRoles[currentVersion][role], account);
|
||||||
}
|
}
|
||||||
|
|
||||||
function _revokeCollectionRole(Roles role, address account) internal {
|
function _revokeCollectionRole(Roles role, address account) internal {
|
||||||
_revokeRole(_collectionRoles[role], account);
|
uint256 currentVersion = _collectionRolesVersion.current();
|
||||||
|
_revokeRole(_collectionRoles[currentVersion][role], account);
|
||||||
}
|
}
|
||||||
|
|
||||||
function _grantTokenRole(
|
function _grantTokenRole(
|
||||||
|
|
@ -112,7 +126,8 @@ abstract contract FleekAccessControl {
|
||||||
Roles role,
|
Roles role,
|
||||||
address account
|
address account
|
||||||
) internal {
|
) internal {
|
||||||
_grantRole(_tokenRoles[tokenId][role], account);
|
uint256 currentVersion = _tokenRolesVersion[tokenId].current();
|
||||||
|
_grantRole(_tokenRoles[tokenId][currentVersion][role], account);
|
||||||
}
|
}
|
||||||
|
|
||||||
function _revokeTokenRole(
|
function _revokeTokenRole(
|
||||||
|
|
@ -120,7 +135,8 @@ abstract contract FleekAccessControl {
|
||||||
Roles role,
|
Roles role,
|
||||||
address account
|
address account
|
||||||
) internal {
|
) internal {
|
||||||
_revokeRole(_tokenRoles[tokenId][role], account);
|
uint256 currentVersion = _tokenRolesVersion[tokenId].current();
|
||||||
|
_revokeRole(_tokenRoles[tokenId][currentVersion][role], account);
|
||||||
}
|
}
|
||||||
|
|
||||||
function _grantRole(Role storage role, address account) internal {
|
function _grantRole(Role storage role, address account) internal {
|
||||||
|
|
@ -144,12 +160,12 @@ abstract contract FleekAccessControl {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function _clearTokenRole(uint256 tokenId, Roles role) internal {
|
function _clearAllTokenRoles(uint256 tokenId) internal {
|
||||||
delete _tokenRoles[tokenId][role];
|
_tokenRolesVersion[tokenId].increment();
|
||||||
}
|
}
|
||||||
|
|
||||||
function _clearAllTokenRoles(uint256 tokenId) internal {
|
function _clearAllTokenRoles(uint256 tokenId, address newOwner) internal {
|
||||||
delete _tokenRoles[tokenId][Roles.Owner];
|
_clearAllTokenRoles(tokenId);
|
||||||
delete _tokenRoles[tokenId][Roles.Controller];
|
_grantTokenRole(tokenId, Roles.Owner, newOwner);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -127,8 +127,7 @@ contract FleekERC721 is ERC721, FleekAccessControl {
|
||||||
) internal virtual override {
|
) internal virtual override {
|
||||||
if (from != address(0) && to != address(0)) {
|
if (from != address(0) && to != address(0)) {
|
||||||
// Transfer
|
// Transfer
|
||||||
_clearAllTokenRoles(tokenId);
|
_clearAllTokenRoles(tokenId, to);
|
||||||
_grantTokenRole(tokenId, Roles.Owner, to);
|
|
||||||
} else if (from == address(0)) {
|
} else if (from == address(0)) {
|
||||||
// Mint
|
// Mint
|
||||||
_grantTokenRole(tokenId, Roles.Owner, to);
|
_grantTokenRole(tokenId, Roles.Owner, to);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue