feedback_adapter.gno
4.87 Kb · 83 lines
1// Fixed feedback authority and membership. Content moderation remains with the
2// current owner and appointed target admins; votes cannot call arbitrary code.
3package memba_dao
4
5import (
6 "gno.land/p/samcrew/memba_weighted_host"
7 feedback "gno.land/r/samcrew/memba_feedback_v2"
8)
9
10func feedbackState(a memba_weighted_host.FeedbackAction) memba_weighted_host.FeedbackState {
11 owner:=feedback.GetOwner()
12 subjectRoles:=""
13 if a.Subject()!="" { subjectRoles=feedback.GetMemberRoles(a.Subject()) }
14 s:=memba_weighted_host.FeedbackState{
15 Owner:owner, PendingOwner:feedback.GetPendingOwner(), Paused:feedback.IsPaused(),
16 MemberCount:feedback.GetMemberCount(), MembershipRevision:feedback.GetMembershipRevision(), OwnerRoles:feedback.GetMemberRoles(owner),
17 OwnerMember:feedback.IsMember(owner), DAOMember:feedback.IsMember(feedbackPolicy.DAO()),
18 SuccessorMember:feedback.IsMember(feedbackPolicy.Successor()),
19 SubjectMember:a.Subject()!="" && feedback.IsMember(a.Subject()),
20 DAORoles:feedback.GetMemberRoles(feedbackPolicy.DAO()),
21 SuccessorRoles:feedback.GetMemberRoles(feedbackPolicy.Successor()), SubjectRoles:subjectRoles,
22 }
23 s.ChannelCount,s.ChannelExists,s.ChannelDescription,s.ChannelType,s.ChannelReadRoles,s.ChannelWriteRoles=feedback.GetChannelState(a.Name())
24 return s
25}
26func proposeFeedback(cur realm,a memba_weighted_host.FeedbackAction) uint64 { return host.ProposeFeedback(a,feedbackState(a),cur) }
27func ProposeFeedbackAccept(cur realm) uint64 { return proposeFeedback(cur,feedbackPolicy.Accept()) }
28func ProposeFeedbackReturn(cur realm) uint64 { return proposeFeedback(cur,feedbackPolicy.Return()) }
29func ProposeFeedbackAbortReturn(cur realm) uint64 { return proposeFeedback(cur,feedbackPolicy.AbortReturn()) }
30func ProposeFeedbackAddMember(cur realm,who address,roles string) uint64 { return proposeFeedback(cur,feedbackPolicy.AddMember(who,roles)) }
31func ProposeFeedbackRemoveMember(cur realm,who address) uint64 { return proposeFeedback(cur,feedbackPolicy.RemoveMember(who)) }
32func ProposeFeedbackSetRoles(cur realm,who address,roles string) uint64 { return proposeFeedback(cur,feedbackPolicy.SetRoles(who,roles)) }
33func ProposeFeedbackCreateText(cur realm,name,description string) uint64 { return proposeFeedback(cur,feedbackPolicy.CreateText(name,description)) }
34func ProposeFeedbackUnpause(cur realm) uint64 { return proposeFeedback(cur,memba_weighted_host.FeedbackResume()) }
35func EmergencyPauseFeedback(cur realm) {
36 a:=memba_weighted_host.FeedbackResume()
37 before:=feedbackState(a)
38 host.PrepareFeedbackEmergencyPause(before,cur)
39 expected:=before; expected.Paused=true
40 feedback.PauseRealm(cross(cur))
41 if feedbackState(a)!=expected { panic("feedback pause postcondition mismatch") }
42}
43func executeFeedback(cur realm,id uint64) {
44 proposed:=host.Proposal(id).FeedbackAction
45 before:=feedbackState(proposed)
46 a:=host.ConsumeFeedback(id,before,cur)
47 expected:=before
48 switch a.Kind() {
49 case memba_weighted_host.FeedbackAcceptOwner:
50 expected.Owner=feedbackPolicy.DAO();expected.PendingOwner=""
51 expected.OwnerRoles="admin";expected.DAORoles="admin";expected.OwnerMember=true;expected.DAOMember=true
52 expected.MemberCount++;expected.MembershipRevision++
53 expected.SuccessorRoles="member";expected.SuccessorMember=true
54 feedback.AcceptOwnership(cross(cur))
55 case memba_weighted_host.FeedbackReturnOwner:
56 expected.PendingOwner=a.Recipient()
57 feedback.TransferOwnership(cross(cur),a.Recipient())
58 case memba_weighted_host.FeedbackAbortReturn:
59 expected.PendingOwner=""
60 feedback.CancelOwnershipTransfer(cross(cur))
61 case memba_weighted_host.FeedbackAddMember:
62 expected.MemberCount++;expected.MembershipRevision++;expected.SubjectRoles=a.Roles();expected.SubjectMember=true
63 feedback.AddMember(cross(cur),a.Subject(),a.Roles())
64 case memba_weighted_host.FeedbackRemoveMember:
65 expected.MemberCount--;expected.MembershipRevision++;expected.SubjectRoles="";expected.SubjectMember=false
66 if a.Subject()==feedbackPolicy.Successor() { expected.SuccessorRoles="";expected.SuccessorMember=false }
67 feedback.RemoveMember(cross(cur),a.Subject())
68 case memba_weighted_host.FeedbackSetRoles:
69 expected.MembershipRevision++;expected.SubjectRoles=a.Roles()
70 feedback.UpdateMemberRoles(cross(cur),a.Subject(),a.Roles())
71 case memba_weighted_host.FeedbackCreateText:
72 expected.ChannelCount++;expected.ChannelExists=true
73 expected.ChannelDescription=a.Description();expected.ChannelType="text"
74 expected.ChannelReadRoles="admin,dev,ops,member";expected.ChannelWriteRoles="admin,dev,ops,member"
75 feedback.CreateChannel(cross(cur),a.Name(),a.Description(),"text")
76 case memba_weighted_host.FeedbackUnpause:
77 expected.Paused=false
78 feedback.UnpauseRealm(cross(cur))
79 default: panic("unsupported feedback action")
80 }
81 if feedbackState(a)!=expected { panic("feedback postcondition mismatch") }
82 if a.Kind()==memba_weighted_host.FeedbackAcceptOwner && feedback.GetMemberRoles(before.Owner)!="member" { panic("feedback previous owner admin retained") }
83}