acl - [mainnet]
Access control list (acl) module. An acl is a list of account addresses who
have the access permission to a certain object.
This module uses a vector
to represent the list, but can be refactored to
use a “set” instead when it’s available in the language in the future.
use 0x1::error;use 0x1::vector;
Constants
The ACL already contains the address.
const ECONTAIN: u64 = 0;
The ACL does not contain the address.
const ENOT_CONTAIN: u64 = 1;
Structs
ACL
struct ACL has copy, drop, store
Fields
-
list: vector<address>
Functions
empty
Return an empty ACL.
public fun empty(): acl::ACL
Implementation
public fun empty(): ACL { ACL{ list: vector::empty<address>() }}
add
Add the address to the ACL.
public fun add(self: &mut acl::ACL, addr: address)
Implementation
public fun add(self: &mut ACL, addr: address) { assert!(!self.list.contains(&addr), error::invalid_argument(ECONTAIN)); self.list.push_back(addr);}
remove
Remove the address from the ACL.
public fun remove(self: &mut acl::ACL, addr: address)
Implementation
public fun remove(self: &mut ACL, addr: address) { let (found, index) = self.list.index_of(&addr); assert!(found, error::invalid_argument(ENOT_CONTAIN)); self.list.remove(index);}
contains
Return true iff the ACL contains the address.
public fun contains(self: &acl::ACL, addr: address): bool
Implementation
public fun contains(self: &ACL, addr: address): bool { self.list.contains(&addr)}
assert_contains
assert! that the ACL has the address.
public fun assert_contains(self: &acl::ACL, addr: address)
Implementation
public fun assert_contains(self: &ACL, addr: address) { assert!(self.contains(addr), error::invalid_argument(ENOT_CONTAIN));}
Specification
ACL
struct ACL has copy, drop, store
-
list: vector<address>
invariant forall i in 0..len(list), j in 0..len(list): list[i] == list[j] ==> i == j;
fun spec_contains(self: ACL, addr: address): bool { exists a in self.list: a == addr}
add
public fun add(self: &mut acl::ACL, addr: address)
aborts_if spec_contains(self, addr) with error::INVALID_ARGUMENT;ensures spec_contains(self, addr);
remove
public fun remove(self: &mut acl::ACL, addr: address)
aborts_if !spec_contains(self, addr) with error::INVALID_ARGUMENT;ensures !spec_contains(self, addr);
contains
public fun contains(self: &acl::ACL, addr: address): bool
ensures result == spec_contains(self, addr);
assert_contains
public fun assert_contains(self: &acl::ACL, addr: address)
aborts_if !spec_contains(self, addr) with error::INVALID_ARGUMENT;