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}