RBAC and Ownable migration towards Roles (#1291)
* Role tests (#1228)
* Moved RBAC tests to access.
* Added Roles.addMany and tests.
* Fixed linter error.
* Now using uint256 indexes.
* Removed RBAC tokens (#1229)
* Deleted RBACCappedTokenMock.
* Removed RBACMintableToken.
* Removed RBACMintableToken from the MintedCrowdsale tests.
* Roles can now be transfered. (#1235)
* Roles can now be transfered.
* Now explicitly checking support for the null address.
* Now rejecting transfer to a role-haver.
* Added renounce, roles can no longer be transfered to 0.
* Fixed linter errors.
* Fixed a Roles test.
* True Ownership (#1247)
* Added barebones Secondary.
* Added transferPrimary
* Escrow is now Secondary instead of Ownable.
* Now reverting on transfers to 0.
* The Secondary's primary is now private.
* MintableToken using Roles (#1236)
* Minor test style improvements (#1219)
* Changed .eq to .equal
* Changed equal(bool) to .to.be.bool
* Changed be.bool to equal(bool), disallowed unused expressions.
* Add ERC165Query library (#1086)
* Add ERC165Query library
* Address PR Comments
* Add tests and mocks from #1024 and refactor code slightly
* Fix javascript and solidity linting errors
* Split supportsInterface into three methods as discussed in #1086
* Change InterfaceId_ERC165 comment to match style in the rest of the repo
* Fix max-len lint issue on ERC165Checker.sol
* Conditionally ignore the asserts during solidity-coverage test
* Switch to abi.encodeWithSelector and add test for account addresses
* Switch to supportsInterfaces API as suggested by @frangio
* Adding ERC165InterfacesSupported.sol
* Fix style issues
* Add test for supportsInterfaces returning false
* Add ERC165Checker.sol newline
* feat: fix coverage implementation
* fix: solidity linting error
* fix: revert to using boolean tests instead of require statements
* fix: make supportsERC165Interface private again
* rename SupportsInterfaceWithLookupMock to avoid name clashing
* Added mint and burn tests for zero amounts. (#1230)
* Changed .eq to .equal. (#1231)
* ERC721 pausable token (#1154)
* ERC721 pausable token
* Reuse of ERC721 Basic behavior for Pausable, split view checks in paused state & style fixes
* [~] paused token behavior
* Add some detail to releasing steps (#1190)
* add note about pulling upstream changes to release branch
* add comment about upstream changes in merging section
* Increase test coverage (#1237)
* Fixed a SplitPayment test
* Deleted unnecessary function.
* Improved PostDeliveryCrowdsale tests.
* Improved RefundableCrowdsale tests.
* Improved MintedCrowdsale tests.
* Improved IncreasingPriceCrowdsale tests.
* Fixed a CappedCrowdsale test.
* Improved TimedCrowdsale tests.
* Improved descriptions of added tests.
* ci: trigger docs update on tag (#1186)
* MintableToken now uses Roles.
* Fixed FinalizableCrowdsale test.
* Roles can now be transfered.
* Fixed tests related to MintableToken.
* Removed Roles.check.
* Renamed transferMintPermission.
* Moved MinterRole
* Fixed RBAC.
* Adressed review comments.
* Addressed review comments
* Fixed linter errors.
* Added Events tests of Pausable contract (#1207)
* Fixed roles tests.
* Rename events to past-tense (#1181)
* fix: refactor sign.js and related tests (#1243)
* fix: refactor sign.js and related tests
* fix: remove unused dep
* fix: update package.json correctly
* Added "_" sufix to internal variables (#1171)
* Added PublicRole test.
* Fixed crowdsale tests.
* Rename ERC interfaces to I prefix (#1252)
* rename ERC20 to IERC20
* move ERC20.sol to IERC20.sol
* rename StandardToken to ERC20
* rename StandardTokenMock to ERC20Mock
* move StandardToken.sol to ERC20.sol, likewise test and mock files
* rename MintableToken to ERC20Mintable
* move MintableToken.sol to ERC20Mintable.sol, likewise test and mock files
* rename BurnableToken to ERC20Burnable
* move BurnableToken.sol to ERC20Burnable.sol, likewise for related files
* rename CappedToken to ERC20Capped
* move CappedToken.sol to ERC20Capped.sol, likewise for related files
* rename PausableToken to ERC20Pausable
* move PausableToken.sol to ERC20Pausable.sol, likewise for related files
* rename DetailedERC20 to ERC20Detailed
* move DetailedERC20.sol to ERC20Detailed.sol, likewise for related files
* rename ERC721 to IERC721, and likewise for other related interfaces
* move ERC721.sol to IERC721.sol, likewise for other 721 interfaces
* rename ERC721Token to ERC721
* move ERC721Token.sol to ERC721.sol, likewise for related files
* rename ERC721BasicToken to ERC721Basic
* move ERC721BasicToken.sol to ERC721Basic.sol, likewise for related files
* rename ERC721PausableToken to ERC721Pausable
* move ERC721PausableToken.sol to ERC721Pausable.sol
* rename ERC165 to IERC165
* move ERC165.sol to IERC165.sol
* amend comment that ERC20 is based on FirstBlood
* fix comments mentioning IERC721Receiver
* added explicit visibility (#1261)
* Remove underscores from event parameters. (#1258)
* Remove underscores from event parameters.
Fixes #1175
* Add comment about ERC
* Move contracts to subdirectories (#1253)
* Move contracts to subdirectories
Fixes #1177.
This Change also removes the LimitBalance contract.
* fix import
* move MerkleProof to cryptography
* Fix import
* Remove HasNoEther, HasNoTokens, HasNoContracts, and NoOwner (#1254)
* remove HasNoEther, HasNoTokens, HasNoContracts, and NoOwner
* remove unused ERC223TokenMock
* remove Contactable
* remove TokenDestructible
* remove DeprecatedERC721
* inline Destructible#destroy in Bounty
* remove Destructible
* Functions in interfaces changed to "external" (#1263)
* Add a leading underscore to internal and private functions. (#1257)
* Add a leading underscore to internal and private functions.
Fixes #1176
* Remove super
* update the ERC721 changes
* add missing underscore after merge
* Fix mock
* Improve encapsulation on SignatureBouncer, Whitelist and RBAC example (#1265)
* Improve encapsulation on Whitelist
* remove only
* update whitelisted crowdsale test
* Improve encapsulation on SignatureBouncer
* fix missing test
* Improve encapsulation on RBAC example
* Improve encapsulation on RBAC example
* Remove extra visibility
* Improve encapsulation on ERC20 Mintable
* Improve encapsulation on Superuser
* fix lint
* add missing constant
* Addressed review comments.
* Fixed build error.
* Improved Roles API. (#1280)
* Improved Roles API.
* fix linter error
* Added PauserRole. (#1283)
* Remove Claimable, DelayedClaimable, Heritable (#1274)
* remove Claimable, DelayedClaimable, Heritable
* remove SimpleSavingsWallet example which used Heritable
(cherry picked from commit 0dc711732a)
* Role behavior tests (#1285)
* Added role tests.
* Added PauserRole tests to contracts that have that role.
* Added MinterRole tests to contracts that have that role.
* Fixed linter errors.
* Migrate Ownable to Roles (#1287)
* Added CapperRole.
* RefundEscrow is now Secondary.
* FinalizableCrowdsale is no longer Ownable.
* Removed Whitelist and WhitelistedCrowdsale, redesign needed.
* Fixed linter errors, disabled lbrace due to it being buggy.
* Remove RBAC, SignatureBouncer refactor (#1289)
* Added CapperRole.
* RefundEscrow is now Secondary.
* FinalizableCrowdsale is no longer Ownable.
* Removed Whitelist and WhitelistedCrowdsale, redesign needed.
* Fixed linter errors, disabled lbrace due to it being buggy.
* Moved SignatureBouncer tests.
* Deleted RBAC and Superuser.
* Deleted rbac directory.
* Updated readme.
* SignatureBouncer now uses SignerRole, renamed bouncer to signer.
* feat: implement ERC721Mintable and ERC721Burnable (#1276)
* feat: implement ERC721Mintable and ERC721Burnable
* fix: linting errors
* fix: remove unused mintable mock for ERC721BasicMock
* fix: add finishMinting tests
* fix: catch MintFinished typo
* inline ERC721Full behavior
* undo pretty formatting
* fix lint errors
* rename canMint to onlyBeforeMintingFinished for consistency with ERC20Mintable
* Fix the merge with the privatization branch
* remove duplicate CapperRole test
This commit is contained in:
@ -3,9 +3,7 @@ pragma solidity ^0.4.24;
|
||||
|
||||
/**
|
||||
* @title Roles
|
||||
* @author Francisco Giordano (@frangio)
|
||||
* @dev Library for managing addresses assigned to a Role.
|
||||
* See RBAC.sol for example usage.
|
||||
*/
|
||||
library Roles {
|
||||
struct Role {
|
||||
@ -15,32 +13,17 @@ library Roles {
|
||||
/**
|
||||
* @dev give an account access to this role
|
||||
*/
|
||||
function add(Role storage _role, address _account)
|
||||
internal
|
||||
{
|
||||
function add(Role storage _role, address _account) internal {
|
||||
_role.bearer[_account] = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev remove an account's access to this role
|
||||
*/
|
||||
function remove(Role storage _role, address _account)
|
||||
internal
|
||||
{
|
||||
function remove(Role storage _role, address _account) internal {
|
||||
_role.bearer[_account] = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev check if an account has this role
|
||||
* // reverts
|
||||
*/
|
||||
function check(Role storage _role, address _account)
|
||||
internal
|
||||
view
|
||||
{
|
||||
require(has(_role, _account));
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev check if an account has this role
|
||||
* @return bool
|
||||
@ -1,94 +0,0 @@
|
||||
pragma solidity ^0.4.24;
|
||||
|
||||
|
||||
import "../ownership/Ownable.sol";
|
||||
import "../access/rbac/RBAC.sol";
|
||||
|
||||
|
||||
/**
|
||||
* @title Whitelist
|
||||
* @dev The Whitelist contract has a whitelist of addresses, and provides basic authorization control functions.
|
||||
* This simplifies the implementation of "user permissions".
|
||||
*/
|
||||
contract Whitelist is Ownable, RBAC {
|
||||
|
||||
// Name of the whitelisted role.
|
||||
string private constant ROLE_WHITELISTED = "whitelist";
|
||||
|
||||
/**
|
||||
* @dev Throws if operator is not whitelisted.
|
||||
* @param _operator address
|
||||
*/
|
||||
modifier onlyIfWhitelisted(address _operator) {
|
||||
checkRole(_operator, ROLE_WHITELISTED);
|
||||
_;
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev add an address to the whitelist
|
||||
* @param _operator address
|
||||
* @return true if the address was added to the whitelist, false if the address was already in the whitelist
|
||||
*/
|
||||
function addAddressToWhitelist(address _operator)
|
||||
public
|
||||
onlyOwner
|
||||
{
|
||||
_addRole(_operator, ROLE_WHITELISTED);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Determine if an account is whitelisted.
|
||||
* @return true if the account is whitelisted, false otherwise.
|
||||
*/
|
||||
function isWhitelisted(address _operator)
|
||||
public
|
||||
view
|
||||
returns (bool)
|
||||
{
|
||||
return hasRole(_operator, ROLE_WHITELISTED);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev add addresses to the whitelist
|
||||
* @param _operators addresses
|
||||
* @return true if at least one address was added to the whitelist,
|
||||
* false if all addresses were already in the whitelist
|
||||
*/
|
||||
function addAddressesToWhitelist(address[] _operators)
|
||||
public
|
||||
onlyOwner
|
||||
{
|
||||
for (uint256 i = 0; i < _operators.length; i++) {
|
||||
addAddressToWhitelist(_operators[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev remove an address from the whitelist
|
||||
* @param _operator address
|
||||
* @return true if the address was removed from the whitelist,
|
||||
* false if the address wasn't in the whitelist in the first place
|
||||
*/
|
||||
function removeAddressFromWhitelist(address _operator)
|
||||
public
|
||||
onlyOwner
|
||||
{
|
||||
_removeRole(_operator, ROLE_WHITELISTED);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev remove addresses from the whitelist
|
||||
* @param _operators addresses
|
||||
* @return true if at least one address was removed from the whitelist,
|
||||
* false if all addresses weren't in the whitelist in the first place
|
||||
*/
|
||||
function removeAddressesFromWhitelist(address[] _operators)
|
||||
public
|
||||
onlyOwner
|
||||
{
|
||||
for (uint256 i = 0; i < _operators.length; i++) {
|
||||
removeAddressFromWhitelist(_operators[i]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,106 +0,0 @@
|
||||
pragma solidity ^0.4.24;
|
||||
|
||||
import "./Roles.sol";
|
||||
|
||||
|
||||
/**
|
||||
* @title RBAC (Role-Based Access Control)
|
||||
* @author Matt Condon (@Shrugs)
|
||||
* @dev Stores and provides setters and getters for roles and addresses.
|
||||
* Supports unlimited numbers of roles and addresses.
|
||||
* See //contracts/mocks/RBACMock.sol for an example of usage.
|
||||
* This RBAC method uses strings to key roles. It may be beneficial
|
||||
* for you to write your own implementation of this interface using Enums or similar.
|
||||
*/
|
||||
contract RBAC {
|
||||
using Roles for Roles.Role;
|
||||
|
||||
mapping (string => Roles.Role) private roles;
|
||||
|
||||
event RoleAdded(address indexed operator, string role);
|
||||
event RoleRemoved(address indexed operator, string role);
|
||||
|
||||
/**
|
||||
* @dev reverts if addr does not have role
|
||||
* @param _operator address
|
||||
* @param _role the name of the role
|
||||
* // reverts
|
||||
*/
|
||||
function checkRole(address _operator, string _role)
|
||||
public
|
||||
view
|
||||
{
|
||||
roles[_role].check(_operator);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev determine if addr has role
|
||||
* @param _operator address
|
||||
* @param _role the name of the role
|
||||
* @return bool
|
||||
*/
|
||||
function hasRole(address _operator, string _role)
|
||||
public
|
||||
view
|
||||
returns (bool)
|
||||
{
|
||||
return roles[_role].has(_operator);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev add a role to an address
|
||||
* @param _operator address
|
||||
* @param _role the name of the role
|
||||
*/
|
||||
function _addRole(address _operator, string _role)
|
||||
internal
|
||||
{
|
||||
roles[_role].add(_operator);
|
||||
emit RoleAdded(_operator, _role);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev remove a role from an address
|
||||
* @param _operator address
|
||||
* @param _role the name of the role
|
||||
*/
|
||||
function _removeRole(address _operator, string _role)
|
||||
internal
|
||||
{
|
||||
roles[_role].remove(_operator);
|
||||
emit RoleRemoved(_operator, _role);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev modifier to scope access to a single role (uses msg.sender as addr)
|
||||
* @param _role the name of the role
|
||||
* // reverts
|
||||
*/
|
||||
modifier onlyRole(string _role)
|
||||
{
|
||||
checkRole(msg.sender, _role);
|
||||
_;
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev modifier to scope access to a set of roles (uses msg.sender as addr)
|
||||
* @param _roles the names of the roles to scope access to
|
||||
* // reverts
|
||||
*
|
||||
* @TODO - when solidity supports dynamic arrays as arguments to modifiers, provide this
|
||||
* see: https://github.com/ethereum/solidity/issues/2467
|
||||
*/
|
||||
// modifier onlyRoles(string[] _roles) {
|
||||
// bool hasAnyRole = false;
|
||||
// for (uint8 i = 0; i < _roles.length; i++) {
|
||||
// if (hasRole(msg.sender, _roles[i])) {
|
||||
// hasAnyRole = true;
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
|
||||
// require(hasAnyRole);
|
||||
|
||||
// _;
|
||||
// }
|
||||
}
|
||||
35
contracts/access/roles/CapperRole.sol
Normal file
35
contracts/access/roles/CapperRole.sol
Normal file
@ -0,0 +1,35 @@
|
||||
pragma solidity ^0.4.24;
|
||||
|
||||
import "../Roles.sol";
|
||||
|
||||
|
||||
contract CapperRole {
|
||||
using Roles for Roles.Role;
|
||||
|
||||
Roles.Role private cappers;
|
||||
|
||||
constructor() public {
|
||||
cappers.add(msg.sender);
|
||||
}
|
||||
|
||||
modifier onlyCapper() {
|
||||
require(isCapper(msg.sender));
|
||||
_;
|
||||
}
|
||||
|
||||
function isCapper(address _account) public view returns (bool) {
|
||||
return cappers.has(_account);
|
||||
}
|
||||
|
||||
function addCapper(address _account) public onlyCapper {
|
||||
cappers.add(_account);
|
||||
}
|
||||
|
||||
function renounceCapper() public {
|
||||
cappers.remove(msg.sender);
|
||||
}
|
||||
|
||||
function _removeCapper(address _account) internal {
|
||||
cappers.remove(_account);
|
||||
}
|
||||
}
|
||||
35
contracts/access/roles/MinterRole.sol
Normal file
35
contracts/access/roles/MinterRole.sol
Normal file
@ -0,0 +1,35 @@
|
||||
pragma solidity ^0.4.24;
|
||||
|
||||
import "../Roles.sol";
|
||||
|
||||
|
||||
contract MinterRole {
|
||||
using Roles for Roles.Role;
|
||||
|
||||
Roles.Role private minters;
|
||||
|
||||
constructor() public {
|
||||
minters.add(msg.sender);
|
||||
}
|
||||
|
||||
modifier onlyMinter() {
|
||||
require(isMinter(msg.sender));
|
||||
_;
|
||||
}
|
||||
|
||||
function isMinter(address _account) public view returns (bool) {
|
||||
return minters.has(_account);
|
||||
}
|
||||
|
||||
function addMinter(address _account) public onlyMinter {
|
||||
minters.add(_account);
|
||||
}
|
||||
|
||||
function renounceMinter() public {
|
||||
minters.remove(msg.sender);
|
||||
}
|
||||
|
||||
function _removeMinter(address _account) internal {
|
||||
minters.remove(_account);
|
||||
}
|
||||
}
|
||||
35
contracts/access/roles/PauserRole.sol
Normal file
35
contracts/access/roles/PauserRole.sol
Normal file
@ -0,0 +1,35 @@
|
||||
pragma solidity ^0.4.24;
|
||||
|
||||
import "../Roles.sol";
|
||||
|
||||
|
||||
contract PauserRole {
|
||||
using Roles for Roles.Role;
|
||||
|
||||
Roles.Role private pausers;
|
||||
|
||||
constructor() public {
|
||||
pausers.add(msg.sender);
|
||||
}
|
||||
|
||||
modifier onlyPauser() {
|
||||
require(isPauser(msg.sender));
|
||||
_;
|
||||
}
|
||||
|
||||
function isPauser(address _account) public view returns (bool) {
|
||||
return pausers.has(_account);
|
||||
}
|
||||
|
||||
function addPauser(address _account) public onlyPauser {
|
||||
pausers.add(_account);
|
||||
}
|
||||
|
||||
function renouncePauser() public {
|
||||
pausers.remove(msg.sender);
|
||||
}
|
||||
|
||||
function _removePauser(address _account) internal {
|
||||
pausers.remove(_account);
|
||||
}
|
||||
}
|
||||
35
contracts/access/roles/SignerRole.sol
Normal file
35
contracts/access/roles/SignerRole.sol
Normal file
@ -0,0 +1,35 @@
|
||||
pragma solidity ^0.4.24;
|
||||
|
||||
import "../Roles.sol";
|
||||
|
||||
|
||||
contract SignerRole {
|
||||
using Roles for Roles.Role;
|
||||
|
||||
Roles.Role private signers;
|
||||
|
||||
constructor() public {
|
||||
signers.add(msg.sender);
|
||||
}
|
||||
|
||||
modifier onlySigner() {
|
||||
require(isSigner(msg.sender));
|
||||
_;
|
||||
}
|
||||
|
||||
function isSigner(address _account) public view returns (bool) {
|
||||
return signers.has(_account);
|
||||
}
|
||||
|
||||
function addSigner(address _account) public onlySigner {
|
||||
signers.add(_account);
|
||||
}
|
||||
|
||||
function renounceSigner() public {
|
||||
signers.remove(msg.sender);
|
||||
}
|
||||
|
||||
function _removeSigner(address _account) internal {
|
||||
signers.remove(_account);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user