badges_adapter.gno
3.68 Kb · 72 lines
1// Fixed badges administration and authority return. Operational badge minting
2// remains with explicitly appointed admins; no arbitrary mint route is exposed.
3package memba_dao
4
5import (
6 "gno.land/p/samcrew/memba_weighted_host"
7 "gno.land/r/samcrew/gnobuilders_badges_v2"
8)
9
10func badgesState(a memba_weighted_host.BadgesAction) memba_weighted_host.BadgesState {
11 owner := gnobuilders_badges_v2.GetOwner()
12 subject := false
13 if a.Subject() != "" { subject = gnobuilders_badges_v2.IsAdmin(a.Subject()) }
14 return memba_weighted_host.BadgesState{
15 Owner: owner, PendingOwner: gnobuilders_badges_v2.GetPendingOwner(),
16 Paused: gnobuilders_badges_v2.IsPaused(), AdminCount: gnobuilders_badges_v2.GetAdminCount(),
17 OwnerAdmin: gnobuilders_badges_v2.IsAdmin(owner), DAOAdmin: gnobuilders_badges_v2.IsAdmin(badgesPolicy.DAO()),
18 SuccessorAdmin: gnobuilders_badges_v2.IsAdmin(badgesPolicy.Successor()), SubjectAdmin: subject,
19 }
20}
21func proposeBadges(cur realm, a memba_weighted_host.BadgesAction) uint64 { return host.ProposeBadges(a, badgesState(a), cur) }
22func ProposeBadgesAccept(cur realm) uint64 { return proposeBadges(cur, badgesPolicy.Accept()) }
23func ProposeBadgesReturn(cur realm) uint64 { return proposeBadges(cur, badgesPolicy.Return()) }
24func ProposeBadgesAbortReturn(cur realm) uint64 { return proposeBadges(cur, badgesPolicy.AbortReturn()) }
25func ProposeBadgesAddAdmin(cur realm, who address) uint64 { return proposeBadges(cur, badgesPolicy.AddAdmin(who)) }
26func ProposeBadgesRemoveAdmin(cur realm, who address) uint64 { return proposeBadges(cur, memba_weighted_host.BadgesRevokeAdmin(who)) }
27func ProposeBadgesUnpause(cur realm) uint64 { return proposeBadges(cur, memba_weighted_host.BadgesResume()) }
28func EmergencyPauseBadges(cur realm) {
29 a := memba_weighted_host.BadgesResume()
30 before := badgesState(a)
31 host.PrepareBadgesEmergencyPause(before, cur)
32 expected := before
33 expected.Paused = true
34 gnobuilders_badges_v2.Pause(cross(cur))
35 if badgesState(a) != expected { panic("badges pause postcondition mismatch") }
36}
37func executeBadges(cur realm, id uint64) {
38 proposed := host.Proposal(id).BadgesAction
39 before := badgesState(proposed)
40 a := host.ConsumeBadges(id, before, cur)
41 expected := before
42 switch a.Kind() {
43 case memba_weighted_host.BadgesAcceptOwner:
44 expected.Owner = badgesPolicy.DAO()
45 expected.PendingOwner = ""
46 expected.OwnerAdmin = true
47 expected.DAOAdmin = true
48 if !before.DAOAdmin { expected.AdminCount++ }
49 if before.OwnerAdmin { expected.AdminCount-- }
50 if before.Owner == badgesPolicy.Successor() { expected.SuccessorAdmin = false }
51 gnobuilders_badges_v2.AcceptOwnership(cross(cur))
52 case memba_weighted_host.BadgesReturnOwner:
53 expected.PendingOwner = a.Recipient()
54 gnobuilders_badges_v2.TransferOwnership(cross(cur), a.Recipient())
55 case memba_weighted_host.BadgesAbortReturn:
56 expected.PendingOwner = ""
57 gnobuilders_badges_v2.CancelOwnershipTransfer(cross(cur))
58 case memba_weighted_host.BadgesUnpause:
59 expected.Paused = false
60 gnobuilders_badges_v2.Unpause(cross(cur))
61 case memba_weighted_host.BadgesAddAdmin, memba_weighted_host.BadgesRemoveAdmin:
62 grant := a.Kind() == memba_weighted_host.BadgesAddAdmin
63 expected.SubjectAdmin = grant
64 if grant { expected.AdminCount++ } else { expected.AdminCount-- }
65 if a.Subject() == badgesPolicy.Successor() { expected.SuccessorAdmin = grant }
66 if grant { gnobuilders_badges_v2.AddAdmin(cross(cur), a.Subject()) } else { gnobuilders_badges_v2.RemoveAdmin(cross(cur), a.Subject()) }
67 default:
68 panic("unsupported badges action")
69 }
70 if badgesState(a) != expected { panic("badges postcondition mismatch") }
71 if a.Kind() == memba_weighted_host.BadgesAcceptOwner && gnobuilders_badges_v2.IsAdmin(before.Owner) { panic("badges previous owner admin retained") }
72}