delegation_manager.gno
2.25 Kb ยท 71 lines
1package staker
2
3import (
4 "gno.land/p/nt/avl"
5)
6
7// DelegationManager manages the mapping between users and their delegation IDs.
8// It provides efficient lookup and management of user delegations organized by delegator and delegatee addresses.
9type DelegationManager struct {
10 // userDelegations maps delegator address -> *avl.Tree (delegatee address -> list of delegation IDs)
11 // Using AVL tree instead of map to handle unbounded growth of delegators efficiently
12 userDelegations *avl.Tree
13}
14
15// NewDelegationManager creates a new instance of DelegationManager.
16// This factory function initializes the AVL tree structure for tracking user delegations.
17func NewDelegationManager() *DelegationManager {
18 return &DelegationManager{
19 userDelegations: avl.NewTree(),
20 }
21}
22
23// GetUserDelegations returns the entire user delegations tree.
24func (dm *DelegationManager) GetUserDelegations() *avl.Tree {
25 return dm.userDelegations
26}
27
28// SetUserDelegations sets the entire user delegations tree.
29func (dm *DelegationManager) SetUserDelegations(userDelegations *avl.Tree) {
30 dm.userDelegations = userDelegations
31}
32
33// GetDelegatorDelegations returns all delegations for a specific delegator.
34func (dm *DelegationManager) GetDelegatorDelegations(delegator string) (*avl.Tree, bool) {
35 delegations, exists := dm.userDelegations.Get(delegator)
36 if !exists {
37 return nil, false
38 }
39 delegationsTree, ok := delegations.(*avl.Tree)
40 if !ok {
41 return nil, false
42 }
43 return delegationsTree, true
44}
45
46// GetDelegationIDs returns all delegation IDs for a specific delegator-delegatee pair.
47func (dm *DelegationManager) GetDelegationIDs(delegator, delegatee string) ([]int64, bool) {
48 delegations, exists := dm.GetDelegatorDelegations(delegator)
49 if !exists {
50 return nil, false
51 }
52 ids, exists := delegations.Get(delegatee)
53 if !exists {
54 return nil, false
55 }
56 idsSlice, ok := ids.([]int64)
57 if !ok {
58 return nil, false
59 }
60 return idsSlice, true
61}
62
63// SetDelegationIDs sets delegation IDs for a specific delegator-delegatee pair.
64func (dm *DelegationManager) SetDelegationIDs(delegator, delegatee string, ids []int64) {
65 delegations, exists := dm.GetDelegatorDelegations(delegator)
66 if !exists {
67 delegations = avl.NewTree()
68 dm.userDelegations.Set(delegator, delegations)
69 }
70 delegations.Set(delegatee, ids)
71}