Search Apps Documentation Source Content File Folder Download Copy Actions Download State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

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}