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