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

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}