> ## Documentation Index
> Fetch the complete documentation index at: https://docs.livepeer.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Delegate Operations

> How to attract and retain LPT delegators as a Livepeer orchestrator – what delegators evaluate, the Explorer ROI formulas explained, commission strategy, reputation, and the compounding stake flywheel.

export const MathBlock = ({latex, className = "", ariaLabel, style = {}, ...rest}) => {
  const value = latex === null || latex === undefined ? "" : String(latex);
  if (!value) return null;
  return <div className={className} aria-label={ariaLabel || "Math expression"} style={style} {...rest}>
      {`$$\n${value}\n$$`}
    </div>;
};

export const MathInline = ({latex, className = "", ariaLabel, style = {}, ...rest}) => {
  const value = latex === null || latex === undefined ? "" : String(latex);
  if (!value) return null;
  return <span className={className} aria-label={ariaLabel || "Math expression"} style={style} {...rest}>
      {`$${value}$`}
    </span>;
};

export const CustomDivider = ({color = "var(--lp-color-border-default)", middleText = "", spacing = "default", style = {}, className = "", ...rest}) => {
  const spacingPresets = {
    default: {
      margin: "24px 0"
    },
    overlap: {
      margin: "-1rem 0 -1rem 0"
    },
    tight: {
      margin: "0 0 -1rem 0"
    },
    section: {
      margin: "0 0 -2rem 0"
    },
    sectionOverlap: {
      margin: "-1rem 0 -2rem 0"
    },
    deepOverlap: {
      margin: "-1rem 0 -1.5rem 0"
    }
  };
  const spacingStyle = spacingPresets[spacing] || spacingPresets.default;
  return <div role="separator" aria-orientation="horizontal" className={className} style={{
    display: "flex",
    alignItems: "center",
    ...spacingStyle,
    fontSize: style?.fontSize || "16px",
    height: "fit-content",
    ...style
  }} {...rest}>
      <span style={{
    marginRight: "var(--lp-spacing-px-8)",
    opacity: 0.2
  }}>
        <Icon icon="/snippets/assets/logos/Livepeer-Logo-Symbol-Theme.svg" />
      </span>
      <div style={{
    flex: 1,
    height: "1px",
    background: "var(--lp-color-border-default)",
    opacity: 0.4
  }}></div>
      {middleText && <>
          <Icon icon="circle" size={2} />
          <span style={{
    margin: "0 8px",
    fontWeight: "bold",
    color: color,
    opacity: 0.7
  }}>
            {middleText}
          </span>
          <Icon icon="circle" size={2} />
        </>}
      <div style={{
    flex: 1,
    height: "1px",
    background: "var(--lp-color-border-default)",
    opacity: 0.4
  }}></div>
      <span style={{
    marginLeft: "var(--lp-spacing-px-8)",
    opacity: 0.2
  }}>
        <span style={{
    display: "inline-block",
    transform: "scaleX(-1)"
  }}>
          <Icon icon="/snippets/assets/logos/Livepeer-Logo-Symbol-Theme.svg" />
        </span>
      </span>
    </div>;
};

export const TableCell = ({children, align = "left", header = false, style = {}, className = "", ...rest}) => {
  const Component = header ? "th" : "td";
  return <Component className={className} style={{
    padding: "0.75rem 1rem",
    textAlign: align,
    border: header ? "none" : "1px solid var(--lp-color-border-default)",
    ...style
  }} {...rest}>
      {children}
    </Component>;
};

export const TableRow = ({children, header = false, hover = false, style = {}, className = "", ...rest}) => {
  const rowId = `table-row-${Math.random().toString(36).substr(2, 9)}`;
  return <>
      {hover && <style>{`
          #${rowId}:hover {
            background-color: var(--lp-color-bg-card);
          }
        `}</style>}
      <tr id={rowId} className={className} style={{
    ...header && ({
      backgroundColor: "var(--lp-color-accent-strong)",
      color: "var(--lp-color-on-accent)",
      fontWeight: "bold"
    }),
    ...style
  }} {...rest}>
        {children}
      </tr>
    </>;
};

export const StyledTable = ({children, variant = "default", style = {}, className = "", ...rest}) => {
  const wrapperVariants = {
    default: {
      border: "1px solid var(--lp-color-border-default)",
      backgroundColor: "var(--lp-color-bg-card)",
      overflow: "hidden"
    },
    bordered: {
      border: "2px solid var(--lp-color-accent)",
      backgroundColor: "var(--lp-color-bg-page)",
      overflow: "hidden"
    },
    minimal: {
      border: "none",
      backgroundColor: "transparent",
      overflow: "visible"
    }
  };
  return <div data-docs-styled-table-shell className={className} style={{
    width: "100%",
    padding: 0,
    margin: 0,
    ...wrapperVariants[variant],
    ...style
  }} {...rest}>
      <table data-docs-styled-table style={{
    width: "100%",
    borderCollapse: "collapse",
    borderSpacing: 0,
    margin: 0,
    backgroundColor: "transparent"
  }}>
        {children}
      </table>
    </div>;
};

export const StyledStep = ({title, icon, titleSize = 'h3', iconColor = null, titleColor = null, children, className = '', style = {}, ...rest}) => {
  const styledTitle = titleColor ? <span style={{
    color: titleColor
  }}>{title}</span> : title;
  return <Step title={styledTitle} icon={icon} iconColor={iconColor || undefined} titleSize={titleSize} className={className} style={style} {...rest}>
      {children}
    </Step>;
};

export const StyledSteps = ({children, iconColor, titleColor, lineColor, iconSize = '24px', className = '', style = {}, ...rest}) => {
  const resolvedIconColor = iconColor || 'var(--accent-dark, #18794E)';
  const resolvedTitleColor = titleColor || 'var(--lp-color-accent)';
  const resolvedLineColor = lineColor || 'var(--lp-color-accent)';
  return <div className={['docs-styled-steps', className].filter(Boolean).join(' ')} style={style} {...rest}>
      <style>{`
        .docs-styled-steps .steps > div > div.absolute > div {
          background-color: ${resolvedIconColor};
        }
        .docs-styled-steps .steps > div > div.w-full > p {
          color: ${resolvedTitleColor};
        }
        .docs-styled-steps .steps > div > div.absolute.w-px {
          background-color: ${resolvedLineColor};
        }
        .docs-styled-steps .steps > div:last-child > div.absolute.w-px::after {
          content: '';
          position: absolute;
          bottom: 0;
          left: 50%;
          transform: translateX(-50%);
          width: 6px;
          height: 6px;
          background-color: ${resolvedLineColor};
          transform: translateX(-50%) rotate(45deg);
        }
      `}</style>
      <div>
        <Steps>{children}</Steps>
      </div>
    </div>;
};

Delegated LPT lets third-party token holders increase your Orchestrator's total stake. More stake means a larger share of protocol inflation, stronger positioning in the transcoding queue, and greater credibility in the network. Use this page to understand why delegation matters, what Delegators evaluate, how the Explorer yield calculation works, and what persuades Delegators to stay.

<CustomDivider />

## Why Delegators matter

An Orchestrator's **total stake** is the sum of its own self-bonded LPT and all LPT delegated to it by third parties. This total drives two things simultaneously:

```icon="terminal" theme={"theme":{"light":"github-light","dark":"dark-plus"}}
More total stake
       ├── Larger share of LPT inflation each round
       └── Higher position in the active set → more transcoding jobs
                    ↓
            More ETH fee revenue
                    ↓
         Higher v_daily (daily fee volume average)
                    ↓
        Even more attractive to delegators (compounding)
```

The compounding dynamic is visible in every historical reporting period. The Orchestrators near the top of the Active Set by stake captured disproportionately more of both inflation rewards and job volume.

Delegators contribute their LPT in exchange for a share of the Orchestrator's earnings. They trust you to keep commission stable, call reward every round, and keep the node performant. In return, they expect a return that is competitive with the other Orchestrators on the table.

<CustomDivider />

## What Delegators actually evaluate

The [Livepeer Explorer](https://explorer.livepeer.org/orchestrators) displays a calculated return on investment for delegating to any given Orchestrator. Understanding exactly how that calculation works puts you in the position of knowing what levers you control.

### The Explorer ROI calculation

The Explorer's yield estimate for a Delegator with stake <MathInline latex={String.raw`p`} /> on your Orchestrator combines ETH fee yield and LPT inflation yield:

#### ETH (fee) yield

<MathBlock latex={String.raw`yield_{ETH} = (v_{daily} \times 365) \times s_{fees} \times \frac{p}{p + l_{orch}}`} />

Where:

* <MathInline latex={String.raw`v_{daily}`} /> = your 90-day average daily fee volume in ETH
* <MathInline latex={String.raw`s_{fees}`} /> = your `feeShare` rate (as a decimal, e.g. 0.5 for 50%)
* <MathInline latex={String.raw`p`} /> = the Delegator's stake they're considering bonding
* <MathInline latex={String.raw`l_{orch}`} /> = your current total active stake

The fee yield estimate extrapolates your recent daily fee volume over a year, applies your fee share, and scales by the Delegator's proportion of your total stake.

#### LPT (inflation) yield

<MathBlock latex={String.raw`yield_{LPT} = \frac{l_{total} \times (1 + r_{inf})^{417} - l_{total}}{l_{active}} \times ((p + l_{orch}) \times r_{rewards}) \times \left( s_{rewards} \times \frac{p}{p + l_{orch}} \right)`} />

Where:

* <MathInline latex={String.raw`l_{total}`} /> = current total LPT supply
* <MathInline latex={String.raw`r_{inf}`} /> = current inflation rate per round
* <MathInline latex={String.raw`l_{active}`} /> = total LPT bonded across the network
* <MathInline latex={String.raw`r_{rewards}`} /> = your reward call ratio (`rewardCalls / n`, up to 90 rounds)
* <MathInline latex={String.raw`s_{rewards}`} /> = your `rewardShare` rate (1 − rewardCut)
* <MathInline latex={String.raw`417`} /> = approximate rounds per year at Arbitrum block times

#### Combined yield

<MathBlock latex={String.raw`yield_{total} = yield_{LPT} + yield_{ETH} \times price_{LPT/ETH}`} />

The ETH fee yield is converted into LPT terms using the current <MathInline latex={String.raw`price_{LPT/ETH}`} /> Uniswap price. Total yield is expressed in LPT terms so Delegators compare it directly to the LPT they're bonding.

The implementation of this calculation lives in the [Explorer's roi.ts](https://github.com/livepeer/explorer/blob/main/lib/roi.ts).

<Note>
  This formula is a projection built from the current inflation rate, fee volume, and commission settings. Treat the headline rate as directional and use stability over time as the stronger trust signal.
</Note>

<CustomDivider />

## The four things Delegators look at

### 1. Reward call ratio

Your `rewardCalls / n` ratio over the trailing 90 rounds is visible on your Explorer profile and feeds directly into the yield formula. Every missed round reduces this ratio, which reduces every Delegator's projected yield – and every Delegator who recalculates sees a worse number.

A ratio below 1.0 is a signal of either unreliability or low-stake economics. Delegators migrate away from Orchestrators with declining reward ratios.

**What you control:** Keep your node running and your ETH balance sufficient for gas. A value of <MathInline latex={String.raw`r_{rewards} = 1.0`} /> (100%) is achievable and expected.

### 2. Fee share and reward share

Your `feeShare` and `rewardCut` set what percentage of your earnings pass through to Delegators. These are visible in Explorer and are the most direct signal of how "Delegator-friendly" your Orchestrator is.

The competitive range as of early 2026:

<StyledTable variant="bordered">
  <TableRow header>
    <TableCell header>Parameter</TableCell>
    <TableCell header>Very competitive</TableCell>
    <TableCell header>Moderate</TableCell>
    <TableCell header>Operator-heavy</TableCell>
  </TableRow>

  <TableRow>
    <TableCell>`rewardCut`</TableCell>
    <TableCell>0–10%</TableCell>
    <TableCell>10–25%</TableCell>
    <TableCell>25–100%</TableCell>
  </TableRow>

  <TableRow>
    <TableCell>`feeShare`</TableCell>
    <TableCell>75–100%</TableCell>
    <TableCell>30–75%</TableCell>
    <TableCell>0–30%</TableCell>
  </TableRow>
</StyledTable>

New Orchestrators building their initial delegation base should be at the competitive end. Once you have a stable delegation base and reputation, modest increases in `rewardCut` are less disruptive – but they should still be telegraphed to Delegators in advance.

### 3. Daily fee volume (v\_daily)

Your 90-day average daily fee volume in ETH shows Delegators how much fee-producing work your Orchestrator is winning. A high <MathInline latex={String.raw`v_{daily}`} /> means more ETH flowing through the fee share calculation, raising the ETH yield component significantly.

Gateway demand and node performance determine <MathInline latex={String.raw`v_{daily}`} />. Improve it by:

* Keep your transcoding session limits competitive
* Run popular AI models warm at competitive prices
* Maintain high uptime and low latency to stay preferred by Gateways

### 4. Active stake dilution

When a Delegator adds new stake <MathInline latex={String.raw`p`} /> to your Orchestrator, their yield is diluted by the total stake they're joining: <MathInline latex={String.raw`\frac{p}{p + l_{orch}}`} />. Smaller Orchestrators offer higher yield per unit of delegated stake because the denominator is smaller. This is why new and mid-tier Orchestrators still offer competitive yields despite lower absolute fee volumes.

<CustomDivider />

## Building reputation

The yield formula explains the maths, but reputation is what keeps Delegators when market conditions change.

### Transparency

Some high-performing Orchestrators publish their operational setup, uptime history, and commission change notices publicly via:

* Livepeer Forum post introducing their Orchestrator
* Discord announcements in the #Orchestrators channel
* On-chain commission change with advance notice (one round is a minimum; a week is better)

Delegators on the forum and Discord actively discuss which Orchestrators they trust. A reputation thread or introduction builds discoverability.

### Commission stability

The most common Delegator complaint (visible throughout the Livepeer Forum history) is Orchestrators who set attractive rates to attract initial delegation and then change them. The protocol permits this, but it is reputationally damaging. Delegators who experience this switch Orchestrators immediately.

The Explorer shows your commission change history. Delegators check this.

### Running AI capabilities

Since Q3 2024, Orchestrators running AI inference pipelines have seen higher <MathInline latex={String.raw`v_{daily}`} /> values than transcoding-only nodes. Higher fee volume improves your ETH yield component, making you more attractive to yield-focused Delegators. Running popular models warm is a compounding advantage: more fees → higher yield → more delegation → more stake → more jobs.

<CustomDivider />

## The delegation mechanics (what Delegators actually do)

It's useful to understand the Delegator's side of the process to anticipate their questions.

<StyledSteps>
  <StyledStep title="Delegator connects wallet to Explorer">
    At [explorer.livepeer.org](https://explorer.livepeer.org), a Delegator connects their Ethereum/Arbitrum wallet.
  </StyledStep>

  <StyledStep title="Browse orchestrator list">
    The Active Orchestrators table shows every Orchestrator's current stake, commission parameters, reward call history, and estimated ROI. Delegators filter and sort here.
  </StyledStep>

  <StyledStep title="Evaluate the target orchestrator">
    Clicking through to an Orchestrator's profile shows: stake history, daily fee volume graph, Delegator count, reward call ratio, commission change history, and the personalised yield calculator where they enter their own stake amount <MathInline latex={String.raw`p`} />.
  </StyledStep>

  <StyledStep title="Bond LPT">
    Delegating requires holding LPT on Arbitrum and approving the bonding transaction. The LPT stays in the Delegator's wallet while bonding to the Orchestrator's stake until unbonding.
  </StyledStep>

  <StyledStep title="Unbonding period">
    Delegators who leave enter the protocol-defined unbonding period before their LPT is liquid again. This creates some natural stickiness in the delegation relationship.
  </StyledStep>
</StyledSteps>

<CustomDivider />

## Common pitfalls for Delegators (and what they mean for you)

These are documented in the yield-calculation source material and are known to the Delegator community. Understanding them helps you avoid the behaviours that cause Delegators to leave.

### Variable commission rates

**The risk:** Orchestrators change `feeShare` and `rewardCut` on-chain at any time. The Explorer yield projection uses your current rates and assumes they stay constant. Raising `rewardCut` after attracting delegation pulls realised yield below the projection Delegators saw.

**Your response:** Treat commission rates as a public commitment. Announce any changes in advance, with clear reasons. A small planned increase communicated honestly is far less damaging than an unannounced change.

### Inflation rate changes

The yield formula assumes a constant inflation rate. Bonded participation above 50% decreases the inflation rate and reduces LPT yield for all Delegators. This is outside your control, but some Delegators interpret reduced yields as your fault.

**Your response:** Be transparent about protocol-level factors. The Explorer shows the current inflation rate, so link informed Delegators directly to that data and show the protocol-level cause.

### Missed reward rounds

Every missed round reduces <MathInline latex={String.raw`r_{rewards}`} />, which directly reduces projected LPT yield in the formula. Delegators notice and migrate.

**Your response:** This is fully within your control. Automate reward calling, monitor with alerts, keep ETH in your wallet. See [Rewards and Fees](/v2/Orchestrators/guides/staking-and-rewards/reward-mechanics) for the complete setup.

<CustomDivider />

## Resources to share

Pointing incoming Delegators to good educational resources reduces confusion and builds trust:

* **Explorer yield calculator:** [explorer.livepeer.org/Orchestrators](https://explorer.livepeer.org/orchestrators) – enter any stake amount to see projected yield for your Orchestrator specifically
* **Delegation guide:** [Choose an Orchestrator and Delegate](/v2/Delegators/delegation/choose-an-Orchestrator) – how Delegators evaluate an Orchestrator and complete the bonding flow
* **Livepeer primer:** [livepeer.org/primer](https://livepeer.org/primer) – accessible introduction to the protocol

<CustomDivider />

## Related

<CardGroup cols={2}>
  <Card title="Earnings Explained" icon="chart-line" href="/v2/orchestrators/guides/staking-and-rewards/earning-model">
    The full picture of how ETH fees and LPT rewards work.
  </Card>

  <Card title="Rewards and Fees" icon="hand-holding-dollar" href="/v2/orchestrators/guides/staking-and-rewards/reward-mechanics">
    Reward call automation, gas thresholds, and commission setting via livepeer\_cli.
  </Card>

  <Card title="LPT Token" icon="coins" href="/v2/delegators/concepts/purpose">
    Why LPT exists and how it functions in the protocol.
  </Card>

  <Card title="Livepeer Explorer" icon="compass" href="https://explorer.livepeer.org">
    Live ROI data, Orchestrator rankings, and your own earnings dashboard.
  </Card>
</CardGroup>
