Skip to content

Instantly share code, notes, and snippets.

@twfarland
Created December 17, 2021 01:32
Show Gist options
  • Save twfarland/55a4c6338a4e44b3ecbe87cee0d35432 to your computer and use it in GitHub Desktop.
Save twfarland/55a4c6338a4e44b3ecbe87cee0d35432 to your computer and use it in GitHub Desktop.
Role based access organisation smart contract
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
// RbacOrgManager (index of orgs, invites for self)
// RbacOrg
/**
* @title RbacOrg
* @dev Autonomous organisation with role based access
*/
enum Role { NONE, READER, EDITOR, ADMIN, OWNER }
struct Invitation {
address invitee;
address inviter;
Role role;
}
contract RbacOrg {
string public name;
string public description;
mapping(address => Invitation) internal invitations;
mapping(address => Role) internal members;
constructor(
string memory _name,
string memory _description
) {
name = _name;
description = _description;
members[msg.sender] = Role.OWNER;
}
function getMember(address member) public view returns (Role) {
return members[member];
}
function removeMember(address member) public {
Role senderRole = members[msg.sender];
assert(senderRole >= Role.ADMIN && senderRole >= members[member]);
delete members[member];
}
function updateMember(address member, Role role) public {
Role senderRole = members[msg.sender];
assert(senderRole >= Role.ADMIN && senderRole >= members[member] && senderRole >= role);
members[member] = role;
}
function invite(address invitee, Role role) public {
Role senderRole = members[msg.sender];
assert(senderRole >= Role.ADMIN && senderRole >= role);
invitations[invitee] = Invitation(invitee, msg.sender, role);
}
function rescindInvitation(address invitee) public {
Role senderRole = members[msg.sender];
assert(senderRole >= Role.ADMIN && senderRole >= invitations[invitee].role);
delete invitations[invitee];
}
function acceptInvitation() public {
Invitation memory invitation = invitations[msg.sender];
assert(invitation.invitee == msg.sender);
members[msg.sender] = invitation.role;
delete invitations[msg.sender];
}
function rejectInvitation() public {
Invitation memory invitation = invitations[msg.sender];
assert(invitation.invitee == msg.sender);
delete invitations[msg.sender];
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment