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