handover.gno
1.05 Kb · 50 lines
1package kourtv3
2func HandOver(cur realm, to address) {
3 if !cur.IsCurrent() {
4 panic(errStaleRealm)
5 }
6 if !to.IsValid() {
7 panic("kourtv3: not a valid address")
8 }
9 who := cur.Previous().Address()
10 d := ensureGlobalDAO()
11 if who != d.admin {
12 panic("kourtv3: only the global DAO admin hands over")
13 }
14 if to == who {
15 panic("kourtv3: hand over to a different address")
16 }
17 seatGlobalMember(d, to)
18 d.admin = to
19 if d.members.Has(who.String()) {
20 d.members.Remove(who.String())
21 d.n--
22 if d.purgeM > d.n {
23 d.purgeM = d.n
24 }
25 clearPendingOnMembershipChange(&d.pending)
26 }
27 directoryAdmin = to
28 courts.Iterate("", "", func(_ string, v any) bool {
29 c := v.(*Court)
30 if c.admin != who {
31 return false
32 }
33 c.admin = to
34 if cm := c.mod; cm != nil && !cm.creatorUnseated {
35 if cm.members.Has(who.String()) {
36 cm.members.Remove(who.String())
37 cm.n--
38 }
39 if !cm.members.Has(to.String()) {
40 cm.members.Set(to.String(), true)
41 cm.n++
42 }
43 if cm.m > cm.n {
44 cm.m = cm.n
45 }
46 clearPendingOnMembershipChange(&cm.pending)
47 }
48 return false
49 })
50}