Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}