Search Apps Documentation Source Content File Folder Download Copy Actions Download State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

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}