---
# System prepended metadata

title: Operator Self-Delegating Proposal V3/Final
tags: [Spec-Revenue-Sharing]

---

---
tags: Spec-Revenue-Sharing
---

# Operator Self-Delegating Proposal V3/Final

TODO: add changes to main text. This is how it works now conceptually:
* when operator withdraws earnings (or receives earnings as part of unstaking):
  * the incoming DATA are added to the Operator contract's balance
      * this would cause DATA/pooltoken rate go up
  * operator's share (given fraction) is "self-delegated"
      * as if e.g. 10% of that DATA had been sent in by the operator themselves, even though it did come from withdraw action
      * the remaining e.g. 90% just lands to the contract balance
      * DATA/pooltoken rate still goes up but a bit less
* there is still a minimum margin (operator's self-delegated share) but as of 2023-05-04 it's only checked when a new delegator joins (so un-self-delegating everything just prevents new delegators from joining) but ETH-511 adds check for when operator un-selfdelegates

## Summary

This current version is the latest iteration coming from this [prior version](https://hackmd.io/KS09LdnCS7OPn5xZlRNH0Q). There is also the worked out [example scenario](https://hackmd.io/M6gfCQFXSMOy1aDEUAGNaA). The current update adds some smaller changes.


## Parameters



| Name | Description | Type |
| -------- | -------- | -------- |
| initial_margin     | The initial margin requirement that is needed from the broker to create the pool     | Pool Tokens     |
| maintenance_margin     | The level that has to be met of % of pool tokens for insurance (soft limit)      | Percentage (of pool tokens) |
| minimum_margin     | The lowest percent of pool tokens that a broker can have before new delegation is not allowed | Percentage (of pool tokens) |
| broker_share     | The share that the broker gets for running the pool regardless of number of tokens | Percentage (of income) |
| broker_share_max_divert     | The maximum of the broker share that gets diverted when the maintenance_margin is not met | Percentage (of broker_share) |

## Behavioral Actions/Prior Actions

### Broker Pool Initialization

- On initialization of the broker pool there is an <code>initial_margin</code> of tokens that the broker must be buying in to. The broker transfers the necessary DATA to pay for the tokens and receives them in their account.
- This whole flow can follow through the same format as a normal buying operation for a delegator except we track the variable of broker stake separately

### Broker Stake Withdraw

- A behavioral action where a broker sends a message to opt to withdraw stake.
- The flow is Check Withdraw Ability -> IF TRUE -> Withdraw Self-Stake

### Broker Stake Slashing

- In the event of slashing for bad behavior, poor stream performance, or other reasons, there can be slashing that occurs on the broker end
- This will trigger stream slashing policy

### Revenue Modification

- Revenue is first split into two categories:
    - $PoolShareRev = (1-BrokerShare) \cdot revenue$
    - $BrokerShareRev = (BrokerShare) \cdot revenue$
- PoolShareRev hits the pool value and the tokens that the broker has appreciates in value the same way as the non-broker tokens appreciate
- There is then two cases for the BrokerShareRev
- IF (Check Not Under Funded)
    - 100% of the BrokerShareRev sent to the broker
- ELSE
    - Define DivertedRev = $Minimum(\text{Amount needed to be funded}, BrokerShareMaxDivert \cdot BrokerShareRev)$
    - BrokerShareRev - DivertedRev is sent directly to the broker
    - DivertedRev is used to mint new pool tokens for the broker self-stake

### Broker Stake Top Up

- This is the event where a broker tops up their self-stake

### Delegation

- A behavioral action where outside delegators want to delegate to the broker pool
- The flow is Check Not Under Funded -> IF TRUE -> Allow Delegation

## Policies

### Check Withdraw Ability

- A policy which checks the ability of a broker to withdraw their own self-stake based on conditions
- Currently it will return the value of:

$$\frac{BrokerSelfStake}{TotalTokens} > MaintenanceMargin$$

### Check Not Under Funded

- A policy which checks if the current stake that a broker has is less than the <code>maintenance_margin</code>
- This will divert revenue until the stake is back to variation margin
- It will return the value of:

$$\frac{BrokerSelfStake}{TotalTokens} > MinimumMargin$$


### Stream Slashing Policy

- We are given an amount of DATA that was slashed SlashAmount
- Start with $ExchangeRate = \frac{PoolValue}{TotalTokens}$
- Determine DATA value of the self-stake, $SelfStakeValue = BrokerStake \cdot ExchangeRate$
- The amount paid out of insurance can be found as: $InsurancePayment = MIN(SelfStakeValue, SlashAmount)$
- Pool value decreases by InsurancePayment
- The equivalent tokens are burned from the broker's tokens, i.e. we burn $InsurancePayment / ExchangeRate$ worth of tokens that the broker owns
- Not that the exchange rate stays constant and the token value of delegators does not decrease at this point!
- If there is any leftover payment, i.e. InsurancePayment < SlashAmount, then it is just taken out of the pool value as done prior which decreases the exchange rate/value of the tokens


## Mechanisms

### Withdraw Self-Stake

- A mechanism which decreases the pool tokens of the broker and swaps DATA to them

### Top Up Mechanism

- A mechanism which takes care of setting any flags, transferring for pool tokens, etc.

## System Guarantees

1. Brokers will only earn revenue if they have enough stake.
2. Brokers will be the first line of defense for slashing