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

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}