Skip to content Search Apps Documentation Source Content File Folder Download Copy Actions State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

state.gno

1.52 Kb · 73 lines
 1package staker
 2
 3import (
 4	"errors"
 5
 6	prbac "gno.land/p/gnoswap/rbac/v1"
 7	_ "gno.land/r/gnoswap/rbac/v1" // initialize readable contract role(s)
 8
 9	"gno.land/p/gnoswap/store/v1"
10	"gno.land/p/gnoswap/version_manager/v1"
11
12	"gno.land/r/gnoswap/access/v1"
13)
14
15const ErrSpoofedRealm = "rlm does not match the current crossing frame"
16
17var (
18	kvStore store.KVStore
19
20	versionManager version_manager.VersionManager
21	implementation IStaker
22)
23
24func init(cur realm) {
25	// Create a new KV store instance for this domain
26	kvStore = store.NewKVStore(cur.Address())
27	initRegisterWritableContract(cur)
28
29	// Initialize the initializers map to store implementation registration functions
30	versionManager = version_manager.NewVersionManager(
31		cur.PkgPath(),
32		kvStore,
33		initializeDomainStore,
34	)
35
36	implementation = nil
37}
38
39func initRegisterWritableContract(cur realm) {
40	poolAddr := access.MustGetAddress(prbac.ROLE_POOL.String())
41
42	if err := kvStore.AddAuthorizedCaller(0, cur, poolAddr, store.Write); err != nil {
43		panic(err)
44	}
45}
46
47func initializeDomainStore(_ int, rlm realm, kvStore store.KVStore) any {
48	return NewStakerStore(kvStore)
49}
50
51func getImplementation() IStaker {
52	if implementation == nil {
53		panic("implementation is not initialized")
54	}
55
56	return implementation
57}
58
59func updateImplementation() error {
60	result := versionManager.GetCurrentImplementation()
61	if result == nil {
62		return errors.New("implementation is not initialized")
63	}
64
65	impl, ok := result.(IStaker)
66	if !ok {
67		return errors.New("impl is not an IStaker")
68	}
69
70	implementation = impl
71
72	return nil
73}