delegation_manager.gno
3.78 Kb ยท 122 lines
1package v1
2
3import (
4 "gno.land/r/gnoswap/gov/staker"
5)
6
7type DelegationManagerResolver struct {
8 *staker.DelegationManager
9}
10
11func NewDelegationManagerResolver(delegationManager *staker.DelegationManager) *DelegationManagerResolver {
12 return &DelegationManagerResolver{delegationManager}
13}
14
15// GetUserDelegationIDsWithDelegatee retrieves all delegation IDs for a specific delegator-delegatee pair.
16// This method is used to find delegations from a specific user to a specific delegate.
17//
18// Parameters:
19// - delegator: address of the user who delegated tokens
20// - delegatee: address of the user who received the delegation
21//
22// Returns:
23// - []int64: list of delegation IDs for the specified pair
24func (dm *DelegationManagerResolver) GetUserDelegationIDsWithDelegatee(delegator, delegatee address) []int64 {
25 delegatorAddress := delegator.String()
26 delegateeAddress := delegatee.String()
27
28 ids, exists := dm.GetDelegationIDs(delegatorAddress, delegateeAddress)
29 if !exists {
30 return []int64{}
31 }
32 return ids
33}
34
35// GetUserDelegationIDs retrieves all delegation IDs for a specific delegator across all delegatees.
36// This method is used to find all delegations made by a specific user.
37//
38// Parameters:
39// - delegator: address of the user whose delegations to retrieve
40//
41// Returns:
42// - []int64: list of all delegation IDs for the delegator
43func (dm *DelegationManagerResolver) GetUserDelegationIDs(delegator address) []int64 {
44 delegatorAddress := delegator.String()
45 delegationIDs := make([]int64, 0)
46
47 // Get all delegations for this delegator
48 delegations, exists := dm.GetDelegatorDelegations(delegatorAddress)
49 if !exists {
50 return delegationIDs
51 }
52
53 // Collect delegation IDs from all delegatees by iterating the AVL tree
54 delegations.Iterate("", "", func(key string, value interface{}) bool {
55 if toDelegations, ok := value.([]int64); ok {
56 delegationIDs = append(delegationIDs, toDelegations...)
57 }
58 return false
59 })
60
61 return delegationIDs
62}
63
64// addDelegation adds a delegation ID to the manager's tracking system.
65// This method creates the necessary nested map structure if it doesn't exist
66// and ensures no duplicate delegation IDs are stored.
67//
68// Parameters:
69// - delegator: address of the user who made the delegation
70// - delegatee: address of the user who received the delegation
71// - delegationID: unique identifier for the delegation
72func (dm *DelegationManagerResolver) addDelegation(delegator, delegatee address, delegationID int64) {
73 delegatorAddress := delegator.String()
74 delegateeAddress := delegatee.String()
75
76 // Get existing IDs
77 ids, _ := dm.GetDelegationIDs(delegatorAddress, delegateeAddress)
78
79 // Check for duplicates
80 for _, id := range ids {
81 if id == delegationID {
82 return
83 }
84 }
85
86 // Add the new delegation ID
87 ids = append(ids, delegationID)
88 dm.SetDelegationIDs(delegatorAddress, delegateeAddress, ids)
89}
90
91// removeDelegation removes a delegation ID from the manager's tracking system.
92// This method finds and removes the specified delegation ID from the appropriate slice.
93//
94// Parameters:
95// - delegator: address of the user who made the delegation
96// - delegatee: address of the user who received the delegation
97// - delegationID: unique identifier for the delegation to remove
98func (dm *DelegationManagerResolver) removeDelegation(delegator, delegatee address, delegationID int64) {
99 delegatorAddress := delegator.String()
100 delegateeAddress := delegatee.String()
101
102 // Get existing IDs
103 ids, exists := dm.GetDelegationIDs(delegatorAddress, delegateeAddress)
104 if !exists {
105 return
106 }
107
108 // Find and remove the delegation ID
109 index := -1
110 for i, id := range ids {
111 if id == delegationID {
112 index = i
113 break
114 }
115 }
116
117 // Remove the delegation ID if found
118 if index != -1 {
119 ids = append(ids[:index], ids[index+1:]...)
120 dm.SetDelegationIDs(delegatorAddress, delegateeAddress, ids)
121 }
122}