From f6f48ba2066efcd2dd9c49aed138c7eac10c3a56 Mon Sep 17 00:00:00 2001 From: zoruka Date: Mon, 12 Dec 2022 12:31:53 -0300 Subject: [PATCH] refactor: add version for roles --- contracts/FleekAccessControl.sol | 50 +++++++++++++++++++++----------- contracts/FleekERC721.sol | 3 +- 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/contracts/FleekAccessControl.sol b/contracts/FleekAccessControl.sol index 3c904c6..72362a6 100644 --- a/contracts/FleekAccessControl.sol +++ b/contracts/FleekAccessControl.sol @@ -2,7 +2,11 @@ pragma solidity ^0.8.7; +import "@openzeppelin/contracts/utils/Counters.sol"; + abstract contract FleekAccessControl { + using Counters for Counters.Counter; + enum Roles { Owner, Controller @@ -13,11 +17,14 @@ abstract contract FleekAccessControl { address[] members; } - // _collectionRoles[role] - mapping(Roles => Role) private _collectionRoles; + Counters.Counter private _collectionRolesVersion; + // _collectionRoles[version][role] + mapping(uint256 => mapping(Roles => Role)) private _collectionRoles; - // _tokenRoles[tokenId][role] - mapping(uint256 => mapping(Roles => Role)) private _tokenRoles; + mapping(uint256 => Counters.Counter) private _tokenRolesVersion; + // _tokenRoles[tokenId][version][role] + mapping(uint256 => mapping(uint256 => mapping(Roles => Role))) + private _tokenRoles; constructor() { _grantCollectionRole(Roles.Owner, msg.sender); @@ -75,7 +82,9 @@ abstract contract FleekAccessControl { Roles role, address account ) public view returns (bool) { - return _collectionRoles[role].indexes[account] != 0; + uint256 currentVersion = _collectionRolesVersion.current(); + + return _collectionRoles[currentVersion][role].indexes[account] != 0; } function hasTokenRole( @@ -83,28 +92,33 @@ abstract contract FleekAccessControl { Roles role, address account ) 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( Roles role ) public view returns (address[] memory) { - return _collectionRoles[role].members; + uint256 currentVersion = _collectionRolesVersion.current(); + return _collectionRoles[currentVersion][role].members; } function getTokenRoleMembers( uint256 tokenId, Roles role ) 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 { - _grantRole(_collectionRoles[role], account); + uint256 currentVersion = _collectionRolesVersion.current(); + _grantRole(_collectionRoles[currentVersion][role], account); } function _revokeCollectionRole(Roles role, address account) internal { - _revokeRole(_collectionRoles[role], account); + uint256 currentVersion = _collectionRolesVersion.current(); + _revokeRole(_collectionRoles[currentVersion][role], account); } function _grantTokenRole( @@ -112,7 +126,8 @@ abstract contract FleekAccessControl { Roles role, address account ) internal { - _grantRole(_tokenRoles[tokenId][role], account); + uint256 currentVersion = _tokenRolesVersion[tokenId].current(); + _grantRole(_tokenRoles[tokenId][currentVersion][role], account); } function _revokeTokenRole( @@ -120,7 +135,8 @@ abstract contract FleekAccessControl { Roles role, address account ) 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 { @@ -144,12 +160,12 @@ abstract contract FleekAccessControl { } } - function _clearTokenRole(uint256 tokenId, Roles role) internal { - delete _tokenRoles[tokenId][role]; + function _clearAllTokenRoles(uint256 tokenId) internal { + _tokenRolesVersion[tokenId].increment(); } - function _clearAllTokenRoles(uint256 tokenId) internal { - delete _tokenRoles[tokenId][Roles.Owner]; - delete _tokenRoles[tokenId][Roles.Controller]; + function _clearAllTokenRoles(uint256 tokenId, address newOwner) internal { + _clearAllTokenRoles(tokenId); + _grantTokenRole(tokenId, Roles.Owner, newOwner); } } diff --git a/contracts/FleekERC721.sol b/contracts/FleekERC721.sol index 80057ab..1013a3b 100644 --- a/contracts/FleekERC721.sol +++ b/contracts/FleekERC721.sol @@ -127,8 +127,7 @@ contract FleekERC721 is ERC721, FleekAccessControl { ) internal virtual override { if (from != address(0) && to != address(0)) { // Transfer - _clearAllTokenRoles(tokenId); - _grantTokenRole(tokenId, Roles.Owner, to); + _clearAllTokenRoles(tokenId, to); } else if (from == address(0)) { // Mint _grantTokenRole(tokenId, Roles.Owner, to);