badges_actions.gno
2.99 Kb · 93 lines
1package memba_weighted_host
2
3import (
4 "chain"
5 "gno.land/p/samcrew/memba_weighted_policy"
6)
7
8const BadgesPath = "gno.land/r/samcrew/gnobuilders_badges_v2"
9
10type BadgesActionKind string
11
12const (
13 BadgesAcceptOwner BadgesActionKind = "accept-owner"
14 BadgesReturnOwner BadgesActionKind = "return-owner"
15 BadgesAbortReturn BadgesActionKind = "abort-return"
16 BadgesAddAdmin BadgesActionKind = "add-admin"
17 BadgesRemoveAdmin BadgesActionKind = "remove-admin"
18 BadgesUnpause BadgesActionKind = "unpause"
19)
20
21type BadgesPolicy struct{ dao, successor address }
22
23func NewBadgesPolicy(dao, successor address) BadgesPolicy {
24 if !dao.IsValid() || dao != chain.PackageAddress("gno.land/r/samcrew/memba_dao") {
25 panic("badges policy requires the founding DAO address")
26 }
27 if !successor.IsValid() || successor == dao || successor == chain.PackageAddress(BadgesPath) {
28 panic("badges policy requires a valid distinct successor")
29 }
30 return BadgesPolicy{dao: dao, successor: successor}
31}
32func (p BadgesPolicy) DAO() address { return p.dao }
33func (p BadgesPolicy) Successor() address { return p.successor }
34
35type BadgesAction struct {
36 kind BadgesActionKind
37 recipient address
38 subject address
39}
40
41func (p BadgesPolicy) Accept() BadgesAction { return BadgesAction{kind: BadgesAcceptOwner} }
42func (p BadgesPolicy) Return() BadgesAction {
43 return BadgesAction{kind: BadgesReturnOwner, recipient: p.successor}
44}
45func (p BadgesPolicy) AbortReturn() BadgesAction {
46 return BadgesAction{kind: BadgesAbortReturn, recipient: p.successor}
47}
48func (p BadgesPolicy) AddAdmin(who address) BadgesAction {
49 if who == p.dao || who == chain.PackageAddress(BadgesPath) {
50 panic("badges admin must be an external account")
51 }
52 a := BadgesAction{kind: BadgesAddAdmin, subject: who}
53 a.Bytes()
54 return a
55}
56func BadgesRevokeAdmin(who address) BadgesAction {
57 a := BadgesAction{kind: BadgesRemoveAdmin, subject: who}
58 a.Bytes()
59 return a
60}
61func BadgesResume() BadgesAction { return BadgesAction{kind: BadgesUnpause} }
62func (a BadgesAction) Kind() BadgesActionKind { return a.kind }
63func (a BadgesAction) Recipient() address { return a.recipient }
64func (a BadgesAction) Subject() address { return a.subject }
65func (a BadgesAction) Bytes() string {
66 base := "badges/v1|" + BadgesPath + "|" + string(a.kind)
67 switch a.kind {
68 case BadgesAcceptOwner, BadgesUnpause:
69 if a.recipient != "" || a.subject != "" {
70 panic("malformed badges action")
71 }
72 return base
73 case BadgesReturnOwner, BadgesAbortReturn:
74 if !a.recipient.IsValid() || a.subject != "" {
75 panic("malformed badges return action")
76 }
77 return base + "|" + string(a.recipient)
78 case BadgesAddAdmin, BadgesRemoveAdmin:
79 if !a.subject.IsValid() || a.recipient != "" {
80 panic("invalid badges admin action")
81 }
82 return base + "|" + string(a.subject)
83 default:
84 panic("unsupported badges action")
85 }
86}
87func (a BadgesAction) Category() memba_weighted_policy.Category {
88 a.Bytes()
89 if a.kind == BadgesUnpause {
90 return memba_weighted_policy.Financial
91 }
92 return memba_weighted_policy.Critical
93}