Search Apps Documentation Source Content File Folder Download Copy Actions Download

public_lock.gno

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