Search Apps Documentation Source Content File Folder Download Copy Actions Download

public_lock.gno

1.72 Kb ยท 63 lines
 1package boards2
 2
 3import (
 4	"chain"
 5	"chain/runtime"
 6	"strconv"
 7
 8	"gno.land/p/gnoland/boards"
 9
10	"gno.land/r/gnoland/boards2/v1/permissions"
11)
12
13// LockRealm locks the realm making it readonly.
14//
15// WARNING: Realm can't be unlocked once locked.
16//
17// Realm can also be locked without locking realm members.
18// Realm members can be locked when locking the realm or afterwards.
19// This is relevant for two reasons, one so members can be modified after lock.
20// The other is for realm owners, which can delete threads and comments after lock.
21func LockRealm(_ realm, lockRealmMembers bool) {
22	assertRealmMembersAreNotLocked()
23
24	// If realm members are not being locked assert that realm is no locked.
25	// Members can be locked after locking the realm, in a second `LockRealm` call.
26	if !lockRealmMembers {
27		assertRealmIsNotLocked()
28	}
29
30	caller := runtime.PreviousRealm().Address()
31	gPerms.WithPermission(cross, caller, permissions.PermissionRealmLock, boards.Args{}, func(realm) {
32		gLocked.realm = true
33		gLocked.realmMembers = lockRealmMembers
34
35		chain.Emit(
36			"RealmLocked",
37			"caller", caller.String(),
38			"lockRealmMembers", strconv.FormatBool(lockRealmMembers),
39		)
40	})
41}
42
43// IsRealmLocked checks if boards realm has been locked.
44func IsRealmLocked() bool {
45	return gLocked.realm
46}
47
48// AreRealmMembersLocked checks if realm members has been locked.
49func AreRealmMembersLocked() bool {
50	return gLocked.realmMembers
51}
52
53func assertRealmIsNotLocked() { // TODO: Add filtests for locked realm case to all public functions
54	if gLocked.realm {
55		panic("realm is locked")
56	}
57}
58
59func assertRealmMembersAreNotLocked() { // TODO: Add filtests for locked members case to all public member functions
60	if gLocked.realmMembers {
61		panic("realm and members are locked")
62	}
63}