Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}