delegation_manager.gno
3.76 Kb · 97 lines
1package staker
2
3import (
4 "gno.land/r/gnoswap/gov/staker"
5)
6
7type DelegationManagerResolver struct {
8 *staker.DelegationManager
9}
10
11// NewDelegationManagerResolver creates a resolver over an existing delegation manager.
12//
13// Parameters:
14// - delegationManager: manager whose domain-owned delegation trees will be queried or updated.
15//
16// Returns:
17// - *DelegationManagerResolver: resolver exposing address-typed delegation operations.
18func NewDelegationManagerResolver(delegationManager *staker.DelegationManager) *DelegationManagerResolver {
19 return &DelegationManagerResolver{delegationManager}
20}
21
22// GetUserDelegationIDsWithDelegatee retrieves all delegation IDs for a specific delegator-delegatee pair.
23// This method is used to find delegations from a specific user to a specific delegate.
24//
25// Parameters:
26// - delegator: address of the user who delegated tokens
27// - delegatee: address of the user who received the delegation
28//
29// Returns:
30// - []int64: matching delegation IDs, or an empty slice when no pair is stored.
31func (dm *DelegationManagerResolver) GetUserDelegationIDsWithDelegatee(delegator, delegatee address) []int64 {
32 delegatorAddress := delegator.String()
33 delegateeAddress := delegatee.String()
34
35 ids, exists := dm.GetDelegationIDs(delegatorAddress, delegateeAddress)
36 if !exists {
37 return []int64{}
38 }
39 return ids
40}
41
42// GetUserDelegationIDs retrieves all delegation IDs for a specific delegator across all delegatees.
43// This method is used to find all delegations made by a specific user.
44//
45// Parameters:
46// - delegator: address of the user whose delegations to retrieve
47//
48// Returns:
49// - []int64: concatenated delegation IDs from every stored delegatee entry, or an empty slice when absent.
50func (dm *DelegationManagerResolver) GetUserDelegationIDs(delegator address) []int64 {
51 delegatorAddress := delegator.String()
52 delegationIDs := make([]int64, 0)
53
54 // Get all delegations for this delegator
55 delegations, exists := dm.GetDelegatorDelegations(delegatorAddress)
56 if !exists {
57 return delegationIDs
58 }
59
60 // Collect delegation IDs from all delegatees by iterating the BPTree
61 delegations.Iterate("", "", func(key string, value interface{}) bool {
62 if toDelegations, ok := value.([]int64); ok {
63 delegationIDs = append(delegationIDs, toDelegations...)
64 }
65 return false
66 })
67
68 return delegationIDs
69}
70
71// addDelegation adds a delegation ID to the manager's tracking system.
72// This method creates the necessary nested map structure if it doesn't exist
73// and ensures no duplicate delegation IDs are stored.
74//
75// Parameters:
76// - delegator: address of the user who made the delegation
77// - delegatee: address of the user who received the delegation
78// - delegationID: unique identifier for the delegation
79func (dm *DelegationManagerResolver) addDelegation(delegator, delegatee address, delegationID int64) {
80 // Delegate the read-modify-write to the domain method so the nested BPTree
81 // mutation stays within the owning realm; splitting the get and set across
82 // the realm boundary here would taint the re-fetched inner tree.
83 dm.AddDelegationID(delegator.String(), delegatee.String(), delegationID)
84}
85
86// removeDelegation removes a delegation ID from the manager's tracking system.
87// This method finds and removes the specified delegation ID from the appropriate slice.
88//
89// Parameters:
90// - delegator: address of the user who made the delegation
91// - delegatee: address of the user who received the delegation
92// - delegationID: unique identifier for the delegation to remove
93func (dm *DelegationManagerResolver) removeDelegation(delegator, delegatee address, delegationID int64) {
94 // Delegate the read-modify-write to the domain method so the nested BPTree
95 // mutation stays within the owning realm.
96 dm.RemoveDelegationID(delegator.String(), delegatee.String(), delegationID)
97}