Module project.eods.delegated_validator

This module defines the attributes of class delegated validator.

Classes

class DelegatedValidator (validator: protocol.validator.Validator, initial_balance: numpy.uint64)
Expand source code
class DelegatedValidator:
    """
    This class serves as a wrapper around a Validator, providing an abstraction for managing delegated amounts. 
    It adds functionality to the Validator, functionality specific to eODS.
    It defines quotas, tracks balances, and facilitates operations related to delegation management. 
    """
    initial_balance: Gwei
    rewards: Gwei
    penalties: Gwei
    validator_balance: Gwei

    delegated_validator: Validator
    validator_quota: Quota
    delegator_quotas: List[Quota]
    delegated_balances: List[Gwei]
    total_delegated_balance: Gwei
    
    debug_total_rewards: Gwei
    debug_total_penalties: Gwei
    debug_total_delegated: Gwei
    debug_total_withdrawn: Gwei

    def __init__(self, validator: Validator, initial_balance: Gwei):
        self.delegated_validator = validator
        self.initial_balance = initial_balance
        self.validator_balance = self.initial_balance
                
        self.validator_quota = 1
        self.delegator_quotas = [0]
        self.delegated_balances = [0]
        self.total_delegated_balance = 0
        self.rewards = 0
        self.penalties = 0

        self.debug_total_delegated = 0
        self.debug_total_withdrawn = 0
        self.debug_total_rewards = 0
        self.debug_total_penalties = 0
        

    def process_withdrawal(self, delegator_index: int, amount: Gwei) -> Gwei:
        """
        Method to process a withdrawal of balance from the delegated validator towards a delegator with `delegator_index`
        """

        if amount > self.delegated_balances[delegator_index]:
            amount = self.delegated_balances[delegator_index]     

        withdrawable_amount = self._calculate_withdrawable_amount(amount)

        self.delegated_balances[delegator_index] -= withdrawable_amount

        self.total_delegated_balance -= withdrawable_amount

        # Decreases the delegated validator's balance with withdrawable amount
        self._decrease_balance(withdrawable_amount)

        self._recalculate_quotas()

        self.debug_total_withdrawn += withdrawable_amount
        
        return withdrawable_amount

    def process_delegation(self, delegator_index: int, amount: Gwei):
        """
        Method to process a delegation from a delegator with `delegator_index` towards the delegated validator
        """
        num_delegated_balances = len(self.delegated_balances)

        if(num_delegated_balances <= delegator_index):
            for _ in range(delegator_index - num_delegated_balances + 1):
                self.delegated_balances.append(0)
        
        self.delegated_balances[delegator_index] += amount

        self.total_delegated_balance += amount

        self._increase_balance(amount)

        self._recalculate_quotas()

        self.debug_total_delegated += amount

    def process_rewards_penalties(self):
        """
        This method processes the rewards and penalties.
        """
        self._adjust_delegated_balances()

        self.debug_total_rewards += self.rewards
        self.debug_total_penalties += self.penalties

        self.rewards = 0
        self.penalties = 0
       
    def _adjust_delegated_balances(self):
        self._increase_balance(self.rewards)
        self._decrease_balance(self.penalties)

        for index in range(len(self.delegator_quotas)):
            self.delegated_balances[index] = self.validator_balance * self.delegator_quotas[index]
        
        self.total_delegated_balance += (1 - self.validator_quota) * self.rewards
        self.total_delegated_balance -= (1 - self.validator_quota) * self.penalties

    def _calculate_withdrawable_amount(self, amount: Gwei):
        withdrawable_amount = amount * (1 - self.delegated_validator.fee_percentage / 100)
        
        return withdrawable_amount

    def _decrease_balance(self, delta: Gwei): 
        self.validator_balance -= delta

    def _increase_balance(self, delta: Gwei):
        self.validator_balance += delta 

    def _recalculate_quotas(self):
        num_delegated_balances = len(self.delegated_balances)
        num_delegator_quotas = len(self.delegator_quotas)

        #adjust for any list size change
        if(num_delegator_quotas < num_delegated_balances):
            for _ in range(num_delegated_balances - num_delegator_quotas):
                self.delegator_quotas.append(0)
        
        # Calculates the validator's quota from from the active balance, based on it's initial balance
        self.validator_quota = 1 if self.total_delegated_balance == 0 else (self.validator_balance - self.total_delegated_balance) / self.validator_balance

        for index, delegated_amount in enumerate(self.delegated_balances):
            self.delegator_quotas[index] = 0 if self.validator_balance ==0 or self.total_delegated_balance  == 0 else delegated_amount / self.validator_balance

This class serves as a wrapper around a Validator, providing an abstraction for managing delegated amounts. It adds functionality to the Validator, functionality specific to eODS. It defines quotas, tracks balances, and facilitates operations related to delegation management.

Class variables

var debug_total_delegated : numpy.uint64
var debug_total_penalties : numpy.uint64
var debug_total_rewards : numpy.uint64
var debug_total_withdrawn : numpy.uint64
var delegated_balances : List[numpy.uint64]
var delegated_validator : protocol.validator.Validator
var delegator_quotas : List[numpy.uint64]
var initial_balance : numpy.uint64
var penalties : numpy.uint64
var rewards : numpy.uint64
var total_delegated_balance : numpy.uint64
var validator_balance : numpy.uint64
var validator_quota : numpy.uint64

Methods

def process_delegation(self, delegator_index: int, amount: numpy.uint64)
Expand source code
def process_delegation(self, delegator_index: int, amount: Gwei):
    """
    Method to process a delegation from a delegator with `delegator_index` towards the delegated validator
    """
    num_delegated_balances = len(self.delegated_balances)

    if(num_delegated_balances <= delegator_index):
        for _ in range(delegator_index - num_delegated_balances + 1):
            self.delegated_balances.append(0)
    
    self.delegated_balances[delegator_index] += amount

    self.total_delegated_balance += amount

    self._increase_balance(amount)

    self._recalculate_quotas()

    self.debug_total_delegated += amount

Method to process a delegation from a delegator with delegator_index towards the delegated validator

def process_rewards_penalties(self)
Expand source code
def process_rewards_penalties(self):
    """
    This method processes the rewards and penalties.
    """
    self._adjust_delegated_balances()

    self.debug_total_rewards += self.rewards
    self.debug_total_penalties += self.penalties

    self.rewards = 0
    self.penalties = 0

This method processes the rewards and penalties.

def process_withdrawal(self, delegator_index: int, amount: numpy.uint64) ‑> numpy.uint64
Expand source code
def process_withdrawal(self, delegator_index: int, amount: Gwei) -> Gwei:
    """
    Method to process a withdrawal of balance from the delegated validator towards a delegator with `delegator_index`
    """

    if amount > self.delegated_balances[delegator_index]:
        amount = self.delegated_balances[delegator_index]     

    withdrawable_amount = self._calculate_withdrawable_amount(amount)

    self.delegated_balances[delegator_index] -= withdrawable_amount

    self.total_delegated_balance -= withdrawable_amount

    # Decreases the delegated validator's balance with withdrawable amount
    self._decrease_balance(withdrawable_amount)

    self._recalculate_quotas()

    self.debug_total_withdrawn += withdrawable_amount
    
    return withdrawable_amount

Method to process a withdrawal of balance from the delegated validator towards a delegator with delegator_index