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

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}