Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}