arrays.sol 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. enum Permission {
  2. Perm1, Perm2, Perm3, Perm4, Perm5, Perm6, Perm7, Perm8
  3. }
  4. /// This is a test contract which tests arrays
  5. contract arrays {
  6. uint64 user_count;
  7. struct user {
  8. string name;
  9. bytes32 addr;
  10. uint64 id;
  11. Permission[] perms;
  12. }
  13. // declare a sparse array. Sparse arrays are arrays which are too large to
  14. // fit into account data on Solana; this is not neccessarily a Solidity feature
  15. user[type(uint64).max] users;
  16. mapping (bytes32 => uint64) addressToUser;
  17. function addUser(uint64 id, bytes32 addr, string name, Permission[] perms) public {
  18. user storage u = users[id];
  19. u.name = name;
  20. u.addr = addr;
  21. u.id = id;
  22. u.perms = perms;
  23. addressToUser[addr] = id;
  24. assert(id <= users.length);
  25. }
  26. function getUserById(uint64 id) public view returns (user) {
  27. assert(users[id].id == id);
  28. return users[id];
  29. }
  30. function getUserByAddress(bytes32 addr) public view returns (user) {
  31. uint64 id = addressToUser[addr];
  32. assert(users[id].id == id);
  33. return users[id];
  34. }
  35. function userExists(uint64 id) public view returns (bool) {
  36. return users[id].id == id;
  37. }
  38. function removeUser(uint64 id) public {
  39. bytes32 addr = users[id].addr;
  40. delete users[id];
  41. delete addressToUser[addr];
  42. }
  43. function hasPermission(uint64 id, Permission p) public view returns (bool) {
  44. user storage u = users[id];
  45. assert(u.id == id);
  46. for (uint32 i = 0; i < u.perms.length; i++) {
  47. if (u.perms[i] == p) {
  48. return true;
  49. }
  50. }
  51. return false;
  52. }
  53. }