delegation_manager.gno
3.39 Kb · 90 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 BPTree
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 // Delegate the read-modify-write to the domain method so the nested BPTree
74 // mutation stays within the owning realm; splitting the get and set across
75 // the realm boundary here would taint the re-fetched inner tree.
76 dm.AddDelegationID(delegator.String(), delegatee.String(), delegationID)
77}
78
79// removeDelegation removes a delegation ID from the manager's tracking system.
80// This method finds and removes the specified delegation ID from the appropriate slice.
81//
82// Parameters:
83// - delegator: address of the user who made the delegation
84// - delegatee: address of the user who received the delegation
85// - delegationID: unique identifier for the delegation to remove
86func (dm *DelegationManagerResolver) removeDelegation(delegator, delegatee address, delegationID int64) {
87 // Delegate the read-modify-write to the domain method so the nested BPTree
88 // mutation stays within the owning realm.
89 dm.RemoveDelegationID(delegator.String(), delegatee.String(), delegationID)
90}