feed_adapter.gno
3.45 Kb · 69 lines
1// Fixed feed authority and moderator appointment. Content moderation stays
2// with the current owner or explicitly appointed moderators.
3package memba_dao
4
5import (
6 "gno.land/p/samcrew/memba_weighted_host"
7 "gno.land/r/samcrew/memba_feed_v1"
8)
9
10func feedState(a memba_weighted_host.FeedAction) memba_weighted_host.FeedState {
11 owner := memba_feed_v1.GetOwner()
12 subject := false
13 if a.Subject() != "" { subject = memba_feed_v1.IsModerator(a.Subject()) }
14 return memba_weighted_host.FeedState{
15 Owner: owner, PendingOwner: memba_feed_v1.GetPendingOwner(),
16 Paused: memba_feed_v1.IsPaused(), ModeratorCount: memba_feed_v1.GetModeratorCount(),
17 OwnerModerator: memba_feed_v1.IsModerator(owner), DAOModerator: memba_feed_v1.IsModerator(feedPolicy.DAO()),
18 SuccessorModerator: memba_feed_v1.IsModerator(feedPolicy.Successor()), SubjectModerator: subject,
19 }
20}
21func proposeFeed(cur realm, a memba_weighted_host.FeedAction) uint64 { return host.ProposeFeed(a, feedState(a), cur) }
22func ProposeFeedAccept(cur realm) uint64 { return proposeFeed(cur, feedPolicy.Accept()) }
23func ProposeFeedReturn(cur realm) uint64 { return proposeFeed(cur, feedPolicy.Return()) }
24func ProposeFeedAbortReturn(cur realm) uint64 { return proposeFeed(cur, feedPolicy.AbortReturn()) }
25func ProposeFeedAddModerator(cur realm, who address) uint64 { return proposeFeed(cur, feedPolicy.AddModerator(who)) }
26func ProposeFeedRemoveModerator(cur realm, who address) uint64 { return proposeFeed(cur, memba_weighted_host.FeedRevokeModerator(who)) }
27func ProposeFeedUnpause(cur realm) uint64 { return proposeFeed(cur, memba_weighted_host.FeedResume()) }
28func EmergencyPauseFeed(cur realm) {
29 a := memba_weighted_host.FeedResume()
30 before := feedState(a)
31 host.PrepareFeedEmergencyPause(before, cur)
32 expected := before
33 expected.Paused = true
34 memba_feed_v1.PauseRealm(cross(cur))
35 if feedState(a) != expected { panic("feed pause postcondition mismatch") }
36}
37func executeFeed(cur realm, id uint64) {
38 proposed := host.Proposal(id).FeedAction
39 before := feedState(proposed)
40 a := host.ConsumeFeed(id, before, cur)
41 expected := before
42 switch a.Kind() {
43 case memba_weighted_host.FeedAcceptOwner:
44 expected.Owner = feedPolicy.DAO()
45 expected.PendingOwner = ""
46 expected.OwnerModerator = before.DAOModerator
47 memba_feed_v1.AcceptOwnership(cross(cur))
48 case memba_weighted_host.FeedReturnOwner:
49 expected.PendingOwner = a.Recipient()
50 memba_feed_v1.TransferOwnership(cross(cur), a.Recipient())
51 case memba_weighted_host.FeedAbortReturn:
52 expected.PendingOwner = ""
53 memba_feed_v1.CancelOwnershipTransfer(cross(cur))
54 case memba_weighted_host.FeedUnpause:
55 expected.Paused = false
56 memba_feed_v1.UnpauseRealm(cross(cur))
57 case memba_weighted_host.FeedAddModerator, memba_weighted_host.FeedRemoveModerator:
58 grant := a.Kind() == memba_weighted_host.FeedAddModerator
59 expected.SubjectModerator = grant
60 if grant { expected.ModeratorCount++ } else { expected.ModeratorCount-- }
61 if a.Subject() == feedPolicy.Successor() { expected.SuccessorModerator = grant }
62 if a.Subject() == feedPolicy.DAO() { expected.DAOModerator = grant; expected.OwnerModerator = grant }
63 if grant { memba_feed_v1.AddModerator(cross(cur), a.Subject()) } else { memba_feed_v1.RemoveModerator(cross(cur), a.Subject()) }
64 default:
65 panic("unsupported feed action")
66 }
67 if feedState(a) != expected { panic("feed postcondition mismatch") }
68 if a.Kind() == memba_weighted_host.FeedAcceptOwner && memba_feed_v1.IsModerator(before.Owner) { panic("feed previous owner moderator retained") }
69}