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}