admin.gno
1.80 Kb ยท 74 lines
1package users
2
3import (
4 "std"
5
6 "gno.land/p/moul/addrset"
7 "gno.land/r/gov/dao"
8)
9
10const gusersv1 = "gno.land/r/gnoland/users/v1" // preregistered with store write perms
11
12var controllers = addrset.Set{} // caller whitelist
13
14func init() {
15 controllers.Add(std.DerivePkgAddr(gusersv1)) // initially whitelisted
16}
17
18// ProposeNewController allows GovDAO to add a whitelisted caller
19func ProposeNewController(addr std.Address) dao.ProposalRequest {
20 cb := func() error {
21 return addToWhitelist(addr)
22 }
23
24 return dao.NewProposalRequest("Add a new whitelisted caller at sys/users realm", "", dao.NewSimpleExecutor(cb, ""))
25}
26
27// ProposeControllerRemoval allows GovDAO to add a whitelisted caller
28func ProposeControllerRemoval(addr std.Address) dao.ProposalRequest {
29 cb := func() error {
30 return deleteFromwhitelist(addr)
31 }
32
33 return dao.NewProposalRequest("Remove a whitelisted caller from sys/users realm", "", dao.NewSimpleExecutor(cb, ""))
34}
35
36// ProposeControllerAdditionAndRemoval allows GovDAO to add a new caller and remove an old caller in the same proposal.
37func ProposeControllerAdditionAndRemoval(toAdd, toRemove std.Address) dao.ProposalRequest {
38 cb := func() error {
39 err := addToWhitelist(toAdd)
40 if err != nil {
41 return err
42 }
43
44 return deleteFromwhitelist(toRemove)
45 }
46
47 return dao.NewProposalRequest("Add and Remove whitelisted caller from sys/users realm", "", dao.NewSimpleExecutor(cb, ""))
48}
49
50// Helpers
51
52func deleteFromwhitelist(addr std.Address) error {
53 if !controllers.Has(addr) {
54 return ErrNotWhitelisted
55 }
56
57 if ok := controllers.Remove(addr); !ok {
58 panic("failed to remove address from whitelist")
59 }
60
61 return nil
62}
63
64func addToWhitelist(newCaller std.Address) error {
65 if !newCaller.IsValid() {
66 return ErrInvalidAddress
67 }
68
69 if !controllers.Add(newCaller) {
70 return ErrAlreadyWhitelisted
71 }
72
73 return nil
74}